blob: 44f3dc3fc32db36f92d626a5fc2a33556c63bc53 [file] [log] [blame]
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.1.5">
<title>Workflow (Ant tasks) - Epsilon</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.bde7dde4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ef6f36e2.min.css">
<meta name="theme-color" content="#000000">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
<style>:root{--md-text-font-family:"Roboto";--md-code-font-family:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/stylesheets/mermaid.css">
<link rel="stylesheet" href="../../assets/javascript/google-code-prettify/prettify.css">
<link rel="stylesheet" href="https://unpkg.com/mermaid@8.5.1/dist/mermaid.css">
<link rel="stylesheet" href="../../assets/stylesheets/slick.css">
<link rel="stylesheet" href="../../assets/stylesheets/slick-theme.css">
<link rel="stylesheet" href="../../assets/stylesheets/extra.css">
<script>
window.ga = window.ga || function() {
(ga.q = ga.q || []).push(arguments)
}
ga.l = +new Date
/* Setup integration and send page view */
ga("create", "UA-184785655-1", "auto")
ga("set", "anonymizeIp", true)
ga("send", "pageview")
/* Register handler to log search on blur */
document.addEventListener("DOMContentLoaded", () => {
if (document.forms.search) {
var query = document.forms.search.query
query.addEventListener("blur", function() {
if (this.value) {
var path = document.location.pathname;
ga("send", "pageview", path + "?q=" + this.value)
}
})
}
})
</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="black" data-md-color-accent="orange">
<script>function __prefix(e){return new URL("../..",location).pathname+"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}</script>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#orchestration-workflow" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Epsilon" class="md-header__button md-logo" aria-label="Epsilon" data-md-component="logo">
<img src="../../assets/images/epsilon-white-background.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Epsilon
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Workflow (Ant tasks)
</span>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</label>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
</div>
<div class="md-source__repository">
Git repository @ Eclipse
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Epsilon" class="md-nav__button md-logo" aria-label="Epsilon" data-md-component="logo">
<img src="../../assets/images/epsilon-white-background.png" alt="logo">
</a>
Epsilon
</label>
<div class="md-nav__source">
<a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
</div>
<div class="md-source__repository">
Git repository @ Eclipse
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item">
<a href="../../download/" class="md-nav__link">
Download
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../live" class="md-nav__link">
Playground
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5">
Documentation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Documentation" data-md-level="1">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../emc/" class="md-nav__link">
Model Connectivity
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_3" type="checkbox" id="__nav_5_3" >
<label class="md-nav__link" for="__nav_5_3">
Languages
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Languages" data-md-level="2">
<label class="md-nav__title" for="__nav_5_3">
<span class="md-nav__icon md-icon"></span>
Languages
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../eol/" class="md-nav__link">
Object Language (EOL)
</a>
</li>
<li class="md-nav__item">
<a href="../egl/" class="md-nav__link">
Code Generation (EGL)
</a>
</li>
<li class="md-nav__item">
<a href="../evl/" class="md-nav__link">
Model Validation (EVL)
</a>
</li>
<li class="md-nav__item">
<a href="../etl/" class="md-nav__link">
Model Transformation (ETL)
</a>
</li>
<li class="md-nav__item">
<a href="../ecl/" class="md-nav__link">
Model Comparison (ECL)
</a>
</li>
<li class="md-nav__item">
<a href="../eml/" class="md-nav__link">
Model Merging (EML)
</a>
</li>
<li class="md-nav__item">
<a href="../epl/" class="md-nav__link">
Pattern Matching (EPL)
</a>
</li>
<li class="md-nav__item">
<a href="../flock/" class="md-nav__link">
Model Migration (Flock)
</a>
</li>
<li class="md-nav__item">
<a href="../emg/" class="md-nav__link">
Model Generation (EMG)
</a>
</li>
<li class="md-nav__item">
<a href="../eunit/" class="md-nav__link">
Unit Testing (EUnit)
</a>
</li>
<li class="md-nav__item">
<a href="../pinset/" class="md-nav__link">
Dataset Extraction (Pinset)
</a>
</li>
<li class="md-nav__item">
<a href="../ewl/" class="md-nav__link">
Wizard Language (EWL)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_4" type="checkbox" id="__nav_5_4" checked>
<label class="md-nav__link" for="__nav_5_4">
Tools
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Tools" data-md-level="2">
<label class="md-nav__title" for="__nav_5_4">
<span class="md-nav__icon md-icon"></span>
Tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../picto/" class="md-nav__link">
Picto
</a>
</li>
<li class="md-nav__item">
<a href="../flexmi/" class="md-nav__link">
Flexmi
</a>
</li>
<li class="md-nav__item">
<a href="../eugenia/" class="md-nav__link">
Eugenia
</a>
</li>
<li class="md-nav__item">
<a href="../exeed/" class="md-nav__link">
Exeed
</a>
</li>
<li class="md-nav__item">
<a href="../modelink/" class="md-nav__link">
Modelink
</a>
</li>
<li class="md-nav__item">
<a href="../hutn/" class="md-nav__link">
HUTN
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Workflow (Ant tasks)
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Workflow (Ant tasks)
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#motivation" class="md-nav__link">
Motivation
</a>
</li>
<li class="md-nav__item">
<a href="#the-ant-tool" class="md-nav__link">
The ANT Tool
</a>
<nav class="md-nav" aria-label="The ANT Tool">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#structure" class="md-nav__link">
Structure
</a>
</li>
<li class="md-nav__item">
<a href="#concrete-syntax" class="md-nav__link">
Concrete Syntax
</a>
</li>
<li class="md-nav__item">
<a href="#extending-ant" class="md-nav__link">
Extending ANT
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#integration-challenges" class="md-nav__link">
Integration Challenges
</a>
</li>
<li class="md-nav__item">
<a href="#framework-design-and-core-tasks" class="md-nav__link">
Framework Design and Core Tasks
</a>
<nav class="md-nav" aria-label="Framework Design and Core Tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#the-epsilontask-task" class="md-nav__link">
The EpsilonTask task
</a>
</li>
<li class="md-nav__item">
<a href="#model-loading-tasks" class="md-nav__link">
Model Loading Tasks
</a>
</li>
<li class="md-nav__item">
<a href="#model-storing-task" class="md-nav__link">
Model Storing Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-disposal-tasks" class="md-nav__link">
Model Disposal Tasks
</a>
</li>
<li class="md-nav__item">
<a href="#the-starttransaction-task" class="md-nav__link">
The StartTransaction Task
</a>
</li>
<li class="md-nav__item">
<a href="#the-committransaction-and-rollbacktransaction-tasks" class="md-nav__link">
The CommitTransaction and RollbackTransaction Tasks
</a>
</li>
<li class="md-nav__item">
<a href="#the-abstract-executable-module-task" class="md-nav__link">
The Abstract Executable Module Task
</a>
<nav class="md-nav" aria-label="The Abstract Executable Module Task">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#0n-model-nested-elements" class="md-nav__link">
0..n model nested elements
</a>
</li>
<li class="md-nav__item">
<a href="#0n-parameter-nested-elements" class="md-nav__link">
0..n parameter nested elements
</a>
</li>
<li class="md-nav__item">
<a href="#0n-exports-nested-elements" class="md-nav__link">
0..n exports nested elements
</a>
</li>
<li class="md-nav__item">
<a href="#0n-uses-nested-elements" class="md-nav__link">
0..n uses nested elements
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#model-management-tasks" class="md-nav__link">
Model Management Tasks
</a>
<nav class="md-nav" aria-label="Model Management Tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#generic-model-management-task" class="md-nav__link">
Generic Model Management Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-validation-task" class="md-nav__link">
Model Validation Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-to-model-transformation-task" class="md-nav__link">
Model-to-Model Transformation Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-comparison-task" class="md-nav__link">
Model Comparison Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-merging-task" class="md-nav__link">
Model Merging Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-to-text-transformation-task" class="md-nav__link">
Model-to-Text Transformation Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-migration-task" class="md-nav__link">
Model Migration Task
</a>
</li>
<li class="md-nav__item">
<a href="#pattern-matching-task" class="md-nav__link">
Pattern Matching Task
</a>
</li>
<li class="md-nav__item">
<a href="#java-class-static-method-execution-task" class="md-nav__link">
Java Class Static Method Execution Task
</a>
</li>
<li class="md-nav__item">
<a href="#for-task" class="md-nav__link">
For Task
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#additional-resources" class="md-nav__link">
Additional Resources
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../articles/" class="md-nav__link">
Articles
</a>
</li>
<li class="md-nav__item">
<a href="../../examples/" class="md-nav__link">
Examples
</a>
</li>
<li class="md-nav__item">
<a href="https://www.youtube.com/epsilondevs" class="md-nav__link">
Screencasts
</a>
</li>
<li class="md-nav__item">
<a href="https://www.youtube.com/playlist?list=PLRwHao6Ue0YUecg7vEUQTrtySIWwrd_mI" class="md-nav__link">
Lectures
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_9" type="checkbox" id="__nav_5_9" >
<label class="md-nav__link" for="__nav_5_9">
Javadoc
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Javadoc" data-md-level="2">
<label class="md-nav__title" for="__nav_5_9">
<span class="md-nav__icon md-icon"></span>
Javadoc
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://download.eclipse.org/epsilon/stable-javadoc/" class="md-nav__link">
Stable
</a>
</li>
<li class="md-nav__item">
<a href="https://download.eclipse.org/epsilon/interim-javadoc/" class="md-nav__link">
Interim
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6">
Issues
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Issues" data-md-level="1">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Issues
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=epsilon" class="md-nav__link">
Report a new issue
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?product=epsilon&cmdtype=doit&order=Reuse+same+sort+as+last+time&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_severity=blocker&bug_severity=critical&bug_severity=major&bug_severity=normal&bug_severity=minor&bug_severity=trivial" class="md-nav__link">
View open bugs
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?product=epsilon&cmdtype=doit&order=Reuse+same+sort+as+last+time&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_severity=enhancement" class="md-nav__link">
View enhancement requests
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&list_id=17694438&product=epsilon&query_format=advanced" class="md-nav__link">
View issues resolved since the last stable release
</a>
</li>
<li class="md-nav__item">
<a href="https://bugs.eclipse.org/bugs/buglist.cgi?product=epsilon&cmdtype=doit&order=Reuse+same+sort+as+last+time" class="md-nav__link">
View all issues
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7">
Community
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Community" data-md-level="1">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Community
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
<label class="md-nav__link" for="__nav_7_1">
Who is using Epsilon?
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Who is using Epsilon?" data-md-level="2">
<label class="md-nav__title" for="__nav_7_1">
<span class="md-nav__icon md-icon"></span>
Who is using Epsilon?
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../users/" class="md-nav__link">
Industry
</a>
</li>
<li class="md-nav__item">
<a href="../../users/education/" class="md-nav__link">
Education
</a>
</li>
<li class="md-nav__item">
<a href="../../users/open-source/" class="md-nav__link">
Open-source Projects
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="https://projects.eclipse.org/projects/modeling.epsilon/who" class="md-nav__link">
Who is developing Epsilon?
</a>
</li>
<li class="md-nav__item">
<a href="https://www.eclipse.org/forums/index.php/f/22/" class="md-nav__link">
Forum
</a>
</li>
<li class="md-nav__item">
<a href="../../professional-services" class="md-nav__link">
Professional Services
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_5" type="checkbox" id="__nav_7_5" >
<label class="md-nav__link" for="__nav_7_5">
Social Media
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Social Media" data-md-level="2">
<label class="md-nav__title" for="__nav_7_5">
<span class="md-nav__icon md-icon"></span>
Social Media
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://twitter.com/eclipseepsilon" class="md-nav__link">
Twitter
</a>
</li>
<li class="md-nav__item">
<a href="https://youtube.com/epsilondevs" class="md-nav__link">
YouTube
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../labs/" class="md-nav__link">
Epsilon Labs
</a>
</li>
<li class="md-nav__item">
<a href="../../faq/" class="md-nav__link">
Frequently Asked Questions
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../branding/" class="md-nav__link">
Branding
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#motivation" class="md-nav__link">
Motivation
</a>
</li>
<li class="md-nav__item">
<a href="#the-ant-tool" class="md-nav__link">
The ANT Tool
</a>
<nav class="md-nav" aria-label="The ANT Tool">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#structure" class="md-nav__link">
Structure
</a>
</li>
<li class="md-nav__item">
<a href="#concrete-syntax" class="md-nav__link">
Concrete Syntax
</a>
</li>
<li class="md-nav__item">
<a href="#extending-ant" class="md-nav__link">
Extending ANT
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#integration-challenges" class="md-nav__link">
Integration Challenges
</a>
</li>
<li class="md-nav__item">
<a href="#framework-design-and-core-tasks" class="md-nav__link">
Framework Design and Core Tasks
</a>
<nav class="md-nav" aria-label="Framework Design and Core Tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#the-epsilontask-task" class="md-nav__link">
The EpsilonTask task
</a>
</li>
<li class="md-nav__item">
<a href="#model-loading-tasks" class="md-nav__link">
Model Loading Tasks
</a>
</li>
<li class="md-nav__item">
<a href="#model-storing-task" class="md-nav__link">
Model Storing Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-disposal-tasks" class="md-nav__link">
Model Disposal Tasks
</a>
</li>
<li class="md-nav__item">
<a href="#the-starttransaction-task" class="md-nav__link">
The StartTransaction Task
</a>
</li>
<li class="md-nav__item">
<a href="#the-committransaction-and-rollbacktransaction-tasks" class="md-nav__link">
The CommitTransaction and RollbackTransaction Tasks
</a>
</li>
<li class="md-nav__item">
<a href="#the-abstract-executable-module-task" class="md-nav__link">
The Abstract Executable Module Task
</a>
<nav class="md-nav" aria-label="The Abstract Executable Module Task">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#0n-model-nested-elements" class="md-nav__link">
0..n model nested elements
</a>
</li>
<li class="md-nav__item">
<a href="#0n-parameter-nested-elements" class="md-nav__link">
0..n parameter nested elements
</a>
</li>
<li class="md-nav__item">
<a href="#0n-exports-nested-elements" class="md-nav__link">
0..n exports nested elements
</a>
</li>
<li class="md-nav__item">
<a href="#0n-uses-nested-elements" class="md-nav__link">
0..n uses nested elements
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#model-management-tasks" class="md-nav__link">
Model Management Tasks
</a>
<nav class="md-nav" aria-label="Model Management Tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#generic-model-management-task" class="md-nav__link">
Generic Model Management Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-validation-task" class="md-nav__link">
Model Validation Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-to-model-transformation-task" class="md-nav__link">
Model-to-Model Transformation Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-comparison-task" class="md-nav__link">
Model Comparison Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-merging-task" class="md-nav__link">
Model Merging Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-to-text-transformation-task" class="md-nav__link">
Model-to-Text Transformation Task
</a>
</li>
<li class="md-nav__item">
<a href="#model-migration-task" class="md-nav__link">
Model Migration Task
</a>
</li>
<li class="md-nav__item">
<a href="#pattern-matching-task" class="md-nav__link">
Pattern Matching Task
</a>
</li>
<li class="md-nav__item">
<a href="#java-class-static-method-execution-task" class="md-nav__link">
Java Class Static Method Execution Task
</a>
</li>
<li class="md-nav__item">
<a href="#for-task" class="md-nav__link">
For Task
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#additional-resources" class="md-nav__link">
Additional Resources
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="orchestration-workflow">Orchestration Workflow<a class="headerlink" href="#orchestration-workflow" title="Permanent link">&para;</a></h1>
<p>In practice, model management activities are seldom carried out in isolation; instead, they are often combined together to form complex workflows. Therefore, in addition to task-specific languages for individual activities (model-to-text transformatino, model validation etc), Epsilon provides a set of Apache ANT tasks for assembling multi-step automated build processes.</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>Epsilon's ANT tasks can run both within Eclipse and <a href="../articles/running-epsilon-ant-tasks-from-command-line">headless</a>, and from <a href="../articles/running-epsilon-ant-tasks-from-command-line/#maven">Maven</a> and <a href="../articles/running-epsilon-ant-tasks-from-command-line/#gradle">Gradle</a> builds too. </p>
</div>
<h2 id="motivation">Motivation<a class="headerlink" href="#motivation" title="Permanent link">&para;</a></h2>
<p>As a motivating example, a workflow that consists of both model management tasks (1-4, 6) and mainstream software development tasks (5, 7) is displayed below.</p>
<ol>
<li>Load a UML model</li>
<li>Validate it</li>
<li>Transform it into a Database Schema model</li>
<li>Generate Java code from the UML model</li>
<li>Compile the Java code</li>
<li>Generate SQL statements from the Database model</li>
<li>Run the SQL statements in a Database Management System (DBMS)</li>
</ol>
<p>In the above workflow, if the validation step (2) fails, the entire process should be aborted and the identified errors should be reported to the user. This example demonstrates that to be of practical use, a task orchestration framework needs to be able to coordinate both model management and mainstream development tasks and provide mechanisms for establishing dependencies between different tasks.</p>
<p>This page discusses such a framework for orchestrating modular model management tasks implemented using languages of the Epsilon platform. As the problem of task coordination is common in software development, many technical solutions have been already proposed and are widely used by software practitioners. In this context, designing a new general-purpose workflow management solution was deemed inappropriate. Therefore, the task orchestration solution discussed here has been designed as an extension to the robust and widely used <a href="https://ant.apache.org">ANT</a> framework. A brief overview of ANT as well as a discussion on the choice to design the orchestration workflow of Epsilon atop it is provided below.</p>
<h2 id="the-ant-tool">The ANT Tool<a class="headerlink" href="#the-ant-tool" title="Permanent link">&para;</a></h2>
<p>ANT, named so because it is <em>a little thing that can be used to build big things</em>, is a robust and widely-used framework for composing automated workflows from small reusable activities. The most important advantages of ANT, compared to traditional build tools such as <em>gnumake</em>, is that it is platform independent and easily extensible. Platform independence is achieved by building atop Java, and extensibility is realized through a lightweight binding mechanism that enables developers to contribute custom tasks using well defined interfaces and extension points.</p>
<p>This section provides a brief discussion of the structure and concrete syntax of ANT workflows, as well as the extensibility mechanisms that ANT provides to enable users contribute custom tasks.</p>
<h3 id="structure">Structure<a class="headerlink" href="#structure" title="Permanent link">&para;</a></h3>
<p>In ANT, each workflow is captured as a <code>project</code>. A simplified illustration of the structure of an ANT project is displayed in the figure below. Each ANT project consists of a number of <code>targets</code>. The one specified as the <code>default</code> is executed automatically when the project is executed. Each <code>target</code> contains a number of <code>tasks</code> and <code>depends</code> on other targets that must be executed before it. An ANT task is responsible for a distinct activity and can either succeed or fail. Exemplar activities implemented by ANT tasks include file system management, compiler invocation, version management and remote artefact deployment.</p>
<div class="mermaid mermaid-80">classDiagram
class Project {
-targets: Target[*]
-default: Target
-properties: Property[*]
}
class Task {
-typeName: String
-name: String
-attributes: Attribute[*]
}
class Attribute {
-name: String
-value: String
}
class Target {
-name: String
-tasks: Task[*]
-depends: Target[*]
}
class HashMap {
+put(key: String, object: Object)
+get(key: String): Object
}
Project -- Property: properties *
Project -- Target: targets *
Target -- Project: default
Property --|&gt; Task
Task -- Attribute: attributes *
Task -- Target: tasks *
Target -- Target: depends *
Project -- HashMap: references *</div>
<h3 id="concrete-syntax">Concrete Syntax<a class="headerlink" href="#concrete-syntax" title="Permanent link">&para;</a></h3>
<p>In terms of concrete syntax, ANT provides an XML-based syntax. In the listing below, an exemplar ANT project that compiles a set of Java files is illustrated. The project contains one target (<code>main</code>) which is also set to be the <code>default</code> target. The <code>main</code> target contains one <code>javac</code> task that specifies attributes such as <code>srcdir</code>, <code>destdir</code> and <code>classpath</code>, which define that the Java compiler will compile a set of Java files contained into the <code>src</code> directory into classes that should be placed in the <code>build</code> directory using <code>dependencies.jar</code> as an external library.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;project</span> <span class="na">default=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;target</span> <span class="na">name=</span><span class="s">&quot;main&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;javac</span> <span class="na">srcdir=</span><span class="s">&quot;${src}&quot;</span>
<span class="na">destdir=</span><span class="s">&quot;${build}&quot;</span>
<span class="na">classpath=</span><span class="s">&quot;dependencies.jar&quot;</span>
<span class="na">debug=</span><span class="s">&quot;on&quot;</span>
<span class="na">source=</span><span class="s">&quot;1.4&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/target&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<h3 id="extending-ant">Extending ANT<a class="headerlink" href="#extending-ant" title="Permanent link">&para;</a></h3>
<p>Binding between the XML tags that describe the tasks and the actual implementations of the tasks is achieved through a light-weight mechanism at two levels. First, the tag (in the example above, <code>javac</code>) is resolved to a Java class that extends the <code>org.apache.ant.Task</code> abstract class (in the case of <code>javac</code>, the class is <code>org.apache.tools.ant.taskdefs.Javac</code>) via a configuration file. Then, the attributes of the tasks (e.g. <code>srcdir</code>) are set using the reflective features that Java provides. Finally, the <code>execute()</code> method of the task is invoked to perform the actual job.</p>
<p>ANT also supports more advanced features including nested XML elements and <code>filesets</code>, however providing a complete discussion is beyond the scope of this page.</p>
<h2 id="integration-challenges">Integration Challenges<a class="headerlink" href="#integration-challenges" title="Permanent link">&para;</a></h2>
<p>A simple approach to extending ANT with support for model management tasks would be to implement one standalone task for each language in Epsilon. However, such an approach demonstrates a number of integration and performance shortcomings which are discussed below.</p>
<p>Since models are typically serialized in the file system, before a task is executed, the models it needs to access/modify must be parsed and loaded in memory. In the absence of a more elaborate framework, each model management task would have to take responsibility for loading and storing the models it operates on. Also, in most workflows, more than one task operates on the same models sequentially, and needlessly loading/storing the same models many times in the context of the same workflow is an expensive operation both time and memory-wise, particularly as the size of models increases.</p>
<p>Another weakness of this primitive approach is limited inter-task communication. In the absence of a communication framework that allows model management tasks to exchange information with each other, it is often the case that many tasks end up performing the same (potentially expensive) queries on models. By contrast, an inter-task communication framework would enable time and resource intensive calculations to be performed once and their results to be communicated to all interested subsequent tasks.</p>
<p>Having discussed ANT, Epsilon and the challenges their integration poses, the following sections presents the design of a solution that enables developers to invoke model management tasks in the context of ANT workflows. The solution consists of a core framework that addresses the challenges discussed above, a set of specific tasks, each of which implements a distinct model management activity, and a set of tasks that enable developers to initiate and manage transactions on models using the respective facilities provided by Epsilon's <a href="../emc">model connectivity layer</a>.</p>
<h2 id="framework-design-and-core-tasks">Framework Design and Core Tasks<a class="headerlink" href="#framework-design-and-core-tasks" title="Permanent link">&para;</a></h2>
<p>The role of the core framework, illustrated below, is to provide model loading and storing facilities as well as runtime communication facilities to the individual model management tasks that build atop it. This section provides a detailed discussion of the components it consists of.</p>
<div class="mermaid mermaid-90">classDiagram
class Task {
-name: String
-type: String
}
class VariableNestedElement {
-ref: String
-as: String
-optional: String
-ant: boolean
}
class EpsilonTask {
-profile: Boolean
+getProjectRepository(): ModelRepository
+getProjectContext(): IEolContext
}
class ExecutableModuleTask {
-src: String
-code: String
-models: ModelNestedElement[*]
-exports: ExportNestedElement[*]
-uses: UsesNestedElement[*]
}
class ModelNestedElement {
-ref: String
-as: String
-optional: String
}
Task &lt;|-- EpsilonTask
EpsilonTask &lt;|-- ExecutableModuleTask
ExecutableModuleTask *-- ModelNestedElement: models *
ExecutableModuleTask *-- UsesNestedElement: uses *
ExecutableModuleTask *-- ExportsNestedElement: exports *
ExportsNestedElement --|&gt; VariableNestedElement
UsesNestedElement --|&gt; VariableNestedElement</div>
<div class="mermaid mermaid-100">classDiagram
class LoadModelTask {
-name: String
-type: String
-aliases: String
-parameters: ParameterNestedElement[*]
}
class ParameterNestedElement {
-name: String
-value: String
-file: String
}
class StoreModelTask {
-model: String
-target: String
}
class DisposeModelTask {
-model: String
}
class StartTransactionTask {
-name: String
-models: String
}
class CommitTransactionTask {
-name: String
}
class RollbackTransactionTask {
-name: String
}
EpsilonTask &lt;|-- CommitTransactionTask
EpsilonTask &lt;|-- StartTransactionTask
RollbackTransactionTask --|&gt; EpsilonTask
EpsilonTask &lt;|-- LoadModelTask
StoreModelTask --|&gt; EpsilonTask
DisposeModelTask --|&gt; EpsilonTask
DisposeModelsTask --|&gt; EpsilonTask
LoadModelTask *-- ParameterNestedElement: parameters *</div>
<h3 id="the-epsilontask-task">The EpsilonTask task<a class="headerlink" href="#the-epsilontask-task" title="Permanent link">&para;</a></h3>
<p>An ANT task can access the project in which it is contained by invoking the <code>Task.getProject()</code> method. To facilitate sharing of arbitrary information between tasks, ANT projects provide two convenience methods, namely <code>addReference(String key, Object ref)</code> and <code>getReference(String key) : Object</code>. The former is used to add key-value pairs, which are then accessible using the latter from other tasks of the project.</p>
<p>To avoid loading models multiple times and to enable on-the-fly management of models from different Epsilon modules without needing to store and re-load the models after each task, a reference to a project-wide model repository has been added to the current ANT project using the <code>addReference</code> method discussed above. In this way, all the subclasses of the abstract <code>EpsilonTask</code> can invoke the <code>getProjectRepository()</code> method to access the project model repository.</p>
<p>Also, to support a variable sharing mechanism that enables inter-task communication, the same technique has been employed; a shared context, accessible by all Epsilon tasks via the <code>getProjectContext()</code> method, has been added. Through this mechanism, model management tasks can export variables to the project context (e.g. traces or lists containing results of expensive queries) which other tasks can then reuse.</p>
<p><code>EpsilonTask</code> also specifies a <code>profile</code> attribute that defines if the execution of the task must be profiled using the <a href="../articles/profiling/">profiling features</a> provided by Epsilon. Profiling is a particularly important aspect of workflow execution, especially where model management languages are involved. The main reason is that model management languages tend to provide convenient features which can however be computationally expensive (such as the <code>allInstances()</code> EOL built-in feature that returns all the instances of a specific metaclass in the model) and when used more often than really needed, can significantly degrade the overall performance.</p>
<p>The workflow leverages the model-transaction services provided by the model connectivity framework of Epsilon by providing three tasks for managing transactions in the context of workflows.</p>
<h3 id="model-loading-tasks">Model Loading Tasks<a class="headerlink" href="#model-loading-tasks" title="Permanent link">&para;</a></h3>
<p>The <code>LoadModelTask (epsilon.loadModel)</code> loads a model from an arbitrary location (e.g. file-system, database) and adds it to the project repository so that subsequent Epsilon tasks can query or modify it. Since Epsilon supports many modelling technologies (e.g. EMF, MDR, XML), the <code>LoadModelTask</code> defines only three generic attributes. The <code>name</code> attribute specifies the name of the model in the project repository. The <code>type</code> attribute specifies the modelling technology with which the model is captured and is used to resolve the technology-specific model loading functionality. Finally, the <code>aliases</code> attribute defines a comma-separated list of alternative names by which the model can be accessed in the model repository.</p>
<p>The rest of the information needed to load a model is implementation-specific and is therefore provided through <code>parameter</code> nested elements, each one defining a pair of <code>name</code>-<code>value</code> attributes. As an example, a task for loading an EMF model that has a file-based ECore metamodel is displayed below.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;epsilon.loadModel</span> <span class="na">name=</span><span class="s">&quot;Tree1&quot;</span> <span class="na">type=</span><span class="s">&quot;EMF&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;parameter</span> <span class="na">name=</span><span class="s">&quot;modelFile&quot;</span> <span class="na">value=</span><span class="s">&quot;TreeInstance.ecore&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;parameter</span> <span class="na">name=</span><span class="s">&quot;metamodelFile&quot;</span> <span class="na">path=</span><span class="s">&quot;Tree.ecore&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;parameter</span> <span class="na">name=</span><span class="s">&quot;isMetamodelFileBased&quot;</span> <span class="na">value=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;parameter</span> <span class="na">name=</span><span class="s">&quot;readOnLoad&quot;</span> <span class="na">value=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.loadModel&gt;</span>
</code></pre></div>
<p><code>LoadEmfModelTask</code> is a specialised version of <code>LoadModelTask</code> only for EMF models. While the <code>type</code> attribute is no longer available, the task still supports the <code>name</code> and <code>aliases</code> attributes. In addition, some of the values which had to be provided through <code>parameter</code> nested elements can now be set using regular attributes, such as <code>modelFile</code>, <code>modelUri</code>, <code>metamodelFile</code> (which implicitly indicates that the metamodel is file-based), <code>metamodelUri</code>, <code>reuseUnmodifiedMetamodelFile</code> (which can be set to "false" to avoid reusing file-based metamodels that have not been modified since the last time they were loaded), <code>read</code> (equivalent to <code>readOnLoad</code>) and <code>store</code> (equivalent to <code>storeOnDisposal</code>). The listing below shows the equivalent fragment required to produce the same result as in the listing above.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;epsilon.emf.loadModel</span> <span class="na">name=</span><span class="s">&quot;Tree1&quot;</span>
<span class="na">modelFile=</span><span class="s">&quot;TreeInstance.ecore&quot;</span>
<span class="na">metamodelFile=</span><span class="s">&quot;Tree.ecore&quot;</span> <span class="nt">/&gt;</span>
</code></pre></div>
<h3 id="model-storing-task">Model Storing Task<a class="headerlink" href="#model-storing-task" title="Permanent link">&para;</a></h3>
<p>The <code>StoreModelTask (epsilon.storeModel)</code> is used to store a model residing in the project repository. The <code>StoreModelTask</code> defines three attributes:</p>
<ul>
<li>
<p><code>model</code> (required): name of the model to be stored.</p>
</li>
<li>
<p><code>targetUri</code> (optional): URI where the model will be stored (e.g. "file:/path/to/destination").</p>
</li>
<li>
<p><code>target</code> (optional): file path where the model will be stored (e.g. "file.xmi").</p>
</li>
</ul>
<p><code>targetUri</code> takes precedence over <code>target</code>. If neither is defined, then the model is stored in the location from which it was originally loaded.</p>
<h3 id="model-disposal-tasks">Model Disposal Tasks<a class="headerlink" href="#model-disposal-tasks" title="Permanent link">&para;</a></h3>
<p>When a model is no longer required by tasks of the workflow, it can be disposed using the <code>epsilon.disposeModel</code> task. The task provides the <code>model</code> attribute that defines the name of the model to be disposed. Also, the attribute-less <code>epsilon.disposeModels</code> task is provided that disposes all the models in the project model repository. This task is typically invoked when the model management part of the workflow has finished.</p>
<h3 id="the-starttransaction-task">The StartTransaction Task<a class="headerlink" href="#the-starttransaction-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.startTransaction</code> task defines a <code>name</code> attribute that identifies the transaction. It also optionally defines a comma-separated list of model names (<code>models</code>) that the transaction will manage. If the <code>models</code> attribute is not specified, the transaction involves all the models contained in the common project model repository.</p>
<h3 id="the-committransaction-and-rollbacktransaction-tasks">The CommitTransaction and RollbackTransaction Tasks<a class="headerlink" href="#the-committransaction-and-rollbacktransaction-tasks" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.commitTransaction</code> and <code>epsilon.rollbackTransaction</code> tasks define a <code>name</code> attribute through which the transaction to be committed/rolled-back is located in the project's active transactions. If several active transactions with the same name exist the more recent one is selected.</p>
<p>The example below demonstrates an exemplar usage of the <code>epsilon.startTransaction</code> and <code>epsilon.rollbackTransaction</code> tasks. In this example, two empty models Tree1 and Tree2 are loaded in lines 1,2. Then, the EOL task of line 4 queries the models and prints the number of instances of the <code>Tree</code> metaclass in each one of them (which is 0 for both). Then, in line 13, a transaction named T1 is started on model Tree1. The EOL task of line 15, creates a new instance of Tree in both Tree1 and Tree2 and prints the number of instances of Tree in the two models (which is 1 for both models). Then, in line 26, the T1 transaction is rolled-back and any changes done in its context to model Tree1 (but not Tree2) are undone. Therefore, the EOL task of line 28, which prints the number of instances of Tree in both models, prints 0 for Tree1 but 1 for Tree2.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;epsilon.loadModel</span> <span class="na">name=</span><span class="s">&quot;Tree1&quot;</span> <span class="na">type=</span><span class="s">&quot;EMF&quot;</span><span class="nt">&gt;</span>...<span class="nt">&lt;/epsilon.loadModel&gt;</span>
<span class="nt">&lt;epsilon.loadModel</span> <span class="na">name=</span><span class="s">&quot;Tree2&quot;</span> <span class="na">type=</span><span class="s">&quot;EMF&quot;</span><span class="nt">&gt;</span>...<span class="nt">&lt;/epsilon.loadModel&gt;</span>
<span class="nt">&lt;epsilon.eol&gt;</span>
<span class="cp">&lt;![CDATA[</span>
<span class="cp"> Tree1!Tree.allInstances.size().println(); // prints 0 </span>
<span class="cp"> Tree2!Tree.allInstances.size().println(); // prints 0</span>
<span class="cp"> ]]&gt;</span>
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Tree1&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Tree2&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
<span class="nt">&lt;epsilon.startTransaction</span> <span class="na">name=</span><span class="s">&quot;T1&quot;</span> <span class="na">models=</span><span class="s">&quot;Tree1&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;epsilon.eol&gt;</span>
<span class="cp">&lt;![CDATA[</span>
<span class="cp"> var t1 : new Tree1!Tree; </span>
<span class="cp"> Tree1!Tree.allInstances.size().println(); // prints 1</span>
<span class="cp"> var t2 : new Tree2!Tree;</span>
<span class="cp"> Tree2!Tree.allInstances.size().println(); // prints 1</span>
<span class="cp"> ]]&gt;</span>
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Tree1&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Tree2&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
<span class="nt">&lt;epsilon.rollbackTransaction</span> <span class="na">name=</span><span class="s">&quot;T1&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;epsilon.eol&gt;</span>
<span class="cp">&lt;![CDATA[</span>
<span class="cp"> Tree1!Tree.allInstances.size().println(); // prints 0 </span>
<span class="cp"> Tree2!Tree.allInstances.size().println(); // prints 1 </span>
<span class="cp"> ]]&gt;</span>
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Tree1&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Tree2&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
</code></pre></div>
<div class="mermaid mermaid-90">classDiagram
class ExecutableModuleTask {
-src: String
}
class EmlTask {
-useMatchTrace: String
-exportTransformationTrace: String
-exportMergeTrace: String
}
class EtlTask {
-exportTransformationTrace: String
}
class EglTask {
-target: String
}
class EclTask {
-exportMatchTrace: String
-useMatchTrace: String
}
class EvlTask {
-failOnErrors: Boolean
-failOnWarnings: Boolean
-exportConstraintTrace: String
}
ExecutableModuleTask &lt;|-- EclTask
ExecutableModuleTask &lt;|-- EvlTask
ExecutableModuleTask &lt;|-- EglTask
EmlTask --|&gt; ExecutableModuleTask
EtlTask --|&gt; ExecutableModuleTask
EolTask --|&gt; ExecutableModuleTask</div>
<h3 id="the-abstract-executable-module-task">The Abstract Executable Module Task<a class="headerlink" href="#the-abstract-executable-module-task" title="Permanent link">&para;</a></h3>
<p>This task is the base of all the model management tasks presented in the following section. Its aim is to encapsulate the commonalities of Epsilon tasks in order to reduce duplication among them. As already discussed, in Epsilon, specifications of model management tasks are organized in executable modules. While modules can be stored anywhere, in the case of the workflow it is assumed that they are either stored as separate files in the file-system or they are provided inline within the worfklow. Thus, this abstract task defines an <code>src</code> attribute that specifies the path of the source file in which the Epsilon module is stored, but also supports inline specification of the source of the module. The two alternatives are demonstrated in the listings below.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;project</span> <span class="na">default=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;target</span> <span class="na">name=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;epsilon.eol</span> <span class="na">src=</span><span class="s">&quot;HelloWorld.eol&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/target&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;project</span> <span class="na">default=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;target</span> <span class="na">name=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;epsilon.eol&gt;</span>
<span class="cp">&lt;![CDATA[</span>
<span class="cp"> &quot;Hello world&quot;.println();</span>
<span class="cp"> ]]&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
<span class="nt">&lt;/target&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<p>Optionally, users can enable debugging for the module to be run by setting the <code>debug</code> attribute to <code>true</code>. An example is shown below. If the module reaches a breakpoint, users will be able to run the code step by step and inspect the stack trace and its variables.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;project</span> <span class="na">default=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;target</span> <span class="na">name=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;epsilon.eol</span> <span class="na">src=</span><span class="s">&quot;HelloWorld.eol&quot;</span> <span class="na">debug=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/target&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<p>The task also defines the following nested elements:</p>
<h4 id="0n-model-nested-elements">0..n model nested elements<a class="headerlink" href="#0n-model-nested-elements" title="Permanent link">&para;</a></h4>
<p>Through the <code>model</code> nested elements, each task can define which of the models, loaded in the project repository it needs to access. Each <code>model</code> element defines three attributes. The <code>ref</code> attribute specifies the name of the model that the task needs to access, the <code>as</code> attribute defines the name by which the model will be accessible in the context of the task, and the <code>aliases</code> defines a comma-delimited sequence of aliases for the model in the context of the task.</p>
<h4 id="0n-parameter-nested-elements">0..n parameter nested elements<a class="headerlink" href="#0n-parameter-nested-elements" title="Permanent link">&para;</a></h4>
<p>The <code>parameter</code> nested elements enable users to communicate String parameters to tasks. Each <code>parameter</code> element defines a <code>name</code> and a <code>value</code> attribute. Before executing the module, each <code>parameter</code> element is transformed into a String variable with the respective name and value which is then made accessible to the module.</p>
<h4 id="0n-exports-nested-elements">0..n exports nested elements<a class="headerlink" href="#0n-exports-nested-elements" title="Permanent link">&para;</a></h4>
<p>To facilitate low-level integration between different Epsilon tasks, each task can export a number of variables to the project context, so that subsequent tasks can access them later. Each <code>export</code> nested element defines the three attributes. The <code>ref</code> attribute specifies the name of the variable to be exported, the <code>as</code> string attribute defines the name by which the variable is stored in the project context and the <code>optional</code> boolean attribute specifies whether the variable is mandatory. If <code>optional</code> is set to <code>false</code> and the module does not specify such a variable, an ANT <code>BuildException</code> is raised. If the <code>ant</code> attribute is set to true, the variable is exported as an ANT variable, as shown below.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;project</span> <span class="na">default=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;target</span> <span class="na">name=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;epsilon.eol&gt;</span>
var x = 1;
<span class="nt">&lt;exports</span> <span class="na">ref=</span><span class="s">&quot;x&quot;</span> <span class="na">ant=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
<span class="nt">&lt;echo&gt;</span>${x}<span class="nt">&lt;/echo&gt;</span> <span class="c">&lt;!-- Prints 1 --&gt;</span>
<span class="nt">&lt;/target&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<h4 id="0n-uses-nested-elements">0..n uses nested elements<a class="headerlink" href="#0n-uses-nested-elements" title="Permanent link">&para;</a></h4>
<p>The <code>uses</code> nested elements enable tasks to import variables exported by previous Epsilon tasks. Each use element supports three attributes. The <code>ref</code> attribute specifies the name of the variable to be used. If there is no variable with this name in the project context, the ANT project properties are queried. This enables Epsilon modules to access ANT parameters (e.g. provided using command-line arguments). The <code>as</code> attribute specifies the name by which the variable is accessible in the context of the task. Finally, the <code>optional</code> boolean parameter specifies if the variable must exist in the project context.</p>
<p>To better illustrate the runtime communication mechanism, a minimal example is provided below. In the first listing, <code>Exporter.eol</code> defines a String variable named <code>x</code> and assigns a value to it. The workflow below specifies that after executing <code>Exporter.eol</code>, it must export a variable named <code>x</code> with the new name <code>y</code> to the project context. Finally, it defines that before executing <code>User.eol</code>, it must query the project context for a variable named <code>y</code> and in case this is available, add the variable to the module's context and then execute it. Thus, the result of executing the workflow is <code>Some String</code> printed in the output console.</p>
<pre class="prettyprint lang-eol"><code>// Exporter.eol
var x : String = "Some string";</code></pre>
<pre class="prettyprint lang-eol"><code>// User.eol
z.println();</code></pre>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;epsilon.eol</span> <span class="na">src=</span><span class="s">&quot;Exporter.eol&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;exports</span> <span class="na">ref=</span><span class="s">&quot;x&quot;</span> <span class="na">as=</span><span class="s">&quot;y&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
<span class="nt">&lt;epsilon.eol</span> <span class="na">src=</span><span class="s">&quot;User.eol&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;uses</span> <span class="na">ref=</span><span class="s">&quot;y&quot;</span> <span class="na">as=</span><span class="s">&quot;z&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
</code></pre></div>
<h2 id="model-management-tasks">Model Management Tasks<a class="headerlink" href="#model-management-tasks" title="Permanent link">&para;</a></h2>
<p>Having discussed the core framework, this section presents the model management tasks that have been implemented atop it, using languages of the Epsilon platform.</p>
<h3 id="generic-model-management-task">Generic Model Management Task<a class="headerlink" href="#generic-model-management-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.eol</code> task executes an EOL module, defined using the <code>src</code> attribute on the models that are specified using the <code>model</code> nested elements.</p>
<h3 id="model-validation-task">Model Validation Task<a class="headerlink" href="#model-validation-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.evl</code> task executes an EVL module, defined using the <code>src</code> attribute on the models that are specified using the <code>model</code> nested elements. In addition to the attributes defined by the ExecutableModuleTask, this task also provides the following attributes:</p>
<ul>
<li>
<p><code>failOnErrors</code> : Errors are the results of unsatisfied constraints. Setting the value of this attribute to <code>true</code> (default is <code>false</code>) causes a <code>BuildException</code> to be raised if one or more errors are identified during the validation process.</p>
</li>
<li>
<p><code>failOnWarnings</code> : Similarly to errors, warnings are the results of unsatisfied critiques. Setting the value of this attribute to <code>true</code> (default is also <code>false</code>) causes a <code>BuildException</code> to be raised if one or more warnings are identified during the validation process.</p>
</li>
<li>
<p><code>exportConstraintTrace</code> : This attribute enables developers to export the internal constraint trace constructed during model validation to the project context so that it can be later accessed by other tasks - which could for example attempt to automatically repair the identified inconsistencies.</p>
</li>
<li>
<p><code>exportAsModel</code> : Setting the value of this attribute causes the task to export the results of the validation as a new in-memory <a href="https://download.eclipse.org/epsilon/interim-javadoc/org/eclipse/epsilon/eol/models/java/JavaModel.html">Java model</a> with the specified name in the project repository. The exported model is essentially a wrapper for all the <a href="https://download.eclipse.org/epsilon/interim-javadoc/org/eclipse/epsilon/evl/execute/UnsatisfiedConstraint.html">unsatisfied constraints</a> identified by EVL.</p>
</li>
</ul>
<h3 id="model-to-model-transformation-task">Model-to-Model Transformation Task<a class="headerlink" href="#model-to-model-transformation-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.etl</code> task executes an ETL module, defined using the <code>src</code> attribute to transform between the models that are specified using the <code>model</code> nested elements. In addition to the attributes defined by the ExecutableModuleTask, this task also provides the <code>exportTransformationTrace</code> attribute that enables the developer to export the internal transformation trace to the project context. In this way this trace can be reused by subsequent tasks; for example another task can serialize it in the form of a separate traceability model.</p>
<h3 id="model-comparison-task">Model Comparison Task<a class="headerlink" href="#model-comparison-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.ecl</code> task executes an ECL module, defined using the <code>src</code> attribute to establish matches between elements of the models that are specified using the <code>model</code> nested elements. In addition to the attributes defined by <code>ExecutableModuleTask</code>, this task also provides the <code>exportMatchTrace</code> attribute that enables users to export the <a href="https://download.eclipse.org/epsilon/interim-javadoc/org/eclipse/epsilon/ecl/trace/MatchTrace.html">match-trace</a> calculated during the comparison as a named variable to the project context so that subsequent tasks can reuse it. For example, as discussed in the sequel, an EML model merging task can use it as a means of identifying correspondences on which to perform merging. In another example, the match-trace can be stored by a subsequent EOL task in the form of an stand-alone weaving model.</p>
<h3 id="model-merging-task">Model Merging Task<a class="headerlink" href="#model-merging-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.eml</code> task executes an EML module, defined using the <code>src</code> attribute on the models that are specified using the <code>model</code> nested elements. In addition to the attributes defined by the ExecutableModuleTask, this task also provides the following attributes:</p>
<ul>
<li>
<p><code>useMatchTrace</code> : To merge a set of models, an EML module needs an established match-trace between elements of the models. The <code>useMatchTrace</code> attribute enables the EML task to use a match-trace exported by a preceding ECL task (using its <code>exportMatchTrace</code> attribute).</p>
</li>
<li>
<p><code>exportMergeTrace, exportTransformationTrace</code> : Similarly to ETL, through these attributes an EML task can export the internal traces calculated during merging for subsequent tasks to use.</p>
</li>
</ul>
<h3 id="model-to-text-transformation-task">Model-to-Text Transformation Task<a class="headerlink" href="#model-to-text-transformation-task" title="Permanent link">&para;</a></h3>
<p>To support model to text transformations, <code>EglTask (epsilon.egl)</code> task is provided that executes an Epsilon Generation Language (EGL) module. In addition to the attributes defined by <code>ExecutableModuleTask</code>, <code>EglTask</code> also defines the following attributes:</p>
<ul>
<li>
<p><code>target</code> : Defines a file in which all of the generated text will be stored.</p>
</li>
<li>
<p><code>templateFactoryType</code> : Defines the Java class that will be instantiated to provide a <code>TemplateFactory</code> for the EGL program. The specified class must be on the classpath and must subtype <code>EglTemplateFactory</code>.</p>
</li>
</ul>
<p><code>EglTask</code> may nest any number of <code>formatter</code> elements. The <code>formatter</code> nested element has the following attributes:</p>
<ul>
<li><code>implementation</code> (required) : Defines the Java class that will be instantiated to provide a <code>Formatter</code> for the EGL program. The specified class must be on the classpath and must subtype <code>Formatter</code>.</li>
</ul>
<h3 id="model-migration-task">Model Migration Task<a class="headerlink" href="#model-migration-task" title="Permanent link">&para;</a></h3>
<p>To support model migration, <code>FlockTask (epsilon.flock)</code> is provided for executing an Epsilon <a href="../flock">Flock</a> module. In addition to the attributes defined by <code>ExecutableModuleTask</code>, <code>FlockTask</code> also defines the following mandatory attributes:</p>
<ul>
<li>
<p><code>originalModel</code> : Specifies which of the currently loaded models should be used as the source of the model migration.</p>
</li>
<li>
<p><code>migratedModel</code> : Specifies which of the currently loaded models should be used as the target of the model migration.</p>
</li>
</ul>
<h3 id="pattern-matching-task">Pattern Matching Task<a class="headerlink" href="#pattern-matching-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.epl</code> task executes an EPL module, defined using the <code>src</code> attribute to perform pattern matching on the models that are specified using the <code>model</code> nested elements. In addition to the attributes defined by the ExecutableModuleTask, this task also provides the following attributes.</p>
<ul>
<li>
<p><code>repeatWhileMatches</code>: A boolean specifying whether the pattern matching process should continue to execute for as long as matches are found.</p>
</li>
<li>
<p><code>maxLoops</code>: An integer specifying the maximum number of pattern matching iterations.</p>
</li>
<li>
<p><code>exportAs</code>: The name under which the computed pattern match model should be made available to other Epsilon tasks of the workflow.</p>
</li>
</ul>
<h3 id="java-class-static-method-execution-task">Java Class Static Method Execution Task<a class="headerlink" href="#java-class-static-method-execution-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.java.executeStaticMethod</code> task executes a parameter-less static method, defined using the <code>method</code> attribute, of a Java class, defined using the <code>javaClass</code> attribute. This task can be useful for setting up the infrastructure of Xtext-based languages.</p>
<h3 id="for-task">For Task<a class="headerlink" href="#for-task" title="Permanent link">&para;</a></h3>
<p>The <code>epsilon.for</code> task iterates over the files in a <a href="https://ant.apache.org/manual/Types/fileset.html">fileset</a> and executes its nested tasks. An example that uses <code>epsilon.for</code> to run an EOL program on XML files contained in a folder called <code>loop</code> is show below. </p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;project</span> <span class="na">default=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;target</span> <span class="na">name=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
<span class="c">&lt;!-- Load t1.xml once as Ta --&gt;</span>
<span class="nt">&lt;epsilon.xml.loadModel</span> <span class="na">name=</span><span class="s">&quot;Ta&quot;</span> <span class="na">file=</span><span class="s">&quot;t1.xml&quot;</span><span class="nt">/&gt;</span>
<span class="c">&lt;!-- For every XML file in the loop directory --&gt;</span>
<span class="nt">&lt;epsilon.for&gt;</span>
<span class="nt">&lt;fileset</span> <span class="na">dir=</span><span class="s">&quot;loop&quot;</span> <span class="na">includes=</span><span class="s">&quot;*.xml&quot;</span><span class="nt">/&gt;</span>
<span class="c">&lt;!-- Load the file as Tb --&gt;</span>
<span class="nt">&lt;epsilon.xml.loadModel</span> <span class="na">name=</span><span class="s">&quot;Tb&quot;</span> <span class="na">file=</span><span class="s">&quot;loop/${it}&quot;</span><span class="nt">/&gt;</span>
<span class="c">&lt;!-- Run an EOL program on Ta and Tb --&gt;</span>
<span class="nt">&lt;epsilon.eol&gt;</span>
Ta!t_tree.all.a_name.println();
Tb!t_tree.all.a_name.println();
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Ta&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;model</span> <span class="na">ref=</span><span class="s">&quot;Tb&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.eol&gt;</span>
<span class="c">&lt;!-- Dispose of Tb --&gt;</span>
<span class="nt">&lt;epsilon.disposeModel</span> <span class="na">model=</span><span class="s">&quot;Tb&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/epsilon.for&gt;</span>
<span class="nt">&lt;/target&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<p>The complete source code for this example is in <a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/tree/examples/org.eclipse.epsilon.examples.workflow.for">Epsilon's Git repo</a>.</p>
<h2 id="additional-resources">Additional Resources<a class="headerlink" href="#additional-resources" title="Permanent link">&para;</a></h2>
<p>Additional resources about the Epsilon ANT tasks are available <a href="../articles/#workflow-ant-tasks">here</a>.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../hutn/" title="HUTN" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
HUTN
</span>
</div>
</a>
<a href="../articles/" title="Articles" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Articles
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright © Eclipse Foundation, Inc. All Rights Reserved.
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs</a>
</div>
<div class="md-footer-copyright epsilon-eclipse-links">
<ul>
<li><a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
<li><a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
<li><a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
</ul>
</div>
<div class="md-footer-social">
<a href="https://twitter.com/eclipseepsilon" target="_blank" rel="noopener" title="twitter.com" class="md-footer-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
</a>
<a href="https://youtube.com/epsilondevs" target="_blank" rel="noopener" title="youtube.com" class="md-footer-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../../assets/javascripts/workers/search.d351de03.min.js", "version": null}</script>
<script src="../../assets/javascripts/bundle.a1609d9a.min.js"></script>
<script src="https://unpkg.com/mermaid@8.5.1/dist/mermaid.min.js"></script>
<script src="../../assets/javascript/mermaid.js"></script>
<script src="../../assets/javascript/jquery.js"></script>
<script src="../../assets/javascript/slick.min.js"></script>
<script src="../../assets/javascript/google-code-prettify/prettify.js"></script>
<script src="../../assets/javascript/google-code-prettify/lang-emfatic.js"></script>
<script src="../../assets/javascript/google-code-prettify/lang-epsilon.js"></script>
<script src="../../assets/javascript/google-code-prettify/prettyprint.js"></script>
<script src="../../assets/javascript/extra.js"></script>
<script src="https://w.appzi.io/w.js?token=jlv6W"></script>
</body>
</html>