JWT Metamodel

From Eclipsepedia

Jump to: navigation, search

Contents

Introduction

This page describes the discussions and requirements for the meta-model of JWT. Based on the existing meta-model of AgilPro we will summarize all wishes, extensions etc. on this page.

An important part is JWT metamodel's extensibility.


Initial metamodel

This document File:AgilPro MetamodelDescription.pdf describes the metamodel of AgilPro as it is today (2007-02-21). This document will be the basis for discussions on all working groups who have requirements on the meta-model.

JWT metamodel comparisons

Comparison with other metamodels

A comparison with other meta-models as a result of an evaluation can be found in the following document: File:EvaluationExistingMetamodels.pdf.


Metamodel and XPDL 1.0

The document File:AgilPro Metamodel.pdf describes an initial revision of the document comparing the JWT/AgilPro metamodel with the XPDL 1.0 schema. It covers all the XPDL elements as well as the Bonita engine vendor specific extensions.

Metamodel and BPMN

Please find under File:Comparison JWT BPMN v0 3.pdf a document describing the differences between the JWT Metamodel on the one hand and BPMN on the other.


JWT Metamodel Extension Specifications


Extension Requirements and Use Cases

Specification Alternatives Study

Metamodel Extension Prototype - working samples (added 20080527)

Required changes in JWT WE

These samples showcase the mixed static and dynamic EMF technology, thanks to a JWT metamodel with an EObject-typed "aspects" relation on ModelElement (or Action). To be loaded in JWT, it also requires some magic in WEEditor.createModel().

Extract from proposed JWT Metamodel :

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model"
    nsURI="org.eclipse.jwt" nsPrefix="">
  <eSubpackages name="core" nsURI="org.eclipse.jwt/core" nsPrefix="core">
    <eClassifiers xsi:type="ecore:EClass" name="ModelElement">
      <eStructuralFeatures xsi:type="ecore:EReference" name="aspects" upperBound="-1"
          eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject" containment="true"/>
      ...
    </eClassifiers>
    ...
  </eSubpackages>
  ...
</ecore:EPackage>

Configuring EMF .workflow file loading in WEEditor.createModel() :

                  mainModelResource = getEmfEditingDomain().getResourceSet().createResource(resourceUri);
                  XMIResourceImpl r = (XMIResourceImpl) mainModelResource;
	          r.setEncoding("UTF-8");
	          // load options
	          r.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
	          r.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
	          r.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
	          XMLOptions xmlOptions = new XMLOptionsImpl();
	          xmlOptions.setProcessAnyXML(false); // REQUIRED for XSD ; else won't find ecore classes defined in metamodel extensions ; however doesn't work with old agilpros
	          xmlOptions.setProcessSchemaLocations(true); // not required, works also with false ?!
	          r.getDefaultLoadOptions().put(XMLResource.OPTION_XML_OPTIONS, xmlOptions);
	          // save options (or in doSave())
	          r.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
	          //r.getDefaultSaveOptions().put(XMLResource.OPTION_LINE_WIDTH, new Integer(80));
	          r.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
	          r.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); // REQUIRED else no xsi:schemaLocation after save !
	          //r.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION_IMPLEMENTATION, Boolean.TRUE); // adds java:// schemaLocation for static ecore
		mainModelResource = getEmfEditingDomain().getResourceSet().getResource(
				resourceUri, true);
		// read version from the model object in the resource
		converter.readModelVersionFromFile(getModel(), resourceUri);
 
		// if old version model, reread it now that the version is known
		if (getModel() instanceof AnyType) {
			loadOldVersionModel(resourceUri);
		}

LogAspect sample

Here we define a LogAspect extension meant to provide an Action with additional information (messageFormat and logProtocol attributes) about how it might be logged at runtime.

