blob: 0e39b653f93702f203eefb71d5a7bed9ce005285 [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">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-4.4.2">
<title>Model connectivity - Epsilon</title>
<link rel="stylesheet" href="../../assets/stylesheets/application.30686662.css">
<link rel="stylesheet" href="../../assets/stylesheets/application-palette.a8b3c06d.css">
<meta name="theme-color" content="">
<script src="../../assets/javascripts/modernizr.74668098.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono&display=fallback">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../../assets/fonts/material-icons.css">
<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-primary="black" data-md-color-accent="orange">
<svg class="md-svg">
<defs>
</defs>
</svg>
<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" data-md-component="overlay" for="__drawer"></label>
<a href="#the-epsilon-model-connectivity-layer-emc" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="../.." title="Epsilon" class="md-header-nav__button md-logo">
<img src="../../assets/images/epsilon-white-background.png" width="24" height="24">
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
Epsilon
</span>
<span class="md-header-nav__topic">
Model connectivity
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></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" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<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" data-md-source="">
<div class="md-source__repository">
Git repository @ Eclipse
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main" role="main">
<div class="md-main__inner md-grid" data-md-component="container">
<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" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="../.." title="Epsilon" class="md-nav__button md-logo">
<img src="../../assets/images/epsilon-white-background.png" width="48" height="48">
</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-source="">
<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-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3" checked>
<label class="md-nav__link" for="nav-3">
Documentation
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-3">
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 md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Model connectivity
</label>
<a href="./" title="Model connectivity" class="md-nav__link md-nav__link--active">
Model connectivity
</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="#the-imodel-interface" class="md-nav__link">
The IModel interface
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#loading-and-persistence" class="md-nav__link">
Loading and Persistence
</a>
</li>
<li class="md-nav__item">
<a href="#type-related-services" class="md-nav__link">
Type-related Services
</a>
</li>
<li class="md-nav__item">
<a href="#ownership" class="md-nav__link">
Ownership
</a>
</li>
<li class="md-nav__item">
<a href="#creation-deletion-and-modifications" class="md-nav__link">
Creation, Deletion and Modifications
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#the-modelrepository-class" class="md-nav__link">
The ModelRepository class
</a>
</li>
<li class="md-nav__item">
<a href="#the-modelgroup-class" class="md-nav__link">
The ModelGroup class
</a>
</li>
<li class="md-nav__item">
<a href="#assumptions-about-the-underlying-modelling-technologies" class="md-nav__link">
Assumptions about the underlying modelling technologies
</a>
</li>
<li class="md-nav__item">
<a href="#emc-drivers" class="md-nav__link">
EMC Drivers
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#eclipse-modeling-framework" class="md-nav__link">
Eclipse Modeling Framework
</a>
</li>
<li class="md-nav__item">
<a href="#matlab-simulink" class="md-nav__link">
Matlab Simulink
</a>
</li>
<li class="md-nav__item">
<a href="#xmlcsv" class="md-nav__link">
XML/CSV
</a>
</li>
<li class="md-nav__item">
<a href="#eclipse-hawk" class="md-nav__link">
Eclipse Hawk
</a>
</li>
<li class="md-nav__item">
<a href="#other-drivers" class="md-nav__link">
Other Drivers
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3-3" type="checkbox" id="nav-3-3">
<label class="md-nav__link" for="nav-3-3">
Languages
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="2">
<label class="md-nav__title" for="nav-3-3">
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>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3-4" type="checkbox" id="nav-3-4">
<label class="md-nav__link" for="nav-3-4">
Tools
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="2">
<label class="md-nav__title" for="nav-3-4">
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">
<a href="../flexmi/" title="Flexmi" class="md-nav__link">
Flexmi
</a>
</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-toggle md-nav__toggle" data-md-toggle="nav-3-9" type="checkbox" id="nav-3-9">
<label class="md-nav__link" for="nav-3-9">
Javadoc
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="2">
<label class="md-nav__title" for="nav-3-9">
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-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
Issues
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-4">
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-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
Community
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-5">
Community
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__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?
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="2">
<label class="md-nav__title" for="nav-5-1">
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">
<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="#the-imodel-interface" class="md-nav__link">
The IModel interface
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#loading-and-persistence" class="md-nav__link">
Loading and Persistence
</a>
</li>
<li class="md-nav__item">
<a href="#type-related-services" class="md-nav__link">
Type-related Services
</a>
</li>
<li class="md-nav__item">
<a href="#ownership" class="md-nav__link">
Ownership
</a>
</li>
<li class="md-nav__item">
<a href="#creation-deletion-and-modifications" class="md-nav__link">
Creation, Deletion and Modifications
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#the-modelrepository-class" class="md-nav__link">
The ModelRepository class
</a>
</li>
<li class="md-nav__item">
<a href="#the-modelgroup-class" class="md-nav__link">
The ModelGroup class
</a>
</li>
<li class="md-nav__item">
<a href="#assumptions-about-the-underlying-modelling-technologies" class="md-nav__link">
Assumptions about the underlying modelling technologies
</a>
</li>
<li class="md-nav__item">
<a href="#emc-drivers" class="md-nav__link">
EMC Drivers
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#eclipse-modeling-framework" class="md-nav__link">
Eclipse Modeling Framework
</a>
</li>
<li class="md-nav__item">
<a href="#matlab-simulink" class="md-nav__link">
Matlab Simulink
</a>
</li>
<li class="md-nav__item">
<a href="#xmlcsv" class="md-nav__link">
XML/CSV
</a>
</li>
<li class="md-nav__item">
<a href="#eclipse-hawk" class="md-nav__link">
Eclipse Hawk
</a>
</li>
<li class="md-nav__item">
<a href="#other-drivers" class="md-nav__link">
Other Drivers
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="the-epsilon-model-connectivity-layer-emc">The Epsilon Model Connectivity Layer (EMC)<a class="headerlink" href="#the-epsilon-model-connectivity-layer-emc" title="Permanent link">&para;</a></h1>
<p>The Epsilon Model Connectivity (EMC) layer provides abstraction facilities over concrete modelling technologies such as <a href="#eclipse-modeling-framework">EMF</a>, <a href="#xmlcsv">XML</a>, <a href="#matlab-simulink">Simulink</a> etc. and enables Epsilon programs to interact with models conforming to these technologies in a uniform manner. A graphical overview of the core classes and methods of EMC is displayed below.</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>If you are interested in examples of EMC-based drivers for Epsilon, rather than on the organisation of EMC itself, please scroll to the <a href="#emc-drivers">bottom of this page</a>.</p>
</div>
<div class="mermaid mermaid-100">classDiagram
class IModel {
-name: String
-aliases: String[*]
+load()
+load(properties : StringProperties)
+store()
+getAllOfKind(type: String): Object[*]
+isKindOf(element: Object, type: String): boolean
+getAllOfType(type: String): Object[*]
+isTypeOf(element: Object, type: String): boolean
+createInstance(type: String): Object
+deleteElement(element: Object)
}
class ModelRepository {
+getOwningModel(modelElement: Object)
+getModelByName(name: String)
+dispose()
}
class IPropertyGetter {
+invoke(object: Object, property: String)
}
class IPropertySetter {
+invoke(object: Object, property: String, value: Object)
}
ModelRepository -- IModel: models *
ModelGroup -- IModel: models *
IModel &lt;|-- ModelGroup
IModel -- IPropertySetter: propertySetter
IModel -- IPropertyGetter: propertyGetter</div>
<!--![The Epsilon Model Connectivity Layer](images/EMC.png)-->
<p>To abstract away from diverse model representations and APIs provided by different modelling technologies, EMC defines the <em>IModel</em> interface. <em>IModel</em> provides a number of methods that enable querying and modifying the model elements it contains at a higher level of abstraction. To enable languages and tools that build atop EMC to manage multiple models simultaneously, the <em>ModelRepository</em> class acts as a container that offers façade services. The following sections discuss these two core concepts in detail.</p>
<h2 id="the-imodel-interface">The IModel interface<a class="headerlink" href="#the-imodel-interface" title="Permanent link">&para;</a></h2>
<p>Each model specifies a name which must be unique in the context of the model repository in which it is contained. Also, it defines a number of aliases; that is non-unique alternate names; via which it can be accessed. The interface also defines the following services.</p>
<h3 id="loading-and-persistence">Loading and Persistence<a class="headerlink" href="#loading-and-persistence" title="Permanent link">&para;</a></h3>
<p>The <em>load()</em> and <em>load(properties : Properties)</em> methods enable extenders to specify in a uniform way how a model is loaded into memory from the physical location in which it resides. Similarly, the <em>store()</em> and <em>store(location : String)</em> methods are used to define how the model can be persisted from memory to a permanent storage location.</p>
<h3 id="type-related-services">Type-related Services<a class="headerlink" href="#type-related-services" title="Permanent link">&para;</a></h3>
<p>The majority of metamodelling architectures support inheritance between meta-classes and therefore two types of type-conformance relationships generally appear between model elements and types. The <em>type-of</em> relationship appears when a model element is an instance of the type and the <em>kind-of</em> relationship appears when the model element is an instance of the type or any of its sub-types. Under this definition, the <em>getAllOfType(type: String)</em> and the <em>getAllOfKind(type: String)</em> operations return all the elements in the model that have a type-of and a kind-of relationship with the type in question respectively.</p>
<p>Similarly, the <em>isTypeOf(element: Object, type : String)</em> and <em>isKindOf(element: Object, type : String)</em> return whether the element in question has a type-of or a kind-of relationship with the type respectively. The <em>getTypeOf(element: Object)</em> method returns the fully-qualified name of the type an element conforms to.</p>
<p>The <em>hasType(type: String)</em> method returns true if the model supports a type with the specified name. To support technologies that enable users to define abstract (non-instantiable) types, the <em>isInstantiable(type: String)</em> method returns if instances of the type can be created.</p>
<h3 id="ownership">Ownership<a class="headerlink" href="#ownership" title="Permanent link">&para;</a></h3>
<p>The <em>allContents()</em> method returns all the elements that the model contains and the <em>owns(element: Object)</em> method returns true if the element under question belongs to the model.</p>
<h3 id="creation-deletion-and-modifications">Creation, Deletion and Modifications<a class="headerlink" href="#creation-deletion-and-modifications" title="Permanent link">&para;</a></h3>
<p>Model elements are created and deleted using the <em>createInstance(type: String)</em> and <em>deleteElement(element: Object)</em> methods respectively.</p>
<p>To retrieve and set the values of properties of its model elements, <em>IModel</em> uses its associated <em>propertyGetter</em> (<em>IPropertyGetter</em>) and <em>propertySetter</em> (<em>IPropertySetter</em>) respectively. Technology-specific implementations of those two interfaces are responsible for accessing and modifying the value of a property of a model element through their <em>invoke(element: Object, property : String)</em> and <em>invoke(value: Object)</em> respectively.</p>
<!--
## The IModelTransactionSupport interface
In its *transactionSupport* property, a model can optionally (if the target modelling technology supports transactions) specify an instance of an implementation of the *IModelTransactionSupport* interface. The interface provides transaction-related services for the specific modelling technology. The interface provides the *startTransaction()*, *commitTransaction()* and *rollbackTransaction()* methods that start a new transaction, commit and roll back the current transaction respectively.
-->
<h2 id="the-modelrepository-class">The ModelRepository class<a class="headerlink" href="#the-modelrepository-class" title="Permanent link">&para;</a></h2>
<p>A model repository acts as a container for a set of models that need to be managed in the context of a task or a set of tasks. Apart from a reference to the models it contains, <em>ModelRepository</em> also provides the following façade functionality.</p>
<p>The <em>getOwningModel(element: Object)</em> method returns the model that owns a particular element. The <em>transactionSupport</em> property specifies an instance of the <em>ModelRepositoryTransactionSupport</em> class which is responsible for aggregate management of transactions by delegating calls to its <em>startTransaction()</em>, <em>commitTransaction()</em> and <em>abortTransaction()</em> methods, to the respective methods of instances of <em>IModelTransactionSupport</em> associated with models contained in the repository.</p>
<h2 id="the-modelgroup-class">The ModelGroup class<a class="headerlink" href="#the-modelgroup-class" title="Permanent link">&para;</a></h2>
<p>A <em>ModelGroup</em> is a group of models that have a common alias. <em>ModelGroups</em> are calculated dynamically by the model repository based on common model aliases. That is, if two or more models share a common alias, the repository forms a new model group. Since <em>ModelGroup</em> implements the <em>IModel</em> interface, clients can use all the methods of <em>IModel</em> to perform aggregate operations on multiple models, such as collecting the contents of more than one models. An exception to that is the <em>createInstance(type: String)</em> method which cannot be defined for a group of models as it cannot be determined in which model of the group the newly created element should belong.</p>
<h2 id="assumptions-about-the-underlying-modelling-technologies">Assumptions about the underlying modelling technologies<a class="headerlink" href="#assumptions-about-the-underlying-modelling-technologies" title="Permanent link">&para;</a></h2>
<p>The discussion provided above has demonstrated that EMC makes only minimal assumptions about the structure and the organization of the underlying modelling technologies. Thus, it intentionally refrains from defining classes for concepts such as <em>model element</em>, <em>type</em> and <em>metamodel</em>. By contrast, it employs a lightweight approach that uses primitive strings for type names and objects of the target implementation platforms as model elements. There are two reasons for this decision.</p>
<ul>
<li>
<p>The primary reason is that by minimizing the assumptions about the underlying technologies EMC becomes more resistant to future changes of the implementations of the current technologies and can also embrace new technologies without changes.</p>
</li>
<li>
<p>Another reason is that if a heavy-weight approach was used, extending the platform with support for a new modelling technology would involve providing wrapping objects for the native objects which represent model elements and types in the specific modelling technology. Experiments in the early phases of the design of EMC demonstrated that such a heavy-weight approach significantly increases the amount of memory required to represent the models in memory, degrades performance and provides little benefits in reward.</p>
</li>
</ul>
<h2 id="emc-drivers">EMC Drivers<a class="headerlink" href="#emc-drivers" title="Permanent link">&para;</a></h2>
<p>Below are known <em>drivers</em> that implement the EMC interfaces discussed above and allow Epsilon programs to access different types of models and structured data.</p>
<h3 id="eclipse-modeling-framework">Eclipse Modeling Framework<a class="headerlink" href="#eclipse-modeling-framework" title="Permanent link">&para;</a></h3>
<p>The Eclipse Modelling Framework (EMF) is one of the most robust and widely used open-source modelling frameworks, and the cornerstone of an extensive ecosystem of technologies for graphical/textual model editing, model comparison and merging etc. Being an Eclipse project, Epsilon naturally provides support for all flavours of EMF models (e.g. textual, graphical, XSD-based XML), and most of the <a href="../screencasts">screencasts</a>, <a href="../articles/">articles</a> and <a href="../examples">examples</a> in Epsilon's Git repository use EMF models.</p>
<h3 id="matlab-simulink">Matlab Simulink<a class="headerlink" href="#matlab-simulink" title="Permanent link">&para;</a></h3>
<p>Epsilon also provides mature support for querying and modifying Matlab Simulink models as shown in <a href="../articles/#epsilon-and-simulink-models">these articles</a>.</p>
<h3 id="xmlcsv">XML/CSV<a class="headerlink" href="#xmlcsv" title="Permanent link">&para;</a></h3>
<p>For quick and dirty metamodel-less modelling, Epsilon also supports <a href="../articles/plain-xml">plain XML documents</a> and <a href="../articles/csv-emc">CSV files</a>.</p>
<h3 id="eclipse-hawk">Eclipse Hawk<a class="headerlink" href="#eclipse-hawk" title="Permanent link">&para;</a></h3>
<p><a href="https://www.eclipse.org/hawk">Hawk</a> is an Eclipse project that provides tools for monitoring, indexing and querying <em>repositories</em> (i.e. local folders, Eclipse workspaces, Git/SVN repositories) containing models. Hawk provides an EMC driver through which model indices can be queried with Epsilon languages.</p>
<h3 id="other-drivers">Other Drivers<a class="headerlink" href="#other-drivers" title="Permanent link">&para;</a></h3>
<p>There are also less mature/well-documented drivers for Epsilon for tools and formats such as:</p>
<ul>
<li><a href="https://github.com/epsilonlabs/emc-cdt">Eclipse C/C++ Development tools</a></li>
<li><a href="https://github.com/epsilonlabs/emc-ptcim">PTC Integrity Modeller</a></li>
<li><a href="https://github.com/epsilonlabs/emc-metaedit">MetaEdit+</a></li>
<li><a href="https://github.com/epsilonlabs/emc-jdt">Eclipse Java Development Tools</a></li>
<li><a href="https://github.com/epsilonlabs/emc-jdbc/">Relational Databases (JDBC)</a></li>
<li><a href="https://github.com/epsilonlabs/emc-argouml">ArgoUML</a></li>
<li><a href="https://github.com/epsilonlabs/emc-cdo">Connected Data Objects (CDO)</a></li>
<li><a href="https://github.com/gdaniel/emc-neoemf">NeoEMF</a></li>
</ul>
<p>These drivers have not had much external use historically, but if you're interested in them, please <a href="../../forum">give us a shout</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="../" title="Overview" 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>
Overview
</span>
</div>
</a>
<a href="../eol/" title="Object language (EOL)" 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>
Object language (EOL)
</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/application.c648116f.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:"../.."}})</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>