From 4dce964a8f360657b7abb5751d4bb23cb4b37c72 Mon Sep 17 00:00:00 2001 From: Markus Hamann <markus.hamann1@tu-dresden.de> Date: Tue, 10 Dec 2024 14:55:33 +0100 Subject: [PATCH] Add V1 of the epsilon gradle example --- .gitattributes | 12 + .gitignore | 5 + README.md | 105 ++------ build.gradle | 98 ++++++++ gradle.properties | 6 + gradle/libs.versions.toml | 2 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 252 +++++++++++++++++++ gradlew.bat | 94 +++++++ metamodel/transportation_network.ecore | 77 ++++++ model/saxony_original.transportation_network | 45 ++++ report/.gitkeep | 0 scripts/rewrite.etl | 98 ++++++++ scripts/test.eunit | 4 + settings.gradle | 9 + 16 files changed, 727 insertions(+), 87 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 metamodel/transportation_network.ecore create mode 100644 model/saxony_original.transportation_network create mode 100644 report/.gitkeep create mode 100644 scripts/rewrite.etl create mode 100644 scripts/test.eunit create mode 100644 settings.gradle diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f91f646 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + +# Binary files should be left untouched +*.jar binary + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b6985c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/README.md b/README.md index ecedf04..51ec64c 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,24 @@ -# transportation_network-MDSD-EpsilonGradleExample +# Epsilon Gradle Example for the Transportation Network Example +This repository gives a simple working example of the usage of EMF models (model transformation and unit testing) outside the direct eclipse ecosystem. +The example uses [Epsilon](https://eclipse.dev/epsilon/) and [Gradle](https://gradle.org/) to create a simple CI pipeline. -## Getting started - -To make it easy for you to get started with GitLab, here's a list of recommended next steps. - -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: - -``` -cd existing_repo -git remote add origin https://git-st.inf.tu-dresden.de/open-teaching-resources/model-driven-software-development/transportation_network-mdsd-pipeline/transportation_network-mdsd-epsilongradleexample.git -git branch -M main -git push -uf origin main -``` - -## Integrate with your tools - -- [ ] [Set up project integrations](https://git-st.inf.tu-dresden.de/open-teaching-resources/model-driven-software-development/transportation_network-mdsd-pipeline/transportation_network-mdsd-epsilongradleexample/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README - -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. +The goal is to give interested students a base project to build their own MDSD pipeline. ## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. +The example pipeline has three Parts. + +1. Create a copy of the original model with: + ``` + ./gradlew copyOriginalModel + ``` +2. Transform/Rewrite the copy with + ``` + ./gradlew transform + ``` +3. Test if the transformation was running by comparing the original model with the rewritten copy. Run the tests with: + ``` + ./gradlew test + ``` \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..2f9a9b6 --- /dev/null +++ b/build.gradle @@ -0,0 +1,98 @@ +configurations { + epsilon +} + +repositories { + mavenCentral() +} + +dependencies { + epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow:2.5.0' + epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow.emf:2.5.0' + epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.eunit.cmp.emf:2.5.0' +} + +task setupEpsilonTasks { + // Set up the core Epsilon tasks + ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/tasks.xml', + classpath: configurations.epsilon.asPath, loaderref: 'epsilon') + // Set up the Epsilon EMF tasks + ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/emf/tasks.xml', + classpath: configurations.epsilon.asPath, loaderref: 'epsilon') + // Set logging level to info so that EOL's println() is not suppressed + ant.lifecycleLogLevel = 'INFO' +} + +task copyOriginalModel(type: Copy) { + from file(dir_model + 'saxony_original.transportation_network') + into dir_model + rename 'saxony_original','saxony' +} + +task register_source { + dependsOn setupEpsilonTasks, copyOriginalModel + + doFirst{ + // Load the EMF model + ant.'epsilon.emf.loadModel'( name: 'source', + modelfile: dir_model + 'saxony.transportation_network', + metamodelfile: dir_metamodel + 'transportation_network.ecore', + read: "true", + store: "true") + } +} + +task register_target { + dependsOn setupEpsilonTasks + + doFirst{ + // Load the EMF model + ant.'epsilon.emf.loadModel'( name: 'target', + modelfile: dir_model + 'saxony_t.transportation_network', + metamodelfile: dir_metamodel + 'transportation_network.ecore', + read: "false", + store: "false") + } +} + +task transform { + dependsOn register_source, register_target + + doFirst{ + ant.'epsilon.etl'(src: dir_script + "rewrite.etl"){ + model(ref: "source", alias: "source") + model(ref: "target", alias: "target") + } + } + + doLast{ + ant.'epsilon.disposeModel'(model: "source") + ant.'epsilon.disposeModel'(model: "target") + } + +} + +task test{ + dependsOn setupEpsilonTasks + + doFirst{ + ant.'epsilon.eunit'(src: dir_script + "test.eunit", failOnErrors: false, toDir: "./report/", report: "yes"){ + modelTasks() { + ant.'epsilon.emf.loadModel'( name: 'expected', + modelfile: dir_model + 'saxony.transportation_network', + metamodelfile: dir_metamodel + 'transportation_network.ecore', + read: "true", + store: "false") + ant.'epsilon.emf.loadModel'( name: 'actual', + modelfile: dir_model + 'saxony_original.transportation_network', + metamodelfile: dir_metamodel + 'transportation_network.ecore', + read: "true", + store: "false") + } + comparators() { + comparator(classname: 'org.eclipse.epsilon.eunit.cmp.emf.EMFModelComparator') + } + } + } + +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..59f0f28 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +# This file was generated by the Gradle 'init' task. +# https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties + +dir_metamodel =./metamodel/ +dir_script =./scripts/ +dir_model =./model/ \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..4ac3234 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,2 @@ +# This file was generated by the Gradle 'init' task. +# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e2847c8 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..f5feea6 --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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 +# +# https://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. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..9d21a21 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/metamodel/transportation_network.ecore b/metamodel/transportation_network.ecore new file mode 100644 index 0000000..43d35f6 --- /dev/null +++ b/metamodel/transportation_network.ecore @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="transportation_network" nsURI="http://www.stgroup.org/transportation_network" + nsPrefix="transportation_network"> + <eClassifiers xsi:type="ecore:EClass" name="TransportationNetwork" eSuperTypes="#//IdentifiableElement"> + <eStructuralFeatures xsi:type="ecore:EReference" name="roadnetworks" upperBound="-1" + eType="#//RoadNetwork" containment="true"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="locations" upperBound="-1" + eType="#//Location" containment="true"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="routes" upperBound="-1" + eType="#//Route" containment="true"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="carPark" upperBound="-1" + eType="#//Vehicle" containment="true"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Location" eSuperTypes="#//NamedElement"> + <eStructuralFeatures xsi:type="ecore:EReference" name="pois" upperBound="-1" eType="#//PointOfInterest" + containment="true"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="RoadNetwork" eSuperTypes="#//IdentifiableElement"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="isDirected" lowerBound="1" + eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false"/> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="length" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble" + defaultValueLiteral="-1.0"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1" + eType="#//Location"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="target" lowerBound="1" + eType="#//Location"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="roads" upperBound="-1" + eType="#//Road" containment="true"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Road" eSuperTypes="#//IdentifiableElement"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="length" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble" + defaultValueLiteral="0.0"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="IdentifiableElement" abstract="true"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="identifier" lowerBound="1" + eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="PointOfInterest" abstract="true" eSuperTypes="#//NamedElement"/> + <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="RestStop" eSuperTypes="#//PointOfInterest"/> + <eClassifiers xsi:type="ecore:EClass" name="GasStation" eSuperTypes="#//PointOfInterest"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="fueltypes" lowerBound="1" + upperBound="-1" eType="#//FuelType"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EEnum" name="FuelType"> + <eLiterals name="PETROL"/> + <eLiterals name="DIESEL" value="1"/> + <eLiterals name="ELECTRICITY" value="2"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Warehouse" abstract="true" eSuperTypes="#//PointOfInterest"/> + <eClassifiers xsi:type="ecore:EClass" name="Other" eSuperTypes="#//PointOfInterest"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="CompanyWarehouse" eSuperTypes="#//Warehouse"/> + <eClassifiers xsi:type="ecore:EClass" name="CustomerWarehouse" eSuperTypes="#//Warehouse"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="customerName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Route" eSuperTypes="#//IdentifiableElement"> + <eStructuralFeatures xsi:type="ecore:EReference" name="networkList" upperBound="-1" + eType="#//RoadNetwork"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="start" eType="#//Location"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="end" eType="#//Location"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="vehicle" lowerBound="1" + eType="#//Vehicle" containment="true"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Vehicle" eSuperTypes="#//IdentifiableElement"> + <eStructuralFeatures xsi:type="ecore:EReference" name="location" eType="#//Location"/> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="model" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="fuelCapacity" lowerBound="1" + eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="fuelType" lowerBound="1" + eType="#//FuelType" defaultValueLiteral="ELECTRICITY"/> + </eClassifiers> +</ecore:EPackage> diff --git a/model/saxony_original.transportation_network b/model/saxony_original.transportation_network new file mode 100644 index 0000000..3cdd3ef --- /dev/null +++ b/model/saxony_original.transportation_network @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<transportation_network:TransportationNetwork xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:transportation_network="http://www.stgroup.org/transportation_network" identifier="saxony"> + <roadnetworks identifier="DG" length="95.0" source="//@locations.0" target="//@locations.3"> + <roads identifier="A4" length="95.0"/> + </roadnetworks> + <roadnetworks identifier="DL" length="102.0" source="//@locations.0" target="//@locations.2"> + <roads identifier="A4" length="20.0"/> + <roads identifier="A14" length="67.0"/> + <roads identifier="A38" length="15.0"/> + </roadnetworks> + <roadnetworks identifier="DC" length="64.0" source="//@locations.0" target="//@locations.1"> + <roads identifier="A4" length="64.0"/> + </roadnetworks> + <roadnetworks identifier="LC" length="69.0" source="//@locations.2" target="//@locations.1"> + <roads identifier="A72" length="69.0"/> + </roadnetworks> + <locations name="Dresden"> + <pois xsi:type="transportation_network:RestStop"/> + <pois xsi:type="transportation_network:GasStation"> + <fueltypes>PETROL</fueltypes> + <fueltypes>DIESEL</fueltypes> + <fueltypes>ELECTRICITY</fueltypes> + </pois> + </locations> + <locations name="Chemnitz"> + <pois xsi:type="transportation_network:CustomerWarehouse" name="OG-01" customerName="Office GmbH"/> + <pois xsi:type="transportation_network:Other" name="Owner`s Home" type="Private House"/> + </locations> + <locations name="Leipzig"> + <pois xsi:type="transportation_network:CustomerWarehouse" name="DA-01" customerName="Delivery AG"/> + <pois xsi:type="transportation_network:RestStop"/> + </locations> + <locations name="Görlitz"> + <pois xsi:type="transportation_network:RestStop"/> + <pois xsi:type="transportation_network:GasStation"> + <fueltypes>PETROL</fueltypes> + <fueltypes>DIESEL</fueltypes> + </pois> + </locations> + <routes identifier="R1" networkList="//@roadnetworks.1 //@roadnetworks.3" start="//@locations.0" end="//@locations.1"> + <vehicle identifier="V01" location="//@locations.0" model="eTruck" fuelCapacity="150.0"/> + </routes> + <carPark identifier="V02" location="//@locations.2" model="eTruck" fuelCapacity="150.0"/> + <carPark identifier="V03" location="//@locations.0" model="eTruck" fuelCapacity="150.0"/> +</transportation_network:TransportationNetwork> diff --git a/report/.gitkeep b/report/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/scripts/rewrite.etl b/scripts/rewrite.etl new file mode 100644 index 0000000..eca5cfe --- /dev/null +++ b/scripts/rewrite.etl @@ -0,0 +1,98 @@ +/* +* Example of extending by rewriting a model. +* Here: Splitting a road network if the network +* use multiple roads. +*/ + +/* +* Normal configuration: +* Source model: Read=true, Write=true +* Target model: Read=false, Write=false +*/ + +pre { + "Model Extending/Rewrite Example".println(); + "-------------------------------------".println(); + "Start of transformation...".println(); +} + +post { + "... End of transformation.".println(); +} + +/* +* Option 1: Have a rule for the model elements which need to be extended. +* Write the extended elements in your source model. +*/ + +rule SplitRoadNetworks + transform s : source!Road + to l : source!Location, + rn : source!RoadNetwork + { + + var originalRN:source!RoadNetwork = s.eContainer(); + var network:source!TransportationNetwork = originalRN.eContainer(); + + network.roadnetworks.add(rn); + network.locations.add(l); + + rn.identifier = originalRN.identifier + "/" + originalRN.roads.size(); + rn.roads.add(s); + rn.length = s.length; + rn.source = originalRN.source; + if (originalRN.roads.isEmpty()){ + rn.target = originalRN.target; + delete l; + } else{ + rn.target = l; + originalRN.source = l; + } + +} + + +rule deleteEmptyRoadNetworks + transform s : source!RoadNetwork + to t : target!EObject + { + + if(s.roads.isEmpty()){ + delete s; + } +} + + +/* +* Optional Part for merging Road Networks with the help of an operation +*/ +rule mergeRoadNetworks + transform s : source!TransportationNetwork + to t : target!EObject{ + + for (r in s.roadnetworks) { + var toBeMergeRNs = r.RNtoMerge(); + if(not toBeMergeRNs.isEmpty()){ + toBeMergeRNs.add(r); + var minRoad = toBeMergeRNs.sortBy(rn | rn.roads.first().length).first(); + toBeMergeRNs.remove(minRoad); + for (mergingRN in toBeMergeRNs) { + mergingRN.source = minRoad.target; + mergingRN.roads.first().length -= minRoad.roads.first().length; + mergingRN.length = mergingRN.roads.first().length; + } + } + } +} + +operation source!RoadNetwork RNtoMerge() : Set { + if(self.eContainer() <> null){ + return self.eContainer().roadnetworks.select(rn | rn.source.equals(self.source) + and not (rn == self)) + .select(rn | (rn.roads.size() == 1) + and (rn.roads.first().identifier == self.roads.first().identifier)); + } else{ + return new Set; + } + +} diff --git a/scripts/test.eunit b/scripts/test.eunit new file mode 100644 index 0000000..fd6e731 --- /dev/null +++ b/scripts/test.eunit @@ -0,0 +1,4 @@ +@Test +operation testModelChanged() { + assertNotEqualModels("The model should have be changed by a transformation!", "expected", "actual"); +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..29655b9 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,9 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.11.1/userguide/multi_project_builds.html in the Gradle documentation. + * This project uses @Incubating APIs which are subject to change. + */ + +rootProject.name = 'EpsilonGradleExample' -- GitLab