Metamodel extension definition WEMetaModel_log1.workflow :

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="logModel"
    nsURI="org.eclipse.jwt.log" nsPrefix="">
    <eClassifiers xsi:type="ecore:EClass" name="LogAspect">
      <eStructuralFeatures xsi:type="ecore:EAttribute" name="messageFormat" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
      <eStructuralFeatures xsi:type="ecore:EAttribute" name="logProtocol" lowerBound="1"
          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
          defaultValueLiteral="syslog"/>
    </eClassifiers>
</ecore:EPackage>

Workflow sample (inspired by a jwt2bpmn unit test workflow) activity_log1.workflow :

<?xml version="1.0" encoding="UTF-8"?>
<core:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:core="org.eclipse.jwt/core"
xmlns:organisations="org.eclipse.jwt/organisations"
xmlns:processes="org.eclipse.jwt/processes"
xmlns:log="org.eclipse.jwt.log"
xsi:schemaLocation="org.eclipse.jwt.log WEMetaModel_log1.ecore"
name="MainPackage" fileversion="0.4.0">
  <elements xsi:type="processes:Activity" name="Diagram1">
    <nodes xsi:type="processes:Action" name="Log Action" in="//@elements.0/@edges.0" out="//@elements.0/@edges.1" performedBy="//@elements.1" referenceEdges="//@elements.0/@referenceEdges.0">
      <aspects xsi:type="log:LogAspect" messageFormat="WARNING %" logProtocol="beep"/>
      <Location x="140" y="153"/>
      <Size width="71" height="31"/>
    </nodes>
    <nodes xsi:type="processes:InitialNode" out="//@elements.0/@edges.0">
      <Location x="41" y="158"/>
    </nodes>
    <nodes xsi:type="processes:FinalNode" in="//@elements.0/@edges.1">
      <Location x="294" y="157"/>
    </nodes>
    <edges source="//@elements.0/@nodes.1" target="//@elements.0/@nodes.0"/>
    <edges source="//@elements.0/@nodes.0" target="//@elements.0/@nodes.2"/>
    <references reference="//@elements.1" referenceEdges="//@elements.0/@referenceEdges.0">
      <Location x="164" y="56"/>
    </references>
    <referenceEdges reference="//@elements.0/@references.0" action="//@elements.0/@nodes.0"/>
  </elements>
  <elements xsi:type="organisations:Role" name="role" icon=""/>
</core:Model>


InvokeWebServiceAspect sample

Adding this aspect to an action (or its application) specifies a runtime invocation of the given web service.

Note that there will be two different ways to invoke a service : either explicitly calling a web service using this aspect, or calling a generic service and also specifying its binding (web service, rmi, xml / rest...) by using another aspect InvokeServiceAspect and runtime infrastructure provided by the friend SCOrWare project.

Metamodel extension definition WEMetaModel_ws.workflow :

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="wsModel"
    nsURI="org.eclipse.jwt.ws" nsPrefix=""
    xmlns:core="org.eclipse.jwt/core"
    xsi:schemaLocation="org.eclipse.jwt/core java://org.eclipse.jwt.we.model.core.CorePackage">
  <eClassifiers xsi:type="ecore:EClass" name="InvokeWebService" instanceClassName="org.eclipse.jwt.we.model.core.impl.AspectImpl"
      eSuperTypes="java://org.eclipse.jwt.we.model.core.CorePackage#//core/ApplicationAspectTemplate">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bindingType" lowerBound="1"
        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="wsdl" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="url" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="operation" lowerBound="1"
        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
  </eClassifiers>
</ecore:EPackage>

Extract from workflow activity sample :

<elements xsi:type="processes:Activity" name="Diagram1">
    <nodes xsi:type="processes:Action" name="WS Action" in="//@elements.0/@edges.0" out="//@elements.0/@edges.1" performedBy="//@elements.1" referenceEdges="//@elements.0/@referenceEdges.0">
      <aspects xsi:type="ws:InvokeWebService" bindingType="ws" wsdl="" url="http://localhost:8080/EchoService" operation="echo"/>
      ...
    </nodes>
