Tutorial - how to parse an XMI file and access the model elements
The following code snippets take you through the steps to parse an XMI file, and write out all model elements extracted from the XMI file to the console.
import java.util.Collection; import java.util.List; import sdmetrics.model.MetaModel; import sdmetrics.model.MetaModelElement; import sdmetrics.model.Model; import sdmetrics.model.ModelElement; import sdmetrics.model.XMIReader; import sdmetrics.model.XMITransformations; import sdmetrics.util.XMLParser;
String metaModelURL = ...; // metamodel definition to use String xmiTransURL = ...; // XMI tranformations to use String xmiFile = ...; // XMI file with the UML model
{@link com.sdmetrics.util.XMLParser} parser = new XMLParser(); {@link com.sdmetrics.model.MetaModel} metaModel = new MetaModel(); parser.parse(metaModelURL, metaModel.getSAXParserHandler());You do not have to use the SAX parser provided by class
XMLParser
,
you may just as well use a org.xml.sax.XMLReader
that you created yourself.
{@link com.sdmetrics.model.XMITransformations} trans=new XMITransformations(metaModel); parser.parse(xmiTransURL, trans.getSAXParserHandler());
{@link com.sdmetrics.model.Model} model = new Model(metaModel); {@link com.sdmetrics.model.XMIReader} xmiReader = new XMIReader(trans, model); parser.parse(xmiFile, xmiReader);
String[] filters = { "#.java", "#.javax", "#.org.xml" }; {@link com.sdmetrics.model.Model#setFilter model.setFilter}(filters, false, true);At this point, you can already start calculating metrics for the elements in the model. The tutorial for package {@link com.sdmetrics.metrics} describes how. The remainder of this tutorial shows how to access the elements in the model.
// iterate over all model element types in the metamodel for ({@link com.sdmetrics.model.MetaModelElement} type : metaModel) { System.out.println("Elements of type: " + type.getName()); // iterate over all model elements of the current type List<ModelElement> elements = model.getAcceptedElements(type); for ({@link com.sdmetrics.model.ModelElement} me : elements) { System.out.println(" Element: " + me.getFullName() + " "); // write out the value of each attribute of the element Collection<String> attributeNames = type.getAttributeNames(); for (String attr : attributeNames) { System.out.print(" Attribute '" + attr); if (type.isSetAttribute(attr)) System.out.println("' has set value " + me.getSetAttribute(attr)); else if (type.isRefAttribute(attr)) { System.out.print("' references "); ModelElement referenced = me.getRefAttribute(attr); System.out.println((referenced == null) ? "nothing" : referenced.getFullName()); } else System.out.println("' has value: " + me.getPlainAttribute(attr)); } } }