Difference between pages "EMF framework for Event-B" and "Element Hierarchy Extension Point & Library"

From Event-B
(Difference between pages)
Jump to navigationJump to search
imported>Colin
 
imported>Tommy
 
Line 1: Line 1:
{{TOCright}}
+
The UI in Rodin 2.x contains an extension point <tt>org.eventb.ui.editorItems</tt> that groups the both following information:
''This page is edited by Colin, Alexei and Fabian''
+
*the definition of elements and attributes and their hierarchy, and the way they are created
 +
*the information needed to correctly display and edit these elements in the various editors and UI components
  
===An EMF Model of Event-B===
+
It appears obvious that the first information should be defined from an extension that belongs to the Database.
 +
To fullfil the above statement, the current extension point <tt>org.eventb.ui.editorItems</tt> should be split in two.
 +
The existing extension point was also heterogenous. Indeed, whereas the element relationships were concerning element types, the attribute relationship were concerning element types and references to UI defined attributes (referring to core attributes).<br>
 +
There is no need for such an indirection.
  
 +
----
 +
The proposal should concern :
 +
A - Relationship declaration (new extension point)
 +
B - API to test these relations and traverse them
 +
C - Enforcement of the authorized relations when modifying the DB
 +
D - Behaviour while loading a file (including a file with invalid parent-child relations occurrences)
 +
E- What about the compatibilty with the file upgrade mechanism?
 +
----
  
{| style="width:auto; background-color:#FFFF00; border:2px solid red;  padding:3px;"
+
= Some identified difficulties =
|<b title="Usage warning"><font size="3"> Warning:</font size="3"></b><font size="1">
 
  
This page is being updated and is currently inconsistent and inaccurate in some areas
+
== Initialization of elements from non UI components ==
  
|}
+
The following ElementDescRegistry method, shows the dependency between an element creation and the initialization of its attributes with default values.
  
====The Eclipse Modeling Framework====
+
        public <T extends IInternalElement> T createElement(
 +
final IInternalElement root, IInternalElement parent,
 +
final IInternalElementType<T> type, final IInternalElement sibling)
 +
throws RodinDBException {
 +
final T newElement = parent.createChild(type, sibling, null);
 +
final IAttributeDesc[] attrDesc = getAttributes(type);
 +
for (IAttributeDesc desc : attrDesc) {
 +
desc.getManipulation().setDefaultValue(newElement, null);    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 +
}
 +
return newElement;
 +
}
  
The EMF project is a modeling framework and code generation facility for building tools and other applications based on a structured data model. From a model specification described in XMI, EMF provides tools and runtime support to produce a set of Java classes for the model, along with a set of adapter classes that enable viewing and command-based editing of the model, and a basic editor.
+
The protocol shall be changed to take into account this initialization outside from the graphical manipulation.
 +
Doing the initialization at org.eventb.core level is possible by registering a special "attribute initializer". <br>
 +
WARNING : The required attribute is only available for "choice" attributes. Can't it be available for all kind of attributes?
  
 +
== Correspondence between UI manipulation and "core" elements ==
 +
What if an element is not defined in the UI but defined in the hierarchy of a given core element?<br>
 +
>>> ANSWER : it seems that any contributor to the UI manages the extensions of the datat model. The responsability is thus left to him.<br>
 +
>>> A element for which there is no UI correspondance will not be displayed.
  
====Event-B Meta-Model====
+
== Operation on elements shall be enforced ==
The Event-B meta-model defines the structure of Event-B projects. The model is structured into three packages for clarity. The core package contains a structure of abstract meta-classes so that models can be treated generically as far as possible. The core package also contains mechanisms to handle extensions provided by other plug-ins and a meta-class to model entire projects. There are two sub-packages, contained with the core package, for Machine and Context. Note, that the ''EventB'' prefix is used to indicate that a meta-class is abstract (i.e. cannot be instantiated except via one of its subclasses).
+
 +
        private <T extends IInternalElement> OperationCreateElement getCreateElement(
 +
IInternalElement parent, IInternalElementType<T> type,
 +
IInternalElement sibling, IAttributeValue[] values) {
 +
OperationCreateElement op = new OperationCreateElement(
 +
createDefaultElement(parent, type, sibling));
 +
op.addSubCommande(new ChangeAttribute(values));
 +
return op;
 +
}
  
