IBM Rational DOORS is a requirements management application, allowing the user to capture, track and manage requirements.
SodiusWillert provides MDAccess for DOORS as a way to get access to all of this information using a simple Java API and Eclipse EMF representation.
This article is a presentation on how to use this technology.
For more details on how to use MDWorkbench, refer to the Introduction to MDAccess for Excel article.
The following picture represents a subset of the DOORS metamodel:
A Folder is made of Modules, that can be Formal (FormalModule) or Link (LinkModule).
A FormalModule has Objects, and Objects can contain other Objects (nestedObjects).
A LinkModule can have LinkSets, themselves containing Links between Objects. A LinkSet is represented by a source FormalModule and a target FormalModule.
Modules have Attributes.
To read from a DOORS database, the DOORS client application must be open. Our example, the EasyStart training database, is provided by IBM.
Using the Application reader, open the DOORS Database in MDWorkbench.
Note: To learn how to open a Model in MDWorkbench, refer to the Introduction to MDAccess for Excel article.
It is possible to choose the items to import (folder, project, or module). In this case, we select the "EasyStart" Project and its contained elements:
There are several import modes:
Into this mode, data is read from the application when requested. A click on the plus sign of a relation calls the appropriate DOORS API.
Indeed, the main reason to use the On-Demand mode is the size of databases. When they are too large, it is a means to load only the interesting part and not the entire database.
In this mode, data is never read.
Into this mode, all selected elements are read at once. This is an interesting mode when all the information from a particular node in the DOORS database is needed.
We choose to import the EasyStart project using the "On-Demand" mode.`
Note: It is also possible to import a particular Baseline.
To load the other elements, click on the "ownedItems" reference. The "EasyStart Tutorial" Folder is loaded.
We would like to programmatically get the Folders' qualified names:
Create a Plug-in Project called "com.sodius.blogs.demo.doors" and add the following dependencies:
Create a Java Class called "ExploreDoorsDatabase":
package com.sodius.blogs.demo.doors;
public class ExploreDoorsDatabase {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
First create an instance of MDWorkbench, then get the DOORS metamodel, and instantiate it:
MDWorkbench mdw = MDWorkbenchFactory.create();
Metamodel doorsMetamodel = mdw.getMetamodelManager().getMetamodel("doors");
Model doorsModel = doorsMetamodel.createModel();
Use the "Application" reader to populate the Model.
Map options = new HashMap();
options.put("doors.ignoreConnectorUI", Boolean.TRUE);
doorsModel.read("Application", "", options);
Folder folder = (Folder) doorsModel
.getInstances(DoorsPackage.eINSTANCE.getFolder(), false).first();
MDWList<Item> ownedItems = folder.getOwnedItems();
printFolder(ownedItems);
with:
private static void printFolder(MDWList<Item> items){
for (Item item : items) {
if(item instanceof Folder){
System.out.println(((Folder)item).getQualifiedName());
printFolder(((Folder)item).getOwnedItems());
}
}
}
Note: For more information on how to use reader options, please refer to the MDAccess documentation.
Now, execute the code, running a Runtime configuration.
Note: To know how to launch a Runtime Configuration in MDWorkbench, and notably to set the license location, refer to the Introduction to MDAccess for Excel article.
Console output:
/EasyStart Tutorial
/EasyStart
/EasyStart/Change Proposal System
/EasyStart/Requirements
/EasyStart/Sub-systems
/EasyStart/Test
/EasyStart Tutorial/EasyStart Learning Area
/Example Data
...
/Example Data/Company Standards/Procedures
/Example Data/General information
/Lost and Found
We would now like to get the elements (Objects, Formal, and Link Modules) under the "Design" Folder:
ReaderScope scope = new ReaderScope();
scope.getItemScope("/Sports utility vehicle 4x2/Design")
.setMode(ItemScopeMode.COMPLETE);
options.put("doors.scope", scope);
doorsModel.read("Application", "", options);
Folder folderChange = (Folder) doorsModel
.getInstances(DoorsPackage.eINSTANCE.getFolder(), false)
.detect("name", "Design");
System.out.println("nnCurrent Folder = " + folderChange);
MDWList<Item> items = folder.getOwnedItems();
for (Item item : items) {
if(item instanceof FormalModule){
System.out.println("Formal Module = " + module.getName());
MDWList<Object> objects = ((FormalModule)item).getObjects();
for(Object object : objects){
System.out.println("tObject = " + object.getObjectHeading());
}
}else if(item instanceof LinkModule){
System.out.println("Link Module = " + module.getName());
MDWList<LinkSet> linkSets = ((LinkModule)item).getLinkSets();
for(LinkSet linkSet : linkSets){
System.out.println("tModule Source = "
+ linkSet.getSourceModule().getName()
+ " - Module Target = "
+ linkSet.getTargetModule().getName());
}
}
}
Console output:
Current Folder = Design
Formal Module = Architecture
Object = Body
Object = Drive system
Object = Braking system
...
Object = Indications
Object = Entertainment system
Link Module = Architecture Links
Module Source = - Module Target = Architecture
Formal Module = CI Structure
Object = Electrical equipment
Object = Lighting equipment
Object = Sensors
Object = Motors
This article shows you how to easily read DOORS Database using MDAccess for DOORS. Using the On-Demand connector, the execution is faster because just the needed/necessary elements are read.
The complete Eclipse project: com_sodius_blogs_demo_doors (File > Import > General > Existing project into Workspace > Select archive file)