...
</elements>

Some screenshots : File:Jwt emfextension ws.png

UserMappingAspect sample

This sample showcases a more complex aspect.

UserMappingAspect's purpose is to allow to provide to an action (or its application) more specific user mappings than those defined globally at workflow level. It is useful when all applications executed by a workflow are not using the same user directory as the workflow engine ; in this case, applications that require specific credentials will use this aspect to provide them.

The UserMappingAspect contains several UserMappings, each specifying how a given runtime user (i.e. a user known within the workflow engine) is mapped to different credentials when talking to the application, which has to exploit this data on its own.

Metamodel extension definition WEMetaModel_usermapping.workflow (added 20080624) :

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="usermappingModel"
    nsURI="org.eclipse.jwt.usermapping" nsPrefix="">
  <eClassifiers xsi:type="ecore:EClass" name="UserMappingAspect" instanceClassName="org.eclipse.jwt.we.model.core.impl.AspectImpl"
      eSuperTypes="WEMetaModel.ecore#//core/ApplicationAspectTemplate">
    <eStructuralFeatures xsi:type="ecore:EReference" name="userMappings" upperBound="-1"
        eType="#//UserMapping" containment="true"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enabled" lowerBound="1"
        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
  </eClassifiers>
  <eClassifiers xsi:type="ecore:EClass" name="UserMapping">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="username" lowerBound="1"
        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="password" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mappedUserName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
  </eClassifiers>
</ecore:EPackage>

Extract from workflow activity sample (added 20080624) :

<elements xsi:type="processes:Activity" name="Diagram1">
    <nodes xsi:type="processes:Action" name="User Mapping Action" in="//@elements.0/@edges.0" out="//@elements.0/@edges.1" performedBy="//@elements.1" referenceEdges="//@elements.0/@referenceEdges.0">
      <aspects xsi:type="usermapping:UserMappingAspect" enabled="true">
        <usermapping:userMappings xsi:type="usermapping:UserMapping" username="guest" password="" mappedUserName="anonymous"/>
        <usermapping:userMappings xsi:type="usermapping:UserMapping" username="admin" password="admin"/>
      </aspects>
      ...
    </nodes>
...
</elements>

Some screenshots (added 20080624) : Jwt emfextension usermapping.png

Metamodel extensions and JWT WE (added 20080527)

Metamodel extensions and JWT WE - overview

Or : how should the JWT Workflow Editor behave in the case of metamodel extensions ?

Now that we've got a basic idea of how it could work at model level, let's focus on what is its first use : display and edition in JWT WE.

Let's remember JWT WE comprises the following display and edition capabilities :

  • JWT GEF / EMF diagram
  • JWT EMF outline
  • JWT EMF property view
  • aditionally, the JWT EMF property view could be enhanced by custom tabs
  • aditionally, custom views could be made

As said before, we prioritize manipulating metamodel extensions in a generic (i.e. JWT outline and property view) or vendor specific view. It is enough and evacuates GEF diagram extension complexities. We will here focus on what JWT WE itself provides : the JWT outline and property views, and how it should best behave in the case of metamodel extensions.

NB. What is possible with extensions should be as much as possible specified in the ecore metamodel, since not only will it improve what features the generated EMF editors provide by default, but it will also prevent any illegal, non-conforming workflow model. However we obviously won't limit features to what EMF provides. So these needs could be additionally implemented through an additional behaviour metamodel, adapted or custom UI code or UI code generation - or even through ecore customization (see http://www.ibm.com/developerworks/opensource/library/os-eclipse-emfmetamodel/ ) though it would be hard to maintain and not agile enough.

Metamodel extensions and JWT WE behaviour

How do we want extensions / Aspects to behave in the Workflow Editor ?

functional needs

