> getExecutionEngine() {
return _executionEngine;
}
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/pomfirst/pom.xml b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/pomfirst/pom.xml
new file mode 100644
index 000000000..4c67b74c8
--- /dev/null
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/pomfirst/pom.xml
@@ -0,0 +1,76 @@
+
+
+ 4.0.0
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.executionframework.engine
+ 4.0.0-SNAPSHOT
+
+ jar
+
+
+ scm:git:https://github.com/eclipse/gemoc-studio-modeldebugging.git
+ UTF-8
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ unpack
+ prepare-package
+
+ unpack
+
+
+
+
+ org.eclipse.gemoc.modeldebugging.executionframework
+ ${project.artifactId}
+ ${project.version}
+ jar
+ true
+ ${project.build.directory}/classes
+ **
+
+
+
+
+
+
+
+
+
+
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.commons.eclipse
+ 3.0.0-SNAPSHOT
+
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.trace.commons.model
+ 3.0.1-SNAPSHOT
+
+
+
+
+ nexus-eclipse-gemoc
+ Nexus Eclipse GEMOC
+
+ true
+
+
+ true
+
+ https://repo.eclipse.org/content/groups/gemoc/
+
+
+
\ No newline at end of file
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/src/org/eclipse/gemoc/executionframework/engine/commons/sequential/ISequentialModelExecutionContext.java b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/src/org/eclipse/gemoc/executionframework/engine/commons/sequential/ISequentialModelExecutionContext.java
new file mode 100644
index 000000000..9c5140d74
--- /dev/null
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/src/org/eclipse/gemoc/executionframework/engine/commons/sequential/ISequentialModelExecutionContext.java
@@ -0,0 +1,9 @@
+package org.eclipse.gemoc.executionframework.engine.commons.sequential;
+
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionContext;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionPlatform;
+import org.eclipse.gemoc.xdsmlframework.api.extensions.languages.LanguageDefinitionExtension;
+
+public interface ISequentialModelExecutionContext extends IExecutionContext {
+
+}
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/src/org/eclipse/gemoc/executionframework/engine/commons/sequential/SequentialModelExecutionContext.java b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/src/org/eclipse/gemoc/executionframework/engine/commons/sequential/SequentialModelExecutionContext.java
new file mode 100644
index 000000000..1e7fdc6bb
--- /dev/null
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.engine/src/org/eclipse/gemoc/executionframework/engine/commons/sequential/SequentialModelExecutionContext.java
@@ -0,0 +1,14 @@
+package org.eclipse.gemoc.executionframework.engine.commons.sequential;
+
+import org.eclipse.gemoc.executionframework.engine.commons.DefaultExecutionPlatform;
+import org.eclipse.gemoc.executionframework.engine.commons.EngineContextException;
+import org.eclipse.gemoc.executionframework.engine.commons.GenericModelExecutionContext;
+import org.eclipse.gemoc.xdsmlframework.api.core.ExecutionMode;
+
+public class SequentialModelExecutionContext extends GenericModelExecutionContext implements ISequentialModelExecutionContext {
+
+ public SequentialModelExecutionContext(ISequentialRunConfiguration runConfiguration, ExecutionMode executionMode) throws EngineContextException {
+ super(runConfiguration, executionMode);
+ }
+
+}
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.edit/plugin.properties b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.edit/plugin.properties
index 891e729b2..21c01ce92 100644
--- a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.edit/plugin.properties
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.edit/plugin.properties
@@ -1,7 +1,7 @@
#
-pluginName = Event Model Edit Support
-providerName = www.example.org
+pluginName = GEMOC Execution Framework Event Model Edit Support
+providerName = Eclipse GEMOC Project
_UI_CreateChild_text = {0}
_UI_CreateChild_text2 = {1} {0}
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.editor/plugin.properties b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.editor/plugin.properties
index be8a0cc32..d7817602d 100644
--- a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.editor/plugin.properties
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model.editor/plugin.properties
@@ -1,7 +1,7 @@
#
-pluginName = Event Model Editor
-providerName = www.example.org
+pluginName = GEMOC Execution Framework Event Model Editor
+providerName = Eclipse GEMOC Project
_UI_EventEditor_menu = &Event Editor
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model/plugin.properties b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model/plugin.properties
index 4fe0c177b..9c56f2edc 100644
--- a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model/plugin.properties
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.event.model/plugin.properties
@@ -1,4 +1,4 @@
#
-pluginName = Event Model
-providerName = www.example.org
+pluginName = GEMOC Execution Framework Event Model
+providerName = Eclipse GEMOC Project
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.extensions.sirius/src/org/eclipse/gemoc/executionframework/extensions/sirius/debug/DebugSessionFactory.java b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.extensions.sirius/src/org/eclipse/gemoc/executionframework/extensions/sirius/debug/DebugSessionFactory.java
index 1bb7c2a72..9ac92c18c 100644
--- a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.extensions.sirius/src/org/eclipse/gemoc/executionframework/extensions/sirius/debug/DebugSessionFactory.java
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.extensions.sirius/src/org/eclipse/gemoc/executionframework/extensions/sirius/debug/DebugSessionFactory.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017 THALES GLOBAL SERVICES.
+ * Copyright (c) 2008, 2020 THALES GLOBAL SERVICES.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -29,7 +29,7 @@
import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.sirius.business.internal.session.danalysis.DAnalysisSessionImpl;
import org.eclipse.sirius.common.tools.api.editing.EditingDomainFactoryService;
-import org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapterImpl;
+import org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapter;
import org.eclipse.sirius.tools.internal.resource.ResourceSetUtil;
import org.eclipse.sirius.viewpoint.DAnalysis;
import org.eclipse.sirius.viewpoint.SiriusPlugin;
@@ -65,7 +65,7 @@ public Session createSession(ResourceSet set, final URI sessionResourceURI, IPro
// Configure the resource set, its is done here and not before the
// editing domain creation which could provide its own resource set.
- transactionalEditingDomain.getResourceSet().eAdapters().add(new SiriusCrossReferenceAdapterImpl());
+ transactionalEditingDomain.getResourceSet().eAdapters().add(new SiriusCrossReferenceAdapter());
// Create or load the session.
boolean alreadyExistingResource = exists(sessionResourceURI, transactionalEditingDomain.getResourceSet());
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.edit/plugin.properties b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.edit/plugin.properties
index 707961485..16e3f365d 100644
--- a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.edit/plugin.properties
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.edit/plugin.properties
@@ -1,7 +1,7 @@
#
-pluginName = Value Model Edit Support
-providerName = www.example.org
+pluginName = GEMOC Execution Framework Value Model Edit Support
+providerName = Eclipse GEMOC Project
_UI_CreateChild_text = {0}
_UI_CreateChild_text2 = {1} {0}
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.editor/plugin.properties b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.editor/plugin.properties
index 21a308255..b4b8c4709 100644
--- a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.editor/plugin.properties
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model.editor/plugin.properties
@@ -1,7 +1,7 @@
#
-pluginName = Value Model Editor
-providerName = www.example.org
+pluginName = GEMOC Execution Framework Value Model Editor
+providerName = Eclipse GEMOC Project
_UI_ValueEditor_menu = &Value Editor
diff --git a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model/plugin.properties b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model/plugin.properties
index 9f6facabb..16dbc16e1 100644
--- a/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model/plugin.properties
+++ b/framework/execution_framework/plugins/org.eclipse.gemoc.executionframework.value.model/plugin.properties
@@ -1,4 +1,4 @@
#
-pluginName = Value Model
-providerName = www.example.org
+pluginName = GEMOC Execution Framework Value Model
+providerName = Eclipse GEMOC Project
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.debugger.mep/.project b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.debugger.mep/.project
new file mode 100644
index 000000000..ef09ee804
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.debugger.mep/.project
@@ -0,0 +1,29 @@
+
+
+ org.eclipse.gemoc.executionframework.debugger.mep
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextNature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.classpath b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.classpath
new file mode 100644
index 000000000..5e8a55fef
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.classpath
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.project b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.project
new file mode 100644
index 000000000..faa7a3760
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.project
@@ -0,0 +1,29 @@
+
+
+ org.eclipse.gemoc.executionframework.engine.headless
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextNature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.core.resources.prefs b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 000000000..f9fe34593
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/test/java=UTF-8
+encoding/=UTF-8
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.jdt.core.prefs b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..b8947ec6f
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.m2e.core.prefs b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 000000000..f897a7f1c
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.xtend.core.Xtend.prefs b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 000000000..9682a4c0a
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,7 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/main/java.directory=xtend-gen
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/pom.xml b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/pom.xml
new file mode 100644
index 000000000..c57a8d748
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/pom.xml
@@ -0,0 +1,63 @@
+
+ 4.0.0
+
+ org.eclipse.gemoc.executionframework
+ org.eclipse.gemoc.executionframework.engine.headless
+ 1.0.0-SNAPSHOT
+
+
+ org.eclipse.gemoc.executionframework
+ org.eclipse.gemoc.executionframework.pomfirst
+ 1.0.0-SNAPSHOT
+
+
+
+ 1.8
+ 1.8
+ 2.22.0
+ 0.21.1
+ 2.18.0
+ 0.8.0
+
+
+
+
+ org.eclipse.gemoc.modeldebugging.framework.commons
+ org.eclipse.gemoc.xdsmlframework.api
+ 4.0.0-SNAPSHOT
+
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.executionframework.engine
+ 4.0.0-SNAPSHOT
+
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.executionframework.debugger
+ 4.0.0-SNAPSHOT
+
+
+ org.eclipse.gemoc.commons
+ org.eclipse.gemoc.commons.eclipse.pde
+ 3.0.0-SNAPSHOT
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+
+
+ org.eclipse.gemoc.multidimensional_trace_management
+ org.eclipse.gemoc.trace.gemoc
+ 3.0.1-SNAPSHOT
+
+
+
+
+
+
+
+
+
+
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/AbstractHeadlessExecutionContext.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/AbstractHeadlessExecutionContext.java
new file mode 100644
index 000000000..b9ef57e22
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/AbstractHeadlessExecutionContext.java
@@ -0,0 +1,86 @@
+package org.eclipse.gemoc.executionframework.engine.headless;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.gemoc.executionframework.engine.commons.EngineContextException;
+import org.eclipse.gemoc.trace.commons.model.trace.MSEModel;
+import org.eclipse.gemoc.xdsmlframework.api.core.ExecutionMode;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionContext;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionWorkspace;
+import org.eclipse.gemoc.xdsmlframework.api.core.IRunConfiguration;
+import org.eclipse.gemoc.xdsmlframework.api.extensions.languages.LanguageDefinitionExtension;
+import org.osgi.framework.Bundle;
+
+public abstract class AbstractHeadlessExecutionContext implements IExecutionContext {
+
+ protected R _runConfiguration;
+
+ protected HeadlessExecutionPlatform _executionPlatform;
+
+ protected L _languageDefinition;
+
+ protected Resource _resourceModel;
+
+ protected ExecutionMode _executionMode;
+
+ protected Bundle _dslBundle;
+
+ protected IExecutionWorkspace _executionWorkspace;
+
+
+ public AbstractHeadlessExecutionContext(R runConfiguration, ExecutionMode executionMode, L languageDefinitionExtension, IExecutionWorkspace executionWorkspace, HeadlessExecutionPlatform executionPlatform) throws EngineContextException {
+ _runConfiguration = runConfiguration;
+ _executionMode = executionMode;
+ _executionWorkspace = executionWorkspace;
+ _languageDefinition = languageDefinitionExtension;
+ //_dslBundle = DslHelper.getDslBundle(_runConfiguration.getLanguageName());
+ _executionPlatform = executionPlatform;
+ }
+
+ @Override
+ public void dispose() {
+ _executionPlatform.dispose();
+ }
+
+ @Override
+ public IExecutionWorkspace getWorkspace() {
+ return _executionWorkspace;
+ }
+
+ @Override
+ public Resource getResourceModel() {
+ return _resourceModel;
+ }
+
+ @Override
+ public ExecutionMode getExecutionMode() {
+ return _executionMode;
+ }
+
+ @Override
+ public MSEModel getMSEModel() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle getDslBundle() {
+ return _dslBundle;
+ }
+
+ @Override
+ public L getLanguageDefinitionExtension() {
+ return _languageDefinition;
+ }
+
+ @Override
+ public HeadlessExecutionPlatform getExecutionPlatform() {
+ return _executionPlatform;
+ }
+
+ @Override
+ public R getRunConfiguration() {
+ return _runConfiguration;
+ }
+
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/AbstractSequentialHeadlessExecutionContext.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/AbstractSequentialHeadlessExecutionContext.java
new file mode 100644
index 000000000..35fc5ff94
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/AbstractSequentialHeadlessExecutionContext.java
@@ -0,0 +1,18 @@
+package org.eclipse.gemoc.executionframework.engine.headless;
+
+import org.eclipse.gemoc.executionframework.engine.commons.EngineContextException;
+import org.eclipse.gemoc.executionframework.engine.commons.sequential.ISequentialModelExecutionContext;
+import org.eclipse.gemoc.executionframework.engine.commons.sequential.ISequentialRunConfiguration;
+import org.eclipse.gemoc.xdsmlframework.api.core.ExecutionMode;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionWorkspace;
+import org.eclipse.gemoc.xdsmlframework.api.extensions.languages.LanguageDefinitionExtension;
+
+public abstract class AbstractSequentialHeadlessExecutionContext extends AbstractHeadlessExecutionContext implements ISequentialModelExecutionContext {
+
+ public AbstractSequentialHeadlessExecutionContext(ISequentialRunConfiguration runConfiguration, ExecutionMode executionMode,
+ LanguageDefinitionExtension languageDefinitionExtension, IExecutionWorkspace executionWorkspace, HeadlessExecutionPlatform executionPlatform)
+ throws EngineContextException {
+ super(runConfiguration, executionMode, languageDefinitionExtension, executionWorkspace, executionPlatform);
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/FakeBundleContext.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/FakeBundleContext.java
new file mode 100644
index 000000000..bbbc439e5
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/FakeBundleContext.java
@@ -0,0 +1,193 @@
+package org.eclipse.gemoc.executionframework.engine.headless;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Dictionary;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceObjects;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+public class FakeBundleContext implements BundleContext {
+
+ @Override
+ public String getProperty(String key) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle getBundle() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle installBundle(String location, InputStream input) throws BundleException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle installBundle(String location) throws BundleException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle getBundle(long id) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle[] getBundles() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void addServiceListener(ServiceListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void removeServiceListener(ServiceListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void addBundleListener(BundleListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void removeBundleListener(BundleListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void addFrameworkListener(FrameworkListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void removeFrameworkListener(FrameworkListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ServiceRegistration> registerService(String[] clazzes, Object service, Dictionary properties) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServiceRegistration> registerService(String clazz, Object service, Dictionary properties) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServiceRegistration registerService(Class clazz, S service, Dictionary properties) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServiceRegistration registerService(Class clazz, ServiceFactory factory,
+ Dictionary properties) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServiceReference>[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServiceReference>[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServiceReference> getServiceReference(String clazz) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServiceReference getServiceReference(Class clazz) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Collection> getServiceReferences(Class clazz, String filter)
+ throws InvalidSyntaxException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public S getService(ServiceReference reference) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean ungetService(ServiceReference> reference) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public ServiceObjects getServiceObjects(ServiceReference reference) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public File getDataFile(String filename) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Filter createFilter(String filter) throws InvalidSyntaxException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle getBundle(String location) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/FakeOSGI.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/FakeOSGI.java
new file mode 100644
index 000000000..c95257854
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/FakeOSGI.java
@@ -0,0 +1,103 @@
+package org.eclipse.gemoc.executionframework.engine.headless;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.RegistryFactory;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.spi.IRegistryProvider;
+import org.eclipse.core.runtime.spi.RegistryStrategy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FakeOSGI {
+ private static final Logger LOGGER = LoggerFactory.getLogger("FakeOSGI");
+
+
+ public static void start() {
+ // If there isn't already a registry...
+ //
+ IExtensionRegistry registry = RegistryFactory.getRegistry();
+ if (registry == null)
+ {
+ // Create a new registry.
+ //
+ final IExtensionRegistry newRegistry =
+ RegistryFactory.createRegistry
+ (new RegistryStrategy(null, null)
+ {
+ @Override
+ public void log(IStatus status)
+ {
+ switch (status.getSeverity()) {
+ case Status.ERROR:
+ LOGGER.error(status.toString());
+ break;
+ case Status.WARNING:
+ LOGGER.warn(status.toString());
+ break;
+
+ default:
+ LOGGER.info(status.toString());
+ break;
+
+ }
+ }
+
+ @Override
+ public String translate(String key, ResourceBundle resources)
+ {
+ try
+ {
+ // The org.eclipse.core.resources bundle has keys that aren't translated, so avoid exception propagation.
+ //
+ return super.translate(key, resources);
+ }
+ catch (Throwable throwable)
+ {
+ return key;
+ }
+ }
+ },
+ null,
+ null);
+
+ // Make the new registry the default.
+ //
+ try
+ {
+ RegistryFactory.setDefaultRegistryProvider
+ (new IRegistryProvider()
+ {
+ public IExtensionRegistry getRegistry()
+ {
+ return newRegistry;
+ }
+ });
+ }
+ catch (CoreException e)
+ {
+ LOGGER.error(e.getMessage(), e);
+ }
+
+ registry = newRegistry;
+ }
+
+
+ org.eclipse.gemoc.executionframework.engine.Activator activator = new org.eclipse.gemoc.executionframework.engine.Activator();
+ org.eclipse.gemoc.executionframework.debugger.Activator activatorDebug = new org.eclipse.gemoc.executionframework.debugger.Activator();
+ org.eclipse.gemoc.trace.gemoc.Activator activatorTrace = new org.eclipse.gemoc.trace.gemoc.Activator();
+ FakeBundleContext context = new FakeBundleContext();
+ try {
+ activator.start(context);
+ activatorDebug.start(context);
+ activatorTrace.start(context);
+ } catch (Exception e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessExecutionPlatform.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessExecutionPlatform.java
new file mode 100644
index 000000000..531f28933
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessExecutionPlatform.java
@@ -0,0 +1,61 @@
+package org.eclipse.gemoc.executionframework.engine.headless;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionPlatform;
+import org.eclipse.gemoc.xdsmlframework.api.core.IModelLoader;
+import org.eclipse.gemoc.xdsmlframework.api.engine_addon.EngineAddonSortingRule.EngineEvent;
+import org.eclipse.gemoc.xdsmlframework.api.engine_addon.IEngineAddon;
+
+public class HeadlessExecutionPlatform implements IExecutionPlatform {
+
+
+ protected Collection _addons = new ArrayList();
+
+ @Override
+ public void dispose() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public IModelLoader getModelLoader() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ private Object _addonLock = new Object();
+
+ @Override
+ public void addEngineAddon(IEngineAddon addon) {
+ synchronized (_addonLock) {
+ _addons.add(addon);
+ }
+ }
+
+ @Override
+ public void removeEngineAddon(IEngineAddon addon) {
+ synchronized (_addonLock) {
+ _addons.remove(addon);
+ }
+ }
+
+
+ @Override
+ public Iterable getEngineAddons() {
+ synchronized (_addonLock) {
+ return Collections.unmodifiableCollection(new ArrayList(_addons));
+ }
+ }
+
+ @Override
+ public List getSortedEngineAddons(EngineEvent engineEvent) {
+ synchronized (_addonLock) {
+ return Collections.unmodifiableList(new ArrayList(_addons));
+ }
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessExecutionWorkspace.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessExecutionWorkspace.java
new file mode 100644
index 000000000..9f2646574
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessExecutionWorkspace.java
@@ -0,0 +1,45 @@
+package org.eclipse.gemoc.executionframework.engine.headless;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionWorkspace;
+
+public class HeadlessExecutionWorkspace implements IExecutionWorkspace {
+
+ @Override
+ public IPath getProjectPath() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public IPath getModelPath() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public IPath getMoCPath() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public IPath getMSEModelPath() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public IPath getExecutionPath() {
+ return new Path(System.getProperty("user.home")).append("gemoc_headless_execution");
+ }
+
+ @Override
+ public void copyFileToExecutionFolder(IPath filePath) throws CoreException {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessJavaEngineSequentialRunConfiguration.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessJavaEngineSequentialRunConfiguration.java
new file mode 100644
index 000000000..0116de12c
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.headless/src/main/java/org/eclipse/gemoc/executionframework/engine/headless/HeadlessJavaEngineSequentialRunConfiguration.java
@@ -0,0 +1,111 @@
+package org.eclipse.gemoc.executionframework.engine.headless;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.gemoc.executionframework.engine.commons.sequential.ISequentialRunConfiguration;
+import org.eclipse.gemoc.xdsmlframework.api.extensions.engine_addon.EngineAddonSpecificationExtension;
+
+public class HeadlessJavaEngineSequentialRunConfiguration implements ISequentialRunConfiguration {
+
+ URI modelURI;
+ String languageName;
+ String modelEntryPoint;
+ String methodEntryPoint;
+ String initializationMethod;
+ String initializationMethodArgs;
+ public HeadlessJavaEngineSequentialRunConfiguration(URI modelURI, String languageName, String modelEntryPoint,
+ String methodEntryPoint, String initializationMethod, String initializationMethodArgs) {
+ this.modelURI = modelURI;
+ this.languageName = languageName;
+ this.modelEntryPoint = modelEntryPoint;
+ this.methodEntryPoint = methodEntryPoint;
+ this.initializationMethod = initializationMethod;
+ this.initializationMethodArgs = initializationMethodArgs;
+ }
+
+ @Override
+ public int getAnimationDelay() {
+ return 0;
+ }
+
+ @Override
+ public URI getAnimatorURI() {
+ return null;
+ }
+
+ @Override
+ public boolean getBreakStart() {
+ return false;
+ }
+
+ @Override
+ public String getDebugModelID() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Collection getEngineAddonExtensions() {
+ return null;
+ }
+
+ @Override
+ public URI getExecutedModelAsMelangeURI() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public URI getExecutedModelURI() {
+ return modelURI;
+ }
+
+ @Override
+ public String getLanguageName() {
+ return this.languageName;
+ }
+
+ @Override
+ public String getMelangeQuery() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getExecutionEntryPoint() {
+ return this.methodEntryPoint;
+ }
+
+ @Override
+ public String getModelEntryPoint() {
+ return this.modelEntryPoint;
+ }
+
+ @Override
+ public String getModelInitializationMethod() {
+ return this.initializationMethod;
+ }
+
+ @Override
+ public String getModelInitializationArguments() {
+ return this.initializationMethodArgs;
+ }
+
+
+ public String getAttribute(String attributeName, String defaultValue) {
+ // there is no addon in this mode, so return the default value
+ return defaultValue;
+ }
+
+ public Integer getAttribute(String attributeName, Integer defaultValue) {
+ // there is no addon in this mode, so return the default value
+ return defaultValue;
+ }
+
+ public Boolean getAttribute(String attributeName, Boolean defaultValue) {
+ // there is no addon in this mode, so return the default value
+ return defaultValue;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.mep/.project b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.mep/.project
new file mode 100644
index 000000000..7b38d846b
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.engine.mep/.project
@@ -0,0 +1,29 @@
+
+
+ org.eclipse.gemoc.executionframework.engine.mep
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.xtext.ui.shared.xtextNature
+
+
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.classpath b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.classpath
new file mode 100644
index 000000000..002ad570e
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.classpath
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.project b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.project
new file mode 100644
index 000000000..c2f06ef95
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.project
@@ -0,0 +1,29 @@
+
+
+ org.eclipse.gemoc.executionframework.mep
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.xtext.ui.shared.xtextNature
+
+
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.core.resources.prefs b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 000000000..989609020
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/=UTF-8
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.jdt.core.prefs b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..b8947ec6f
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.xtend.core.Xtend.prefs b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 000000000..9682a4c0a
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,7 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/main/java.directory=xtend-gen
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/META-INF/MANIFEST.MF b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..2ad0bfe21
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mep
+Bundle-SymbolicName: org.eclipse.gemoc.executionframework.mep
+Bundle-Version: 1.0.0.qualifier
+Export-Package: org.eclipse.gemoc.executionframework.mep.engine,
+ org.eclipse.gemoc.executionframework.mep.events,
+ org.eclipse.gemoc.executionframework.mep.launch,
+ org.eclipse.gemoc.executionframework.mep.services,
+ org.eclipse.gemoc.executionframework.mep.types
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/build.properties b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/build.properties
new file mode 100644
index 000000000..80bc25000
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/build.properties
@@ -0,0 +1,6 @@
+source.. = src/main/java/,\
+ src/main/resources/,\
+ src/test/java/,\
+ src/test/resources/
+bin.includes = META-INF/,\
+ .
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/pom.xml b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/pom.xml
new file mode 100644
index 000000000..5d0171502
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/pom.xml
@@ -0,0 +1,118 @@
+
+ 4.0.0
+ org.eclipse.gemoc.executionframework
+ org.eclipse.gemoc.executionframework.mep
+ 1.0.0-SNAPSHOT
+
+
+
+ org.eclipse.gemoc.executionframework
+ org.eclipse.gemoc.executionframework.pomfirst
+ 1.0.0-SNAPSHOT
+
+
+
+ 1.8
+ 1.8
+ 2.22.0
+ 0.21.1
+ 2.18.0
+ 0.10.0
+
+
+
+
+
+
+ org.eclipse.xtext
+ org.eclipse.xtext
+ ${xtend.version}
+
+
+
+ org.eclipse.lsp4j
+ org.eclipse.lsp4j.debug
+ ${lsp4j.version}
+
+
+ org.eclipse.lsp4j
+ org.eclipse.lsp4j.jsonrpc
+ ${lsp4j.version}
+
+
+ org.eclipse.emf
+ org.eclipse.emf.edit
+ 2.16.0
+
+
+ org.eclipse.lsp4j
+ org.eclipse.lsp4j.jsonrpc
+ 0.8.0
+
+
+
+ org.eclipse.emf
+ org.eclipse.emf.edit
+ 2.16.0
+
+
+
+ org.eclipse.gemoc.modeldebugging.framework.commons
+ org.eclipse.gemoc.xdsmlframework.api
+ 4.0.0-SNAPSHOT
+
+
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.executionframework.engine
+ 4.0.0-SNAPSHOT
+
+
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.executionframework.debugger
+ 4.0.0-SNAPSHOT
+
+
+
+ org.eclipse.gemoc.trace.commons
+ org.eclipse.gemoc.trace.gemoc.api
+ 3.0.1-SNAPSHOT
+
+
+
+ DSLDebugger
+ org.eclipse.gemoc.dsl.debug.ide
+ 3.0.1-SNAPSHOT
+
+
+
+ org.eclipse.gemoc.multidimensional_trace_management
+ org.eclipse.gemoc.trace.gemoc
+ 3.0.1-SNAPSHOT
+
+
+
+ org.emfjson
+ emfjson-jackson
+ 1.3.0
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.12.1
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/ExecutionEngineSingleton.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/ExecutionEngineSingleton.java
new file mode 100644
index 000000000..625516d8b
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/ExecutionEngineSingleton.java
@@ -0,0 +1,34 @@
+package org.eclipse.gemoc.executionframework.mep.engine;
+
+
+import java.util.concurrent.Semaphore;
+
+public class ExecutionEngineSingleton {
+
+ private static volatile IMEPEngine engine = null;
+ private static volatile Semaphore semaphore = new Semaphore(0);
+
+ public static void setEngine(IMEPEngine engine) {
+ if (ExecutionEngineSingleton.engine == null) {
+ ExecutionEngineSingleton.engine = engine;
+ semaphore.release();
+ }
+ }
+
+ public static IMEPEngine acquireEngine() {
+ try {
+ semaphore.acquire();
+ return engine;
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static void releaseEngine() {
+ if (engine != null) {
+ semaphore.release();
+ }
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/IMEPEngine.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/IMEPEngine.java
new file mode 100644
index 000000000..2116f3388
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/IMEPEngine.java
@@ -0,0 +1,41 @@
+package org.eclipse.gemoc.executionframework.mep.engine;
+
+import org.eclipse.gemoc.executionframework.debugger.IGemocDebugger;
+import org.eclipse.gemoc.executionframework.mep.launch.MEPLauncherParameters;
+import org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint;
+import org.eclipse.gemoc.executionframework.mep.types.StackFrame;
+import org.eclipse.gemoc.executionframework.mep.types.Variable;
+
+public interface IMEPEngine {
+
+ abstract void internalLaunchEngine(MEPLauncherParameters launchParameters);
+
+ abstract void internalNext();
+
+ abstract void internalStepIn();
+
+ abstract void internalStepOut();
+
+ abstract void internalSetBreakpoints(SourceBreakpoint[] breakpoints);
+
+ abstract void internalTerminate();
+
+ abstract void internalContinue();
+
+ abstract Variable[] internalVariables();
+
+ abstract StackFrame[] internalStackTrace();
+
+ abstract String internalSource();
+
+ abstract void addMEPEventListener(IMEPEventListener listener);
+
+ abstract void removeMEPEventListener(IMEPEventListener listener);
+
+ abstract void removeAllMEPEventListeners();
+
+ default IGemocDebugger getDebugger() {
+ return null;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/IMEPEventListener.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/IMEPEventListener.java
new file mode 100644
index 000000000..f6d8bd5ce
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/IMEPEventListener.java
@@ -0,0 +1,14 @@
+package org.eclipse.gemoc.executionframework.mep.engine;
+
+import java.util.EventListener;
+
+import org.eclipse.gemoc.executionframework.mep.events.Output;
+import org.eclipse.gemoc.executionframework.mep.events.Stopped;
+
+public interface IMEPEventListener extends EventListener {
+
+ abstract void outputReceived(Output event);
+
+ abstract void stopReceived(Stopped event);
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/MEPEvent.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/MEPEvent.java
new file mode 100644
index 000000000..5aac5d173
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/engine/MEPEvent.java
@@ -0,0 +1,11 @@
+package org.eclipse.gemoc.executionframework.mep.engine;
+
+import java.util.EventObject;
+
+public class MEPEvent extends EventObject {
+
+ public MEPEvent(Object source) {
+ super(source);
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/Output.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/Output.java
new file mode 100644
index 000000000..c4e6dff40
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/Output.java
@@ -0,0 +1,18 @@
+package org.eclipse.gemoc.executionframework.mep.events;
+
+import org.eclipse.gemoc.executionframework.mep.engine.MEPEvent;
+
+public class Output extends MEPEvent {
+
+ private String output;
+
+ public Output(Object source, String output) {
+ super(source);
+ this.output = output;
+ }
+
+ public String getOutput() {
+ return output;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/Stopped.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/Stopped.java
new file mode 100644
index 000000000..e9187e7a9
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/Stopped.java
@@ -0,0 +1,18 @@
+package org.eclipse.gemoc.executionframework.mep.events;
+
+import org.eclipse.gemoc.executionframework.mep.engine.MEPEvent;
+
+public class Stopped extends MEPEvent {
+
+ private StoppedReason reason;
+
+ public Stopped(Object source, StoppedReason reason) {
+ super(source);
+ this.reason = reason;
+ }
+
+ public StoppedReason getReason() {
+ return reason;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/StoppedReason.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/StoppedReason.java
new file mode 100644
index 000000000..b84c246b2
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/events/StoppedReason.java
@@ -0,0 +1,19 @@
+package org.eclipse.gemoc.executionframework.mep.events;
+
+public enum StoppedReason {
+ REACHED_BREAKPOINT ("breakpoint"),
+ REACHED_NEXT_LOGICAL_STEP ("step"),
+ REACHED_SIMULATION_END ("end"),
+ TIME ("time");
+
+ private final String reason;
+
+ private StoppedReason(String reason) {
+ this.reason = reason;
+ }
+
+ @Override
+ public String toString() {
+ return this.reason;
+ }
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLaunchParameterKey.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLaunchParameterKey.java
new file mode 100644
index 000000000..74a308dfa
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLaunchParameterKey.java
@@ -0,0 +1,15 @@
+package org.eclipse.gemoc.executionframework.mep.launch;
+
+public enum MEPLaunchParameterKey {
+ noDebug,
+ modelContent,
+ modelURI,
+ workspaceLocation, // location of the eclipse workspace on the server ie. for resolution of platform:/resource uri
+ language,
+ modelEntryPoint,
+ methodEntryPoint,
+ initializationMethod,
+ initializationArguments
+
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLauncher.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLauncher.java
new file mode 100644
index 000000000..d07c01841
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLauncher.java
@@ -0,0 +1,224 @@
+package org.eclipse.gemoc.executionframework.mep.launch;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.debug.json.DebugMessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+
+import com.google.gson.GsonBuilder;
+
+/**
+ * Specialized launcher for the MEP Server Protocol.
+ */
+public class MEPLauncher {
+
+ private MEPLauncher() {}
+
+
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ */
+ public static Launcher createLauncher(Object localService, Class remoteInterface, InputStream in,
+ OutputStream out) {
+ return new Builder()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream, and set up message validation and
+ * tracing.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param validate
+ * - whether messages should be validated with the
+ * {@link ReflectiveMessageValidator}
+ * @param trace
+ * - a writer to which incoming and outgoing messages are traced, or
+ * {@code null} to disable tracing
+ */
+ public static Launcher createLauncher(Object localService, Class remoteInterface, InputStream in,
+ OutputStream out, boolean validate, PrintWriter trace) {
+ return new Builder()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .validateMessages(validate)
+ .traceMessages(trace)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation
+ * and tracing can be included.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param executorService
+ * - the executor service used to start threads
+ * @param wrapper
+ * - a function for plugging in additional message consumers
+ */
+ public static Launcher createLauncher(Object localService, Class remoteInterface, InputStream in,
+ OutputStream out, ExecutorService executorService, Function wrapper) {
+ return createIoLauncher(localService, remoteInterface, in, out, executorService, wrapper);
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation
+ * and tracing can be included.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param executorService
+ * - the executor service used to start threads
+ * @param wrapper
+ * - a function for plugging in additional message consumers
+ */
+ public static Launcher createIoLauncher(Object localService, Class remoteInterface, InputStream in,
+ OutputStream out, ExecutorService executorService, Function wrapper) {
+ return new Builder()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation
+ * and tracing can be included. The {@code configureGson} function can be used
+ * to register additional type adapters in the {@link GsonBuilder} in order to
+ * support protocol classes that cannot be handled by Gson's reflective
+ * capabilities.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param executorService
+ * - the executor service used to start threads
+ * @param wrapper
+ * - a function for plugging in additional message consumers
+ * @param configureGson
+ * - a function for Gson configuration
+ */
+ public static Launcher createIoLauncher(Object localService, Class remoteInterface, InputStream in,
+ OutputStream out, ExecutorService executorService, Function wrapper,
+ Consumer configureGson) {
+ return new Builder()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .configureGson(configureGson)
+ .create();
+ }
+
+ /**
+ * Launcher builder for the debug protocol. Adapts the JSON-RPC message classes to the JSON format used
+ * by the debug protocol.
+ */
+ public static class Builder extends Launcher.Builder {
+
+ @Override
+ protected MessageJsonHandler createJsonHandler() {
+ Map supportedMethods = getSupportedMethods();
+ if (configureGson != null)
+ return new DebugMessageJsonHandler(supportedMethods, configureGson);
+ else
+ return new DebugMessageJsonHandler(supportedMethods);
+ }
+
+ @Override
+ protected RemoteEndpoint createRemoteEndpoint(MessageJsonHandler jsonHandler) {
+ try {
+ MessageConsumer outgoingMessageStream = new StreamMessageConsumer(output, jsonHandler);
+ outgoingMessageStream = wrapMessageConsumer(outgoingMessageStream);
+ Endpoint localEndpoint = ServiceEndpoints.toEndpoint(localServices);
+ RemoteEndpoint remoteEndpoint;
+
+ // !!!! nosuchfieldException that is trapped by quarkus
+ // check if this is a version issue ?
+ if (exceptionHandler == null)
+ remoteEndpoint = new MEPRemoteEndpoint(outgoingMessageStream, localEndpoint);
+ else
+ remoteEndpoint = new MEPRemoteEndpoint(outgoingMessageStream, localEndpoint, exceptionHandler);
+ jsonHandler.setMethodProvider(remoteEndpoint);
+ return remoteEndpoint;
+ } catch (Exception e) {
+ System.out.println(" issue in createRemoteEndpoint"+e);
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLauncherParameters.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLauncherParameters.java
new file mode 100644
index 000000000..6984f2c8f
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPLauncherParameters.java
@@ -0,0 +1,14 @@
+package org.eclipse.gemoc.executionframework.mep.launch;
+
+import org.eclipse.emf.ecore.resource.Resource;
+
+public class MEPLauncherParameters {
+
+ public String languageName = "";
+ public Resource resourceModel = null;
+ public String modelEntryPoint = "";
+ public String methodEntryPoint = "";
+ public String initializationMethod = "";
+ public String initializationMethodArgs = "";
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPRemoteEndpoint.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPRemoteEndpoint.java
new file mode 100644
index 000000000..dd9d7a50f
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPRemoteEndpoint.java
@@ -0,0 +1,21 @@
+package org.eclipse.gemoc.executionframework.mep.launch;
+
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.debug.DebugRemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+
+public class MEPRemoteEndpoint extends DebugRemoteEndpoint {
+
+ public MEPRemoteEndpoint(MessageConsumer out, Endpoint localEndpoint) {
+ super(out, localEndpoint);
+ }
+
+ public MEPRemoteEndpoint(MessageConsumer out, Endpoint localEndpoint,
+ Function exceptionHandler) {
+ super(out, localEndpoint, exceptionHandler);
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPServerLSP4J.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPServerLSP4J.java
new file mode 100644
index 000000000..eb93d105a
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/MEPServerLSP4J.java
@@ -0,0 +1,560 @@
+package org.eclipse.gemoc.executionframework.mep.launch;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.gemoc.executionframework.mep.engine.ExecutionEngineSingleton;
+import org.eclipse.gemoc.executionframework.mep.engine.IMEPEventListener;
+import org.eclipse.gemoc.executionframework.mep.events.Output;
+import org.eclipse.gemoc.executionframework.mep.events.Stopped;
+import org.eclipse.gemoc.executionframework.mep.events.StoppedReason;
+import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient;
+import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolServer;
+import org.eclipse.gemoc.executionframework.mep.services.ModelExecutionClientAware;
+import org.eclipse.lsp4j.debug.Breakpoint;
+import org.eclipse.lsp4j.debug.Capabilities;
+import org.eclipse.lsp4j.debug.ContinueArguments;
+import org.eclipse.lsp4j.debug.ContinueResponse;
+import org.eclipse.lsp4j.debug.InitializeRequestArguments;
+import org.eclipse.lsp4j.debug.NextArguments;
+import org.eclipse.lsp4j.debug.OutputEventArguments;
+import org.eclipse.lsp4j.debug.RestartArguments;
+import org.eclipse.lsp4j.debug.SetBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SourceArguments;
+import org.eclipse.lsp4j.debug.SourceBreakpoint;
+import org.eclipse.lsp4j.debug.SourceResponse;
+import org.eclipse.lsp4j.debug.StackFrame;
+import org.eclipse.lsp4j.debug.StackTraceArguments;
+import org.eclipse.lsp4j.debug.StackTraceResponse;
+import org.eclipse.lsp4j.debug.StepInArguments;
+import org.eclipse.lsp4j.debug.StepOutArguments;
+import org.eclipse.lsp4j.debug.StoppedEventArguments;
+import org.eclipse.lsp4j.debug.TerminateArguments;
+import org.eclipse.lsp4j.debug.TerminatedEventArguments;
+import org.eclipse.lsp4j.debug.Variable;
+import org.eclipse.lsp4j.debug.VariablesArguments;
+import org.eclipse.lsp4j.debug.VariablesResponse;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.ResponseErrorException;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Multimap;
+
+abstract public class MEPServerLSP4J implements IModelExecutionProtocolServer, Endpoint, JsonRpcMethodProvider, ModelExecutionClientAware, IMEPEventListener {
+
+ private static final Logger LOG = Logger.getLogger(MEPServerLSP4J.class);
+
+ private Map supportedMethods;
+
+ private final Set extensions = new HashSet<>();
+ private final Multimap extensionProviders = LinkedListMultimap.create();
+
+ protected IModelExecutionProtocolClient client;
+
+ protected boolean initialized = false;
+ protected boolean simulationStarted = false;
+ protected MEPLauncherParameters launcherParameters = null;
+ protected Breakpoint[] breakpoints = new Breakpoint[0];
+
+ public MEPServerLSP4J() {
+
+ }
+
+ public void init() {
+ ExecutionEngineSingleton.acquireEngine().addMEPEventListener(this);
+ ExecutionEngineSingleton.releaseEngine();
+ }
+
+ public void addExtension(Endpoint extension) {
+ this.extensions.add(extension);
+ }
+
+ @Override
+ public Map supportedMethods() {
+ if (supportedMethods != null) {
+ return supportedMethods;
+ }
+
+ Map supportedMethods = new LinkedHashMap<>();
+ supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(getClass()));
+
+ for(JsonRpcMethod supportedMethod : supportedMethods.values()) {
+ LOG.info("supported method "+supportedMethod.getMethodName()+ " "+supportedMethod.getParameterTypes());
+ }
+
+ Map extensions = new LinkedHashMap<>();
+ for (Endpoint ext : this.extensions) {
+ if (ext != null) {
+ Map supportedExtensions = ext instanceof JsonRpcMethodProvider
+ ? ((JsonRpcMethodProvider) ext).supportedMethods()
+ : ServiceEndpoints.getSupportedMethods(ext.getClass());
+ for (Map.Entry entry : supportedExtensions.entrySet()) {
+ if (supportedMethods.containsKey(entry.getKey())) {
+ LOG.error("The json rpc method \'" + entry.getKey()
+ + "\' can not be an extension as it is already defined in the LSP standard.");
+ } else {
+ JsonRpcMethod existing = extensions.put(entry.getKey(), entry.getValue());
+ if (existing != null && !Objects.equal(existing, entry.getValue())) {
+ LOG.error("An incompatible LSP extension \'" + entry.getKey()
+ + "\' has already been registered. Using 1 ignoring 2. \n1 : " + existing
+ + " \n2 : " + entry.getValue());
+ extensions.put(entry.getKey(), existing);
+ } else {
+ Endpoint endpoint = ServiceEndpoints.toEndpoint(ext);
+ extensionProviders.put(entry.getKey(), endpoint);
+ supportedMethods.put(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ }
+ }
+
+ this.supportedMethods = supportedMethods;
+ return supportedMethods;
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ for (Endpoint endpoint : extensionProviders.get(method)) {
+ endpoint.notify(method, parameter);
+ }
+ LOG.info("notify "+method);
+ }
+
+ @Override
+ public CompletableFuture> request(String method, Object parameter) {
+ if (!extensionProviders.containsKey(method)) {
+ throw new UnsupportedOperationException("The json request \'" + method + "\' is unknown.");
+ }
+ for (Endpoint endpoint : extensionProviders.get(method)) {
+ return endpoint.request(method, parameter);
+ }
+ return null;
+ }
+
+ @Override
+ public void connect(IModelExecutionProtocolClient client) {
+ this.client = client;
+ }
+
+
+
+ // ****************
+ // * DAP protocol *
+ // ****************
+ @Override
+ public CompletableFuture initialize(InitializeRequestArguments args) {
+ LOG.info("CompletableFuture initialize(InitializeRequestArguments args)");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Capabilities get() {
+ if (initialized) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Server already initialized");
+ throw new ResponseErrorException(error);
+ }
+
+ Capabilities capabilities = new Capabilities();
+ capabilities.setSupportsTerminateRequest(true);
+ // TODO declare here DAP capabilities
+
+ client.initialized();
+ initialized = true;
+
+ return capabilities;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture launch(Map args) {
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ if (!initialized) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Server not initialized");
+ throw new ResponseErrorException(error);
+ }
+ if (simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Another simulation is running");
+ throw new ResponseErrorException(error);
+ }
+
+ // TODO launch the engine
+ // throw new Exception("failed to launch with args\'" + args + "\'.");
+ LOG.info("launch received with args "+args);
+
+ launcherParameters = getDefaultLauncherParameters();
+ if (args != null) {
+ if (args.containsKey(MEPLaunchParameterKey.noDebug.name())) {
+ //TODO: Normal launch if true
+ }
+ if (args.containsKey(MEPLaunchParameterKey.modelContent.name())) {
+ try {
+ ResourceSet rs = createResourceSet();
+ InputStream in = new ByteArrayInputStream("type foo type bar".getBytes());
+ launcherParameters.resourceModel = rs.createResource(URI.createURI("dummy:/example.k3fsm"));
+
+ launcherParameters.resourceModel.load(in, rs.getLoadOptions());
+
+ //Model model = (Model) resource.getContents().get(0);
+ LOG.info("root element in model-content is "+launcherParameters.resourceModel.getContents().get(0));
+
+ } catch (IOException e) {
+ LOG.error(e.getMessage(), e);
+ }
+ } else if(args.containsKey(MEPLaunchParameterKey.modelURI.name())) {
+ String modelURIString = (String) args.get(MEPLaunchParameterKey.modelURI.name());
+ URI uri = URI.createURI(modelURIString);
+ ResourceSet rs = createResourceSet();
+ launcherParameters.resourceModel = rs.createResource(uri);
+ try {
+ launcherParameters.resourceModel.load(rs.getLoadOptions());
+ launcherParameters.resourceModel.getContents().get(0);
+ LOG.info("root element in model uri is "+launcherParameters.resourceModel.getContents().get(0));
+ } catch (IOException e) {
+ LOG.error(e.getMessage(), e);
+ }
+ }
+ if(args.containsKey(MEPLaunchParameterKey.language.name())) {
+ launcherParameters.languageName = (String) args.get(MEPLaunchParameterKey.language.name());
+ }
+ if(args.containsKey(MEPLaunchParameterKey.methodEntryPoint.name())) {
+ launcherParameters.methodEntryPoint = (String) args.get(MEPLaunchParameterKey.methodEntryPoint.name());
+ }
+ if(args.containsKey(MEPLaunchParameterKey.initializationMethod.name())) {
+ launcherParameters.initializationMethod = (String) args.get(MEPLaunchParameterKey.initializationMethod.name());
+ }
+ if(args.containsKey(MEPLaunchParameterKey.modelEntryPoint.name())) {
+ launcherParameters.modelEntryPoint = (String) args.get(MEPLaunchParameterKey.modelEntryPoint.name());
+ }
+ if(args.containsKey(MEPLaunchParameterKey.initializationArguments.name())) {
+ launcherParameters.initializationMethodArgs = (String) args.get(MEPLaunchParameterKey.initializationArguments.name());
+ }
+ }
+
+ launchGemocEngine(launcherParameters);
+
+ simulationStarted = true;
+ }
+ });
+
+ return future;
+ }
+
+ @Override
+ public CompletableFuture continue_(ContinueArguments args) {
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public ContinueResponse get() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+
+ ExecutionEngineSingleton.acquireEngine().internalContinue();
+ ExecutionEngineSingleton.releaseEngine();
+
+ ContinueResponse response = new ContinueResponse();
+ return response;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture next(NextArguments args) {
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+
+ ExecutionEngineSingleton.acquireEngine().internalNext();
+ ExecutionEngineSingleton.releaseEngine();
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepIn(StepInArguments args) {
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+
+ ExecutionEngineSingleton.acquireEngine().internalStepIn();
+ ExecutionEngineSingleton.releaseEngine();
+ }
+ });
+ return future;
+ }
+
+ protected void manageStop(StoppedReason stopReason) {
+ switch (stopReason) {
+ case REACHED_BREAKPOINT:
+ StoppedEventArguments stoppedArgsBreakpoint = new StoppedEventArguments();
+ stoppedArgsBreakpoint.setReason(stopReason.toString());
+ stoppedArgsBreakpoint.setDescription("Reached breakpoint");
+ client.stopped(stoppedArgsBreakpoint);
+ break;
+ case REACHED_NEXT_LOGICAL_STEP:
+ StoppedEventArguments stoppedArgsStep = new StoppedEventArguments();
+ stoppedArgsStep.setReason(stopReason.toString());
+ stoppedArgsStep.setDescription("Reached new logical step");
+ client.stopped(stoppedArgsStep);
+ break;
+ case REACHED_SIMULATION_END:
+ TerminatedEventArguments terminatedArgs = new TerminatedEventArguments();
+ client.terminated(terminatedArgs);
+ simulationStarted = false;
+ break;
+ case TIME:
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public CompletableFuture stepOut(StepOutArguments args) {
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+
+ ExecutionEngineSingleton.acquireEngine().internalStepOut();
+ ExecutionEngineSingleton.releaseEngine();
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture setBreakpoints(SetBreakpointsArguments args) {
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public SetBreakpointsResponse get() {
+ //TODO: Manage different sources for breakpoints
+ SetBreakpointsResponse response = new SetBreakpointsResponse();
+
+ List bps = new ArrayList<>();
+ org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint[] mepBreakpoints =
+ new org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint[args.getBreakpoints().length];
+ int i = 0;
+ for (SourceBreakpoint sbp : args.getBreakpoints()) {
+ org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint mepBreakpoint =
+ new org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint(sbp.getLine());
+ mepBreakpoints[i++] = mepBreakpoint;
+ Breakpoint bp = new Breakpoint();
+ bp.setVerified(true);
+ bp.setLine(sbp.getLine());
+ bps.add(bp);
+ }
+ ExecutionEngineSingleton.acquireEngine().internalSetBreakpoints(mepBreakpoints);
+ ExecutionEngineSingleton.releaseEngine();
+ breakpoints = bps.toArray(new Breakpoint[0]);
+ response.setBreakpoints(breakpoints);
+
+ return response;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture restart(RestartArguments args) {
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ if (launcherParameters == null) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation was not started before");
+ throw new ResponseErrorException(error);
+ }
+ if (simulationStarted) {
+ ExecutionEngineSingleton.acquireEngine().internalTerminate();
+ ExecutionEngineSingleton.releaseEngine();
+ simulationStarted = false;
+ }
+ launchGemocEngine(launcherParameters);
+ simulationStarted = true;
+ org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint mepBreakpoints[] =
+ new org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint[breakpoints.length];
+ int i = 0;
+ for (Breakpoint bp : breakpoints) {
+ mepBreakpoints[i++] = new org.eclipse.gemoc.executionframework.mep.types.SourceBreakpoint(bp.getLine().intValue());
+ }
+ ExecutionEngineSingleton.acquireEngine().internalSetBreakpoints(mepBreakpoints);
+ ExecutionEngineSingleton.releaseEngine();
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stackTrace(StackTraceArguments args) {
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public StackTraceResponse get() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+ StackTraceResponse response = new StackTraceResponse();
+ org.eclipse.gemoc.executionframework.mep.types.StackFrame[] mepFrames = ExecutionEngineSingleton.acquireEngine().internalStackTrace();
+ ExecutionEngineSingleton.releaseEngine();
+ StackFrame[] dapFrames = new StackFrame[mepFrames.length];
+ int i = 0;
+ for (org.eclipse.gemoc.executionframework.mep.types.StackFrame mepFrame : mepFrames) {
+ StackFrame dapFrame = new StackFrame();
+ dapFrame.setId((int) mepFrame.getId());
+ dapFrame.setName(mepFrame.getName());
+ dapFrame.setLine((int) mepFrame.getLine());
+ dapFrame.setColumn((int) mepFrame.getColumn());
+ dapFrames[i++] = dapFrame;
+ }
+ response.setStackFrames(dapFrames);
+ return response;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture variables(VariablesArguments args) {
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public VariablesResponse get() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+ VariablesResponse response = new VariablesResponse();
+ org.eclipse.gemoc.executionframework.mep.types.Variable[] mepVariables = ExecutionEngineSingleton.acquireEngine().internalVariables();
+ ExecutionEngineSingleton.releaseEngine();
+ Variable[] dapVariables = new Variable[mepVariables.length];
+ int i = 0;
+ for (org.eclipse.gemoc.executionframework.mep.types.Variable mepVariable : mepVariables) {
+ Variable dapVariable = new Variable();
+ dapVariable.setName(mepVariable.getName());
+ dapVariable.setValue(mepVariable.getValue());
+ dapVariables[i++] = dapVariable;
+ }
+ response.setVariables(dapVariables);
+ return response;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture source(SourceArguments args) {
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public SourceResponse get() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+ SourceResponse response = new SourceResponse();
+ response.setContent(ExecutionEngineSingleton.acquireEngine().internalSource());
+ ExecutionEngineSingleton.releaseEngine();
+ return response;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture terminate(TerminateArguments args) {
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ if (!simulationStarted) {
+ ResponseError error = new ResponseError();
+ error.setMessage("Simulation not started");
+ throw new ResponseErrorException(error);
+ }
+ ExecutionEngineSingleton.acquireEngine().internalTerminate();
+ ExecutionEngineSingleton.releaseEngine();
+ simulationStarted = false;
+ }
+ });
+ return future;
+ }
+
+ public void sendOutput(String output) {
+ OutputEventArguments args = new OutputEventArguments();
+ args.setCategory("stdout");
+ args.setOutput(output);
+ client.output(args);
+ }
+
+ /**
+ * create a resource set
+ * by default it only allows to load xmi models
+ * @return
+ */
+ public ResourceSet createResourceSet() {
+ //ResourceSetFactory.createFactory().createResourceSet(modelURI);
+ return new ResourceSetImpl();
+ }
+
+ public MEPLauncherParameters getDefaultLauncherParameters() {
+ return new MEPLauncherParameters();
+ }
+
+ public void launchGemocEngine(MEPLauncherParameters parameters) {
+ ExecutionEngineSingleton.acquireEngine().internalLaunchEngine(parameters);
+ ExecutionEngineSingleton.releaseEngine();
+ }
+
+ @Override
+ public void outputReceived(Output event) {
+ this.sendOutput(event.getOutput());
+ }
+
+ @Override
+ public void stopReceived(Stopped event) {
+ this.manageStop(event.getReason());
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/ModelLoadingMethod.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/ModelLoadingMethod.java
new file mode 100644
index 000000000..abe2f12d2
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/launch/ModelLoadingMethod.java
@@ -0,0 +1,6 @@
+package org.eclipse.gemoc.executionframework.mep.launch;
+
+public enum ModelLoadingMethod {
+ uri,
+ modelFileContent
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/IOmniscientDebugProtocolClient.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/IOmniscientDebugProtocolClient.java
new file mode 100644
index 000000000..d96ba8913
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/IOmniscientDebugProtocolClient.java
@@ -0,0 +1,5 @@
+package org.eclipse.gemoc.executionframework.mep.omniscient;
+
+public interface IOmniscientDebugProtocolClient {
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/IOmniscientDebugProtocolServer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/IOmniscientDebugProtocolServer.java
new file mode 100644
index 000000000..382c650a7
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/IOmniscientDebugProtocolServer.java
@@ -0,0 +1,39 @@
+package org.eclipse.gemoc.executionframework.mep.omniscient;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+
+public interface IOmniscientDebugProtocolServer {
+
+ @JsonRequest
+ default CompletableFuture stepBackInto() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepBackOver() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepBackOut() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture canStepBackInto() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture canStepBackOver() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture canStepBackOut() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/OmniscientDebugProtocolClientAware.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/OmniscientDebugProtocolClientAware.java
new file mode 100644
index 000000000..b6a816bd5
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/OmniscientDebugProtocolClientAware.java
@@ -0,0 +1,6 @@
+package org.eclipse.gemoc.executionframework.mep.omniscient;
+
+public interface OmniscientDebugProtocolClientAware {
+
+ void connect(IOmniscientDebugProtocolClient client);
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/OmniscientDebugProtocolServer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/OmniscientDebugProtocolServer.java
new file mode 100644
index 000000000..c5d38fb2f
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/omniscient/OmniscientDebugProtocolServer.java
@@ -0,0 +1,165 @@
+package org.eclipse.gemoc.executionframework.mep.omniscient;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.log4j.Logger;
+import org.eclipse.gemoc.executionframework.debugger.IGemocDebugger;
+import org.eclipse.gemoc.executionframework.debugger.OmniscientGenericSequentialModelDebugger;
+import org.eclipse.gemoc.executionframework.mep.engine.ExecutionEngineSingleton;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+
+import com.google.common.base.Supplier;
+
+public class OmniscientDebugProtocolServer
+ implements Endpoint, IOmniscientDebugProtocolServer, JsonRpcMethodProvider, OmniscientDebugProtocolClientAware {
+
+ private static final Logger LOG = Logger.getLogger(OmniscientDebugProtocolServer.class);
+
+ private IOmniscientDebugProtocolClient client;
+
+ private Map supportedMethods;
+
+ public OmniscientDebugProtocolServer() {
+
+ }
+
+ @Override
+ public CompletableFuture canStepBackInto() {
+ LOG.info("canStepBackInto");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IGemocDebugger debugger = ExecutionEngineSingleton.acquireEngine().getDebugger();
+ if (debugger instanceof OmniscientGenericSequentialModelDebugger) {
+ result = ((OmniscientGenericSequentialModelDebugger) debugger).canStepBackInto();
+ }
+ ExecutionEngineSingleton.releaseEngine();
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture canStepBackOut() {
+ LOG.info("canStepBackOut");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IGemocDebugger debugger = ExecutionEngineSingleton.acquireEngine().getDebugger();
+ if (debugger instanceof OmniscientGenericSequentialModelDebugger) {
+ result = ((OmniscientGenericSequentialModelDebugger) debugger).canStepBackOut();
+ }
+ ExecutionEngineSingleton.releaseEngine();
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture canStepBackOver() {
+ LOG.info("canStepBackOver");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IGemocDebugger debugger = ExecutionEngineSingleton.acquireEngine().getDebugger();
+ if (debugger instanceof OmniscientGenericSequentialModelDebugger) {
+ result = ((OmniscientGenericSequentialModelDebugger) debugger).canStepBackOver();
+ }
+ ExecutionEngineSingleton.releaseEngine();
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public void connect(IOmniscientDebugProtocolClient client) {
+ this.client = client;
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ LOG.info("notify " + method);
+ }
+
+ @Override
+ public CompletableFuture> request(String method, Object parameter) {
+ throw new UnsupportedOperationException("The json request \'" + method + "\' is unknown.");
+ }
+
+ @Override
+ public CompletableFuture stepBackInto() {
+ LOG.info("stepBackInto");
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ IGemocDebugger debugger = ExecutionEngineSingleton.acquireEngine().getDebugger();
+ if (debugger instanceof OmniscientGenericSequentialModelDebugger) {
+ ((OmniscientGenericSequentialModelDebugger) debugger).stepBackInto();
+ }
+ ExecutionEngineSingleton.releaseEngine();
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepBackOut() {
+ LOG.info("stepBackOut");
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ IGemocDebugger debugger = ExecutionEngineSingleton.acquireEngine().getDebugger();
+ if (debugger instanceof OmniscientGenericSequentialModelDebugger) {
+ ((OmniscientGenericSequentialModelDebugger) debugger).stepBackOut();
+ }
+ ExecutionEngineSingleton.releaseEngine();
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepBackOver() {
+ LOG.info("stepBackOver");
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ IGemocDebugger debugger = ExecutionEngineSingleton.acquireEngine().getDebugger();
+ if (debugger instanceof OmniscientGenericSequentialModelDebugger) {
+ ((OmniscientGenericSequentialModelDebugger) debugger).stepBackOver();
+ }
+ ExecutionEngineSingleton.releaseEngine();
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public Map supportedMethods() {
+ if (supportedMethods != null) {
+ return supportedMethods;
+ }
+
+ Map supportedMethods = new LinkedHashMap<>();
+ supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(getClass()));
+
+ for (JsonRpcMethod supportedMethod : supportedMethods.values()) {
+ LOG.info("supported method " + supportedMethod.getMethodName() + " " + supportedMethod.getParameterTypes());
+ }
+
+ this.supportedMethods = supportedMethods;
+ return supportedMethods;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/IModelExecutionProtocolClient.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/IModelExecutionProtocolClient.java
new file mode 100644
index 000000000..e84d234b7
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/IModelExecutionProtocolClient.java
@@ -0,0 +1,12 @@
+package org.eclipse.gemoc.executionframework.mep.services;
+
+import org.eclipse.lsp4j.debug.services.IDebugProtocolClient;
+
+/**
+ * Declaration of client notifications for the
+ * Debug Adapter
+ * Protocol and its Model Execution Protocol extension
+ */
+public interface IModelExecutionProtocolClient extends IDebugProtocolClient {
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/IModelExecutionProtocolServer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/IModelExecutionProtocolServer.java
new file mode 100644
index 000000000..ac3728cda
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/IModelExecutionProtocolServer.java
@@ -0,0 +1,12 @@
+package org.eclipse.gemoc.executionframework.mep.services;
+
+import org.eclipse.lsp4j.debug.services.IDebugProtocolServer;
+
+/**
+ * Declaration of server requests for the
+ * Debug Adapter
+ * Protocol extended with Model Execution Protocol
+ */
+public interface IModelExecutionProtocolServer extends IDebugProtocolServer {
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/ModelExecutionClientAware.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/ModelExecutionClientAware.java
new file mode 100644
index 000000000..64bcc6107
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/services/ModelExecutionClientAware.java
@@ -0,0 +1,6 @@
+package org.eclipse.gemoc.executionframework.mep.services;
+
+public interface ModelExecutionClientAware {
+
+ void connect(IModelExecutionProtocolClient client);
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/IRemoteTraceAddon.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/IRemoteTraceAddon.java
new file mode 100644
index 000000000..15d5ef911
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/IRemoteTraceAddon.java
@@ -0,0 +1,21 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import org.eclipse.gemoc.trace.commons.model.trace.Dimension;
+import org.eclipse.gemoc.trace.commons.model.trace.State;
+import org.eclipse.gemoc.trace.commons.model.trace.Step;
+import org.eclipse.gemoc.trace.commons.model.trace.TracedObject;
+import org.eclipse.gemoc.trace.commons.model.trace.Value;
+import org.eclipse.gemoc.trace.gemoc.api.ITraceExplorer;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionContext;
+
+public interface IRemoteTraceAddon {
+
+ void engineAboutToStart(IExecutionContext, ?, ?> context);
+
+ void aboutToExecuteStep(Step> step);
+
+ void stepExecuted(Step> step);
+
+ void setTraceExplorer(ITraceExplorer, State, ?>, TracedObject>, Dimension>, Value>> traceExplorer);
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/IRemoteTraceExplorer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/IRemoteTraceExplorer.java
new file mode 100644
index 000000000..f35a8c84a
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/IRemoteTraceExplorer.java
@@ -0,0 +1,12 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+
+public interface IRemoteTraceExplorer {
+
+ void addTraceExplorerEventListener(ITraceExplorerEventListener listener);
+
+ void removeTraceExplorerEventListener(ITraceExplorerEventListener listener);
+
+ void removeAllTraceExplorerEventListeners();
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerEventListener.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerEventListener.java
new file mode 100644
index 000000000..e13c5e933
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerEventListener.java
@@ -0,0 +1,9 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.EventListener;
+
+public interface ITraceExplorerEventListener extends EventListener {
+
+ abstract void updatedCallStack();
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerProtocolClient.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerProtocolClient.java
new file mode 100644
index 000000000..c203387ce
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerProtocolClient.java
@@ -0,0 +1,14 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+
+public interface ITraceExplorerProtocolClient {
+
+ @JsonRequest
+ default CompletableFuture updatedCallStack() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerProtocolServer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerProtocolServer.java
new file mode 100644
index 000000000..62a3ba186
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceExplorerProtocolServer.java
@@ -0,0 +1,71 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableStep;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+
+public interface ITraceExplorerProtocolServer {
+
+ @JsonRequest
+ default CompletableFuture inReplayMode() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture loadLastState() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture> getCallStack() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepInto() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepOver() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepReturn() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepBackInto() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepBackOver() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture stepBackOut() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture canStepBackInto() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture canStepBackOver() {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture canStepBackOut() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceManagerAddonProtocolClient.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceManagerAddonProtocolClient.java
new file mode 100644
index 000000000..eca789267
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceManagerAddonProtocolClient.java
@@ -0,0 +1,5 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+public interface ITraceManagerAddonProtocolClient {
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceManagerAddonProtocolServer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceManagerAddonProtocolServer.java
new file mode 100644
index 000000000..7dcfec028
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/ITraceManagerAddonProtocolServer.java
@@ -0,0 +1,26 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableExecutionContext;
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableStep;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+
+public interface ITraceManagerAddonProtocolServer {
+
+ @JsonRequest
+ default CompletableFuture notifyEngineAboutToStart(SerializableExecutionContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture notifyAboutToExecuteStep(SerializableStep step) {
+ throw new UnsupportedOperationException();
+ }
+
+ @JsonRequest
+ default CompletableFuture notifyStepExecuted(SerializableStep step) {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceAddonSingleton.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceAddonSingleton.java
new file mode 100644
index 000000000..3d3399145
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceAddonSingleton.java
@@ -0,0 +1,38 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+
+import java.util.concurrent.Semaphore;
+
+public class TraceAddonSingleton {
+
+ private static volatile IRemoteTraceAddon traceAddon = null;
+ private static volatile Semaphore semaphore = new Semaphore(0);
+
+ public static void setTraceAddon(IRemoteTraceAddon traceAddon) {
+ if (TraceAddonSingleton.traceAddon == null) {
+ TraceAddonSingleton.traceAddon = traceAddon;
+ semaphore.release();
+ }
+ }
+
+ public static IRemoteTraceAddon acquireTraceAddon() {
+ try {
+ semaphore.acquire();
+ return traceAddon;
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static IRemoteTraceAddon getTraceAddon() {
+ return traceAddon;
+ }
+
+ public static void releaseTraceAddon() {
+ if (traceAddon != null) {
+ semaphore.release();
+ }
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolClient.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolClient.java
new file mode 100644
index 000000000..e1ab9982b
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolClient.java
@@ -0,0 +1,113 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.log4j.Logger;
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableStep;
+import org.eclipse.gemoc.trace.commons.model.trace.Step;
+import org.eclipse.gemoc.trace.gemoc.traceaddon.GenericTraceExplorer;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+
+public class TraceExplorerProtocolClient extends GenericTraceExplorer implements Endpoint, ITraceExplorerProtocolClient, TraceExplorerProtocolServerAware {
+
+ private static final Logger LOG = Logger.getLogger(TraceExplorerProtocolClient.class);
+
+ private ITraceExplorerProtocolServer server;
+
+ public TraceExplorerProtocolClient() {
+ super(null);
+ }
+
+ @Override
+ public void connect(ITraceExplorerProtocolServer server) {
+ this.server = server;
+ }
+
+ @Override
+ public CompletableFuture> request(String method, Object parameter) {
+ throw new UnsupportedOperationException("The json request \'" + method + "\' is unknown.");
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ LOG.info("notify " + method);
+ }
+
+ @Override
+ public void loadLastState() {
+ this.server.loadLastState().join();
+ }
+
+ @Override
+ public boolean stepInto() {
+ return this.server.stepInto().join();
+ }
+
+ @Override
+ public boolean stepOver() {
+ return this.server.stepOver().join();
+ }
+
+ @Override
+ public boolean stepReturn() {
+ return this.server.stepReturn().join();
+ }
+
+ @Override
+ public boolean canStepBackInto() {
+ return this.server.canStepBackInto().join();
+ }
+
+ @Override
+ public boolean canStepBackOver() {
+ return this.server.canStepBackOver().join();
+ }
+
+ @Override
+ public boolean canStepBackOut() {
+ return this.server.canStepBackOut().join();
+ }
+
+ @Override
+ public boolean stepBackInto() {
+ return this.server.stepBackInto().join();
+ }
+
+ @Override
+ public boolean stepBackOver() {
+ return this.server.stepBackOver().join();
+ }
+
+ @Override
+ public boolean stepBackOut() {
+ return this.server.stepBackOut().join();
+ }
+
+ @Override
+ public boolean isInReplayMode() {
+ return this.server.inReplayMode().join();
+ }
+
+ @Override
+ public List> getCallStack() {
+ List> result = new ArrayList<>();
+ for (SerializableStep step : this.server.getCallStack().join()) {
+ result.add(step.getStep());
+ }
+ return result;
+ }
+
+ @Override
+ public CompletableFuture updatedCallStack() {
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ notifyListeners();
+ }
+ });
+ return future;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolClientAware.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolClientAware.java
new file mode 100644
index 000000000..ae86189cc
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolClientAware.java
@@ -0,0 +1,6 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+public interface TraceExplorerProtocolClientAware {
+
+ void connect(ITraceExplorerProtocolClient client);
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolServer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolServer.java
new file mode 100644
index 000000000..126582479
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolServer.java
@@ -0,0 +1,281 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.log4j.Logger;
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableStep;
+import org.eclipse.gemoc.trace.commons.model.trace.Step;
+import org.eclipse.gemoc.trace.gemoc.api.ITraceExplorer;
+import org.eclipse.gemoc.trace.gemoc.traceaddon.GenericTraceEngineAddon;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+
+import com.google.common.base.Supplier;
+
+public class TraceExplorerProtocolServer implements Endpoint, ITraceExplorerProtocolServer, JsonRpcMethodProvider, TraceExplorerProtocolClientAware, ITraceExplorerEventListener {
+
+ private static final Logger LOG = Logger.getLogger(TraceExplorerProtocolServer.class);
+
+ ITraceExplorerProtocolClient client;
+
+ private Map supportedMethods;
+
+ @Override
+ public void connect(ITraceExplorerProtocolClient client) {
+ this.client = client;
+ }
+
+ public void init() {
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.acquireTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ ITraceExplorer, ?, ?, ?, ?> traceExplorer = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer();
+ if (traceExplorer instanceof IRemoteTraceExplorer) {
+ ((IRemoteTraceExplorer) traceExplorer).addTraceExplorerEventListener(this);
+ }
+ }
+ TraceAddonSingleton.releaseTraceAddon();
+ }
+
+ @Override
+ public Map supportedMethods() {
+ if (supportedMethods != null) {
+ return supportedMethods;
+ }
+
+ Map supportedMethods = new LinkedHashMap<>();
+ supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(getClass()));
+
+ for (JsonRpcMethod supportedMethod : supportedMethods.values()) {
+ LOG.info("supported method " + supportedMethod.getMethodName() + " " + supportedMethod.getParameterTypes());
+ }
+
+ this.supportedMethods = supportedMethods;
+ return supportedMethods;
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ LOG.info("notify " + method);
+ }
+
+ @Override
+ public CompletableFuture> request(String method, Object parameter) {
+ throw new UnsupportedOperationException("The json request \'" + method + "\' is unknown.");
+ }
+
+ @Override
+ public CompletableFuture inReplayMode() {
+ LOG.info("inReplayMode");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().isInReplayMode();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture loadLastState() {
+ LOG.info("loadLastState");
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().loadLastState();
+ }
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture> getCallStack() {
+ LOG.info("getCallStack");
+ CompletableFuture> future = CompletableFuture.supplyAsync(new Supplier>() {
+ @Override
+ public List get() {
+ List result = new ArrayList<>();
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ for (Step> step : ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().getCallStack()) {
+ result.add(new SerializableStep(step));
+ }
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepInto() {
+ LOG.info("stepInto");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().stepInto();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepOver() {
+ LOG.info("stepOver");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().stepOver();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepReturn() {
+ LOG.info("stepReturn");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().stepReturn();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepBackInto() {
+ LOG.info("stepBackInto");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().stepBackInto();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepBackOver() {
+ LOG.info("stepBackOver");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().stepBackOver();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture stepBackOut() {
+ LOG.info("stepBackOut");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().stepBackOut();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture canStepBackInto() {
+ LOG.info("canStepBackInto");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().canStepBackInto();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture canStepBackOver() {
+ LOG.info("canStepBackOver");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().canStepBackOver();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture canStepBackOut() {
+ LOG.info("canStepBackOut");
+ CompletableFuture future = CompletableFuture.supplyAsync(new Supplier() {
+ @Override
+ public Boolean get() {
+ boolean result = false;
+ IRemoteTraceAddon traceAddon = TraceAddonSingleton.getTraceAddon();
+ if (traceAddon instanceof GenericTraceEngineAddon) {
+ result = ((GenericTraceEngineAddon) traceAddon).getTraceExplorer().canStepBackOut();
+ }
+ return result;
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public void updatedCallStack() {
+ this.client.updatedCallStack().join();
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolServerAware.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolServerAware.java
new file mode 100644
index 000000000..598cc5ea2
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceExplorerProtocolServerAware.java
@@ -0,0 +1,6 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+public interface TraceExplorerProtocolServerAware {
+
+ void connect(ITraceExplorerProtocolServer server);
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolClient.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolClient.java
new file mode 100644
index 000000000..132a3d2ab
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolClient.java
@@ -0,0 +1,65 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.log4j.Logger;
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableExecutionContext;
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableStep;
+import org.eclipse.gemoc.trace.commons.model.trace.Dimension;
+import org.eclipse.gemoc.trace.commons.model.trace.State;
+import org.eclipse.gemoc.trace.commons.model.trace.Step;
+import org.eclipse.gemoc.trace.commons.model.trace.TracedObject;
+import org.eclipse.gemoc.trace.commons.model.trace.Value;
+import org.eclipse.gemoc.trace.gemoc.api.ITraceExplorer;
+import org.eclipse.gemoc.trace.gemoc.traceaddon.GenericTraceEngineAddon;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionEngine;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+
+public class TraceManagerAddonProtocolClient extends GenericTraceEngineAddon implements Endpoint, ITraceManagerAddonProtocolClient, TraceManagerAddonProtocolServerAware {
+
+ private static final Logger LOG = Logger.getLogger(TraceManagerAddonProtocolClient.class);
+
+ private ITraceManagerAddonProtocolServer server;
+
+ @Override
+ public void connect(ITraceManagerAddonProtocolServer server) {
+ this.server = server;
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ LOG.info("notify " + method);
+ }
+
+ @Override
+ public CompletableFuture> request(String method, Object parameter) {
+ throw new UnsupportedOperationException("The json request \'" + method + "\' is unknown.");
+ }
+
+ @Override
+ public void engineAboutToStart(IExecutionEngine> engine) {
+ this.server.notifyEngineAboutToStart(new SerializableExecutionContext(engine.getExecutionContext())).join();
+ }
+
+ @Override
+ public void aboutToExecuteStep(IExecutionEngine> executionEngine, Step> step) {
+ this.server.notifyAboutToExecuteStep(new SerializableStep(step)).join();
+ }
+
+ @Override
+ public void stepExecuted(IExecutionEngine> executionEngine, Step> step) {
+ this.server.notifyStepExecuted(new SerializableStep(step)).join();
+ }
+
+ private TraceExplorerProtocolClient headlessTraceExplorer;
+
+ public void setTraceExplorer(TraceExplorerProtocolClient traceExplorer) {
+ this.headlessTraceExplorer = traceExplorer;
+ }
+
+ @Override
+ public ITraceExplorer, State,?>, TracedObject>, Dimension>, Value>> getTraceExplorer() {
+ return this.headlessTraceExplorer;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolClientAware.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolClientAware.java
new file mode 100644
index 000000000..eff73725b
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolClientAware.java
@@ -0,0 +1,6 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+public interface TraceManagerAddonProtocolClientAware {
+
+ void connect(ITraceManagerAddonProtocolClient client);
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolServer.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolServer.java
new file mode 100644
index 000000000..4acc12d3c
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolServer.java
@@ -0,0 +1,91 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.log4j.Logger;
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableExecutionContext;
+import org.eclipse.gemoc.executionframework.mep.trace.types.SerializableStep;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+
+public class TraceManagerAddonProtocolServer implements Endpoint, ITraceManagerAddonProtocolServer, JsonRpcMethodProvider, TraceManagerAddonProtocolClientAware {
+
+ private static final Logger LOG = Logger.getLogger(TraceManagerAddonProtocolServer.class);
+
+ ITraceManagerAddonProtocolClient client;
+
+ private Map supportedMethods;
+
+ @Override
+ public void connect(ITraceManagerAddonProtocolClient client) {
+ this.client = client;
+ }
+
+ @Override
+ public Map supportedMethods() {
+ if (supportedMethods != null) {
+ return supportedMethods;
+ }
+
+ Map supportedMethods = new LinkedHashMap<>();
+ supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(getClass()));
+
+ for (JsonRpcMethod supportedMethod : supportedMethods.values()) {
+ LOG.info("supported method " + supportedMethod.getMethodName() + " " + supportedMethod.getParameterTypes());
+ }
+
+ this.supportedMethods = supportedMethods;
+ return supportedMethods;
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ LOG.info("notify " + method);
+ }
+
+ @Override
+ public CompletableFuture> request(String method, Object parameter) {
+ throw new UnsupportedOperationException("The json request \'" + method + "\' is unknown.");
+ }
+
+ @Override
+ public CompletableFuture notifyEngineAboutToStart(SerializableExecutionContext serializableExecutionContext) {
+ LOG.info("notifyEngineAboutToStart");
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ TraceAddonSingleton.getTraceAddon().engineAboutToStart(serializableExecutionContext.getExecutionContext());
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture notifyAboutToExecuteStep(SerializableStep serializableStep) {
+ LOG.info("notifyAboutToExecuteStep");
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ TraceAddonSingleton.getTraceAddon().aboutToExecuteStep(serializableStep.getStep());
+ }
+ });
+ return future;
+ }
+
+ @Override
+ public CompletableFuture notifyStepExecuted(SerializableStep serializableStep) {
+ LOG.info("notifyStepExecuted");
+ CompletableFuture future = CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ TraceAddonSingleton.getTraceAddon().stepExecuted(serializableStep.getStep());
+ }
+ });
+ return future;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolServerAware.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolServerAware.java
new file mode 100644
index 000000000..c1853c221
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/TraceManagerAddonProtocolServerAware.java
@@ -0,0 +1,6 @@
+package org.eclipse.gemoc.executionframework.mep.trace;
+
+public interface TraceManagerAddonProtocolServerAware {
+
+ void connect(ITraceManagerAddonProtocolServer server);
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/types/SerializableExecutionContext.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/types/SerializableExecutionContext.java
new file mode 100644
index 000000000..47feb562a
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/types/SerializableExecutionContext.java
@@ -0,0 +1,120 @@
+package org.eclipse.gemoc.executionframework.mep.trace.types;
+
+import java.io.Serializable;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.gemoc.trace.commons.model.trace.MSEModel;
+import org.eclipse.gemoc.xdsmlframework.api.core.ExecutionMode;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionContext;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionPlatform;
+import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionWorkspace;
+import org.eclipse.gemoc.xdsmlframework.api.core.IRunConfiguration;
+import org.eclipse.gemoc.xdsmlframework.api.extensions.languages.LanguageDefinitionExtension;
+import org.eclipse.xtext.EcoreUtil2;
+import org.emfjson.jackson.databind.EMFContext;
+import org.emfjson.jackson.module.EMFModule;
+import org.osgi.framework.Bundle;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class SerializableExecutionContext implements Serializable {
+
+ private String resourceURI;
+ private String jsonModel;
+
+ public SerializableExecutionContext(IExecutionContext, ?, ?> executionContext) {
+ Resource resourceModel = executionContext.getResourceModel();
+ EcoreUtil2.resolveAll(resourceModel);
+ ObjectMapper mapper = EMFModule.setupDefaultMapper();
+ try {
+ this.jsonModel = mapper.writeValueAsString(resourceModel.getContents().get(0));
+ this.resourceURI = resourceModel.getURI().toFileString();
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public IExecutionContext, ?, ?> getExecutionContext() {
+ return new IExecutionContext() {
+ private Resource resourceModel = null;
+
+ @Override
+ public void initializeResourceModel() {
+
+ }
+
+ @Override
+ public IExecutionWorkspace getWorkspace() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Resource getResourceModel() {
+ if (this.resourceModel == null) {
+ this.resourceModel = new ResourceSetImpl().createResource(URI.createFileURI(resourceURI));
+ ObjectMapper mapper = EMFModule.setupDefaultMapper();
+ try {
+ this.resourceModel.getContents().add(mapper.reader()
+ .withAttribute(EMFContext.Attributes.RESOURCE_SET, this.resourceModel.getResourceSet())
+ .withAttribute(EMFContext.Attributes.RESOURCE_URI, resourceURI)
+ .forType(EObject.class).readValue(jsonModel));
+ } catch (JsonMappingException e) {
+ e.printStackTrace();
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ }
+ return this.resourceModel;
+ }
+
+ @Override
+ public ExecutionMode getExecutionMode() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public MSEModel getMSEModel() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Bundle getDslBundle() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public LanguageDefinitionExtension getLanguageDefinitionExtension() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public IExecutionPlatform getExecutionPlatform() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public IRunConfiguration getRunConfiguration() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ // TODO Auto-generated method stub
+
+ }
+ };
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/types/SerializableStep.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/types/SerializableStep.java
new file mode 100644
index 000000000..3ec7edd8e
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/trace/types/SerializableStep.java
@@ -0,0 +1,105 @@
+package org.eclipse.gemoc.executionframework.mep.trace.types;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.gemoc.trace.commons.model.trace.Step;
+import org.eclipse.gemoc.trace.commons.model.trace.impl.MSEOccurrenceImpl;
+import org.eclipse.xtext.EcoreUtil2;
+import org.emfjson.jackson.annotations.EcoreIdentityInfo;
+import org.emfjson.jackson.module.EMFModule;
+import org.emfjson.jackson.resource.JsonResourceFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+public class SerializableStep implements Serializable {
+
+ private String jsonStep;
+
+ public SerializableStep(Step> step) {
+ EcoreUtil2.resolveAll(step);
+
+ ObjectMapper mapper = new ObjectMapper();
+ // Optional
+ mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
+
+ EMFModule module = new EMFModule();
+ module.configure(EMFModule.Feature.OPTION_USE_ID, true);
+ // Optional
+ module.configure(EMFModule.Feature.OPTION_SERIALIZE_TYPE, true);
+
+ module.setIdentityInfo(new EcoreIdentityInfo("_id"));
+ mapper.registerModule(module);
+
+ try {
+ System.err.println(mapper.writeValueAsString(step));
+ System.err.println(mapper.writeValueAsString(step.getMseoccurrence().getMse()));
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+
+ ResourceSet jsonRS = new ResourceSetImpl();
+ jsonRS.getResourceFactoryRegistry().getExtensionToFactoryMap().put("json", new JsonResourceFactory());
+ Resource jsonResource = jsonRS.createResource(URI.createFileURI("step.json"));
+ EObject container = step;
+ while (container.eContainer() != null) {
+ container = container.eContainer();
+ }
+ jsonResource.getContents().add(container);
+ jsonResource.getContents().add(step.getMseoccurrence().getMse());
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try {
+ jsonResource.save(baos, null);
+ this.jsonStep = new String(baos.toByteArray());
+ baos.close();
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ public Step> getStep() {
+ ResourceSet rs = new ResourceSetImpl();
+ if (!rs.getResourceFactoryRegistry().getExtensionToFactoryMap().containsKey("json")) {
+ rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put("json", new JsonResourceFactory());
+ }
+ Resource jsonResource = rs.createResource(URI.createFileURI("step.json"));
+ ByteArrayInputStream bios = new ByteArrayInputStream(this.jsonStep.getBytes());
+ try {
+ jsonResource.load(bios, null);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ EObject rootObj = jsonResource.getContents().get(0);
+ EcoreUtil2.resolveAll(jsonResource.getContents().get(1));
+ if (rootObj instanceof Step> && ((Step>) rootObj).getMseoccurrence() != null
+ && ((Step>) rootObj).getMseoccurrence().getMse() == jsonResource.getContents().get(1)) {
+ return (Step>) rootObj;
+ } else {
+ List> foundStep = new ArrayList<>();
+ rootObj.eAllContents().forEachRemaining(obj -> {
+ if (obj instanceof Step>) {
+ Step> step = (Step>) obj;
+ if (step.getMseoccurrence() != null &&
+ !((MSEOccurrenceImpl)step.getMseoccurrence()).basicGetMse().eIsProxy() &&
+ step.getMseoccurrence().getMse() == jsonResource.getContents().get(1)) {
+ //EcoreUtil2.resolveAll(step);
+ foundStep.add(step);
+ }
+ }
+ });
+ return foundStep.get(0);
+ }
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/SourceBreakpoint.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/SourceBreakpoint.java
new file mode 100644
index 000000000..7476a63f4
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/SourceBreakpoint.java
@@ -0,0 +1,15 @@
+package org.eclipse.gemoc.executionframework.mep.types;
+
+public class SourceBreakpoint {
+
+ private long line;
+
+ public SourceBreakpoint(long line) {
+ this.line = line;
+ }
+
+ public long getLine() {
+ return this.line;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/StackFrame.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/StackFrame.java
new file mode 100644
index 000000000..3f0a383ec
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/StackFrame.java
@@ -0,0 +1,33 @@
+package org.eclipse.gemoc.executionframework.mep.types;
+
+public class StackFrame {
+
+ private long id;
+ private String name;
+ private long line;
+ private long column;
+
+ public StackFrame(long id, String name, long line, long column) {
+ this.id = id;
+ this.name = name;
+ this.line = line;
+ this.column = column;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public long getLine() {
+ return line;
+ }
+
+ public long getColumn() {
+ return column;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/Variable.java b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/Variable.java
new file mode 100644
index 000000000..c751d1963
--- /dev/null
+++ b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/main/java/org/eclipse/gemoc/executionframework/mep/types/Variable.java
@@ -0,0 +1,22 @@
+package org.eclipse.gemoc.executionframework.mep.types;
+
+public class Variable {
+
+ private String name;
+ private String value;
+
+
+ public Variable(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+}
diff --git a/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/test/resources/.gitkeep b/framework/execution_framework/pomfirst/org.eclipse.gemoc.executionframework.mep/src/test/resources/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/framework/execution_framework/pomfirst/pom.xml b/framework/execution_framework/pomfirst/pom.xml
new file mode 100644
index 000000000..e294309c3
--- /dev/null
+++ b/framework/execution_framework/pomfirst/pom.xml
@@ -0,0 +1,75 @@
+
+
+ 4.0.0
+
+ org.eclipse.gemoc.executionframework
+ org.eclipse.gemoc.executionframework.pomfirst
+ 1.0.0-SNAPSHOT
+
+
+ org.eclipse.gemoc
+ org.eclipse.gemoc.modeldebugging.pomfirst
+ 1.0.0-SNAPSHOT
+ ../../../pomfirst/pom.xml
+
+
+ pom
+
+
+ org.eclipse.gemoc.executionframework.engine.headless
+ org.eclipse.gemoc.executionframework.mep
+
+
+
+
+
+
+ org.eclipse.xtend
+ xtend-maven-plugin
+ ${xtend.version}
+
+
+
+ compile
+ xtend-install-debug-info
+ testCompile
+ xtend-test-install-debug-info
+
+
+ xtend-gen
+
+
+
+
+
+
+
+
+ org.eclipse.jdt
+ org.eclipse.jdt.core
+ 3.13.102
+
+
+ org.eclipse.jdt
+ org.eclipse.jdt.compiler.apt
+ 1.3.110
+
+
+ org.eclipse.jdt
+ org.eclipse.jdt.compiler.tool
+ 1.2.101
+
+
+ org.eclipse.emf
+ org.eclipse.emf.codegen
+ 2.11.0
+
+
+
+
+
+
+
diff --git a/framework/framework_commons/.project b/framework/framework_commons/.project
index d15b71066..ef5d854a8 100644
--- a/framework/framework_commons/.project
+++ b/framework/framework_commons/.project
@@ -5,7 +5,13 @@
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+ org.eclipse.m2e.core.maven2Nature
diff --git a/framework/framework_commons/plugins/org.eclipse.gemoc.executionframework.reflectivetrace.model/pomfirst/pom.xml b/framework/framework_commons/plugins/org.eclipse.gemoc.executionframework.reflectivetrace.model/pomfirst/pom.xml
new file mode 100644
index 000000000..a743145f7
--- /dev/null
+++ b/framework/framework_commons/plugins/org.eclipse.gemoc.executionframework.reflectivetrace.model/pomfirst/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+
+ org.eclipse.gemoc.pomfirst
+ org.eclipse.gemoc.executionframework.reflectivetrace.model
+ 4.0.0-SNAPSHOT
+
+ jar
+
+
+ scm:git:https://github.com/eclipse/gemoc-studio-modeldebugging.git
+ UTF-8
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ unpack
+ prepare-package
+
+ unpack
+
+
+
+