The root of all meta-classes in the Event-B EMF model is the abstract base class, ''EventBObject'' this provides some convenience methods to access containing or contained elements of a specified type and a method to obtain the URL of an element's package. EventBObject extends the EMF class, EModelElement, which provides a facility to store EAnnotations in any EventBObject. (EAnnotations give a flexible and efficient way to store information that is not part of the main model. For example this is used to store some information contained in the Rodin database, which must be preserved but is not of interest in the EMF modelling tools).
+
''The Operation model similar to a kind of transaction mechanism, should be made available from the DB layer.''<br>
 +
''The relations when using such layer shall be enforced and any invalid operation could be rejected.''
  
''EventBElement'' provides a common abstract base class for all EventBObjects that are elements of the model. This meta-class provides extensibility features that are described later.
+
= Proposal =
  
''EventBCommentedElement'' provides the ability to comment elements. It inherits a string attribute, ''comment'' from ''EventBCommented''. (The use of a separate meta-class, outside the main inheritance hierarchy gives more flexibility for future modifications if other elements need to be commented. Hence if client code refers to comments via ''EventBCommented'' rather than ''EventBCommentedElement'' they will not be affected if, in the future, other elements inherit ''EventBCommented'').
+
== Hierarchy between elements ==
  
Similarly, ''EventBNamedCommentedElement'' adds the ability to name elements by inheriting a string attribute, ''name'' from ''EventBNamed''. (Currently, a named but not commented element is not provided).  
+
The part concerning element definition and hierarchy will go to a dedicated extension point in the database.
  
''EventBExpression'' provides a string attribute, ''expression'', for an Event-B mathematical expression. Note that this class extends ''EventBCommentedElement'' since our current need (Variant) is for expression elements not to be commented but not named.
+
=== A - hierarchy definition ===
  
''EventBPredicate'', provides a string attribute, ''predicate'' for an Event-B mathematical predicate. Note that this class extends ''EventBNamedCommentedElement'' since our current need is for all predicate elements to be commented and named.
+
Here is the definition of such an extension point : org.rodinp.core.dataModel ???  or org.rodinp.core.internalElementHierarchy ???
  
''EventBDerivedPredicate'', extends ''EventBPredicate'' and provides a boolean attribute, ''theorem'' to indicate that the predicate is a theorem that should be derived (from previous predicates in the same container).
+
Configuration Markup:
 +
<!ELEMENT extension ((childRelation | attributeRelation | autoNaming)+)>
 +
<!ATTLIST extension
 +
point CDATA #REQUIRED
 +
id    CDATA #IMPLIED
 +
name  CDATA #IMPLIED
 +
>
 +
 +
<!ELEMENT elementRelationship (childType)+>
 +
<!ATTLIST elementRelationship
 +
parentTypeId CDATA #REQUIRED
 +
>
 +
parentTypeId - Element type of the parent, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).
 +
 +
<!ELEMENT childType EMPTY>
 +
<!ATTLIST childType
 +
typeId                CDATA #REQUIRED
 +
implicitChildProvider CDATA #IMPLIED
 +
>
 +
typeId - Element type of the child, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).
 +
 +
<!ELEMENT attributeRelationship (attributeType)+>
 +
<!ATTLIST attributeRelationship
 +
elementTypeId CDATA #REQUIRED
 +
>
 +
elementTypeId - Element type of the element, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).
 +
 +
<!ELEMENT attributeType EMPTY>
 +
<!ATTLIST attributeType
 +
typeId CDATA #REQUIRED
 +
class  CDATA #REQUIRED
 +
>
 +
Describes how to graphically display a Rodin attribute of type boolean.
 +
 +
attributeTypeId - Id of the Rodin attribute type to which this description applies (see extension point org.rodinp.core.attributeTypes).
 +
 +
<!ELEMENT autoNaming EMPTY>
 +
<!ATTLIST autoNaming
 +
elementTypeId          CDATA #REQUIRED
 +