Based on the previous metamodel extension ideas, and on trying things with the above sample and others, I've listed the following functionalities, from "most required" to "nice to have" ones :

  • "single" and / or "unique" : to limit instanciation of an aspect of a given type to at most one, or exactly one (i.e. pre-instanciated). Useful for all aspects that model "activable features".
  • (optional) "undeletable" and / or "readonly" : to forbid deleting it (or require it to be instanciated again).
  • "instanciation" : to require instanciation of an aspect or aspect list on a model element. This could be 1. a globally defined list, in JWT release configuration (or possibly user preferences ?) ; 2. a user-chosen list at model element instanciation time, by letting him chose an aspect list or a profile (aspect list)
  • "aspect choice list" : restrain aspect instanciation to at most one of a given list of aspect: "single" and / or "unique" property on an abstract Aspect that is a common ancestor to all aspects of the list ; ex. at most one aspect specifying what "does" a given Action, by making all such Aspect types inherit from the same ApplicationAspectTemplate, which has its "single" property set to "true", or making this abstract aspect inherit from ListConstraintAspect ; cons : requires to introspect inheritance to know the list
  • restrain an aspect type to be instanciated on model elements of a given type : using aspect subtypes, ex. ActionAspect, ModelAspect ; cons : complexifies aspect creation
  • other custom rules required by the extension developer

