===================================================
Sirius - Model Access
===================================================

Description
============

Overview
-----------

Every access (set or get) to the semantic model is going through a unified layer called the *ModelAccessor*. This model accessor is 
responsible for setting and getting values in an unified way, not knowing whether we are setting an intrinsic data attribute or an extended one
from a annotation.   

The ModelAccessor uses a set of Extenders which are responsible for a part of the model data. For instance we have an EcoreIntrinsicExtender which handle
the classical (defined in the metamodel) attributes accesses. And an AnnotationExtender which use an annotation model to add data to an existing model 
without changing the metamodel implementation.

All these extenders are working together and provides, through the ModelAccessor instance, an unified model access layer.


   Dynamic PLM is about being able to lock/unlock a given element and  being able to tell at any moment if this element has been modified or not, if it's a new element and so on.
   
   
All these features requires a tight integration of the tooling (Modelers and editors) and the permission manager. 

We can logically cut these aspects in a number of components in Viewpoint :

# Core components considering
  -  Semantic Model Access
  -  ViewPoint Model Access
# Editor components
  -  GMF model access
  -  Graphical Viewer access
  -  Tool Access
  -  Properties Access (Semantic, Extension, Style and Graphical Properties)
 
Semantic Access
---------------
 
 Every semantic access of model elements is done through the "ModelAccessor". This accessor is the common facade of the Ecore intrinsic data access and 
 of any kind of extended data access. It also handle the inter-weaving of the elements provided by both the Ecore semantic model and the annotations.
 
 Having the permission to set/unset a value or to create an instance of the semantic model is then done in this class and a permission authority coupled with this class may then be used 
 to ask for permission or notify a change or instance creation.
 
 
ViewPoint Model Access
----------------------
 
 Every access made to the viewpoint model is manually checking whether it has rights or not to create/delete/update an element. That means every possible creation or setting of a value manually request the permission at first.
 
GMF Model Access
----------------
GMF model should be understood as the Annotation model used by GMF to keep track of the diagram data. It is composed of "Node" and "Edge" and positions for instance.
The GMF model is automatically updated trough the CannonicalEditPolicy of every edit part in the diagram editor. 
We pretty much have no control on that but we can tell an edit part its "edit mode" is enabled or not. If the edit mode is disabled then nothing *should* lead to a change in the GMF model.    

We make sure that if a "ViewPoint" can't be edited, then at the diagram opening GMF won't bypass any EditPart to refresh the annotation model.

Graphical Viewer access
-----------------------
Mouse or keyboard editing is prevented thanks to the disable/enable edit mode in the GMF edit parts and specific code in the properties.

Tool Access
-----------
Every tool in the modeler palette is able to cause the a change in the model. As every command launched re-use the ModelAccessor it won't really change something in the model, 
but as  we don't want the tool to be enabled on a locked element, then the EMFCommandFactory ask for permission too, and if no permission is given, will return an UnexecutableCommand.

Properties Access
-----------------
Properties will ask for permission on a "per instance" basis right now, if it is not given, no CellEditor will be returned meaning the feature won't be editable.

Notifying the changes
----------------------
The Permission authority should be notified on new instance creation and on changes of the instances. To do so the PermissionAuthority initialization will install a listener on the given ResourceSet and will automatically notify it-self when a change appears.
This system will also help in checking that some unauthorized changes are not done.   
In *strict* mode the permission authority will throw Exceptions when a change is made to a locked element. Then if the process was in a transactional environment, then a rollback will happen.

Access errors
-------------
Current implementation provides 2 modes of usage of the ModelAccessor. The "silent" mode won't complain about an invalid access on a locked element, it will just ignore it.
If the current model accessor is not in silent mode then an Exception will be thrown in these cases. 

Status
------

Semantic Model accesses are handled through the command or properties. Extended information too.
Notification are handled through the usual EMF notifiers  + the notification of instance creation in the Model Accessor.

EditParts are disabled when the corresponding semantic element is locked. Permission listeners are setup to handle dynamic locking/unlocking.