attributeDescriptionId CDATA #REQUIRED
 +
namePrefix             CDATA #REQUIRED
 +
>
 +
Describes how to automatically name an element. The autoNaming definition is unique for a given element type.
 +
 +
elementTypeId - Element type of the element, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).
 +
namePrefix - default prefix to name the element
 +
 +
The use of such extension point is obvious in org.eventb.core plug-in, as it would complement the extensions of org.rodinp.core.attributeTypes and org.rodinp.core.internalElementTypes.
  
[[Image:EMFcore1abstract.gif|EMF model, abstract base elements]]
+
=== B - API to declare and test the element/attribute relations and traverse them ===
  
====The Extension Mechanism====
+
The API for an element : IElementDesc
  
The abstract root meta-class, ''BElement'', contains a collection, ''extensions'', of another abstract meta-class, ''BExtension''. ''BExtension'' can be specialised in other EMF models to define extensions of the model. Extension classes should override the abstract load and save methods of ''BExtension'' in order to define their specific requirements for serialisation.
+
public String getID();
 +
 +
public List<IAttributeRelationship> getAttributeRelationships();
 +
 +
public List<IElementRelationship> getChildRelationships();
  
[[Image:EMFcore2extensions.gif|EMF model, extension mechanism]]
+
        public List<IAttributeType> getAttributeTypes();
 +
 +
public List<IElementType> getChildTypes();
 +
 +
public IAttributeDesc getAutoNameAttribute();
  
====Project====
+
adding the following method to the protocol :
  
A Project contains a collection of components. Project extends EventBNamedCommentedElement. This allows it to contain Extensions and Attributes as well as providing it with a name and comment.
+
        public boolean isDirectChildTypeOf(IElementDesc parentElemDesc);
  
[[Image:EMFcore3project.gif|EMF model of an Event-B Project]]
+
        public boolean isOwnableAttribute(IAttributeDesc ownerElementDesc);
  
====Machine package====
+
with the same interface IElementRelationship
  
A Machine inherits from component (so that it can be used in the ''components'' collection of a Project). Machines, refine other machines (via a subtype of ''BReferenceElement'' which may be resolved), see contexts (via a subtype of ''BReferenceElement'' which may be resolved), and may contain, variables, invariants, theorems, a single variant and events.
+
public interface IElementRelationship extends Comparable<IElementRelationship> {
 +
 +
public String getID();
 +
 +
public IElementType<?> getParentType();
 +
 +
public IInternalElementType<?> getChildType();
 +
   
 +
public IImplicitChildProvider getImplicitChildProvider();
 +
 +
public int getPriority();
 +
 +
}
  
[[Image:EMFmachine.gif|EMF model of a Machine]]
+
with the "new" interface IAttributeRelationship
  
'''Events'''
+
public interface IAttributeRelationship extends Comparable<IAttributeRelationship> {
 +
 +
public String getID();
 +
 +
public IElementType<?> getOwnerType();
 +
 +
public int getPriority();
 +
 +
}
  
Events contain parameters, witnesses, refines relationships with other events, guards and actions. Witnesses, link with other parameters (via a subtype of ''BReferenceElement'' which may be resolved). Similarly, event refinement relationships link to other events (via a subtype of ''BReferenceElement'' which may be resolved). The enumerated type, ''BConvergence'',  provides the values for the convergence property of an event.
+
''IImplicitChildProvider is moved to Event-b Core.''
  
[[Image:EMFevent.gif|EMF model of an Event]]
+
The API for an Attribute : IAttributeDesc
 +
 +
        public String getID(); 
 +
     
 +
        public IAttributeManipulation getManipulation();
 +
 +
public IAttributeType getAttributeType();
  
===Context package===
+
=== C - Data model operations (enforced) ===
 +
The ElementManipulationFacade, support for modifications over the Database, should be provided by the Event-B Core plug-in.<br>
 +
The IAttributeManipulation interface should be also provided by the Event-B Core plug-in as it concerns the manipulation done on the attribute in the DB.
  
