blob: 8501f22260b73c6a4b5b4efc42134c7f30133637 [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="shortcut icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-5.5.3">
<title>Flexmi - Epsilon</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.947af8d5.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.7f672a1f.min.css">
<meta name="theme-color" content="">
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
<style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono",SFMono-Regular,Consolas,Menlo,monospace}</style>
<link rel="stylesheet" href="../../assets/stylesheets/extra.css">
<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">
<!-- FAVICON -->
<link rel="apple-touch-icon" sizes="76x76" href="/assets/images/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/images/favicon-16x16.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<link rel="shortcut icon" href="/assets/images/favicon.ico">
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="black" data-md-color-accent="orange">
<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="#flexmi" 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-nav md-grid" aria-label="Header">
<a href="../.." title="Epsilon" class="md-header-nav__button md-logo" aria-label="Epsilon">
<img src="../../assets/images/epsilon-white-background.png" alt="logo">
</a>
<label class="md-header-nav__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-nav__title" data-md-component="header-title">
<div class="md-header-nav__ellipsis">
<span class="md-header-nav__topic md-ellipsis">
Epsilon
</span>
<span class="md-header-nav__topic md-ellipsis">
Flexmi
</span>
</div>
</div>
<label class="md-header-nav__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 0116 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 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.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">
<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 0116 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 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.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" data-md-component="search-reset" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.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-nav__source">
<a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/" title="Go to repository" class="md-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.05L244 40.45a28.87 28.87 0 00-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 01-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 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-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="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">
<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">
<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.05L244 40.45a28.87 28.87 0 00-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 01-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 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-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="../.." title="Home" class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item">
<a href="../../download/" title="Download" class="md-nav__link">
Download
</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-3" type="checkbox" id="nav-3" checked>
<label class="md-nav__link" for="nav-3">
Documentation
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
</span>
</label>
<nav class="md-nav" aria-label="Documentation" data-md-level="1">
<label class="md-nav__title" for="nav-3">
<span class="md-nav__icon md-icon">
<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>
</span>
Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" title="Overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../emc/" title="Model connectivity" 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-3-3" type="checkbox" id="nav-3-3">
<label class="md-nav__link" for="nav-3-3">
Languages
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
</span>
</label>
<nav class="md-nav" aria-label="Languages" data-md-level="2">
<label class="md-nav__title" for="nav-3-3">
<span class="md-nav__icon md-icon">
<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>
</span>
Languages
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../eol/" title="Object language (EOL)" class="md-nav__link">
Object language (EOL)
</a>
</li>
<li class="md-nav__item">
<a href="../egl/" title="Code generation (EGL)" class="md-nav__link">
Code generation (EGL)
</a>
</li>
<li class="md-nav__item">
<a href="../evl/" title="Model validation (EVL)" class="md-nav__link">
Model validation (EVL)
</a>
</li>
<li class="md-nav__item">
<a href="../etl/" title="Model transformation (ETL)" class="md-nav__link">
Model transformation (ETL)
</a>
</li>
<li class="md-nav__item">
<a href="../ecl/" title="Model comparison (ECL)" class="md-nav__link">
Model comparison (ECL)
</a>
</li>
<li class="md-nav__item">
<a href="../eml/" title="Model merging (EML)" class="md-nav__link">
Model merging (EML)
</a>
</li>
<li class="md-nav__item">
<a href="../epl/" title="Pattern matching (EPL)" class="md-nav__link">
Pattern matching (EPL)
</a>
</li>
<li class="md-nav__item">
<a href="../flock/" title="Model Migration (Flock)" class="md-nav__link">
Model Migration (Flock)
</a>
</li>
<li class="md-nav__item">
<a href="../emg/" title="Model generation (EMG)" class="md-nav__link">
Model generation (EMG)
</a>
</li>
<li class="md-nav__item">
<a href="../eunit/" title="Unit testing (EUnit)" class="md-nav__link">
Unit testing (EUnit)
</a>
</li>
<li class="md-nav__item">
<a href="../pinset/" title="Dataset extraction (Pinset)" class="md-nav__link">
Dataset extraction (Pinset)
</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-3-4" type="checkbox" id="nav-3-4" checked>
<label class="md-nav__link" for="nav-3-4">
Tools
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
</span>
</label>
<nav class="md-nav" aria-label="Tools" data-md-level="2">
<label class="md-nav__title" for="nav-3-4">
<span class="md-nav__icon md-icon">
<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>
</span>
Tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../picto/" title="Picto" class="md-nav__link">
Picto
</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">
Flexmi
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9h14V7H3v2m0 4h14v-2H3v2m0 4h14v-2H3v2m16 0h2v-2h-2v2m0-10v2h2V7h-2m0 6h2v-2h-2v2z"/></svg>
</span>
</label>
<a href="./" title="Flexmi" class="md-nav__link md-nav__link--active">
Flexmi
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon">
<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>
</span>
Table of contents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#getting-started" class="md-nav__link">
Getting started
</a>
</li>
<li class="md-nav__item">
<a href="#fuzzy-parsing" class="md-nav__link">
Fuzzy Parsing
</a>
<nav class="md-nav" aria-label="Fuzzy Parsing">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#non-containment-reference-resolution" class="md-nav__link">
Non-Containment Reference Resolution
</a>
</li>
<li class="md-nav__item">
<a href="#long-attribute-values" class="md-nav__link">
Long Attribute Values
</a>
</li>
<li class="md-nav__item">
<a href="#attribute-assignment" class="md-nav__link">
Attribute Assignment
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#executable-attributes" class="md-nav__link">
Executable Attributes
</a>
</li>
<li class="md-nav__item">
<a href="#including-and-importing-other-flexmi-models" class="md-nav__link">
Including and Importing other Flexmi Models
</a>
</li>
<li class="md-nav__item">
<a href="#instantiating-types-from-multiple-ecore-metamodels" class="md-nav__link">
Instantiating Types from Multiple Ecore Metamodels
</a>
</li>
<li class="md-nav__item">
<a href="#models-with-multiple-root-elements" class="md-nav__link">
Models with Multiple Root Elements
</a>
</li>
<li class="md-nav__item">
<a href="#reusable-templates" class="md-nav__link">
Reusable Templates
</a>
<nav class="md-nav" aria-label="Reusable Templates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#parameters" class="md-nav__link">
Parameters
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-templates-and-slots" class="md-nav__link">
Dynamic Templates and Slots
</a>
</li>
<li class="md-nav__item">
<a href="#reusing-templates-in-different-flexmi-models" class="md-nav__link">
Reusing Templates in Different Flexmi Models
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#use-in-epsilon-and-java" class="md-nav__link">
Use in Epsilon and Java
</a>
</li>
<li class="md-nav__item">
<a href="#converting-to-xmi" class="md-nav__link">
Converting to XMI
</a>
</li>
<li class="md-nav__item">
<a href="#philosophy" class="md-nav__link">
Philosophy
</a>
</li>
<li class="md-nav__item">
<a href="#limitations" class="md-nav__link">
Limitations
</a>
</li>
<li class="md-nav__item">
<a href="#resources" class="md-nav__link">
Resources
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../eugenia/" title="Eugenia" class="md-nav__link">
Eugenia
</a>
</li>
<li class="md-nav__item">
<a href="../exeed/" title="Exeed" class="md-nav__link">
Exeed
</a>
</li>
<li class="md-nav__item">
<a href="../modelink/" title="Modelink" class="md-nav__link">
Modelink
</a>
</li>
<li class="md-nav__item">
<a href="../hutn/" title="HUTN" class="md-nav__link">
HUTN
</a>
</li>
<li class="md-nav__item">
<a href="../workflow/" title="Workflow (Ant tasks)" class="md-nav__link">
Workflow (Ant tasks)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../articles/" title="Articles" class="md-nav__link">
Articles
</a>
</li>
<li class="md-nav__item">
<a href="../../examples/" title="Examples" class="md-nav__link">
Examples
</a>
</li>
<li class="md-nav__item">
<a href="https://www.youtube.com/epsilondevs" title="Screencasts" class="md-nav__link">
Screencasts
</a>
</li>
<li class="md-nav__item">
<a href="https://www.youtube.com/playlist?list=PLRwHao6Ue0YUecg7vEUQTrtySIWwrd_mI" title="Lectures" 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-3-9" type="checkbox" id="nav-3-9">
<label class="md-nav__link" for="nav-3-9">
Javadoc
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
</span>
</label>
<nav class="md-nav" aria-label="Javadoc" data-md-level="2">
<label class="md-nav__title" for="nav-3-9">
<span class="md-nav__icon md-icon">
<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>
</span>
Javadoc
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://download.eclipse.org/epsilon/2.0/javadoc/" title="Stable" class="md-nav__link">
Stable
</a>
</li>
<li class="md-nav__item">
<a href="https://download.eclipse.org/epsilon/interim/javadoc/" title="Interim" 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-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
Issues
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
</span>
</label>
<nav class="md-nav" aria-label="Issues" data-md-level="1">
<label class="md-nav__title" for="nav-4">
<span class="md-nav__icon md-icon">
<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>
</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" title="Report a new issue" 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" title="View open bugs" 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" title="View enhancement requests" 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" title="View issues resolved since the last stable release" 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" title="View all issues" 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-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
Community
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
</span>
</label>
<nav class="md-nav" aria-label="Community" data-md-level="1">
<label class="md-nav__title" for="nav-5">
<span class="md-nav__icon md-icon">
<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>
</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-5-1" type="checkbox" id="nav-5-1">
<label class="md-nav__link" for="nav-5-1">
Who is using Epsilon?
<span class="md-nav__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
</span>
</label>
<nav class="md-nav" aria-label="Who is using Epsilon?" data-md-level="2">
<label class="md-nav__title" for="nav-5-1">
<span class="md-nav__icon md-icon">
<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>
</span>
Who is using Epsilon?
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../users/" title="Industry" class="md-nav__link">
Industry
</a>
</li>
<li class="md-nav__item">
<a href="../../users/education/" title="Education" class="md-nav__link">
Education
</a>
</li>
<li class="md-nav__item">
<a href="../../users/open-source/" title="Open-source projects" 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" title="Who is developing Epsilon?" 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/" title="Forum" class="md-nav__link">
Forum
</a>
</li>
<li class="md-nav__item">
<a href="../../labs/" title="Epsilon Labs" class="md-nav__link">
Epsilon Labs
</a>
</li>
<li class="md-nav__item">
<a href="../../faq/" title="Frequently asked questions" class="md-nav__link">
Frequently asked questions
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../branding/" title="Branding" class="md-nav__link">
Branding
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon">
<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>
</span>
Table of contents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#getting-started" class="md-nav__link">
Getting started
</a>
</li>
<li class="md-nav__item">
<a href="#fuzzy-parsing" class="md-nav__link">
Fuzzy Parsing
</a>
<nav class="md-nav" aria-label="Fuzzy Parsing">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#non-containment-reference-resolution" class="md-nav__link">
Non-Containment Reference Resolution
</a>
</li>
<li class="md-nav__item">
<a href="#long-attribute-values" class="md-nav__link">
Long Attribute Values
</a>
</li>
<li class="md-nav__item">
<a href="#attribute-assignment" class="md-nav__link">
Attribute Assignment
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#executable-attributes" class="md-nav__link">
Executable Attributes
</a>
</li>
<li class="md-nav__item">
<a href="#including-and-importing-other-flexmi-models" class="md-nav__link">
Including and Importing other Flexmi Models
</a>
</li>
<li class="md-nav__item">
<a href="#instantiating-types-from-multiple-ecore-metamodels" class="md-nav__link">
Instantiating Types from Multiple Ecore Metamodels
</a>
</li>
<li class="md-nav__item">
<a href="#models-with-multiple-root-elements" class="md-nav__link">
Models with Multiple Root Elements
</a>
</li>
<li class="md-nav__item">
<a href="#reusable-templates" class="md-nav__link">
Reusable Templates
</a>
<nav class="md-nav" aria-label="Reusable Templates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#parameters" class="md-nav__link">
Parameters
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-templates-and-slots" class="md-nav__link">
Dynamic Templates and Slots
</a>
</li>
<li class="md-nav__item">
<a href="#reusing-templates-in-different-flexmi-models" class="md-nav__link">
Reusing Templates in Different Flexmi Models
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#use-in-epsilon-and-java" class="md-nav__link">
Use in Epsilon and Java
</a>
</li>
<li class="md-nav__item">
<a href="#converting-to-xmi" class="md-nav__link">
Converting to XMI
</a>
</li>
<li class="md-nav__item">
<a href="#philosophy" class="md-nav__link">
Philosophy
</a>
</li>
<li class="md-nav__item">
<a href="#limitations" class="md-nav__link">
Limitations
</a>
</li>
<li class="md-nav__item">
<a href="#resources" class="md-nav__link">
Resources
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="flexmi">Flexmi<a class="headerlink" href="#flexmi" title="Permanent link">&para;</a></h1>
<p>Flexmi (pronounced <em>flex-em-eye</em>) is a <strong>reflective textual syntax for EMF models</strong>. Flexmi is XML-based and offers features such as fuzzy matching of XML tags and attributes to Ecore class/feature names, support for embedding EOL expressions in models and for defining and instantiating model element templates. For example, the following XML document (<code>acme.flexmi</code>):</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Bob&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Analysis&quot;</span> <span class="na">start=</span><span class="s">&quot;1&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Design&quot;</span> <span class="na">start=</span><span class="s">&quot;4&quot;</span> <span class="na">dur=</span><span class="s">&quot;6&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Bob&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Implementation&quot;</span> <span class="na">start=</span><span class="s">&quot;7&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Bob&quot;</span> <span class="na">perc=</span><span class="s">&quot;50&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Alice&quot;</span> <span class="na">perc=</span><span class="s">&quot;50&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<p>is a valid instance of the Ecore metamodel (in Emfatic) below (<code>psl</code> stands for Project Scheduling Language):</p>
<pre class="prettyprint lang-emf"><code>@namespace(uri="psl", prefix="")
package psl;
class Project {
attr String name;
attr String description;
val Task[*] tasks;
val Person[*] people;
}
class Task {
attr String title;
attr int start;
attr int duration;
val Effort[*] effort;
}
class Person {
attr String name;
ref Skill[*] skills;
}
class Effort {
ref Person person;
attr int percentage = 100;
}
class Skill {
attr String name;
}</code></pre>
<h2 id="getting-started">Getting started<a class="headerlink" href="#getting-started" title="Permanent link">&para;</a></h2>
<ul>
<li>Create a text file named <code>psl.emf</code> in your workspace and place the Emfatic content above in it.</li>
<li>Convert it into Ecore and register the produced Ecore metamodel
(<code>psl.ecore</code>) as shown
<a href="../articles/reflective-emf-tutorial">here</a>.</li>
<li>Create a new text file named <code>acme.flexmi</code> and place the XML content above in it.</li>
<li>The result should look like the screenshot below.</li>
</ul>
<p><img alt="" src="screenshot.png" /></p>
<h2 id="fuzzy-parsing">Fuzzy Parsing<a class="headerlink" href="#fuzzy-parsing" title="Permanent link">&para;</a></h2>
<p>The Flexmi parser uses fuzzy matching to map the tags in the XML document to instances of EClasses in the target metamodel. In Flexmi, attributes and non-containment references are captured using XML attributes. Multiple values can be captured in a single XML attribute as comma-delimited strings as shown below.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;_&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span> <span class="na">skills=</span><span class="s">&quot;Java, HTML&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;skill</span> <span class="na">name=</span><span class="s">&quot;Java&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;skill</span> <span class="na">name=</span><span class="s">&quot;HTML&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/_&gt;</span>
</code></pre></div>
<p>Containment references are captured using XML element containment. If an XML element has attributes, the Flexmi parser will compare its tag against EClass/EReference names expected in the context and choose the best match. For example, when it encounters the <code>&lt;person&gt;</code> element below, knowing that it is already in the context of <code>Project</code> it will match the name <code>person</code> against the names of the containment references of <code>Project</code> (<code>tasks</code>, <code>people</code>) and (all the sub-types of) their types (<code>Person</code>, <code>Task</code>) and will decide that the best match for it is <code>Person</code>.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
...
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<p>As such, it will create an instance of <code>Person</code> and will then try to find a suitable containment reference for it (<code>people</code>). If there were multiple containment references of type <code>Person</code> in class <code>Project</code>, we could help the Flexmi parser by either using the name of the target reference instead or <code>person</code>, or by using an empty container element as follows.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;people&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/people&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<h3 id="non-containment-reference-resolution">Non-Containment Reference Resolution<a class="headerlink" href="#non-containment-reference-resolution" title="Permanent link">&para;</a></h3>
<p>To resolve non-containment references, Flexmi needs target elements to have some kind of ID. If a class has an EAttribute marked as <code>id</code>, Flexmi will use that to identify its instances, otherwise, it will use the value of the <code>name</code> attribute, if present. Fully-qualified ID paths, separated by <code>.</code> are also supported.</p>
<h3 id="long-attribute-values">Long Attribute Values<a class="headerlink" href="#long-attribute-values" title="Permanent link">&para;</a></h3>
<p>XML elements can also be used instead of XML attributes to capture long/multiline EAttributes. For example, we can use a <code>&lt;description&gt;</code> nested element instead of an attribute as below.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;description&gt;</span>
Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.
<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<p>To keep very long values out of Flexmi models altogether, appending an <code>_</code> to the name of an attribute will instruct the Flexmi parser to look for a file with that name and parse its content as the value of the attribute as shown below.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span> <span class="na">description_=</span><span class="s">&quot;readme.txt&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<h3 id="attribute-assignment">Attribute Assignment<a class="headerlink" href="#attribute-assignment" title="Permanent link">&para;</a></h3>
<p>The Flexmi parser uses an implementation of the <a href="https://en.wikipedia.org/wiki/Hungarian_algorithm">Hungarian algorithm</a> to decide the best match of XML attribute names to EAttibute/(non-containment) EReference names.</p>
<h2 id="executable-attributes">Executable Attributes<a class="headerlink" href="#executable-attributes" title="Permanent link">&para;</a></h2>
<p>Prepending <code>:</code> to the name of an attribute instructs the Flexmi parser to interpret its value as an executable <a href="../eol">EOL</a> expression instead of a literal value. Also, Flexmi supports attaching a <code>:var</code> or a <code>:global</code> attribute to XML elements, to declare local/global variables that can be used in EOL expressions. The scope of local variables includes siblings of the element, and their descendants, while global variables can be accessed from anywhere in the model.</p>
<p>For example, in the Flexmi model below, the <code>Design</code> task is assigned to a local variable named <code>design</code>, which is then used to compute the value of the <code>start</code> time of the implementation task.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Bob&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Analysis&quot;</span> <span class="na">start=</span><span class="s">&quot;1&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Design&quot;</span> <span class="na">start=</span><span class="s">&quot;4&quot;</span> <span class="na">dur=</span><span class="s">&quot;6&quot;</span> <span class="na">:var=</span><span class="s">&quot;design&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Bob&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Implementation&quot;</span> <span class="na">:start=</span><span class="s">&quot;design.start + design.duration + 1&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Bob&quot;</span> <span class="na">perc=</span><span class="s">&quot;50&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Alice&quot;</span> <span class="na">perc=</span><span class="s">&quot;50&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<p>You can also use <code>:var</code>/<code>:global</code> and EOL attributes to refer to model elements without using names/ids as identifiers. For example, in the version, below, <code>Alice</code> is attached to the local variable name <code>alice</code>, which is then used in the <code>:person</code> reference of the second effort of the <code>Implementation</code> task.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span> <span class="na">:var=</span><span class="s">&quot;alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Bob&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Analysis&quot;</span> <span class="na">start=</span><span class="s">&quot;1&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Design&quot;</span> <span class="na">start=</span><span class="s">&quot;4&quot;</span> <span class="na">dur=</span><span class="s">&quot;6&quot;</span> <span class="na">:var=</span><span class="s">&quot;design&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Bob&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;task</span> <span class="na">title=</span><span class="s">&quot;Implementation&quot;</span> <span class="na">:start=</span><span class="s">&quot;design.start+design.duration+1&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Bob&quot;</span> <span class="na">perc=</span><span class="s">&quot;50&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">:person=</span><span class="s">&quot;alice&quot;</span> <span class="na">perc=</span><span class="s">&quot;50&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;/project&gt;</span>
</code></pre></div>
<h2 id="including-and-importing-other-flexmi-models">Including and Importing other Flexmi Models<a class="headerlink" href="#including-and-importing-other-flexmi-models" title="Permanent link">&para;</a></h2>
<p>Flexmi supports the <code>&lt;?import other.flexmi?&gt;</code> and <code>&lt;?include other.flexmi?&gt;</code> processing instructions. <code>import</code> creates a new resource for <code>other.flexmi</code> while <code>include</code> parses the contents of <code>other.flexmi</code> as if they were embedded in the Flexmi model that contains the <code>include</code> processing instruction.</p>
<h2 id="instantiating-types-from-multiple-ecore-metamodels">Instantiating Types from Multiple Ecore Metamodels<a class="headerlink" href="#instantiating-types-from-multiple-ecore-metamodels" title="Permanent link">&para;</a></h2>
<p>Multiple <code>&lt;?nsuri metamodeluri?&gt;</code> processing instructions can be used in the preamble of a Flexmi model, allowing it to instantiate multiple Ecore metamodels. However, in case of name clashes between them, there's no good way for disambiguation.</p>
<h2 id="models-with-multiple-root-elements">Models with Multiple Root Elements<a class="headerlink" href="#models-with-multiple-root-elements" title="Permanent link">&para;</a></h2>
<p>If you need to have multiple top-level elements in your model, you can add them under a <code>&lt;_&gt;</code> root element, which has no other semantics.</p>
<h2 id="reusable-templates">Reusable Templates<a class="headerlink" href="#reusable-templates" title="Permanent link">&para;</a></h2>
<p>Flexmi supports defining reusable templates through the reserved <code>&lt;:template&gt;</code> XML tag. For example, when designing one-person projects where all tasks take place in sequence, we can omit all the repetitive <code>&lt;effort&gt;</code> elements that refer to the same person, and we can automate the calculation of the start date of each task using a <code>simpletask</code> template, as shown below.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;_&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;simpletask</span> <span class="na">title=</span><span class="s">&quot;Analysis&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;simpletask</span> <span class="na">title=</span><span class="s">&quot;Design&quot;</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;simpletask</span> <span class="na">title=</span><span class="s">&quot;Implementation&quot;</span> <span class="na">dur=</span><span class="s">&quot;6&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/project&gt;</span>
<span class="nt">&lt;:template</span> <span class="na">name=</span><span class="s">&quot;simpletask&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;content&gt;</span>
<span class="nt">&lt;task</span> <span class="na">:start=</span><span class="s">&quot;Task.all.indexOf(self).asVar(&#39;index&#39;) == 0 ? 1 : Task.all.get(index-1).asVar(&#39;previous&#39;).start + previous.duration&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">:person=</span><span class="s">&quot;Person.all.first()&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;/content&gt;</span>
<span class="nt">&lt;/:template&gt;</span>
<span class="nt">&lt;/_&gt;</span>
</code></pre></div>
<h3 id="parameters">Parameters<a class="headerlink" href="#parameters" title="Permanent link">&para;</a></h3>
<p>Flexmi templates also support parameters, which can be used to configure the content they produce when they are invoked. An example is shown below:</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;_&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;design</span> <span class="na">dur=</span><span class="s">&quot;3&quot;</span> <span class="na">person=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/project&gt;</span>
<span class="nt">&lt;:template</span> <span class="na">name=</span><span class="s">&quot;design&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;parameter</span> <span class="na">name=</span><span class="s">&quot;person&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;content&gt;</span>
<span class="nt">&lt;task</span> <span class="na">name=</span><span class="s">&quot;Design&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;${person}&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/task&gt;</span>
<span class="nt">&lt;/content&gt;</span>
<span class="nt">&lt;/:template&gt;</span>
<span class="nt">&lt;/_&gt;</span>
</code></pre></div>
<h3 id="dynamic-templates-and-slots">Dynamic Templates and Slots<a class="headerlink" href="#dynamic-templates-and-slots" title="Permanent link">&para;</a></h3>
<p>To further customise the content that Flexmi templates produce, one can use an <a href="../egl">EGL</a> template that produces XML as the value of the <code>&lt;content&gt;</code> element of the template, by setting it's language to EGL as shown below. Also Flexmi supports a <code>&lt;:slot&gt;</code> element in the content of templates, which specifies where any nested elements of the caller should be placed in the produced XML as shown below.</p>
<div class="highlight"><pre><span></span><code><span class="cp">&lt;?nsuri psl?&gt;</span>
<span class="nt">&lt;_&gt;</span>
<span class="nt">&lt;project</span> <span class="na">title=</span><span class="s">&quot;ACME&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;person</span> <span class="na">name=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;longtask</span> <span class="na">title=</span><span class="s">&quot;Implementation&quot;</span> <span class="na">years=</span><span class="s">&quot;2&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;effort</span> <span class="na">person=</span><span class="s">&quot;Alice&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/longtask&gt;</span>
<span class="nt">&lt;/project&gt;</span>
<span class="nt">&lt;:template</span> <span class="na">name=</span><span class="s">&quot;longtask&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;parameter</span> <span class="na">name=</span><span class="s">&quot;years&quot;</span><span class="nt">/&gt;</span>
<span class="nt">&lt;content</span> <span class="na">language=</span><span class="s">&quot;EGL&quot;</span><span class="nt">&gt;</span>
<span class="cp">&lt;![CDATA[</span>
<span class="cp"> &lt;task duration=&quot;[%=years.asInteger()*12%]&quot;&gt;</span>
<span class="cp"> &lt;:slot/&gt;</span>
<span class="cp"> &lt;/task&gt;</span>
<span class="cp"> ]]&gt;</span>
<span class="nt">&lt;/content&gt;</span>
<span class="nt">&lt;/:template&gt;</span>
<span class="nt">&lt;/_&gt;</span>
</code></pre></div>
<h3 id="reusing-templates-in-different-flexmi-models">Reusing Templates in Different Flexmi Models<a class="headerlink" href="#reusing-templates-in-different-flexmi-models" title="Permanent link">&para;</a></h3>
<p>Templates can be stored in separate Flexmi files and be imported from different models using Flexmi's <code>&lt;?include ?&gt;</code> processing instruction.</p>
<h2 id="use-in-epsilon-and-java">Use in Epsilon and Java<a class="headerlink" href="#use-in-epsilon-and-java" title="Permanent link">&para;</a></h2>
<p>Flexmi offers and registers an implementation of <a href="http://download.eclipse.org/modeling/emf/emf/javadoc/2.4.3/org/eclipse/emf/ecore/resource/Resource.html">EMF's Resource interface</a> (<code>FlexmiResource</code>), and can be used like any other EMF resource implementation. For example, you can add <code>.flexmi</code> models as regular EMF models to the run configuration of your Epsilon program. An example of using Flexmi from Java follows.</p>
<div class="highlight"><pre><span></span><code><span class="n">ResourceSet</span> <span class="n">resourceSet</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ResourceSetImpl</span><span class="o">();</span>
<span class="n">resourceSet</span><span class="o">.</span><span class="na">getResourceFactoryRegistry</span><span class="o">().</span>
<span class="n">getExtensionToFactoryMap</span><span class="o">().</span><span class="na">put</span><span class="o">(</span><span class="s">&quot;flexmi&quot;</span><span class="o">,</span>
<span class="k">new</span> <span class="n">FlexmiResourceFactory</span><span class="o">());</span>
<span class="n">Resource</span> <span class="n">resource</span> <span class="o">=</span> <span class="n">resourceSet</span><span class="o">.</span><span class="na">createResource</span>
<span class="o">(</span><span class="n">URI</span><span class="o">.</span><span class="na">createFileURI</span><span class="o">(</span><span class="s">&quot;/../acme.flexmi&quot;</span><span class="o">));</span>
<span class="n">resource</span><span class="o">.</span><span class="na">load</span><span class="o">(</span><span class="kc">null</span><span class="o">);</span>
</code></pre></div>
<h2 id="converting-to-xmi">Converting to XMI<a class="headerlink" href="#converting-to-xmi" title="Permanent link">&para;</a></h2>
<p>You can convert a Flexmi model to standard XMI (with no templates, executable attributes etc.) by right-clicking on it in the Project Explorer view and selecting <code>Generate XMI</code>.</p>
<p>Converting an XMI model to Flexmi on the other hand is not supported as there's no unique mapping in this direction.</p>
<h2 id="philosophy">Philosophy<a class="headerlink" href="#philosophy" title="Permanent link">&para;</a></h2>
<p>Flexmi was originally developed as a quick and dirty way to type in EMF models without having to define an Xtext grammar or adhere to the rigid naming rules of XMI or HUTN. The name is a combination of the word "flexible" and the "XMI" acronym.</p>
<h2 id="limitations">Limitations<a class="headerlink" href="#limitations" title="Permanent link">&para;</a></h2>
<ul>
<li>Flexmi resources can't be saved programmatically (i.e. trying to call <code>resource.save(...)</code> will do nothing).</li>
<li>There is no code completion in the Flexmi editor at the moment.</li>
</ul>
<h2 id="resources">Resources<a class="headerlink" href="#resources" title="Permanent link">&para;</a></h2>
<ul>
<li>More examples of using Flexmi can be found in projects containing <code>flexmi</code> in their name, under the <a href="https://git.eclipse.org/c/epsilon/org.eclipse.epsilon.git/tree/examples">examples folder</a> of Epsilon's Git repository.</li>
<li>Flexmi is further described in the following papers:<ul>
<li><a href="http://ceur-ws.org/Vol-1694/FlexMDE2016_paper_3.pdf">Towards Flexible Parsing of StructuredTextual Model Representations</a></li>
<li><a href="http://ceur-ws.org/Vol-2245/flexmde_paper_3.pdf">Towards a Modular and Flexible Human-UsableTextual Syntax for EMF Models</a></li>
</ul>
</li>
</ul>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../picto/" title="Picto" 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>
Picto
</span>
</div>
</a>
<a href="../eugenia/" title="Eugenia" 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>
Eugenia
</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>
</div>
</footer>
</div>
<script src="../../assets/javascripts/vendor.c3dc8c49.min.js"></script>
<script src="../../assets/javascripts/bundle.f9edbbd5.min.js"></script><script id="__lang" type="application/json">{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents"}</script>
<script>
app = initialize({
base: "../..",
features: [],
search: Object.assign({
worker: "../../assets/javascripts/worker/search.8e2cddea.min.js"
}, typeof search !== "undefined" && search)
})
</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/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>
</body>
</html>