technical solutions

  • solution 1 : by configuring those features in "special" properties of Aspects, like "singleton", "removable". For example, EMF / XML uses such special properties (ex. "xmlns:prefix"). However, these properties configure how the behaviour of the Aspect type (how it is instanciated etc.), and not of each of the Aspect instances, and therefore are not at the appropriate conceptual level, which complexifies their understanding.
  • solution 2 : modify ecore genmodel to store these information at the right conceptual level, and the EMF ecore JET templates to exploit them at generation time. However besides being difficult to do and maintain, it has not the level of flexibility we need : supporting new Aspect behaviours by adding new information there would be just as costly.
  • solution 3 : using a custom "metametamodel", that would also be in line with future jwt-views management, like Christian Saad advocates. Developing it in EMF would the development of an editor, while still allowing to package it in different ways : standalone, in a plugin.xml extension, or even bundled within a .workflow.
  • other custom rules required by the extension developer would however require coding : either by implementing them in their own custom view UI, or by modifying EMF-generated code or generation templates (EMF.edit's ItemProviders), or even palette ? policies ??

specifications

A gordian knot answer to these is to say that aspects can only be

  • either "singleton", i.e. instanciated along with a model element,
  • or "feature" (transversal, activable feature), that can be added or removed on its own ;

configure their behaviour in an additional metamodel comprising

  • singleton or feature
  • extension name and version
  • their assigned model element
  • Instanciating a model element with different singleton aspect sets can be made available using additional "newChild" commands

and to delegate as much of the complex requirements as possible to the aspect implementors :

  • choice list is done within aspects
  • as well as more complex features

Metamodel extensions and JWT Views

JWT Views are a way to customize how a Model is displayed. For now it is able to configure which model elements and subelements are displayed. Note that in the future, this functional perimeter may be extended / included in the issue of JWT configuration and packaging.

How do work JWT views :

  • edited in swing application jwt-view, by using the above cited code, using the ecore with harcoded path "jwt-we/src/org/eclipse/jwt/we/model/WEMetaModel.ecore" (but if there's none, allows to choose it) ; AppWindow saves the view name in the plugin*.properties files of jwt-we
  • handled in the org.eclipse.jwt.we.misc.views package of jwt-we : read by ViewResourceManager, Views, list of the read ecore's packages built by AnalyseEcore

Enabling metamodel extension at JWT views level (propositions) :

  • basis (works !) : Making it visible in the (outline) UI ! How : in Views.displayObject(), display by default (opposite of current behaviour), so model objects that are not specified in the view will be displayed. This is good behaviour, because, all default model elements will be specified in the view, and it is still possible to specify not to display one by setting it to false (unchecking its checkbox in jwt-view).
  • better : in jwt-view, allow to choose another ecore, many ecores, to merge their properties
  • later : change jwt-view to an eclipse plugin with an eclipse UI, make it the bases of the jwt-configuration/packaging/release-builder plugin

Metamodel extensions and JWT WE - finding and loading models and ecores

About extension loading among the various files, EMF has nice out of the box features. An XMI file that refers relatively to an available ecore extension file will load as dynamic EMF. If XML rather than XMI is used, EMF can be configured so an XMI file that refers relatively to an available XSD extension file will load as EMF / XML (thanks to XSDEcoreBuilder). And EMF can be configured to load unknown extensions as XML without schema (concretely, the EObject implementation is AnyTypeImpl), though it is of little use since it is not typed. However this is not enough.

Requirements for finding and providing extension definition files

  • the end user must be able to provide them in a simple way, like a standard directory whose ecores will be loaded at WE startup (csaad) ; and another way to add one from the editor UI, like a button "add extension model" allowing to choose an ecore file.
  • vendors will want to be able to have a more built-in way to provide their ecore extensions, like a path in a plugin jar, if necessary referred to in their plugin.xml .

Technologies available to find extension definition files (typically metamodel extension file, and possibly an additional extension configuration file) , from the lighter to the deeper :

  • files in an autodiscovery directory
  • zipped files in a workflow bundle (zipped .workflow + extension definition files)
  • EMF model element in a workflow model, as a subtree of the root Model element ; works for EMF or EMF / XML built extension definitions
  • files specified in an extension point in plugin.xml
  • XML inlined in an extension point in plugin.xml ; works for XML or EMF / XML (not static EMF ?) built extension definitions
  • files found in a fixed path in the classpath (i.e. in a vendor's extension jar)

Metamodel extensions and JWT WE - versioning

Another issue is versioning (csaad)

  • Extension versioning : it requires a naming and versioning mechanism for extensions (a list of which must be centrally stored in the model file, e.g. in the model-element) to ensure compatibility. See proposition of Christian Saad for custom typed properties.
  • Note that Model is already versioned.
  • Model update algorithm : it should be modified so it can make the difference between model version error and extension version error (including unknown extension). Note that it is for now limited to the "addition only" changes in the ecore, which is enough.

Metamodel extensions and JWT WE - tabbed properties view (Christian Saad)

The change of the properties view to a version that supports multiple tabs (as described in http://www.eclipse.org/articles/Article-Tabbed-Properties/tabbed_properties_view.html) is quite simple. The “old” properties can be loaded into the view using an adapter, so there is almost no additional effort to this solution (see attachment). Concerning the new dynamic properties, probably a similar approach can be used (write a propertypage that reads the dynamic properties from the itemproviders, creates the corresponding propertyeditors and can be fitted into the propertyview using the same kind of adapter).

Metamodel extensions and JWT Transformations

TODO

Metamodel extensions and JWT Runtimes

TODO


Technical specifications v1

Building on all that has been said, here is my proposition.

Its strong points are

  • it unifies the simple, static EMF DynamicProperties and the powerful, EMF-extensible Aspects solutions
  • once the model has been defined, functionnalities can be added step by step, meaning it will be usable from day 1, and we can add other features (like using visibleOnChildren to impact the outline and property page UI behaviour, or loading externally defined profiles in JWT, or code handling extension versioning check) later, when we are sure of them and when we have time. I'll outline this here by "LATER".

It relies on two concepts :

  • aspect (or dynamicproperty) : a single typed extension of a model element
  • profile (or DynamicPropertyContainer, or ModelExtension) : a model extension made of a consistent collection of aspects

It has been filed in bugzilla as bug 241567 "Typed metamodel extensions (Aspects)" (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=241567 ).


Metamodel specification

ProfileDefModel metamodel

  * done in static EMF
  * contained in Model or / and independent XMI file, which could be the same as the new Views one

ProfileDefModel :

profiledefs : ProfileDef *

ProfileDef :

name
description
author
version
JWT version (modelversion ?)
aspectdefs : AspectDefs *

AspectDef :

id (jwt type) (string, reference ??)
etype (those extending Aspect are aspects, the others e.g. primitives or EObject are supported using Property) : EString
singleton : EBoolean
assignedto (? EClass but requires to refer to the ecore, or EString)
visibleAsChild : EBoolean


JWT metamodel

  * depends on the static ProfileDefs metamodel

Model

profiledefs : ProfileDefs

ModelElement :

aspects : Aspect *

Aspect :

id (jwt type)

Property extends Aspect :

value : EObject


Simple Property Example

Now an example of properties (csaad's) :

  * an instance of ProfileDef (name="Example1")
  * containing an AspectDef (name=id="internal_id1", etype="EString", assignedto="Action", singleton="true")
  * and another AspectDef (name=id="internal_id2", etype="EInteger", assignedto="ActivityNode", singleton="true")

Which automatically creates property instances under said model elements, for example :

  * an instance of JoinNode (name="node1") containing an instance of Property (name=id="internal_id2", value="intvalue1")
  * an instance of ActionNode (name="node1") containing an instance of Property (name=id="internal_id2", value="intvalue2") and another instance of Property (name=id="internal_id1", value="stringvalue1")


Extended Model Example

Now an example of an extended model :

  * an instance of ProfileDef (name="BonitaProfile")
  * containing an AspectDef (name=id="BonitaTaskAspectDef", etype="BonitaTaskAspect", assignedto="Action", singleton="false")
  * which makes BonitaTaskAspect available to be created under Action,
  * BonitaTaskAspect being defined as such :

BonitaTaskAspect :

bonitahooks : BonitaHook*

BonitaHook

event : EString (listbox)
javaClass : EString
jar : EString


Original DynamicProperty Metamodel

Note : csaad's was :

ModelElement :

properties *

DynamicPropertyContainer :

name
description
author
version
JWT version
dynamicproperties *

DynamicProperty :

id
type (of value ?)
assignedto
visibleOnChildren (?)


Features

Localization :

  * Names displayed in the UI (such as those of Property instances) have to be localized. It should be done in the Eclipse manner, using bundles, and if necessary a bit of our code. However I don't think we should put localized names in the model.

Managing the model :

  * Configuration : Which profiles among the ones loaded in JWT are activated in a given workflow model ?
     * all those explicitly defined in this workflow model,
     * LATER and all those in files configured in plugin.xml .
     * LATER buttons allowing to save a workflow containg all profile definitions (including JWT configured ones)
  * Versioning :
     * updating existing version check code so it works with the new model
     * updating existing version check code so it works with the extended EMF metamodels
     * LATER adding profile versioning check

UI

  * LATER Property / Outline : according to visibleAsChild, Aspect instances's content (including Property instances' content) will be either shown as a subelement of their assigned model element instance, or merged in the assigned model element instance's property page. Proposition : this property page's layout could separate each Aspect content by bars.
  * LATER in the outline, commands for creating "not singleton" aspects ; and forbidding deletion of "singleton ones".
  * LATER in the outline, finer extensibility of the "new Child" commands, including allowing to configure in plugin.xml commands that create a type with a given set of aspects.
  * LATER Diagram : nothing

Transformation

  * LATER define an extension point on transformation allowing to specify additional transformation rules for a given profile (not sure of this one, typed profiles sure are nice for this, but has to be tried first).

Packaging

  * LATER Using EMF.Edit, create a simple editor for the ProfileDefModel metamodel and make it available in the jwt packaging tool

Finding and loading extension

  * LATER static EMF extension models can be configured in plugin.xml to be loaded
  * LATER dynamic EMF extension ecores can be provided in given directory to be loaded


Technical specifications v2

See bugzilla https://bugs.eclipse.org/bugs/show_bug.cgi?id=241567 .