|
|
(14 intermediate revisions by 4 users not shown) |
Line 1: |
Line 1: |
− | == MoDisco Role ==
| + | #REDIRECT [[MoDisco/Moved To Help Center]] |
− | | + | |
− | The MoDisco role component introduced the "role" concept. A role
| + | |
− | is a kind of virtual class extension. Those "virtual classes" will never
| + | |
− | have instances. An object can be conform to a role but can not be an
| + | |
− | instance of a role.
| + | |
− | | + | |
− | For example, assuming we have a class named Employee and two
| + | |
− | roles: "Manager" and "Developer". We will have a set of Employee instances and
| + | |
− | some of them will have the role of "Manager" or "Developer".
| + | |
− | | + | |
− | The goal of role concept introduction is to be able to highlight
| + | |
− | some model elements having a specific role.
| + | |
− | | + | |
− | The MoDisco role feature allows describing and using roles. The
| + | |
− | description is done by editing a model and the use is done through an
| + | |
− | API. The main client of this API is the MoDisco browser.
| + | |
− | | + | |
− | ==How to create a model role set==
| + | |
− | The first step is to [[MoDisco/ProjectNature|create
| + | |
− | a MoDisco project]].
| + | |
− | | + | |
− | The second step is to [[MoDisco/QueryManager|create
| + | |
− | a query set]]. This query set will store boolean queries indicating if an
| + | |
− | object is conform to a role.
| + | |
− | | + | |
− | Right-click on the MoDisco project and select the "New > Other
| + | |
− | ..." button.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_001.gif]] | + | |
− | | + | |
− | Select "Role Model" and press the "Next" button
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_002.gif]]
| + | |
− | | + | |
− | Choose a name for your model role set (My.roleSet in the example)
| + | |
− | and press "Next".
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_003.gif]]
| + | |
− | | + | |
− | | + | |
− | Select "RoleSet" in the "Model Object" list and press "Finish"
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_004.gif]]
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_005.gif]]
| + | |
− | | + | |
− | Open the "My.roleSet" file and open the "Properties View"
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_006.gif]]
| + | |
− | | + | |
− | Set the name of the role set and take care that the role set name
| + | |
− | is the same than the containing file name ("My" in the example). The
| + | |
− | nsURI and prefix must also be filled.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_007.gif]]
| + | |
− | | + | |
− | Load the resources containing the meta-model extended by the
| + | |
− | role set. To load a meta-model resource the user must use the "Load
| + | |
− | meta-model resource" action.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_008.gif]]
| + | |
− | | + | |
− | In this example, we choose to use the Java meta-model.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_009.gif]]
| + | |
− | | + | |
− | Fill the "Extended package" field with the ePackages
| + | |
− | containing the virtually extended meta-model.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_010.gif]]
| + | |
− | | + | |
− | Right click on the RoleSet element and choose the "New Child > Role"
| + | |
− | action to create a role.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_011.gif]]
| + | |
− | | + | |
− | Set the role name and the class that the role will extend.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_012.gif]]
| + | |
− | | + | |
− | To specify how to know if an object is conform to a role, we have
| + | |
− | to provide a boolean query. To provide this query we have to load the
| + | |
− | model containing its description.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_013.gif]]
| + | |
− | | + | |
− | The query has to referred using the MoDisco protocol:
| + | |
− | "modisco:/query/<querySetName>". In the example, we use the "My"
| + | |
− | query set.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_014.gif]]
| + | |
− | | + | |
− | Until the query set resource is referred, we have just to select the
| + | |
− | query describing the role. In the example this query is named
| + | |
− | "isAbstract".
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_015.gif]]
| + | |
− | | + | |
− | At this step, if we save the model, the "red cross" should disappear
| + | |
− | from the file icon. This mean that the role set model is valid.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_016.gif]]
| + | |
− | | + | |
− | If the role has specific attributes or references which can be
| + | |
− | calculated, we can declare them. In this example, we will declare an
| + | |
− | attribute indicating the number of abstract method contained in the
| + | |
− | abstract class. To create a new role attribute right-click on the role
| + | |
− | element and select the "New > New Child > RoleAttribute" button.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_017.gif]]
| + | |
− | | + | |
− | The attribute's type and name must be set. The "Value Query" field must
| + | |
− | be field with a reference to a query which is able to calculate the
| + | |
− | attribute's value. This query must have the same type than the attribute
| + | |
− | and be applicable to the virtually extended class.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_018.gif]]
| + | |
− | | + | |
− | | + | |
− | The role set is now ready to be used.
| + | |
− | | + | |
− | == How to consult the MoDisco role set catalog trough the UI ==
| + | |
− | | + | |
− | If a role set model is valid, it is registered in the role set
| + | |
− | catalog. To consult the role set catalog, we can use the "Role Set"
| + | |
− | view.
| + | |
− | | + | |
− | To get this view select "Windows > Show view > Other ..."
| + | |
− | in the menu bar and chose "Role Set" in the list.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_019.gif]]
| + | |
− | [[Image:MoDisco_Role_newRoleSet_020.gif]]
| + | |
− | | + | |
− | The "Role set" view presents the available role sets and them
| + | |
− | roles. For each role set the description model location is point out.
| + | |
− | | + | |
− | [[Image:MoDisco_Role_newRoleSet_021.gif]]
| + | |
− | | + | |
− | == How to programmatically use the MoDisco role set catalog. ==
| + | |
− | | + | |
− | Here a MoDisco role API example is provided. To have more
| + | |
− | informations please refer to the JavaDoc.
| + | |
− | | + | |
− | import org.eclipse.emf.ecore.EObject;
| + | |
− | import org.eclipse.gmt.modisco.infra.query.core.exception.ModelQueryException;
| + | |
− | import org.eclipse.gmt.modisco.infra.role.Role;
| + | |
− | import org.eclipse.gmt.modisco.infra.role.RoleSet;
| + | |
− | import org.eclipse.gmt.modisco.infra.role.core.RoleContext;
| + | |
− | import org.eclipse.gmt.modisco.infra.role.core.RoleSetCatalog;
| + | |
− | import org.eclipse.gmt.modisco.infra.role.core.exception.ModiscoRoleException;
| + | |
− |
| + | |
− | public class Example {
| + | |
− |
| + | |
− | public Integer getNbAbstractMethod(EObject eObject)
| + | |
− | throws ModelQueryException, ModiscoRoleException {
| + | |
− | RoleSet roleSet = RoleSetCatalog.getSingleton().getRoleSet("My");
| + | |
− | RoleContext context = new RoleContext();
| + | |
− | context.addRoleSet(roleSet);
| + | |
− | Role role = roleSet.getRole("AbstractClassDeclaration");
| + | |
− | if (context.isInstance(eObject, role)) {
| + | |
− | Object object = context.get(eObject, role
| + | |
− | .getEStructuralFeature("nbAbstractMethod"));
| + | |
− | if (object instanceof Integer) {
| + | |
− | Integer nbAbstractMethod = (Integer) object;
| + | |
− | return nbAbstractMethod;
| + | |
− | }
| + | |
− | }
| + | |
− | return null;
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | == Role Meta-model Description ==
| + | |
− | | + | |
− | [[Image:MoDisco_Role_metamodel.png]]
| + | |
− | | + | |
− | The role meta-model extends the ecore meta-model and use the
| + | |
− | query meta-model.
| + | |
− | | + | |
− | A roleSet is a kind of ePackage. A roleSet contains roles through
| + | |
− | the eClassifier reference. A role is a kind of eClass.
| + | |
− | | + | |
− | For a role instance, the eSuperType reference must be set to
| + | |
− | specify which class the role virtually extends.
| + | |
− | | + | |
− | The role class has one specific reference: conditionQuery. The
| + | |
− | conditionQuery reference points the ModelQuery class. The model queries
| + | |
− | pointed by the conditionQuery reference must return a Boolean. Those
| + | |
− | queries are used to specify how to decide if an instance is conform to a
| + | |
− | role. If the conditionQuery is empty all the instances of the class
| + | |
− | referred by role instance trough the eSuperType reference, are conform
| + | |
− | to the role.
| + | |
− | | + | |
− | A role contains roleAttributes and roleReferences through the
| + | |
− | eStructuralFeature reference. The RoleAttribute and RoleReference
| + | |
− | classes have a common super class: RoleStructuralFeature. The
| + | |
− | RoleStructuralFeature has one reference named valueQuery and pointing to
| + | |
− | the ModelQuery class. The valueQuery is used to compute the role
| + | |
− | structural feature value. The roleAttribute and roleReference must have
| + | |
− | the same type than the query they refer.
| + | |