A Context inherits from component. Contexts, extend other contexts  (via a subtype of ''BReferenceElement'' which may be resolved), and contain sets, constants, axioms and theorems. (Note that the ''BTheorem'' meta-class is the same one that appeared in the Machine package).
+
The information about the rendering of an element or an attribute, should not be deduced from the attribute itself (e.g. choiceAttribute vs. toggleAttribute vs. textAttribute), it should be given in the UI.
  
[[Image:EMFcontext.gif|EMF model of a Context]]
+
It seems that the ElementManipulationFacade can be used as protocol, but hiercharchy between elements and elements, or between elements and attributes shall be enforced.
 +
''Proposition : add Exceptions to methods of the protocol.''
  
====Event-B Mathematical Language Extension====
+
== UI related information ==
Using [[#The Extension mechanism|the Extension mechanism]] an EMF extension for the Mathmetical Language of EventB will be created. This means expressions, predicates and substitutions will be available as EMF models too.
+
The part concerning how to display elements and UI related info will stay in the editorItems extension point and shall point to an element definition and hierachy.<br>
 +
Relationships will disappear from the editorItems extension point.
  
As the RodinDB only saves these constructs as plain strings, their EMF representation will be recreated every time a model is loaded. The existing RodinParser in combination with a conversion component will be used for this task.
+
The interfaces are refactored to become the following :
To avoid unnecessary parsing the creation of these models will be postponed until the models are needed. For example, it will be up to the tool developers to decide when they need a fully resolved structure of predicates. API methods in the [[#Text Tools|Text Tools]] will ease parsing and model construction for tool developers.
 
  
===Persistence===
+
''NB. IITemDesc disappears as it is cumbersome to provide such interface for a sole method getPrefix(). ''
The Persistence package will override the default EMF persistence so that models created with the Event-B EMF framework will be serialised into the Rodin Database. The serialisation will make use of the Rodin API so that it is decoupled from the serialisation of the Rodin database. Serialisation will synchronise changes with the Rodin Database so that only elements that have been altered are updated.
 
The Persistence API will provide methods to open/create Rodin projects, load and unload components (from Rodin Database to cache), save changes, register listeners to projects and components and resolve references between elements.
 
  
===Text Tools===
+
public interface IUIElementDesc extends IItemDesc {
As several tools based on the EventB meta-model will deal with a textual representation of it, a component called 'Text Tools' will be created. Text Tools will offer an API for basic tasks such as:
+
* Define a concrete syntax for the structure of machines and contexts
+
        public String getPrefix();
* Conversion from an EventB meta-model to text, i.e., pretty-print with configurable layout
+
* Parsing of text input which produces an EventB meta-model
+
public String getChildrenSuffix();
 +
 +
public IImageProvider getImageProvider();
 +
 +
public IAttributeDesc atColumn(int i);
 +
 +
public int getDefaultColumn();
 +
 +
public boolean isSelectable(int i);
 +
 +
public String getAutoNamePrefix();
 +
 +
public IElementPrettyPrinter getPrettyPrinter();
 +
 +
}
  
 +
public interface IUIAttributeDesc extends IItemDesc {
 +
 +
        public String getPrefix();
 +
 +
public String getSuffix();
 +
 +
public IEditComposite createWidget();
 +
 +
public boolean isHorizontalExpand();
 +
 +
}
  
'''Structural parsing'''
+
[[Category:Design_proposal]]
 
 
The Rodin core already provides a parser for expressions, predicates and substitutions. Therefore Text Tools will only provide a parser for the structural parts of the text representation of EventB machines and contexts. This parser will treat expressions, predicates and substitutions as plain strings that are stored in attributes in the meta-model.
 
As described in section [[#Event-B Mathematical Language Extension|Event-B Mathematical Language Extension]] the full mathematical language will be supported as an extension to the EventB meta-model. Tools that are interested in working on a fully parsed version of an expression, predicate or substitution will be able to use helper methods of the Text Tools API. These helper methods will make use of the existing Rodin parser and convert the resulting AST to the meta-model.
 
 
 
 
 
'''Fallback strategy'''
 
 
 
When the user is editing the textual representation of a machine or context the input may contain syntactic errors which prevent converting the parse result into an EMF model. As the user might wish to save the text representation in this syntactically incorrect state, Text Tools will provide a fallback strategy for this case. API methods will be provided to store the plain text into the RodinDB. This plain text will be used as a basis for editing next time the model is loaded via Text Tools.
 
 
 
 
 
'''Conflict resolution'''
 
 
 
When Text Tools loads an EventB meta-model from the Rodin Database it will detect any conflicts in the model. Conflicts will occur if other editors, that do not work via Text Tools, have changed the model in the RodinDB after Text Tools has stored a syntactically incorrect version as plain text. In this case the tool that is using Text Tools to load the model will be informed about the conflict and asked to resolve it. Strategies to solve these conflicts could be 'automatic overwriting based on time stamps' or using the editors described in the section [[#Compare/Merge Editor|Compare/Merge Editor]].
 
 
 
===Tools That Will Use the Framework===
 
 
 
The framework described above is not yet available. However, we already plan to use it in some tools.
 
 
 
====Compare/Merge Editor====
 
In several situations conflicts between different versions of an Event-B model can occur. Often the responsible tool will not be able to resolve these conflicts automatically and user interaction is required. A compare and merge editor for Event-B models will help users to solve these conflicts. This editor will be based on the [http://wiki.eclipse.org/index.php/EMF_Compare EMF Compare] sub-project. It will compare the two conflicting versions and present the differences to the user. This visualization of the model will resemble the [[#Structure Editor|Structure Editor]].
 
 
 
If one of the two versions of the machine/context contains an invalid structure that means it is only available as text, the EMF based Compare/Merge editor cannot be used. A textual Compare/Merge editor will be available as an alternative view (integrated with the EMF Compare/Merge editor). The second view will be based on the [[#Text Editor|Text Editor]].
 
 
 
Usage scenarios are, for example:
 
* Merging after a conflict between RodinDB and Text Editor (as described in [[#Text Tools|Text Tools]])
 
* Team-based development, for example, using SVN or CVS
 
* Comparison of an abstract and a refining machine, highlighting the differences
 
 
 
====Text Editor====
 
Requests by several users have shown that there is demand for a text editor for EventB models. Based on the EventB meta-model and the [http://www2.informatik.hu-berlin.de/sam/meta-tools/tef/index.html Text Editor Framework], a state-of-the-art text editor will be created.
 
The editor will make use of  [[#Text Tools|Text Tools]] and will provide an extensible set of features, such as (syntactical and semantical) highlighting, code completion, quick navigation and outline view.
 
 
 
The text editor will be available in two forms. A first class Eclipse editor will offer editing of full machines and contexts. In addition a pop-up editor will be created that can be used by other tools to allow their users text editing of sub-components in machines and contexts. An example is the [[#Structure Editor|Structure Editor]], which will offer a pop-up text editor allowing the user to edit a single expression or a compound sub-component such as an event.
 
 
 
====Structure Editor====
 
EMF provides support to generate structured (e.g. tree, list, table based) editors for models. An adapted version of these editors will allow users to edit machine and context elements within a structure using menu-guided selections. To allow feature-rich editing of elements containing expressions, predicates and substitutions this editor will use the pop-up variant of the [[#Text Editor|Text Editor]].
 
 
 
====Project Diagram Editor====
 
A diagrammatic editor will be produced that shows the structure of an Event-B Project in terms of it's Machines and Contexts with their refines, sees and extends relationships. (This will replace the current UML-B package diagram). The Project Diagram editor will be produced using the Graphical Modelling Framework (GMF). It will allow machines and contexts to be created/deleted and their relationships changed. A feature to create a 'starting point' refinement of a machine, will be included.
 
 
 
====[[UML-B]]====
 
UML-B will be re-implemented as an extension to the Event-B meta-model. The UML-B meta-classes will extend and add to the meta-classes of Event-B. This will provide greater integration between the EMF based Event-B editors and the UML-B diagrammatic editors.
 
 
 
====Refinement Pattern Editor====
 
The EMF framework will be used to implement the text editor for the Event-B pattern plugin. The syntax of facets - Event-B model templates used to describe patterns - is an extension of the Event-B syntax.
 
 
 
====[[Parallel Composition using Event-B|Shared Event Composition Tool]]====
 
An editor for composing two machines based on shared events has been developed by Southampton. This tool will be re-implemented to utilise the Event-B EMF framework.
 
 
 
See [[Parallel Composition using Event-B]].
 
 
 
====[[Feature Composition Plug-in|Feature Composition Tool]]====
 
An editor for composing two machines based on feature selection has been developed by Southampton. The tool (which is already based on EMF) will be re-implemented to utilise the Event-B EMF framework.
 
See [[Feature Composition Plug-in]].
 
 
 
===Internal Documentation===
 
The following pages contain documentation that we use internally only ('''not''' to be included in deliverable):
 
* [[Tasklist for EventB meta model development|Tasklist]]
 
 
 
[[Category:Design proposal]]
 

Revision as of 16:38, 25 September 2012

The UI in Rodin 2.x contains an extension point org.eventb.ui.editorItems that groups the both following information:

  • the definition of elements and attributes and their hierarchy, and the way they are created
  • the information needed to correctly display and edit these elements in the various editors and UI components

It appears obvious that the first information should be defined from an extension that belongs to the Database. To fullfil the above statement, the current extension point org.eventb.ui.editorItems should be split in two. The existing extension point was also heterogenous. Indeed, whereas the element relationships were concerning element types, the attribute relationship were concerning element types and references to UI defined attributes (referring to core attributes).
There is no need for such an indirection.


The proposal should concern :

A - Relationship declaration (new extension point)
B - API to test these relations and traverse them
C - Enforcement of the authorized relations when modifying the DB
D - Behaviour while loading a file (including a file with invalid parent-child relations occurrences)
E- What about the compatibilty with the file upgrade mechanism?

Some identified difficulties

Initialization of elements from non UI components

The following ElementDescRegistry method, shows the dependency between an element creation and the initialization of its attributes with default values.

       public <T extends IInternalElement> T createElement(
			final IInternalElement root, IInternalElement parent,
			final IInternalElementType<T> type, final IInternalElement sibling)
			throws RodinDBException {
		final T newElement = parent.createChild(type, sibling, null);
		final IAttributeDesc[] attrDesc = getAttributes(type);
		for (IAttributeDesc desc : attrDesc) {
			desc.getManipulation().setDefaultValue(newElement, null);    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
		}
		return newElement;
	}

The protocol shall be changed to take into account this initialization outside from the graphical manipulation. Doing the initialization at org.eventb.core level is possible by registering a special "attribute initializer".
WARNING : The required attribute is only available for "choice" attributes. Can't it be available for all kind of attributes?

Correspondence between UI manipulation and "core" elements

What if an element is not defined in the UI but defined in the hierarchy of a given core element?
>>> ANSWER : it seems that any contributor to the UI manages the extensions of the datat model. The responsability is thus left to him.
>>> A element for which there is no UI correspondance will not be displayed.

Operation on elements shall be enforced

       private <T extends IInternalElement> OperationCreateElement getCreateElement(
			IInternalElement parent, IInternalElementType<T> type, 
			IInternalElement sibling, IAttributeValue[] values) {
		OperationCreateElement op = new OperationCreateElement( 
				createDefaultElement(parent, type, sibling));
		op.addSubCommande(new ChangeAttribute(values));
		return op;
	}

The Operation model similar to a kind of transaction mechanism, should be made available from the DB layer.
The relations when using such layer shall be enforced and any invalid operation could be rejected.

Proposal

Hierarchy between elements

The part concerning element definition and hierarchy will go to a dedicated extension point in the database.

A - hierarchy definition

Here is the definition of such an extension point : org.rodinp.core.dataModel ??? or org.rodinp.core.internalElementHierarchy ???

Configuration Markup:
<!ELEMENT extension ((childRelation | attributeRelation | autoNaming)+)>
<!ATTLIST extension
point CDATA #REQUIRED
id    CDATA #IMPLIED
name  CDATA #IMPLIED
>

<!ELEMENT elementRelationship (childType)+>
<!ATTLIST elementRelationship
parentTypeId CDATA #REQUIRED
>
parentTypeId - Element type of the parent, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).

<!ELEMENT childType EMPTY>
<!ATTLIST childType
typeId                CDATA #REQUIRED
implicitChildProvider CDATA #IMPLIED
>
typeId - Element type of the child, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).

<!ELEMENT attributeRelationship (attributeType)+>
<!ATTLIST attributeRelationship
elementTypeId CDATA #REQUIRED
>
elementTypeId - Element type of the element, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).

<!ELEMENT attributeType EMPTY>
<!ATTLIST attributeType
typeId CDATA #REQUIRED
class  CDATA #REQUIRED
>
Describes how to graphically display a Rodin attribute of type boolean.

attributeTypeId - Id of the Rodin attribute type to which this description applies (see extension point org.rodinp.core.attributeTypes).

<!ELEMENT autoNaming EMPTY>
<!ATTLIST autoNaming
elementTypeId          CDATA #REQUIRED
attributeDescriptionId CDATA #REQUIRED
namePrefix             CDATA #REQUIRED
>
Describes how to automatically name an element. The autoNaming definition is unique for a given element type.

elementTypeId - Element type of the element, must be the unique ID of a Rodin internal element type (see extension point org.rodinp.core.internalElementTypes).
namePrefix - default prefix to name the element

The use of such extension point is obvious in org.eventb.core plug-in, as it would complement the extensions of org.rodinp.core.attributeTypes and org.rodinp.core.internalElementTypes.

B - API to declare and test the element/attribute relations and traverse them

The API for an element : IElementDesc

	public String getID();

	public List<IAttributeRelationship> getAttributeRelationships();
	
	public List<IElementRelationship> getChildRelationships();
       public List<IAttributeType> getAttributeTypes();

	public List<IElementType> getChildTypes();

	public IAttributeDesc getAutoNameAttribute();

adding the following method to the protocol :

       public boolean isDirectChildTypeOf(IElementDesc parentElemDesc);
       public boolean isOwnableAttribute(IAttributeDesc ownerElementDesc);

with the same interface IElementRelationship

public interface IElementRelationship extends Comparable<IElementRelationship> {

	public String getID();

	public IElementType<?> getParentType();

	public IInternalElementType<?> getChildType();

	public IImplicitChildProvider getImplicitChildProvider();
	
	public int getPriority();

}

with the "new" interface IAttributeRelationship

public interface IAttributeRelationship extends Comparable<IAttributeRelationship> {

	public String getID();

	public IElementType<?> getOwnerType();
	
	public int getPriority();

}

IImplicitChildProvider is moved to Event-b Core.

The API for an Attribute : IAttributeDesc

       public String getID();  
     
       public IAttributeManipulation getManipulation();

	public IAttributeType getAttributeType();

C - Data model operations (enforced)

The ElementManipulationFacade, support for modifications over the Database, should be provided by the Event-B Core plug-in.
The IAttributeManipulation interface should be also provided by the Event-B Core plug-in as it concerns the manipulation done on the attribute in the DB.

The information about the rendering of an element or an attribute, should not be deduced from the attribute itself (e.g. choiceAttribute vs. toggleAttribute vs. textAttribute), it should be given in the UI.

It seems that the ElementManipulationFacade can be used as protocol, but hiercharchy between elements and elements, or between elements and attributes shall be enforced. Proposition : add Exceptions to methods of the protocol.

UI related information

The part concerning how to display elements and UI related info will stay in the editorItems extension point and shall point to an element definition and hierachy.
Relationships will disappear from the editorItems extension point.

The interfaces are refactored to become the following :

NB. IITemDesc disappears as it is cumbersome to provide such interface for a sole method getPrefix().

public interface IUIElementDesc extends IItemDesc {

       public String getPrefix();

	public String getChildrenSuffix();

	public IImageProvider getImageProvider();

	public IAttributeDesc atColumn(int i);

	public int getDefaultColumn();

	public boolean isSelectable(int i);
	
	public String getAutoNamePrefix();
	
	public IElementPrettyPrinter getPrettyPrinter();
	
}
public interface IUIAttributeDesc extends IItemDesc {

       public String getPrefix();

	public String getSuffix();

	public IEditComposite createWidget();

	public boolean isHorizontalExpand();

}