From 5bebda451f745e22588d3c65caff1bb0f41365b6 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Wed, 13 May 2020 16:39:21 +0200 Subject: [PATCH 01/13] Initial version Signed-off-by: Didier Vojtisek Improvements Signed-off-by: Pierre Jeanjean Deployment Signed-off-by: Didier Vojtisek --- dev_support/pomfirst/pom.xml | 21 + .../META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 2 +- .../K3FSM/language_workbench/pom.xml | 216 +++++++- .../.classpath | 44 ++ .../.gitignore | 1 + .../.mvn/wrapper/MavenWrapperDownloader.java | 117 ++++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + .../.project | 29 + .../.settings/org.eclipse.jdt.core.prefs | 6 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../org.eclipse.xtend.core.Xtend.prefs | 7 + .../README.md | 94 ++++ ...pse.emf.transaction_1.9.1.201805140824.jar | Bin 0 -> 173186 bytes .../pom.xml | 360 +++++++++++++ .../k3fsm/mep/server/CustomServerModule.xtend | 28 + .../mep/server/K3FSMGemocMEPServerImpl.java | 62 +++ .../K3FSMLanguageDefinitionExtension.java | 10 + .../k3fsm/mep/server/K3FSMMEPModule.xtend | 36 ++ .../mep/server/K3FSMMEPServerEndpoint.java | 146 +++++ .../k3fsm/mep/server/MockClientMain.java | 226 ++++++++ .../src/main/resources/application.properties | 504 ++++++++++++++++++ .../resources/application.properties.example | 502 +++++++++++++++++ .../server/tests/commands/MockTestClient.java | 89 ++++ .../dap/commands/InitializeCommandTest.java | 33 ++ .../tests/dap/commands/LaunchCommandTest.java | 42 ++ .../commands/MEPIntegrationTest.java | 122 +++++ .../src/test/resources/.gitkeep | 0 .../tests/xtext/models/TwoStatesUpcast.k3fsm | 23 + official_samples/K3FSM/pomfirst/pom.xml | 86 +++ 32 files changed, 2794 insertions(+), 22 deletions(-) create mode 100644 dev_support/pomfirst/pom.xml create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.classpath create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.gitignore create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/maven-wrapper.jar create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/maven-wrapper.properties create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.project create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.jdt.core.prefs create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.m2e.core.prefs create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.xtend.core.Xtend.prefs create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/README.md create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/lib_not_correctly_deployed/org.eclipse.emf.transaction_1.9.1.201805140824.jar create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMLanguageDefinitionExtension.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/MockClientMain.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties.example create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/commands/MockTestClient.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/InitializeCommandTest.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/LaunchCommandTest.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/.gitkeep create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/tests/xtext/models/TwoStatesUpcast.k3fsm create mode 100644 official_samples/K3FSM/pomfirst/pom.xml diff --git a/dev_support/pomfirst/pom.xml b/dev_support/pomfirst/pom.xml new file mode 100644 index 00000000..5c69d345 --- /dev/null +++ b/dev_support/pomfirst/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + org.eclipse.gemoc.gemoc_studio + org.eclipse.gemoc.gemoc_studio.pomfirst + 1.0.0-SNAPSHOT + + pom + + + + + + ../../official_samples/K3FSM/pomfirst + ../../../gemoc-studio-modeldebugging/pomfirst + ../../../gemoc-studio-execution-java/pomfirst + + + + \ No newline at end of file diff --git a/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.k3dsa/META-INF/MANIFEST.MF b/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.k3dsa/META-INF/MANIFEST.MF index c081d118..b97eb745 100644 --- a/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.k3dsa/META-INF/MANIFEST.MF +++ b/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.k3dsa/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Automatic-Module-Name: org.eclipse.gemoc.example.k3fsm.k3dsa Bundle-SymbolicName: org.eclipse.gemoc.example.k3fsm.k3dsa; singleton:=true Export-Package: org.eclipse.gemoc.example.k3fsm.k3dsa Bundle-Name: org.eclipse.gemoc.example.k3fsm.k3dsa -Bundle-Version: 1.0.0 +Bundle-Version: 1.0.0.qualifier Bundle-ClassPath: . Require-Bundle: fr.inria.diverse.k3.al.annotationprocessor.plugin;bundle-version="3.0.0";visibility:="reexport", org.eclipse.xtend.lib;bundle-version="2.6.0";visibility:="private", diff --git a/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.xdsml/META-INF/MANIFEST.MF b/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.xdsml/META-INF/MANIFEST.MF index 247d3714..61e33e40 100644 --- a/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.xdsml/META-INF/MANIFEST.MF +++ b/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm.xdsml/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Automatic-Module-Name: org.eclipse.gemoc.example.k3fsm.xdsml Bundle-SymbolicName: org.eclipse.gemoc.example.k3fsm.xdsml; singleton:=true Bundle-Name: org.eclipse.gemoc.example.k3fsm.xdsml -Bundle-Version: 1.0.0 +Bundle-Version: 1.0.0.qualifier Bundle-ClassPath: . Require-Bundle: org.eclipse.xtend.lib;bundle-version="2.7.0";visibility:="private", org.eclipse.xtext.xbase.lib;bundle-version="2.7.0";visibility:="private", diff --git a/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm/META-INF/MANIFEST.MF b/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm/META-INF/MANIFEST.MF index 647534bf..fdf5ed24 100644 --- a/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm/META-INF/MANIFEST.MF +++ b/official_samples/K3FSM/language_workbench/org.eclipse.gemoc.example.k3fsm/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.gemoc.example.k3fsm;singleton:=true -Bundle-Version: 0.1.0.qualifier +Bundle-Version: 1.0.0.qualifier Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/official_samples/K3FSM/language_workbench/pom.xml b/official_samples/K3FSM/language_workbench/pom.xml index 49a97021..b68426d4 100644 --- a/official_samples/K3FSM/language_workbench/pom.xml +++ b/official_samples/K3FSM/language_workbench/pom.xml @@ -4,18 +4,28 @@ http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - + org.eclipse.gemoc.gemoc_studio org.eclipse.gemoc.example.k3fsm.lwb.bundles - + 3.2.0-SNAPSHOT pom - + + + 1.5.1 + UTF-8 + 2.14.0 + http://download.eclipse.org/releases/photon + http://www.kermeta.org/k3/update_2018-09-05 + http://melange.inria.fr/updatesite/nightly/update_2018-12-03/ + + true + org.eclipse.gemoc.example.k3fsm @@ -44,20 +54,188 @@ p2 ${melange.p2.url} - - - - - - - - - - - - - - - + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + plugin-source + + plugin-source + + + + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho-version} + + + source-feature + package + + source-feature + + + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho-version} + + + attach-p2-metadata + package + + p2-metadata + + + + + + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + + + + linux + gtk + x86_64 + + + + win32 + win32 + x86_64 + + + macosx + cocoa + x86_64 + + + + + + org.eclipse.xtend + xtend-maven-plugin + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + ${project.build.sourceEncoding} + + + + 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 + + + + + maven-clean-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + + \ No newline at end of file diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.classpath b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.classpath new file mode 100644 index 00000000..119f0ade --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.classpath @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.gitignore b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.gitignore new file mode 100644 index 00000000..89540d82 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.gitignore @@ -0,0 +1 @@ +/dependency-reduced-pom.xml diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/MavenWrapperDownloader.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000..c32394f1 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.5"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/maven-wrapper.jar b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..0d5e649888a4843c1520054d9672f80c62ebbb48 GIT binary patch literal 50710 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�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 JS$+5G{{hr`vzY(@ literal 0 HcmV?d00001 diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/maven-wrapper.properties b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..fa87ad7d --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.1/apache-maven-3.6.1-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.project b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.project new file mode 100644 index 00000000..d57ebb57 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.project @@ -0,0 +1,29 @@ + + + org.eclipse.gemoc.example.k3fsm.mep.server + + + + + + 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/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.jdt.core.prefs b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..b8947ec6 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.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/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.m2e.core.prefs b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.xtend.core.Xtend.prefs b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.settings/org.eclipse.xtend.core.Xtend.prefs new file mode 100644 index 00000000..9682a4c0 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/.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/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/README.md b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/README.md new file mode 100644 index 00000000..59479a6d --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/README.md @@ -0,0 +1,94 @@ +# k3fsm_mep + +K3FSM language with Model Execution Protocol (dev of MEP concept on a smaller example: StateMachine but still with xtext and java engine) + + +Note: due to tycho limitation, pom-first and manifest-first (plugins) cannot be built in the same maven reactor (cf. https://wiki.eclipse.org/Tycho/How_Tos/Dependency_on_pom-first_artifacts) + + +It uses lsp4j.debug 0.8.0 and xtext/xtend 2.19.0 (correspond to DAP 1.35.0) + +Warning: make sure to use consistent versions (ex: version of xtend used by lsp4j) + + +Some notes about the K3FSM MEP server + +Run the server: + +``` +mvn compile quarkus:dev +``` + +it should open a socket on port 8090 + +ex: http://localhost:8090/mep/k3fsm + + +using a websocket client (for ex written in python, notebook or directly in a browser extension) + +example requests with SimpleWebSocket client for mozilla https://github.com/WangFenjin/Simple-WebSocket-Client +(replace the `/home/rhiobet/gemoc-glose/k3fsm_mep/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server` with the actual location on your disk) + +``` +{"type":"request", "command":"initialize"} +{"type":"request","command":"initialize","arguments":{"clientName":"MEPIntegrationTest.testInitialize()"}} +{"type":"request","command":"launch","arguments":{"myKey":"myValue"}} + +{"type":"request", + "command":"launch", + "arguments":{ + "modelURI":"file:/home/rhiobet/gemoc-glose/k3fsm_mep/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/tests/xtext/models/TwoStatesUpcast.k3fsm", + "modelEntryPoint":"/", + "initializationMethod":"org.eclipse.gemoc.example.k3fsm.k3dsa.FSMAspect.initializeModel", + "initializationArguments":"abababa", + "methodEntryPoint":"public static void org.eclipse.gemoc.example.k3fsm.k3dsa.FSMAspect.main(org.eclipse.gemoc.example.k3fsm.FSM)" + } +} + +{"type":"request", + "command":"next", + "arguments":{} +} + +{"type":"request", + "command":"stepIn", + "arguments":{} +} + +{"type":"request", + "command":"stepOut", + "arguments":{} +} + +{"type":"request", + "command":"terminate", + "arguments":{} +} + +{"type":"request", + "command":"restart", + "arguments":{} +} + +{"type":"request", + "command":"variables", + "arguments":{} +} + +{"type":"request", + "command":"setBreakpoints", + "arguments": { + "breakpoints": [ + { "line": 13 }, + { "line": 4 } + ] + } +} + +{"type":"request", + "command":"continue", + "arguments":{} +} +``` + + diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/lib_not_correctly_deployed/org.eclipse.emf.transaction_1.9.1.201805140824.jar b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/lib_not_correctly_deployed/org.eclipse.emf.transaction_1.9.1.201805140824.jar new file mode 100644 index 0000000000000000000000000000000000000000..99968c2ede4e6f547370c85d0e6a84729f81958a GIT binary patch literal 173186 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 V&<=}Aj$49%*2CAF!2iK + 4.0.0 + org.eclipse.gemoc.gemoc_studio + org.eclipse.gemoc.example.k3fsm.mep.server + 1.0.0-SNAPSHOT + + + 1.8 + 1.8 + 2.22.0 + 0.21.1 + 2.19.0 + + + + + + io.quarkus + quarkus-bom + ${quarkus.version} + pom + import + + + + + + + + + io.quarkus + quarkus-resteasy + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + io.quarkus + quarkus-undertow-websockets + + + + + org.eclipse.xtext + org.eclipse.xtext + ${xtend.version} + + + org.eclipse.xtext + org.eclipse.xtext.ide + ${xtend.version} + + + org.eclipse.emf + org.eclipse.emf.mwe.utils + 1.5.1 + + + + + + + + org.eclipse.lsp4j + org.eclipse.lsp4j.debug + 0.8.0 + + + + + org.eclipse.gemoc.executionframework + org.eclipse.gemoc.executionframework.mep + 1.0.0-SNAPSHOT + + + + org.eclipse.gemoc.execution.sequential.javaengine + org.eclipse.gemoc.execution.sequential.javaengine.headless + 1.0.0-SNAPSHOT + + + fr.inria.glose + org.eclipse.gemoc.commons.utils + 1.0.0-SNAPSHOT + + + + + org.eclipse.gemoc.gemoc_studio + org.eclipse.gemoc.example.k3fsm + 1.0.0-SNAPSHOT + + + org.eclipse.gemoc.gemoc_studio + org.eclipse.gemoc.example.k3fsm.xtext + 1.0.0-SNAPSHOT + + + org.eclipse.gemoc.gemoc_studio + org.eclipse.gemoc.example.k3fsm.xtext.ide + 1.0.0-SNAPSHOT + + + org.eclipse.gemoc.gemoc_studio + org.eclipse.gemoc.example.k3fsm.k3dsa + 1.0.0-SNAPSHOT + + + + + + org.eclipse.gemoc.execution.sequential.java + org.eclipse.gemoc.execution.sequential.javaengine + 4.0.0-SNAPSHOT + + + fr.inria.diverse.k3.al + fr.inria.diverse.k3.al.annotationprocessor + 3.2.3-SNAPSHOT + + + org.eclipse.gemoc.trace.commons + org.eclipse.gemoc.trace.commons.model + 3.0.1-SNAPSHOT + + + org.eclipse.gemoc.trace.commons + org.eclipse.gemoc.trace.commons + 3.0.1-SNAPSHOT + + + org.eclipse.gemoc.modeldebugging.executionframework + org.eclipse.gemoc.executionframework.debugger + 4.0.0-SNAPSHOT + + + org.eclipse.gemoc.modeldebugging.executionframework + org.eclipse.gemoc.executionframework.engine + 4.0.0-SNAPSHOT + + + + + + org.eclipse.emf + org.eclipse.emf.transaction + 1.9.1.201805140824 + system + ${basedir}/lib_not_correctly_deployed/org.eclipse.emf.transaction_1.9.1.201805140824.jar + + + + org.eclipse.emf + org.eclipse.emf.edit + 2.16.0 + + + + org.eclipse.gemoc.commons + org.eclipse.gemoc.commons.eclipse + 3.0.0-SNAPSHOT + + + org.eclipse.gemoc.commons + org.eclipse.gemoc.commons.eclipse.pde + 3.0.0-SNAPSHOT + + + + org.eclipse.gemoc.commons + org.eclipse.gemoc.commons.eclipse.messagingsystem.api + 3.0.0-SNAPSHOT + + + org.eclipse.gemoc.modeldebugging.framework.commons + org.eclipse.gemoc.xdsmlframework.api + 4.0.0-SNAPSHOT + + + org.eclipse.gemoc.modeldebugging.framework.commons + org.eclipse.gemoc.xdsmlframework.commons + 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 + + + DSLDebugger + org.eclipse.gemoc.dsl.debug + 3.0.1-SNAPSHOT + + + DSLDebugger + org.eclipse.gemoc.dsl.debug.edit + 3.0.1-SNAPSHOT + + + + org.eclipse.platform + org.eclipse.debug.core + 3.12.0 + + + + + + + + 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 + + + + + + io.quarkus + quarkus-maven-plugin + ${quarkus.version} + + + + build + + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + + + + + org.apache.maven.plugins + maven-clean-plugin + 3.1.0 + + + + ${basedir}/src/main/xtend-gen + + **/* + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 1.7.1 + + + package + + shade + + + + + + *:* + + META-INF/*.SF + META-INF/*.RSA + META-INF/*.MF + + + + + + + + + + + + nexus-eclipse-gemoc + Nexus Eclipse GEMOC + + true + + + true + + https://repo.eclipse.org/content/groups/gemoc/ + + + >maven.inria.fr + Maven Inria + + true + + + true + + http://maven.inria.fr/artifactory/public/ + + + \ No newline at end of file diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend new file mode 100644 index 00000000..7b508c87 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend @@ -0,0 +1,28 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server + +import com.google.inject.AbstractModule +import java.util.concurrent.ExecutorService +import org.eclipse.xtext.ide.ExecutorServiceProvider +import org.eclipse.xtext.ide.server.DefaultProjectDescriptionFactory +import org.eclipse.xtext.ide.server.IProjectDescriptionFactory +import org.eclipse.xtext.ide.server.IWorkspaceConfigFactory +import org.eclipse.xtext.ide.server.ProjectWorkspaceConfigFactory +import org.eclipse.xtext.resource.IContainer +import org.eclipse.xtext.resource.IResourceServiceProvider +import org.eclipse.xtext.resource.ResourceServiceProviderServiceLoader +import org.eclipse.xtext.resource.containers.ProjectDescriptionBasedContainerManager +import org.eclipse.xtext.ide.server.rename.IRenameService +import org.eclipse.xtext.ide.server.rename.RenameService + +class CustomServerModule extends AbstractModule { + + override protected configure() { + + binder.bind(ExecutorService).toProvider(ExecutorServiceProvider) + bind(IResourceServiceProvider.Registry).toProvider(ResourceServiceProviderServiceLoader) + bind(IWorkspaceConfigFactory).to(ProjectWorkspaceConfigFactory) + bind(IProjectDescriptionFactory).to(DefaultProjectDescriptionFactory) + bind(IContainer.Manager).to(ProjectDescriptionBasedContainerManager) + bind(IRenameService).to(RenameService) + } +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java new file mode 100644 index 00000000..5768428e --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java @@ -0,0 +1,62 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server; + +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.gemoc.example.k3fsm.K3FSMStandaloneSetup; +import org.eclipse.gemoc.example.k3fsm.K3fsmPackage; +import org.eclipse.gemoc.execution.sequential.javaengine.headless.AbstractHeadlessExecutionContext; +import org.eclipse.gemoc.execution.sequential.javaengine.headless.HeadlessExecutionPlatform; +import org.eclipse.gemoc.execution.sequential.javaengine.headless.HeadlessExecutionWorkspace; +import org.eclipse.gemoc.execution.sequential.javaengine.headless.mep.K3GemocMEPServerImpl; +import org.eclipse.gemoc.executionframework.engine.commons.EngineContextException; +import org.eclipse.gemoc.executionframework.engine.commons.sequential.ISequentialRunConfiguration; +import org.eclipse.gemoc.xdsmlframework.api.core.ExecutionMode; +import org.eclipse.xtext.resource.XtextResource; +import org.eclipse.xtext.resource.XtextResourceSet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.inject.Injector; + +public class K3FSMGemocMEPServerImpl extends K3GemocMEPServerImpl { + + private static final Logger LOGGER = LoggerFactory.getLogger("K3FSMGemocMEPServerImpl"); + + public K3FSMGemocMEPServerImpl() { + super(); + languageDefinition = new K3FSMLanguageDefinitionExtension(); + } + + /** + * use K3FSM xtext resourceSet + * TODO see if the Sirius modelLoader allows to generalize/avoid that + */ + @Override + public ResourceSet createResourceSet() { + + K3fsmPackage.eINSTANCE.eClass(); + + new org.eclipse.emf.mwe.utils.StandaloneSetup().setPlatformUri("../"); + Injector injector = new K3FSMStandaloneSetup().createInjectorAndDoEMFRegistration(); + XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class); + resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE); + LOGGER.info("created K3FSM XtextResourceSet"); + return resourceSet; + } + + @Override + protected AbstractHeadlessExecutionContext newExecutionContext(Resource resourceModel) throws EngineContextException { + return new AbstractHeadlessExecutionContext( + runConfiguration, + ExecutionMode.Run, + languageDefinition, + new HeadlessExecutionWorkspace(), + new HeadlessExecutionPlatform()){ + @Override + public void initializeResourceModel() { + _resourceModel = resourceModel; + } + }; + } + +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMLanguageDefinitionExtension.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMLanguageDefinitionExtension.java new file mode 100644 index 00000000..460a7ce4 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMLanguageDefinitionExtension.java @@ -0,0 +1,10 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server; + +import org.eclipse.gemoc.xdsmlframework.api.extensions.languages.LanguageDefinitionExtension; + +public class K3FSMLanguageDefinitionExtension extends LanguageDefinitionExtension { + @Override + public String getName() { + return "org.eclipse.gemoc.example.k3fsm.K3fsm"; + } +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend new file mode 100644 index 00000000..1e766224 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend @@ -0,0 +1,36 @@ + +package org.eclipse.gemoc.example.k3fsm.mep.server + +import com.google.inject.Guice +import org.eclipse.xtext.util.Modules2 +import com.google.inject.Injector +import org.eclipse.emf.ecore.EPackage +import org.eclipse.xtext.resource.IResourceServiceProvider +import org.eclipse.gemoc.example.k3fsm.K3FSMStandaloneSetupGenerated +import org.eclipse.gemoc.example.k3fsm.K3FSMRuntimeModule +import org.eclipse.gemoc.example.k3fsm.ide.K3FSMIdeModule +import org.eclipse.gemoc.example.k3fsm.K3fsmPackage + +/** + * Initialization support for running FCL language as Execution server using xtext. + */ +class K3FSMMEPModule extends K3FSMStandaloneSetupGenerated { + +/* override createInjector() { + Guice.createInjector(Modules2.mixin(new FCLRuntimeModule, new FCLIdeModule)) + }*/ + + override createInjector() { + Guice.createInjector(Modules2.mixin(new K3FSMRuntimeModule, new K3FSMIdeModule, new CustomServerModule, + [bind(IResourceServiceProvider.Registry).toProvider(IResourceServiceProvider.Registry.RegistryProvider)] + )) + } + + override register(Injector injector) { + super.register(injector) + if (!EPackage.Registry.INSTANCE.containsKey("http://www.inria.fr/glose/fcl")) { + EPackage.Registry.INSTANCE.put("http://www.inria.fr/glose/fcl", K3fsmPackage.eINSTANCE); + } + } + +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java new file mode 100644 index 00000000..6bdf372c --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java @@ -0,0 +1,146 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +import javax.enterprise.context.ApplicationScoped; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.gemoc.commons.utils.ExtensibleInputStream; +import org.eclipse.gemoc.example.k3fsm.K3FSMStandaloneSetupGenerated; +import org.eclipse.gemoc.executionframework.mep.launch.GemocMEPServerImpl; +import org.eclipse.gemoc.executionframework.mep.launch.MEPLauncher; +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolServer; +import org.eclipse.lsp4j.jsonrpc.Launcher; +import org.eclipse.lsp4j.launch.LSPLauncher; +import org.eclipse.lsp4j.services.LanguageClient; +import org.eclipse.xtext.ide.server.LanguageServerImpl; +import org.eclipse.xtext.resource.XtextResource; +import org.eclipse.xtext.resource.XtextResourceSet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +@ServerEndpoint("/mep/k3fsm") +@ApplicationScoped +public class K3FSMMEPServerEndpoint { + + private static final Logger LOGGER = LoggerFactory.getLogger("K3FSMMEPServerEndpoint"); + + boolean supportHeader = true; + + Map activeSessions = new HashMap(); + +// LanguageServerImpl server = new LogoIdeSetup().createInjectorAndDoEMFRegistration().getInstance(LanguageServerImpl.class); + + K3FSMGemocMEPServerImpl server; + + public K3FSMGemocMEPServerImpl getOrCreateServer() { + if(server == null) { + server = new K3FSMMEPModule().createInjectorAndDoEMFRegistration().getInstance(K3FSMGemocMEPServerImpl.class); + } + return server; + } + + @OnOpen + public void onOpen(Session session) { + + LOGGER.info("Connection"); + + try { + + getOrCreateServer(); + + + ExtensibleInputStream in = new ExtensibleInputStream(); + activeSessions.put(session, in); + + OutputStream outputstream = new OutputStream() { + + ByteArrayOutputStream internal = new ByteArrayOutputStream(); + + @Override + public void write(int b) throws IOException { + internal.write(b); + } + + @Override + public void flush() throws IOException { + String response = new String(internal.toByteArray(), "UTF-8"); + if(!supportHeader) { //LSP specifies that there is a header but messages from Monaco do not have a header + response = response.substring(response.indexOf("{")); + } + session.getBasicRemote().sendText(response); + internal.reset(); + + System.out.println("[DEBUG] Sent: " + response); + } + }; + + Launcher serverSideLauncher = MEPLauncher.createLauncher(server, IModelExecutionProtocolClient.class, in, outputstream); + server.connect(serverSideLauncher.getRemoteProxy()); + + LOGGER.info("Start listening"); + + serverSideLauncher.startListening(); + + //Launcher serverSideLauncher = MEPLauncher.createLauncher(server, IModelExecutionProtocolServer.class, in, outputstream); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @OnClose + public void onClose(Session session) { + activeSessions.remove(session); + } + + @OnError + public void onError(Session session, Throwable throwable) { + + } + + @OnMessage + public void onMessage(String message, Session session) { + + if(!message.startsWith("Content-Length:")) { //LSP specifies that there is a header but messages from Monaco do not have a header + supportHeader = false; + message = addHeader(message); + } + + System.out.println("[DEBUG] Message: " + message); + + ExtensibleInputStream inputStream = activeSessions.get(session); + if(inputStream != null) { + inputStream.addMessage(message); + } + } + + public String addHeader(String requestContent) { + String header = ""; + try { + int length = requestContent.getBytes("UTF-8").length; + header = "Content-Length: " + length + "\n\n"; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return header + requestContent; + } + +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/MockClientMain.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/MockClientMain.java new file mode 100644 index 00000000..cf4ac4c9 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/MockClientMain.java @@ -0,0 +1,226 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.emf.common.util.URI; +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.executionframework.mep.launch.GemocMEPServerImpl; +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; +import org.eclipse.lsp4j.DidOpenTextDocumentParams; +import org.eclipse.lsp4j.DocumentFormattingParams; +import org.eclipse.lsp4j.FormattingOptions; +import org.eclipse.lsp4j.InitializeParams; +import org.eclipse.lsp4j.InitializedParams; +import org.eclipse.lsp4j.Location; +import org.eclipse.lsp4j.MessageActionItem; +import org.eclipse.lsp4j.MessageParams; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.PublishDiagnosticsParams; +import org.eclipse.lsp4j.ReferenceContext; +import org.eclipse.lsp4j.ReferenceParams; +import org.eclipse.lsp4j.RenameParams; +import org.eclipse.lsp4j.ShowMessageRequestParams; +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.TextDocumentItem; +import org.eclipse.lsp4j.TextEdit; +import org.eclipse.lsp4j.WorkspaceEdit; +import org.eclipse.lsp4j.debug.BreakpointEventArguments; +import org.eclipse.lsp4j.debug.CapabilitiesEventArguments; +import org.eclipse.lsp4j.debug.ContinuedEventArguments; +import org.eclipse.lsp4j.debug.ExitedEventArguments; +import org.eclipse.lsp4j.debug.InitializeRequestArguments; +import org.eclipse.lsp4j.debug.LoadedSourceEventArguments; +import org.eclipse.lsp4j.debug.ModuleEventArguments; +import org.eclipse.lsp4j.debug.OutputEventArguments; +import org.eclipse.lsp4j.debug.ProcessEventArguments; +import org.eclipse.lsp4j.debug.StoppedEventArguments; +import org.eclipse.lsp4j.debug.TerminatedEventArguments; +import org.eclipse.lsp4j.debug.ThreadEventArguments; +import org.eclipse.lsp4j.debug.services.IDebugProtocolClient; +import org.eclipse.lsp4j.services.LanguageClient; +import org.eclipse.xtext.ide.server.LanguageServerImpl; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.resource.XtextResource; + + + +public class MockClientMain { + + public static void main(String[] args) { + try { + GemocMEPServerImpl server = new K3FSMMEPModule().createInjectorAndDoEMFRegistration().getInstance(GemocMEPServerImpl.class); + +// new LogoIdeSetup().createInjectorAndDoEMFRegistration(); +// ASMPackage rootPkg = ASMPackage.eINSTANCE; +// ResourceSet rs = new ResourceSetImpl(); +// Resource res = rs.getResource(URI.createURI("/home/fcoulon/tree.logo"),true); +// System.out.println(res.getContents().get(0)); +// +// XtextResource xRes = (XtextResource) res; +// Iterable it = xRes.getParseResult().getSyntaxErrors(); +// it.iterator().forEachRemaining(node -> { +// System.out.println(node.getSyntaxErrorMessage()); +// }); + + + IModelExecutionProtocolClient mockClient = new IModelExecutionProtocolClient() { + + @Override + public void initialized() { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.initialized(); + } + + @Override + public void stopped(StoppedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.stopped(args); + } + + @Override + public void continued(ContinuedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.continued(args); + } + + @Override + public void exited(ExitedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.exited(args); + } + + @Override + public void terminated(TerminatedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.terminated(args); + } + + @Override + public void thread(ThreadEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.thread(args); + } + + @Override + public void output(OutputEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.output(args); + } + + @Override + public void breakpoint(BreakpointEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.breakpoint(args); + } + + @Override + public void module(ModuleEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.module(args); + } + + @Override + public void loadedSource(LoadedSourceEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.loadedSource(args); + } + + @Override + public void process(ProcessEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.process(args); + } + + @Override + public void capabilities(CapabilitiesEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.capabilities(args); + } + + + + }; + + server.connect(mockClient); + + InitializeRequestArguments initParam = new InitializeRequestArguments(); + server.initialize(initParam); + + /*DidOpenTextDocumentParams openParam = new DidOpenTextDocumentParams( + new TextDocumentItem("/home/fcoulon/tree.logo", "logo", 1, "LogoProgram {\n" + + " Proc Square(size) {\n" + + " PenDown;\n" + + " Repeat 4.0 {\n" + + " Forward size;\n" + + " Left 90.0\n" + + " };\n" + + " PenUp\n" + + " };\n" + + "\n" + + " Proc Tree(baseSize, depth, direction) {\n" + + "\n" + + " Proc SubSquareSize(size, angle) {\n" + + " Return size * Cos angle\n" + + " };\n" + + "\n" + + " Left 90.0;\n" + + " Forward baseSize;\n" + + " Right 45.0 - direction;\n" + + " Square(SubSquareSize(baseSize, 45.0 + direction));\n" + + " If depth > 0.0 {\n" + + " Tree(SubSquareSize(baseSize, 45.0 + direction), depth - 1.0, 0.0)\n" + + " };\n" + + " Right 45.0 + direction;\n" + + " Forward baseSize;\n" + + " Right 45.0 - direction;\n" + + " Back baseSize;\n" + + " Square(SubSquareSize(baseSize, 45.0 - direction));\n" + + " If depth > 0.0 {\n" + + " Tree(SubSquareSize(baseSize, 45.0 - direction), depth - 1.0, 0.0)\n" + + " };\n" + + " Forward SubSquareSize(baseSize, 45.0 - direction);\n" + + " Left 45.0 - direction;\n" + + " Back baseSize;\n" + + " Left 90.0;\n" + + " Back baseSize;\n" + + " Right 90.0\n" + + " };\n" + + "\n" + + " Square(150.0);\n" + + " Tree(150.0, 8.0, 5.0)\n" + + "}\n" + + "")); + server.didOpen(openParam); + */ + + + synchronized (server) { + server.wait(); + } + + +// RenameParams param = new RenameParams(new TextDocumentIdentifier("/home/fcoulon/tree.logo"), new Position(1,9), "foobar"); +// CompletableFuture reply = server.rename(param); +// System.out.println(reply.get()); +// +// ReferenceParams refParam = new ReferenceParams(new ReferenceContext()); +// refParam.setTextDocument(new TextDocumentIdentifier("/home/fcoulon/tree.logo")); +// refParam.setPosition(new Position(1,9)); +// CompletableFuture> replyRef = server.references(refParam); +// System.out.println(replyRef.get()); + +// DocumentFormattingParams formatParam = new DocumentFormattingParams(new TextDocumentIdentifier("/home/fcoulon/tree.logo"), new FormattingOptions()); +// CompletableFuture> replyFormat = server.formatting(formatParam); +// System.out.println(replyFormat.get()); + + } catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("DONE"); + } + +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties new file mode 100644 index 00000000..f4fd1bb3 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties @@ -0,0 +1,504 @@ + +# +# The name of the application. +# If not set, defaults to the name of the project. +# +#quarkus.application.name= + +# +# The version of the application. +# If not set, defaults to the version of the project +# +#quarkus.application.version= + +# +# If set to true '@Inject' is automatically added to all non-static fields that are annotated with +# one of the annotations defined by {@link AutoInjectAnnotationBuildItem}. +# +#quarkus.arc.auto-inject-fields=true + +# +# If set to all (or true) the container will attempt to remove all unused beans. +# +# An unused bean: +# +# - is not a built-in bean or interceptor, +# - is not eligible for injection to any injection point, +# - is not excluded by any extension, +# - does not have a name, +# - does not declare an observer, +# - does not declare any producer which is eligible for injection to any injection point, +# - is not directly eligible for injection into any {@link javax.enterprise.inject.Instance} injection point +# +# +# If set to none (or false) no beans will ever be removed even if they are unused (according to the criteria +# set out above) +# +# If set to fwk, then all unused beans will be removed, except the unused beans whose classes are declared +# in the application code +# +# @see UnremovableBeanBuildItem +# +#quarkus.arc.remove-unused-beans=all + +# + +# +#quarkus.hot-reload.password= + +# + +# +#quarkus.hot-reload.url= + +# +# Enable the CORS filter. +# +#quarkus.http.cors=false + +# +# HTTP headers exposed in CORS +# +# Comma separated list of valid headers. ex: X-Custom,Content-Disposition +# +# default: +# +#quarkus.http.cors.exposed-headers= + +# +# HTTP headers allowed for CORS +# +# Comma separated list of valid headers. ex: X-Custom,Content-Disposition +# The filter allows any header if this is not set. +# +# default: returns any requested header as valid +# +#quarkus.http.cors.headers= + +# +# HTTP methods allowed for CORS +# +# Comma separated list of valid methods. ex: GET,PUT,POST +# The filter allows any method if this is not set. +# +# default: returns any requested method as valid +# +#quarkus.http.cors.methods= + +# +# Origins allowed for CORS +# +# Comma separated list of valid URLs. ex: http://www.quarkus.io,http://localhost:3000 +# The filter allows any origin if this is not set. +# +# default: returns any requested origin as valid +# +#quarkus.http.cors.origins= + +# +# The HTTP host +# +#quarkus.http.host=0.0.0.0 + +# +# The number if IO threads used to perform IO. This will be automatically set to a reasonable value based on +# the number of CPU cores if it is not provided +# +#quarkus.http.io-threads= + +# +# The HTTP port +# +quarkus.http.port=8090 +dev.quarkus.http.port=8090 + +# +# The HTTPS port +# +#quarkus.http.ssl-port=8443 + +# +# The file path to a server certificate or certificate chain in PEM format. +# +#quarkus.http.ssl.certificate.file= + +# +# The file path to the corresponding certificate private key file in PEM format. +# +#quarkus.http.ssl.certificate.key-file= + +# +# An optional key store which holds the certificate information instead of specifying separate files. +# +#quarkus.http.ssl.certificate.key-store-file= + +# +# An optional parameter to specify type of the key store file. If not given, the type is automatically detected +# based on the file name. +# +#quarkus.http.ssl.certificate.key-store-file-type= + +# +# A parameter to specify the password of the key store file. If not given, the default ("password") is used. +# +#quarkus.http.ssl.certificate.key-store-password=password + +# +# The cipher suites to use. If none is given, a reasonable default is selected. +# +#quarkus.http.ssl.cipher-suites= + +# +# The list of protocols to explicitly enable. +# +#quarkus.http.ssl.protocols=TLSv1.3,TLSv1.2 + +# +# The SSL provider name to use. If none is given, the platform default is used. +# +#quarkus.http.ssl.provider-name= + +# +# The SSL session cache size. If not given, the platform default is used. +# +#quarkus.http.ssl.session-cache-size= + +# +# The SSL session cache timeout. If not given, the platform default is used. +# +#quarkus.http.ssl.session-timeout= + +# +# The HTTP port used to run tests +# +#quarkus.http.test-port=8081 + +# +# The HTTPS port used to run tests +# +#quarkus.http.test-ssl-port=8444 + +# +# The maven artifactId of the artifact to index +# +#quarkus.index-dependency.{*}.artifact-id= + +# +# The maven classifier of the artifact to index +# +#quarkus.index-dependency.{*}.classifier= + +# +# The maven groupId of the artifact to index +# +#quarkus.index-dependency.{*}.group-id= + +# +# Enable JNI support. +# +#quarkus.jni.enable=false + +# +# Paths of library to load. +# +#quarkus.jni.library-paths= + +# +# The log level level for this category +# +#quarkus.log.category.{*}.level=inherit + +# +# The minimum level that this category can be set to +# +#quarkus.log.category.{*}.min-level=inherit + +# +# Indicates whether to log asynchronously +# +#quarkus.log.console.async=false + +# +# Determine whether to block the publisher (rather than drop the message) when the queue is full +# +#quarkus.log.console.async.overflow=block + +# +# The queue length to use before flushing writing +# +#quarkus.log.console.async.queue-length=512 + +# +# If the console logging should be in color +# +#quarkus.log.console.color=true + +# +# Specify how much the colors should be darkened +# +#quarkus.log.console.darken=0 + +# +# If console logging should be enabled +# +#quarkus.log.console.enable=true + +# +# The log format +# +#quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n + +# +# The console log level +# +#quarkus.log.console.level=ALL + +# +# Indicates whether to log asynchronously +# +#quarkus.log.file.async=false + +# +# Determine whether to block the publisher (rather than drop the message) when the queue is full +# +#quarkus.log.file.async.overflow=block + +# +# The queue length to use before flushing writing +# +#quarkus.log.file.async.queue-length=512 + +# +# If file logging should be enabled +# +#quarkus.log.file.enable=false + +# +# The log format +# +#quarkus.log.file.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %h %N[%i] %-5p [%c{3.}] (%t) %s%e%n + +# +# The level of logs to be written into the file. +# +#quarkus.log.file.level=ALL + +# +# The name of the file in which logs will be written. +# +#quarkus.log.file.path=quarkus.log + +# +# File handler rotation file suffix. +# +# Example fileSuffix: .yyyy-MM-dd +# +#quarkus.log.file.rotation.file-suffix= + +# +# The maximum number of backups to keep. +# +#quarkus.log.file.rotation.max-backup-index=1 + +# +# The maximum file size of the log file after which a rotation is executed. +# +#quarkus.log.file.rotation.max-file-size= + +# +# Indicates whether to rotate log files on server initialization. +# +#quarkus.log.file.rotation.rotate-on-boot=true + +# +# The message starts to match +# +#quarkus.log.filter.{*}.if-starts-with=inherit + +# +# The default log level +# +#quarkus.log.level= + +# +# The default minimum log level +# +#quarkus.log.min-level=INFO +#quarkus.log.min-level=DEBUG + +# +# The app name used when formatting the message in RFC5424 format +# +#quarkus.log.syslog.app-name= + +# +# Indicates whether to log asynchronously +# +#quarkus.log.syslog.async=false + +# +# Determine whether to block the publisher (rather than drop the message) when the queue is full +# +#quarkus.log.syslog.async.overflow=block + +# +# The queue length to use before flushing writing +# +#quarkus.log.syslog.async.queue-length=512 + +# +# Enables or disables blocking when attempting to reconnect a +# {@link org.jboss.logmanager.handlers.SyslogHandler.Protocol#TCP +# TCP} or {@link org.jboss.logmanager.handlers.SyslogHandler.Protocol#SSL_TCP SSL TCP} protocol +# +#quarkus.log.syslog.block-on-reconnect=false + +# +# If syslog logging should be enabled +# +#quarkus.log.syslog.enable=false + +# +# The IP address and port of the syslog server +# +#quarkus.log.syslog.endpoint=localhost:514 + +# +# Sets the facility used when calculating the priority of the message as defined by RFC-5424 and RFC-3164 +# +#quarkus.log.syslog.facility=USER_LEVEL + +# +# The log message format +# +#quarkus.log.syslog.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n + +# +# The name of the host the messages are being sent from +# +#quarkus.log.syslog.hostname= + +# +# The log level specifying, which message levels will be logged by syslog logger +# +#quarkus.log.syslog.level=ALL + +# +# Sets the protocol used to connect to the syslog server +# +#quarkus.log.syslog.protocol=TCP + +# +# Set the {@link SyslogType syslog type} this handler should use to format the message sent +# +#quarkus.log.syslog.syslog-type=RFC5424 + +# +# Set to 'true' if the message should be truncated +# +#quarkus.log.syslog.truncate=true + +# +# Set to 'true' if the message being sent should be prefixed with the size of the message +# +#quarkus.log.syslog.use-counting-framing=false + +# +# If gzip is enabled +# +#quarkus.resteasy.gzip.enabled=false + +# +# Maximum deflated file bytes size +# +# If the limit is exceeded, Resteasy will return Response +# with status 413("Request Entity Too Large") +# +#quarkus.resteasy.gzip.max-input=10M + +# +# Set this to override the default path for JAX-RS resources if there are no +# annotated application classes. +# +#quarkus.resteasy.path=/ + +# +# If this is true then JAX-RS will use only a single instance of a resource +# class to service all requests. +# +# If this is false then it will create a new instance of the resource per +# request. +# +# If the resource class has an explicit CDI scope annotation then the value of +# this annotation will always be used to control the lifecycle of the resource +# class. +# +# IMPLEMENTATION NOTE: 'javax.ws.rs.Path' turns into a CDI stereotype +# with singleton scope. As a result, if a user annotates a JAX-RS resource with +# a stereotype which has a different default scope the deployment fails with +# IllegalStateException. +# +#quarkus.resteasy.singleton-resources=true + +# +# The context path to serve all Servlet context from. This will also affect any resources +# that run as a Servlet, e.g. JAX-RS +# +#quarkus.servlet.context-path= + +# +# Enable native SSL support. +# +#quarkus.ssl.native= + +# +# The core thread pool size. This number of threads will always be kept alive. +# +#quarkus.thread-pool.core-threads=1 + +# +# The executor growth resistance. +# +# A resistance factor applied after the core pool is full; values applied here will cause that fraction +# of submissions to create new threads when no idle thread is available. A value of '0.0f' implies that +# threads beyond the core size should be created as aggressively as threads within it; a value of '1.0f' +# implies that threads beyond the core size should never be created. +# +#quarkus.thread-pool.growth-resistance=0 + +# +# The amount of time a thread will stay alive with no work. +# +#quarkus.thread-pool.keep-alive-time=30 + +# +# The maximum number of threads. If this is not specified then +# it will be automatically sized to 8 * the number of available processors +# +#quarkus.thread-pool.max-threads= + +# +# The queue size. For most applications this should be unbounded +# +#quarkus.thread-pool.queue-size= + +# +# The frequency at which the status of the thread pool should be checked during shutdown. Information about +# waiting tasks and threads will be checked and possibly logged at this interval. Setting this key to an empty +# value disables the shutdown check interval. +# +#quarkus.thread-pool.shutdown-check-interval=5 + +# +# The amount of time to wait for thread pool shutdown before tasks should be interrupted. If this value is +# greater than or equal to the value for 'shutdown-timeout', then tasks will not be interrupted before +# the shutdown timeout occurs. +# +#quarkus.thread-pool.shutdown-interrupt=10 + +# +# The shutdown timeout. If all pending work has not been completed by this time +# then additional threads will be spawned to attempt to finish any pending tasks, and the shutdown process will +# continue +# +#quarkus.thread-pool.shutdown-timeout=1M diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties.example b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties.example new file mode 100644 index 00000000..6bead13a --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties.example @@ -0,0 +1,502 @@ + +# +# The name of the application. +# If not set, defaults to the name of the project. +# +#quarkus.application.name= + +# +# The version of the application. +# If not set, defaults to the version of the project +# +#quarkus.application.version= + +# +# If set to true '@Inject' is automatically added to all non-static fields that are annotated with +# one of the annotations defined by {@link AutoInjectAnnotationBuildItem}. +# +#quarkus.arc.auto-inject-fields=true + +# +# If set to all (or true) the container will attempt to remove all unused beans. +# +# An unused bean: +# +# - is not a built-in bean or interceptor, +# - is not eligible for injection to any injection point, +# - is not excluded by any extension, +# - does not have a name, +# - does not declare an observer, +# - does not declare any producer which is eligible for injection to any injection point, +# - is not directly eligible for injection into any {@link javax.enterprise.inject.Instance} injection point +# +# +# If set to none (or false) no beans will ever be removed even if they are unused (according to the criteria +# set out above) +# +# If set to fwk, then all unused beans will be removed, except the unused beans whose classes are declared +# in the application code +# +# @see UnremovableBeanBuildItem +# +#quarkus.arc.remove-unused-beans=all + +# + +# +#quarkus.hot-reload.password= + +# + +# +#quarkus.hot-reload.url= + +# +# Enable the CORS filter. +# +#quarkus.http.cors=false + +# +# HTTP headers exposed in CORS +# +# Comma separated list of valid headers. ex: X-Custom,Content-Disposition +# +# default: +# +#quarkus.http.cors.exposed-headers= + +# +# HTTP headers allowed for CORS +# +# Comma separated list of valid headers. ex: X-Custom,Content-Disposition +# The filter allows any header if this is not set. +# +# default: returns any requested header as valid +# +#quarkus.http.cors.headers= + +# +# HTTP methods allowed for CORS +# +# Comma separated list of valid methods. ex: GET,PUT,POST +# The filter allows any method if this is not set. +# +# default: returns any requested method as valid +# +#quarkus.http.cors.methods= + +# +# Origins allowed for CORS +# +# Comma separated list of valid URLs. ex: http://www.quarkus.io,http://localhost:3000 +# The filter allows any origin if this is not set. +# +# default: returns any requested origin as valid +# +#quarkus.http.cors.origins= + +# +# The HTTP host +# +#quarkus.http.host=0.0.0.0 + +# +# The number if IO threads used to perform IO. This will be automatically set to a reasonable value based on +# the number of CPU cores if it is not provided +# +#quarkus.http.io-threads= + +# +# The HTTP port +# +#quarkus.http.port=8080 + +# +# The HTTPS port +# +#quarkus.http.ssl-port=8443 + +# +# The file path to a server certificate or certificate chain in PEM format. +# +#quarkus.http.ssl.certificate.file= + +# +# The file path to the corresponding certificate private key file in PEM format. +# +#quarkus.http.ssl.certificate.key-file= + +# +# An optional key store which holds the certificate information instead of specifying separate files. +# +#quarkus.http.ssl.certificate.key-store-file= + +# +# An optional parameter to specify type of the key store file. If not given, the type is automatically detected +# based on the file name. +# +#quarkus.http.ssl.certificate.key-store-file-type= + +# +# A parameter to specify the password of the key store file. If not given, the default ("password") is used. +# +#quarkus.http.ssl.certificate.key-store-password=password + +# +# The cipher suites to use. If none is given, a reasonable default is selected. +# +#quarkus.http.ssl.cipher-suites= + +# +# The list of protocols to explicitly enable. +# +#quarkus.http.ssl.protocols=TLSv1.3,TLSv1.2 + +# +# The SSL provider name to use. If none is given, the platform default is used. +# +#quarkus.http.ssl.provider-name= + +# +# The SSL session cache size. If not given, the platform default is used. +# +#quarkus.http.ssl.session-cache-size= + +# +# The SSL session cache timeout. If not given, the platform default is used. +# +#quarkus.http.ssl.session-timeout= + +# +# The HTTP port used to run tests +# +#quarkus.http.test-port=8081 + +# +# The HTTPS port used to run tests +# +#quarkus.http.test-ssl-port=8444 + +# +# The maven artifactId of the artifact to index +# +#quarkus.index-dependency.{*}.artifact-id= + +# +# The maven classifier of the artifact to index +# +#quarkus.index-dependency.{*}.classifier= + +# +# The maven groupId of the artifact to index +# +#quarkus.index-dependency.{*}.group-id= + +# +# Enable JNI support. +# +#quarkus.jni.enable=false + +# +# Paths of library to load. +# +#quarkus.jni.library-paths= + +# +# The log level level for this category +# +#quarkus.log.category.{*}.level=inherit + +# +# The minimum level that this category can be set to +# +#quarkus.log.category.{*}.min-level=inherit + +# +# Indicates whether to log asynchronously +# +#quarkus.log.console.async=false + +# +# Determine whether to block the publisher (rather than drop the message) when the queue is full +# +#quarkus.log.console.async.overflow=block + +# +# The queue length to use before flushing writing +# +#quarkus.log.console.async.queue-length=512 + +# +# If the console logging should be in color +# +#quarkus.log.console.color=true + +# +# Specify how much the colors should be darkened +# +#quarkus.log.console.darken=0 + +# +# If console logging should be enabled +# +#quarkus.log.console.enable=true + +# +# The log format +# +#quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n + +# +# The console log level +# +#quarkus.log.console.level=ALL + +# +# Indicates whether to log asynchronously +# +#quarkus.log.file.async=false + +# +# Determine whether to block the publisher (rather than drop the message) when the queue is full +# +#quarkus.log.file.async.overflow=block + +# +# The queue length to use before flushing writing +# +#quarkus.log.file.async.queue-length=512 + +# +# If file logging should be enabled +# +#quarkus.log.file.enable=false + +# +# The log format +# +#quarkus.log.file.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %h %N[%i] %-5p [%c{3.}] (%t) %s%e%n + +# +# The level of logs to be written into the file. +# +#quarkus.log.file.level=ALL + +# +# The name of the file in which logs will be written. +# +#quarkus.log.file.path=quarkus.log + +# +# File handler rotation file suffix. +# +# Example fileSuffix: .yyyy-MM-dd +# +#quarkus.log.file.rotation.file-suffix= + +# +# The maximum number of backups to keep. +# +#quarkus.log.file.rotation.max-backup-index=1 + +# +# The maximum file size of the log file after which a rotation is executed. +# +#quarkus.log.file.rotation.max-file-size= + +# +# Indicates whether to rotate log files on server initialization. +# +#quarkus.log.file.rotation.rotate-on-boot=true + +# +# The message starts to match +# +#quarkus.log.filter.{*}.if-starts-with=inherit + +# +# The default log level +# +#quarkus.log.level= + +# +# The default minimum log level +# +#quarkus.log.min-level=INFO + +# +# The app name used when formatting the message in RFC5424 format +# +#quarkus.log.syslog.app-name= + +# +# Indicates whether to log asynchronously +# +#quarkus.log.syslog.async=false + +# +# Determine whether to block the publisher (rather than drop the message) when the queue is full +# +#quarkus.log.syslog.async.overflow=block + +# +# The queue length to use before flushing writing +# +#quarkus.log.syslog.async.queue-length=512 + +# +# Enables or disables blocking when attempting to reconnect a +# {@link org.jboss.logmanager.handlers.SyslogHandler.Protocol#TCP +# TCP} or {@link org.jboss.logmanager.handlers.SyslogHandler.Protocol#SSL_TCP SSL TCP} protocol +# +#quarkus.log.syslog.block-on-reconnect=false + +# +# If syslog logging should be enabled +# +#quarkus.log.syslog.enable=false + +# +# The IP address and port of the syslog server +# +#quarkus.log.syslog.endpoint=localhost:514 + +# +# Sets the facility used when calculating the priority of the message as defined by RFC-5424 and RFC-3164 +# +#quarkus.log.syslog.facility=USER_LEVEL + +# +# The log message format +# +#quarkus.log.syslog.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n + +# +# The name of the host the messages are being sent from +# +#quarkus.log.syslog.hostname= + +# +# The log level specifying, which message levels will be logged by syslog logger +# +#quarkus.log.syslog.level=ALL + +# +# Sets the protocol used to connect to the syslog server +# +#quarkus.log.syslog.protocol=TCP + +# +# Set the {@link SyslogType syslog type} this handler should use to format the message sent +# +#quarkus.log.syslog.syslog-type=RFC5424 + +# +# Set to 'true' if the message should be truncated +# +#quarkus.log.syslog.truncate=true + +# +# Set to 'true' if the message being sent should be prefixed with the size of the message +# +#quarkus.log.syslog.use-counting-framing=false + +# +# If gzip is enabled +# +#quarkus.resteasy.gzip.enabled=false + +# +# Maximum deflated file bytes size +# +# If the limit is exceeded, Resteasy will return Response +# with status 413("Request Entity Too Large") +# +#quarkus.resteasy.gzip.max-input=10M + +# +# Set this to override the default path for JAX-RS resources if there are no +# annotated application classes. +# +#quarkus.resteasy.path=/ + +# +# If this is true then JAX-RS will use only a single instance of a resource +# class to service all requests. +# +# If this is false then it will create a new instance of the resource per +# request. +# +# If the resource class has an explicit CDI scope annotation then the value of +# this annotation will always be used to control the lifecycle of the resource +# class. +# +# IMPLEMENTATION NOTE: 'javax.ws.rs.Path' turns into a CDI stereotype +# with singleton scope. As a result, if a user annotates a JAX-RS resource with +# a stereotype which has a different default scope the deployment fails with +# IllegalStateException. +# +#quarkus.resteasy.singleton-resources=true + +# +# The context path to serve all Servlet context from. This will also affect any resources +# that run as a Servlet, e.g. JAX-RS +# +#quarkus.servlet.context-path= + +# +# Enable native SSL support. +# +#quarkus.ssl.native= + +# +# The core thread pool size. This number of threads will always be kept alive. +# +#quarkus.thread-pool.core-threads=1 + +# +# The executor growth resistance. +# +# A resistance factor applied after the core pool is full; values applied here will cause that fraction +# of submissions to create new threads when no idle thread is available. A value of '0.0f' implies that +# threads beyond the core size should be created as aggressively as threads within it; a value of '1.0f' +# implies that threads beyond the core size should never be created. +# +#quarkus.thread-pool.growth-resistance=0 + +# +# The amount of time a thread will stay alive with no work. +# +#quarkus.thread-pool.keep-alive-time=30 + +# +# The maximum number of threads. If this is not specified then +# it will be automatically sized to 8 * the number of available processors +# +#quarkus.thread-pool.max-threads= + +# +# The queue size. For most applications this should be unbounded +# +#quarkus.thread-pool.queue-size= + +# +# The frequency at which the status of the thread pool should be checked during shutdown. Information about +# waiting tasks and threads will be checked and possibly logged at this interval. Setting this key to an empty +# value disables the shutdown check interval. +# +#quarkus.thread-pool.shutdown-check-interval=5 + +# +# The amount of time to wait for thread pool shutdown before tasks should be interrupted. If this value is +# greater than or equal to the value for 'shutdown-timeout', then tasks will not be interrupted before +# the shutdown timeout occurs. +# +#quarkus.thread-pool.shutdown-interrupt=10 + +# +# The shutdown timeout. If all pending work has not been completed by this time +# then additional threads will be spawned to attempt to finish any pending tasks, and the shutdown process will +# continue +# +#quarkus.thread-pool.shutdown-timeout=1M diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/commands/MockTestClient.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/commands/MockTestClient.java new file mode 100644 index 00000000..31cab22a --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/commands/MockTestClient.java @@ -0,0 +1,89 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server.tests.commands; + +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; +import org.eclipse.lsp4j.debug.BreakpointEventArguments; +import org.eclipse.lsp4j.debug.CapabilitiesEventArguments; +import org.eclipse.lsp4j.debug.ContinuedEventArguments; +import org.eclipse.lsp4j.debug.ExitedEventArguments; +import org.eclipse.lsp4j.debug.LoadedSourceEventArguments; +import org.eclipse.lsp4j.debug.ModuleEventArguments; +import org.eclipse.lsp4j.debug.OutputEventArguments; +import org.eclipse.lsp4j.debug.ProcessEventArguments; +import org.eclipse.lsp4j.debug.StoppedEventArguments; +import org.eclipse.lsp4j.debug.TerminatedEventArguments; +import org.eclipse.lsp4j.debug.ThreadEventArguments; + +public class MockTestClient implements IModelExecutionProtocolClient { + @Override + public void initialized() { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.initialized(); + } + + @Override + public void stopped(StoppedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.stopped(args); + } + + @Override + public void continued(ContinuedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.continued(args); + } + + @Override + public void exited(ExitedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.exited(args); + } + + @Override + public void terminated(TerminatedEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.terminated(args); + } + + @Override + public void thread(ThreadEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.thread(args); + } + + @Override + public void output(OutputEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.output(args); + } + + @Override + public void breakpoint(BreakpointEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.breakpoint(args); + } + + @Override + public void module(ModuleEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.module(args); + } + + @Override + public void loadedSource(LoadedSourceEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.loadedSource(args); + } + + @Override + public void process(ProcessEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.process(args); + } + + @Override + public void capabilities(CapabilitiesEventArguments args) { + // TODO Auto-generated method stub + IModelExecutionProtocolClient.super.capabilities(args); + } + +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/InitializeCommandTest.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/InitializeCommandTest.java new file mode 100644 index 00000000..0a0f91ce --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/InitializeCommandTest.java @@ -0,0 +1,33 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server.tests.dap.commands; + + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMGemocMEPServerImpl; +import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMMEPModule; +import org.eclipse.gemoc.example.k3fsm.mep.server.tests.commands.MockTestClient; +import org.eclipse.gemoc.executionframework.mep.launch.GemocMEPServerImpl; +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; +import org.eclipse.lsp4j.debug.Capabilities; +import org.eclipse.lsp4j.debug.InitializeRequestArguments; +import org.junit.jupiter.api.Test; + +public class InitializeCommandTest { + @Test + void checkCapabilitiesTest() throws InterruptedException, ExecutionException { + + GemocMEPServerImpl server = new K3FSMMEPModule().createInjectorAndDoEMFRegistration().getInstance(K3FSMGemocMEPServerImpl.class); + IModelExecutionProtocolClient mockClient = new MockTestClient(); + server.connect(mockClient); + + InitializeRequestArguments initParam = new InitializeRequestArguments(); + CompletableFuture futureCapabilities = server.initialize(initParam); + + // check capabilities + Capabilities capabilities = futureCapabilities.get(); + assertTrue( capabilities.getSupportsTerminateRequest(), "capabilities.getSupportsTerminateRequest() returned false"); + } +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/LaunchCommandTest.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/LaunchCommandTest.java new file mode 100644 index 00000000..093e88ce --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/dap/commands/LaunchCommandTest.java @@ -0,0 +1,42 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server.tests.dap.commands; + + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMGemocMEPServerImpl; +import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMMEPModule; +import org.eclipse.gemoc.example.k3fsm.mep.server.tests.commands.MockTestClient; +import org.eclipse.gemoc.executionframework.mep.launch.GemocMEPServerImpl; +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; +import org.eclipse.lsp4j.debug.Capabilities; +import org.eclipse.lsp4j.debug.InitializeRequestArguments; +import org.eclipse.lsp4j.debug.LaunchRequestArguments; +import org.junit.jupiter.api.Test; + +public class LaunchCommandTest { + @Test + void checkCapabilitiesTest() throws InterruptedException, ExecutionException { + + GemocMEPServerImpl server = new K3FSMMEPModule().createInjectorAndDoEMFRegistration().getInstance(K3FSMGemocMEPServerImpl.class); + IModelExecutionProtocolClient mockClient = new MockTestClient(); + server.connect(mockClient); + + InitializeRequestArguments initParam = new InitializeRequestArguments(); + CompletableFuture futureCapabilities = server.initialize(initParam); + + + LaunchRequestArguments launchParam = new LaunchRequestArguments(); + Map args = new HashMap(); + + server.launch(args); + + // check capabilities + Capabilities capabilities = futureCapabilities.get(); + assertTrue( capabilities.getSupportsTerminateRequest(), "capabilities.getSupportsTerminateRequest() returned false"); + } +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java new file mode 100644 index 00000000..dc8a16a5 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java @@ -0,0 +1,122 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server.tests.integration.commands; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.io.IOUtils; +import org.eclipse.emf.common.util.URI; +import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMGemocMEPServerImpl; +import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMMEPModule; +import org.eclipse.gemoc.executionframework.mep.launch.GemocMEPServerImpl; +import org.eclipse.gemoc.executionframework.mep.launch.MEPLaunchParameterKey; +import org.eclipse.gemoc.executionframework.mep.launch.MEPLauncher; +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolServer; +import org.eclipse.lsp4j.debug.Capabilities; +import org.eclipse.lsp4j.debug.InitializeRequestArguments; +import org.eclipse.lsp4j.jsonrpc.Launcher; +import org.junit.jupiter.api.Test; +import org.wildfly.common.Assert; + +public class MEPIntegrationTest { + private static final long TIMEOUT = 200000; + + @Test + public void testInitializeAndLaunch() throws Exception { + // create client side + PipedInputStream in = new PipedInputStream(); + PipedOutputStream out = new PipedOutputStream(); + PipedInputStream in2 = new PipedInputStream(); + PipedOutputStream out2 = new PipedOutputStream(); + + in.connect(out2); + out.connect(in2); + + boolean[] inComputeAsync = new boolean[1]; + boolean[] launchHappened = new boolean[1]; + + + + IModelExecutionProtocolClient client = new IModelExecutionProtocolClient() { + + }; + Launcher clientSideLauncher = MEPLauncher.createLauncher(client, IModelExecutionProtocolServer.class, in, out); + + + + K3FSMGemocMEPServerImpl server = new K3FSMMEPModule().createInjectorAndDoEMFRegistration().getInstance(K3FSMGemocMEPServerImpl.class); + Launcher serverSideLauncher = MEPLauncher.createLauncher(server, IModelExecutionProtocolClient.class, in2, out2); + + + server.connect(serverSideLauncher.getRemoteProxy()); + + clientSideLauncher.startListening(); + serverSideLauncher.startListening(); + + InitializeRequestArguments initializeRequestArguments = new InitializeRequestArguments(); + initializeRequestArguments.setClientName("MEPIntegrationTest.testInitialize()"); + CompletableFuture initFuture = clientSideLauncher.getRemoteProxy().initialize(initializeRequestArguments); + + Capabilities cap = initFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); + System.out.println(""+cap); + Assert.assertTrue(cap.getSupportsTerminateRequest()); + + // TODO find how to assert answer form clientSide + + Map launchRequestArguments = new HashMap(); + launchRequestArguments.put(MEPLaunchParameterKey.modelContent.name(), loadModelContent("tests/xtext/models/TwoStatesUpcast.k3fsm")); + + + URI uri = URI.createFileURI(getFileFromResources("tests/xtext/models/TwoStatesUpcast.k3fsm").getAbsolutePath()); + launchRequestArguments.put(MEPLaunchParameterKey.modelURI.name(), uri.toString()); + launchRequestArguments.put(MEPLaunchParameterKey.language.name(), "org.eclipse.gemoc.example.k3fsm.K3fsm"); + launchRequestArguments.put(MEPLaunchParameterKey.modelEntryPoint.name(), "/"); + launchRequestArguments.put(MEPLaunchParameterKey.initializationMethod.name(), "org.eclipse.gemoc.example.k3fsm.k3dsa.FSMAspect.initializeModel"); + launchRequestArguments.put(MEPLaunchParameterKey.initializationArguments.name(), "abababa"); + launchRequestArguments.put(MEPLaunchParameterKey.methodEntryPoint.name(), "public static void org.eclipse.gemoc.example.k3fsm.k3dsa.FSMAspect.main(org.eclipse.gemoc.example.k3fsm.FSM)"); + + CompletableFuture launchFuture = clientSideLauncher.getRemoteProxy().launch(launchRequestArguments); + launchFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); + + for (int i = 0; i < 20; i++) { + CompletableFuture doSTepFuture = clientSideLauncher.getRemoteProxy().next(null); + doSTepFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); + } + + + } + + + public File getFileFromResources(String fileName) { + ClassLoader classLoader = getClass().getClassLoader(); + + URL resource = classLoader.getResource(fileName); + if (resource == null) { + throw new IllegalArgumentException("file is not found!"); + } else { + return new File(resource.getFile()); + } + } + + public String loadModelContent(String filePathInResourceFolder) throws IOException { + ClassLoader classLoader = getClass().getClassLoader(); + + try (InputStream inputStream = classLoader.getResourceAsStream(filePathInResourceFolder)) { + + String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + return result; + + } catch (IOException e) { + throw e; + } + } +} diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/.gitkeep b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/tests/xtext/models/TwoStatesUpcast.k3fsm b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/tests/xtext/models/TwoStatesUpcast.k3fsm new file mode 100644 index 00000000..b5e0f53b --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/resources/tests/xtext/models/TwoStatesUpcast.k3fsm @@ -0,0 +1,23 @@ +FSM TwoStateUpcast { + initialState S1 + ownedStates { + State S1 { + outgoingTransitions { + Transition "S1_2" { + input "a" + output "A" + target S2 + } + } + }, + State S2 { + outgoingTransitions { + Transition S2_1 { + input "b" + output "B" + target S1 + } + } + } + } +} \ No newline at end of file diff --git a/official_samples/K3FSM/pomfirst/pom.xml b/official_samples/K3FSM/pomfirst/pom.xml new file mode 100644 index 00000000..b3f803da --- /dev/null +++ b/official_samples/K3FSM/pomfirst/pom.xml @@ -0,0 +1,86 @@ + + 4.0.0 + org.eclipse.gemoc.gemoc_studio + org.eclipse.gemoc.gemoc_studio.officialexample.k3fsm.pomfirst + 1.0.0-SNAPSHOT + + pom + + + 1.8 + 1.8 + 2.22.0 + 0.21.1 + 2.14.0 + 1.5.1 + + http://download.eclipse.org/releases/photon + http://www.kermeta.org/k3/update_2018-09-05 + http://www.kermeta.org/ale-lang/updates/2019-11-13 + http://melange.inria.fr/updatesite/nightly/update_2018-12-03/ + + + + + + org.eclipse.gemoc.example.k3fsm.mep.server + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho.version} + true + + + + 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 + + + + + + + \ No newline at end of file From 7bd92d9653bc0418ba91b3738f3e6eb5b916f6ba Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Thu, 14 May 2020 14:22:33 +0200 Subject: [PATCH 02/13] pom cleanup Signed-off-by: Didier Vojtisek --- .../pom.xml | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml index 6fa09343..a411bfc4 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml @@ -64,11 +64,6 @@ org.eclipse.emf.mwe.utils 1.5.1 - - - - - org.eclipse.lsp4j org.eclipse.lsp4j.debug @@ -76,19 +71,17 @@ - org.eclipse.gemoc.executionframework org.eclipse.gemoc.executionframework.mep 1.0.0-SNAPSHOT - org.eclipse.gemoc.execution.sequential.javaengine org.eclipse.gemoc.execution.sequential.javaengine.headless 1.0.0-SNAPSHOT - fr.inria.glose + org.eclipse.gemoc.commons org.eclipse.gemoc.commons.utils 1.0.0-SNAPSHOT @@ -303,7 +296,7 @@ - + *:* @@ -330,7 +320,7 @@ - + --> From b339222d3239f54f6432b4e4f1f61aca235d37fb Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Fri, 15 May 2020 15:02:18 +0200 Subject: [PATCH 03/13] create a set of "pomfirst" pom these pom are used to recreate a more reliable dependency tree of a subset of gemoc components when used from pure maven project Signed-off-by: Didier Vojtisek --- .../pom.xml | 20 +++++++++---------- .../mep/server/K3FSMMEPServerEndpoint.java | 11 +++++----- .../src/main/resources/application.properties | 3 +++ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml index a411bfc4..3bf5b563 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml @@ -81,7 +81,7 @@ 1.0.0-SNAPSHOT - org.eclipse.gemoc.commons + org.eclipse.gemoc.pomfirst org.eclipse.gemoc.commons.utils 1.0.0-SNAPSHOT @@ -111,7 +111,7 @@ - org.eclipse.gemoc.execution.sequential.java + org.eclipse.gemoc.pomfirst org.eclipse.gemoc.execution.sequential.javaengine 4.0.0-SNAPSHOT @@ -121,22 +121,22 @@ 3.2.3-SNAPSHOT - org.eclipse.gemoc.trace.commons + org.eclipse.gemoc.pomfirst org.eclipse.gemoc.trace.commons.model 3.0.1-SNAPSHOT - org.eclipse.gemoc.trace.commons + org.eclipse.gemoc.pomfirst org.eclipse.gemoc.trace.commons 3.0.1-SNAPSHOT - org.eclipse.gemoc.modeldebugging.executionframework + org.eclipse.gemoc.pomfirst org.eclipse.gemoc.executionframework.debugger 4.0.0-SNAPSHOT - org.eclipse.gemoc.modeldebugging.executionframework + org.eclipse.gemoc.pomfirst org.eclipse.gemoc.executionframework.engine 4.0.0-SNAPSHOT @@ -153,7 +153,7 @@ ${basedir}/lib_not_correctly_deployed/org.eclipse.emf.transaction_1.9.1.201805140824.jar - + org.eclipse.platform @@ -296,7 +296,7 @@ - + diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java index 6bdf372c..23335029 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java @@ -38,7 +38,7 @@ @ApplicationScoped public class K3FSMMEPServerEndpoint { - private static final Logger LOGGER = LoggerFactory.getLogger("K3FSMMEPServerEndpoint"); + private static final Logger LOGGER = LoggerFactory.getLogger(K3FSMMEPServerEndpoint.class); boolean supportHeader = true; @@ -58,13 +58,13 @@ public K3FSMGemocMEPServerImpl getOrCreateServer() { @OnOpen public void onOpen(Session session) { - LOGGER.info("Connection"); + LOGGER.info("Starting connection..."); try { - + LOGGER.debug("Creating server..."); getOrCreateServer(); + LOGGER.debug("Server created"); - ExtensibleInputStream in = new ExtensibleInputStream(); activeSessions.put(session, in); @@ -98,9 +98,10 @@ public void flush() throws IOException { serverSideLauncher.startListening(); //Launcher serverSideLauncher = MEPLauncher.createLauncher(server, IModelExecutionProtocolServer.class, in, outputstream); - + LOGGER.info("Connection success"); } catch (Exception e) { e.printStackTrace(); + LOGGER.error("Connection failed", e); } } diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties index f4fd1bb3..f38ade56 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/resources/application.properties @@ -207,6 +207,9 @@ dev.quarkus.http.port=8090 # The log level level for this category # #quarkus.log.category.{*}.level=inherit +quarkus.log.category."io.quarkus".level=DEBUG +quarkus.log.category."org.eclipse".level=DEBUG + # # The minimum level that this category can be set to From 991f63495e917a816273378d4a1164560a5836a6 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Fri, 15 May 2020 16:43:35 +0200 Subject: [PATCH 04/13] adding code in order to help debug classloader issue Signed-off-by: Didier Vojtisek --- .../mep/server/K3FSMMEPServerEndpoint.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java index 23335029..7f305947 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java @@ -3,11 +3,14 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; @@ -32,6 +35,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.quarkus.runtime.StartupEvent; + @ServerEndpoint("/mep/k3fsm") @@ -55,6 +60,31 @@ public K3FSMGemocMEPServerImpl getOrCreateServer() { return server; } + void onStart(@Observes StartupEvent ev) { + LOGGER.info("The K3FSMMEPServerEndpoint is starting..."); + // this is a check, in a correctly configured pom/classloader, this should pass + // otherwise you may obtain error it the classloader/ + // we don this check here because error in onOpen tend to be captured and hidden to the user (+ a timeout) + LOGGER.debug("Creating server..."); + try{ + LOGGER.error("pause 5000ms in order to connect debugger before continuing..."); + Thread.sleep(5000); + LOGGER.debug("Creating K3FSMMEPModule..."); + getOrCreateServer(); + LOGGER.debug("K3FSMMEPModule created"); + } catch (InterruptedException e) { + } catch (Exception e) { + LOGGER.error("failed to create Xtext K3FSMMEPModule, classpath may be inconsistent"); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + LOGGER.error(sw.toString()); + + throw e; + } + LOGGER.debug("Server created"); + } + @OnOpen public void onOpen(Session session) { From 01565be8956f28796758476a3419ead13f005027 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Fri, 29 May 2020 16:00:32 +0200 Subject: [PATCH 05/13] share launch conf for build full studio from eclipse Signed-off-by: Didier Vojtisek --- .project | 2 +- .../gemoc-studio full_compilation (tycho).launch | 16 ++++++++++++++++ .../launchconf/gemoc-studio pomfirst.launch | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 dev_support/launchconf/gemoc-studio full_compilation (tycho).launch create mode 100644 dev_support/launchconf/gemoc-studio pomfirst.launch diff --git a/.project b/.project index b7eb1a43..190ceb32 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - gemoc-studio_root + gemoc-studio diff --git a/dev_support/launchconf/gemoc-studio full_compilation (tycho).launch b/dev_support/launchconf/gemoc-studio full_compilation (tycho).launch new file mode 100644 index 00000000..2caf6d17 --- /dev/null +++ b/dev_support/launchconf/gemoc-studio full_compilation (tycho).launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dev_support/launchconf/gemoc-studio pomfirst.launch b/dev_support/launchconf/gemoc-studio pomfirst.launch new file mode 100644 index 00000000..323c2441 --- /dev/null +++ b/dev_support/launchconf/gemoc-studio pomfirst.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + From 4404b29d4e500a0beda757be50b2ceb1d2de5113 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Fri, 29 May 2020 18:26:03 +0200 Subject: [PATCH 06/13] remove rename strategy binding Signed-off-by: Didier Vojtisek --- .../pom.xml | 9 +++++++-- .../k3fsm/mep/server/CustomServerModule.xtend | 4 +--- .../example/k3fsm/mep/server/K3FSMMEPModule.xtend | 13 ++++++++++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml index 3bf5b563..40e20457 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml @@ -11,7 +11,7 @@ 1.8 2.22.0 0.21.1 - 2.19.0 + 2.18.0 @@ -27,7 +27,12 @@ - + + io.quarkus diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend index 7b508c87..b78ff55f 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/CustomServerModule.xtend @@ -11,8 +11,6 @@ import org.eclipse.xtext.resource.IContainer import org.eclipse.xtext.resource.IResourceServiceProvider import org.eclipse.xtext.resource.ResourceServiceProviderServiceLoader import org.eclipse.xtext.resource.containers.ProjectDescriptionBasedContainerManager -import org.eclipse.xtext.ide.server.rename.IRenameService -import org.eclipse.xtext.ide.server.rename.RenameService class CustomServerModule extends AbstractModule { @@ -23,6 +21,6 @@ class CustomServerModule extends AbstractModule { bind(IWorkspaceConfigFactory).to(ProjectWorkspaceConfigFactory) bind(IProjectDescriptionFactory).to(DefaultProjectDescriptionFactory) bind(IContainer.Manager).to(ProjectDescriptionBasedContainerManager) - bind(IRenameService).to(RenameService) + // bind(IRenameService).to(RenameService) } } diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend index 1e766224..9a6e3c2f 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPModule.xtend @@ -21,11 +21,18 @@ class K3FSMMEPModule extends K3FSMStandaloneSetupGenerated { }*/ override createInjector() { - Guice.createInjector(Modules2.mixin(new K3FSMRuntimeModule, new K3FSMIdeModule, new CustomServerModule, - [bind(IResourceServiceProvider.Registry).toProvider(IResourceServiceProvider.Registry.RegistryProvider)] - )) + Guice.createInjector( + Modules2.mixin( + new K3FSMRuntimeModule, + new K3FSMIdeModule, + new CustomServerModule, + [bind(IResourceServiceProvider.Registry).toProvider(IResourceServiceProvider.Registry.RegistryProvider)] + ) + ) } + + override register(Injector injector) { super.register(injector) if (!EPackage.Registry.INSTANCE.containsKey("http://www.inria.fr/glose/fcl")) { From eacf0d7cf9c5e40ed1715747a77cbdc5d4ecffba Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Tue, 2 Jun 2020 15:57:17 +0200 Subject: [PATCH 07/13] use full qualified name in logger Signed-off-by: Didier Vojtisek --- .../gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java index 5768428e..e0664b77 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMGemocMEPServerImpl.java @@ -20,7 +20,7 @@ public class K3FSMGemocMEPServerImpl extends K3GemocMEPServerImpl { - private static final Logger LOGGER = LoggerFactory.getLogger("K3FSMGemocMEPServerImpl"); + private static final Logger LOGGER = LoggerFactory.getLogger(K3FSMGemocMEPServerImpl.class); public K3FSMGemocMEPServerImpl() { super(); From 7750bf110c21b61081c69bb985686770ea058faa Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Tue, 2 Jun 2020 17:06:49 +0200 Subject: [PATCH 08/13] force lsp4j version makes sure that xtext.ide doesn't grab inconsistent components Signed-off-by: Didier Vojtisek --- .../pom.xml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml index 40e20457..d71fb11e 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/pom.xml @@ -12,6 +12,7 @@ 2.22.0 0.21.1 2.18.0 + 0.8.0 @@ -23,11 +24,21 @@ pom import + + org.eclipse.lsp4j + org.eclipse.lsp4j + ${lsp4j.version} + + + org.eclipse.lsp4j + org.eclipse.lsp4j.debug + ${lsp4j.version} + - + org.eclipse.gemoc.executionframework From 75b76336ab42f0b60457486df3a9a34588c3fbb2 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Tue, 2 Jun 2020 17:49:40 +0200 Subject: [PATCH 09/13] improve error detection Signed-off-by: Didier Vojtisek --- .../example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java index 7f305947..3069d95f 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java @@ -132,6 +132,11 @@ public void flush() throws IOException { } catch (Exception e) { e.printStackTrace(); LOGGER.error("Connection failed", e); + } catch (Throwable e) { + if(e instanceof NoSuchFieldError) + LOGGER.error("NoSuchFieldError detected during MEPLauncher.createLauncher"); + LOGGER.error("Please check jar versions consistency, most probably org.eclipse.lsp4j "); + throw e; } } @@ -139,11 +144,12 @@ public void flush() throws IOException { @OnClose public void onClose(Session session) { activeSessions.remove(session); + LOGGER.info("Closing session "+session.getId()+" "+session.getRequestURI()); } @OnError public void onError(Session session, Throwable throwable) { - + LOGGER.error("Error "+throwable.getMessage()+" on session "+session.getId()+" "+session.getRequestURI(), throwable); } @OnMessage From 7745a417e1d2ce47848a06b485e98bb04ace6c2a Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Wed, 3 Jun 2020 11:24:36 +0200 Subject: [PATCH 10/13] remove debug pause Signed-off-by: Didier Vojtisek --- .../mep/server/K3FSMMEPServerEndpoint.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java index 3069d95f..7b7a6d3b 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/main/java/org/eclipse/gemoc/example/k3fsm/mep/server/K3FSMMEPServerEndpoint.java @@ -67,12 +67,12 @@ void onStart(@Observes StartupEvent ev) { // we don this check here because error in onOpen tend to be captured and hidden to the user (+ a timeout) LOGGER.debug("Creating server..."); try{ - LOGGER.error("pause 5000ms in order to connect debugger before continuing..."); - Thread.sleep(5000); + //LOGGER.error("pause 5000ms in order to connect debugger before continuing..."); + //Thread.sleep(5000); LOGGER.debug("Creating K3FSMMEPModule..."); getOrCreateServer(); LOGGER.debug("K3FSMMEPModule created"); - } catch (InterruptedException e) { + //} catch (InterruptedException e) { } catch (Exception e) { LOGGER.error("failed to create Xtext K3FSMMEPModule, classpath may be inconsistent"); StringWriter sw = new StringWriter(); @@ -82,7 +82,13 @@ void onStart(@Observes StartupEvent ev) { throw e; } - LOGGER.debug("Server created"); + ServerEndpoint[] sepAnnot = this.getClass().getAnnotationsByType(ServerEndpoint.class); + if(sepAnnot.length > 0) { + LOGGER.debug("ServerEndpoint created "+sepAnnot[0].value()); + } else { + + LOGGER.debug("ServerEndpoint created"); + } } @OnOpen @@ -129,6 +135,7 @@ public void flush() throws IOException { //Launcher serverSideLauncher = MEPLauncher.createLauncher(server, IModelExecutionProtocolServer.class, in, outputstream); LOGGER.info("Connection success"); + LOGGER.debug("Session "+session.getId()+" "+session.getRequestURI()+" opened"); } catch (Exception e) { e.printStackTrace(); LOGGER.error("Connection failed", e); @@ -144,7 +151,7 @@ public void flush() throws IOException { @OnClose public void onClose(Session session) { activeSessions.remove(session); - LOGGER.info("Closing session "+session.getId()+" "+session.getRequestURI()); + LOGGER.debug("Closing session "+session.getId()+" "+session.getRequestURI()); } @OnError From 578555b503c3fe7d98f49aa6ba98fa69976b9005 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Wed, 3 Jun 2020 12:21:44 +0200 Subject: [PATCH 11/13] fix tests Signed-off-by: Didier Vojtisek --- .../tests/integration/commands/MEPIntegrationTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java index dc8a16a5..6712d7ea 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java @@ -22,6 +22,7 @@ import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolServer; import org.eclipse.lsp4j.debug.Capabilities; +import org.eclipse.lsp4j.debug.ContinueResponse; import org.eclipse.lsp4j.debug.InitializeRequestArguments; import org.eclipse.lsp4j.jsonrpc.Launcher; import org.junit.jupiter.api.Test; @@ -87,10 +88,12 @@ public void testInitializeAndLaunch() throws Exception { CompletableFuture launchFuture = clientSideLauncher.getRemoteProxy().launch(launchRequestArguments); launchFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); - for (int i = 0; i < 20; i++) { - CompletableFuture doSTepFuture = clientSideLauncher.getRemoteProxy().next(null); - doSTepFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); + for (int i = 0; i < 3; i++) { + CompletableFuture doStepInFuture = clientSideLauncher.getRemoteProxy().stepIn(null); + doStepInFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); } + CompletableFuture continueFuture = clientSideLauncher.getRemoteProxy().continue_(null); + continueFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); } From 500f32cd34e81047ddeefdb4536653fc199b87a2 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Wed, 3 Jun 2020 15:48:24 +0200 Subject: [PATCH 12/13] try to force timeout in test in ci Signed-off-by: Didier Vojtisek --- .../tests/integration/commands/MEPIntegrationTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java index 6712d7ea..4287c9b8 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java @@ -66,12 +66,12 @@ public void testInitializeAndLaunch() throws Exception { InitializeRequestArguments initializeRequestArguments = new InitializeRequestArguments(); initializeRequestArguments.setClientName("MEPIntegrationTest.testInitialize()"); CompletableFuture initFuture = clientSideLauncher.getRemoteProxy().initialize(initializeRequestArguments); - + Thread.sleep(100); Capabilities cap = initFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); System.out.println(""+cap); Assert.assertTrue(cap.getSupportsTerminateRequest()); - // TODO find how to assert answer form clientSide + // TODO find how to assert answer from clientSide Map launchRequestArguments = new HashMap(); launchRequestArguments.put(MEPLaunchParameterKey.modelContent.name(), loadModelContent("tests/xtext/models/TwoStatesUpcast.k3fsm")); @@ -86,6 +86,7 @@ public void testInitializeAndLaunch() throws Exception { launchRequestArguments.put(MEPLaunchParameterKey.methodEntryPoint.name(), "public static void org.eclipse.gemoc.example.k3fsm.k3dsa.FSMAspect.main(org.eclipse.gemoc.example.k3fsm.FSM)"); CompletableFuture launchFuture = clientSideLauncher.getRemoteProxy().launch(launchRequestArguments); + Thread.sleep(100); launchFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); for (int i = 0; i < 3; i++) { @@ -95,6 +96,9 @@ public void testInitializeAndLaunch() throws Exception { CompletableFuture continueFuture = clientSideLauncher.getRemoteProxy().continue_(null); continueFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); + + // TODO find how to assert notifications from clientSide (ex: end of the execution) + } From 31c89b186ace10347906a4d015eee45767cc2336 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Thu, 4 Jun 2020 11:44:28 +0200 Subject: [PATCH 13/13] immroved tests for mep Signed-off-by: Didier Vojtisek --- .../commands/MEPIntegrationTest.java | 20 +++++++---- .../integration/commands/TestClient.java | 36 +++++++++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/TestClient.java diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java index 4287c9b8..1f09eb2e 100644 --- a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/MEPIntegrationTest.java @@ -1,5 +1,7 @@ package org.eclipse.gemoc.example.k3fsm.mep.server.tests.integration.commands; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -16,6 +18,7 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMGemocMEPServerImpl; import org.eclipse.gemoc.example.k3fsm.mep.server.K3FSMMEPModule; +import org.eclipse.gemoc.example.k3fsm.mep.server.tests.integration.commands.TestClient.Status; import org.eclipse.gemoc.executionframework.mep.launch.GemocMEPServerImpl; import org.eclipse.gemoc.executionframework.mep.launch.MEPLaunchParameterKey; import org.eclipse.gemoc.executionframework.mep.launch.MEPLauncher; @@ -23,7 +26,11 @@ import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolServer; import org.eclipse.lsp4j.debug.Capabilities; import org.eclipse.lsp4j.debug.ContinueResponse; +import org.eclipse.lsp4j.debug.ContinuedEventArguments; +import org.eclipse.lsp4j.debug.ExitedEventArguments; import org.eclipse.lsp4j.debug.InitializeRequestArguments; +import org.eclipse.lsp4j.debug.StoppedEventArguments; +import org.eclipse.lsp4j.debug.TerminatedEventArguments; import org.eclipse.lsp4j.jsonrpc.Launcher; import org.junit.jupiter.api.Test; import org.wildfly.common.Assert; @@ -47,9 +54,7 @@ public void testInitializeAndLaunch() throws Exception { - IModelExecutionProtocolClient client = new IModelExecutionProtocolClient() { - - }; + TestClient client = new TestClient(); Launcher clientSideLauncher = MEPLauncher.createLauncher(client, IModelExecutionProtocolServer.class, in, out); @@ -93,12 +98,15 @@ public void testInitializeAndLaunch() throws Exception { CompletableFuture doStepInFuture = clientSideLauncher.getRemoteProxy().stepIn(null); doStepInFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); } + + assertEquals(Status.Stopped, client.currentStatus); CompletableFuture continueFuture = clientSideLauncher.getRemoteProxy().continue_(null); continueFuture.get(TIMEOUT, TimeUnit.MILLISECONDS); - + //assertEquals(Status.Continuing, client.currentStatus); - // TODO find how to assert notifications from clientSide (ex: end of the execution) - + // TODO improve how to assert notifications from clientSide (ex: end of the execution) + Thread.sleep(1000); // ugly + assertEquals(Status.Terminated, client.currentStatus); } diff --git a/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/TestClient.java b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/TestClient.java new file mode 100644 index 00000000..58789095 --- /dev/null +++ b/official_samples/K3FSM/pomfirst/org.eclipse.gemoc.example.k3fsm.mep.server/src/test/java/org/eclipse/gemoc/example/k3fsm/mep/server/tests/integration/commands/TestClient.java @@ -0,0 +1,36 @@ +package org.eclipse.gemoc.example.k3fsm.mep.server.tests.integration.commands; + +import org.eclipse.gemoc.executionframework.mep.services.IModelExecutionProtocolClient; +import org.eclipse.lsp4j.debug.ContinuedEventArguments; +import org.eclipse.lsp4j.debug.ExitedEventArguments; +import org.eclipse.lsp4j.debug.StoppedEventArguments; +import org.eclipse.lsp4j.debug.TerminatedEventArguments; + +public class TestClient implements IModelExecutionProtocolClient { + public enum Status {Unknown, Initialized, Continuing, Stopped, Terminated, Exited} + public Status currentStatus = Status.Unknown; + + @Override + public void stopped(StoppedEventArguments args) { + IModelExecutionProtocolClient.super.stopped(args); + currentStatus= Status.Stopped; + } + + @Override + public void continued(ContinuedEventArguments args) { + IModelExecutionProtocolClient.super.continued(args); + currentStatus= Status.Continuing; + } + + @Override + public void exited(ExitedEventArguments args) { + IModelExecutionProtocolClient.super.exited(args); + currentStatus= Status.Exited; + } + + @Override + public void terminated(TerminatedEventArguments args) { + IModelExecutionProtocolClient.super.terminated(args); + currentStatus= Status.Terminated; + } +}