MWZ's picture

Now we want to import an xml file into ARIS and generate new models. Therefore we presume the same notation of the xml file as generated above.

First we need a browse dialog so that the user can select the xml file he wants to import:

function getImportFile() {
    var sdefname = "";
    var sdefext = "*.xml!!xml file|*.xml||";
    var sdefdir = "";
    var stitle = "Import xml file";

    var aFiles = Dialogs.getFilePath(sdefname, sdefext, sdefdir, stitle, 0);    // Displays a file selection dialog on the client and makes the content of the selected files available in the report
    if (aFiles != null && aFiles.length > 0) {
        return aFiles[0];
    }
    return null;
}

The return value is an object of type “SelectedFile”. So we use method “getData” to get the content of the file and put it as input for the xml parsing method:

var importFile = getImportFile();
if (importFile != null) {
    var xmlData = importFile.getData();             // Content of the file
    var xmlReader = Context.getXMLParser(xmlData);  // Parses the specified XML file and returns an object that provides access to the XML document.
    if (xmlReader.isValid()) {
        var xmlRoot = xmlReader.getRootElement();   // Root element of the XML document

Next step is to read the model elements from the root object and create models in ARIS:

 var xmlModels = xmlRoot.getChildren("Model");
     var iterModel = xmlModels.iterator()
     while(iterModel.hasNext()) {
        var xmlModel = iterModel.next();
        // Create model
        var oModel = createModel(xmlModel, oGroup);
        if (oModel != null) {

Based on these models we read the objects and the connections and create the corresponding objects/connections in ARIS:

 var xmlObjs = xmlModel.getChildren("ObjDef");
        var iterObj = xmlObjs.iterator()
        while(iterObj.hasNext()) {
            var xmlObj = iterObj.next();
            // Create object definition and occurence
            createObject(xmlObj, oGroup, oModel);
        }

        var xmlCxns = xmlModel.getChildren("CxnDef");
        var iterCxn = xmlCxns.iterator()
        while(iterCxn.hasNext()) {
            var xmlCxn = iterCxn.next();
            // Create cxn definition and occurence
            createCxn(xmlCxn, oModel);
        }

During generation of the model we place all objects an connections with default values in the model so we had to layout the model after generating. We can do this by using the method “doLayout”.

At least, we open the model in the in the modeling window after running the report.

oModel.doLayout();                  // Executes a layout of the model
       oModel.openModel()                  // Opens the model in the modeling window after running the report

Function to create models:

function createModel(xmlModel, oGroup) {
    var sName = xmlModel.getAttribute("Name").getValue();
    var nTypeNum = parseInt(xmlModel.getAttribute("TypeNum").getValue());
    var sID = xmlModel.getAttribute("ID").getValue();

    var oModel = oGroup.CreateModel(nTypeNum, sName, g_nLoc);   // Creates a new model in the current group
    if (oModel.IsValid()) {                                     // Tests the validity of the object
        setAttrID(oModel, sID);                                 // Write attribute 'Identifier'
        return oModel;
    }
    return null;
}

To write the attribute “Identifier” we use this function:

function setAttrID(oItem, sID) {
    return oItem.Attribute(Constants.AT_ID, g_nLoc).setValue(sID);
}

Function to create object definitions and occurrences:

function createObject(xmlObj, oGroup, oModel) {
    var sName = xmlObj.getAttribute("Name").getValue();
    var nTypeNum = parseInt(xmlObj.getAttribute("TypeNum").getValue());
    var sID = xmlObj.getAttribute("ID").getValue();

    var oObjDef = oGroup.CreateObjDef(nTypeNum, sName, g_nLoc); // Creates a new m object definition in the current group
    if (oObjDef.IsValid()) {                                    // Tests the validity of the object
        setAttrID(oObjDef, sID);                                // Write attribute 'Identifier'

        var nSymbol = getSymbol(oModel, oObjDef);
        if (nSymbol > 0) {
            var oObjOcc = oModel.createObjOcc(nSymbol, oObjDef, 0, 0, true);    // Creates a new object occurrence of the specified object definition in the model
            if (oObjOcc.IsValid()) {                            // Tests the validity of the object
                return oObjOcc;
            }
            return null;
        }
    }
    return null;

    
    function getSymbol(oModel, oObjDef) {
        var aSymbols = ArisData.ActiveFilter().Symbols(oModel.TypeNum(), oObjDef.TypeNum());    // Returns a list of permitted symbols of the specified object type in the specified model type
        if (aSymbols.length > 0) {
            return aSymbols[0];
        }
        return 0;
    }
}

Function to create connection definitions and occurrences:

function createCxn(xmlCxn, oModel) {
    var sSourceName = xmlCxn.getAttribute("SourceName").getValue();
    var sTargetName = xmlCxn.getAttribute("TargetName").getValue();    
    var nTypeNum = parseInt(xmlCxn.getAttribute("TypeNum").getValue());
    var sID = xmlCxn.getAttribute("ID").getValue();

    var oSourceObjOcc = getObjectInModel(oModel, sSourceName);
    var oTargetObjOcc = getObjectInModel(oModel, sTargetName);
    
    if (oSourceObjOcc != null && oTargetObjOcc != null) {
        var oCxnOcc = oModel.CreateCxnOcc(oSourceObjOcc, oTargetObjOcc, nTypeNum, getDummyPointList()); // Creates a new relationship (definition and occurrence) between the specified object occurrences in the model
        if (oCxnOcc != null) {
            var oCxnDef = oCxnOcc.Cxn();
            setAttrID(oCxnDef, sID);                                // Write attribute 'Identifier'
        }
        return oCxnOcc;
    }
    return null;

    
    function getObjectInModel(oModel, sName) {
        var oObjOccsInModel = oModel.ObjOccList();                  // Returns all object occurrences in the model
        for (var i = 0; i < oObjOccsInModel.length; i++) {
            var oObjOcc = oObjOccsInModel[i];
            var oObjDef = oObjOcc.ObjDef();
            if (StrComp(oObjDef.Name(g_nLoc), sName) == 0) {        // Compare names
                return oObjOcc;
            }
        }
        return null;
    }    
    
    function getDummyPointList() {
        var pointList = new Array();
        pointList.push(new java.awt.Point(0, 0));
        pointList.push(new java.awt.Point(1, 1));        
        return pointList;
    }    
}

Here you can download the entire source code from the "XML Import" report.

Note: This article describe how to develop a report in ARIS. See this post for links to similar articles.

Tags: ARIS Report Scripting Import