Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Script Name: Quality Check - UX Relations
Script Description:
A jArchi script for use on Archi tool models.
Using a specific view called ConceptDefinition to represent a cut down version of the full ArchiMate model,
check all the model relationships to flag up any unexpected ones.
This is used to keep a model to a core set of concepts for those wanted to start simple.
As well as sending the result to the scripts console, it sets a couple of dashboard-life objects on this view to show Model Conformance.
It's looking for two representations named UXRELS and UXOBJECTS and will set properties on these that can be displayed
using the specialisation plugin.
For example UXRELS can have the label "${property:uxrels_total} Unexpected Relations"
and UXOBJECTS the label "${property:uxobjects_total} Unexpected Objects"
It could also be possible to set the colour of any non-conforming object, but I felt it would be too heavy handed.
Author: Richard Heward - Tame Blue Lion
More Info: http://www.tamebluelion.co.uk/blog
Date: 26-Jun-2019
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**** EDIT NEXT LINE IF YOU WANT TO USE A DIFFERENT NAME *****/
var conceptView = ".ConceptDefinition"; // the name of the view of your concept meta model.
console.show();
console.clear();
var comboList = [];
var CountUXREL=0;
var CountUXOBJ=0;
var Problems=0;
var definedTypes = [];
// Load up the defined types into an array to make things quicker.
var viewObj = $(conceptView).first();
$(viewObj).find("element").each(function(viewItem) {
definedTypes.push(viewItem.type);
});
definedTypes.sort();
// List of objects to ignore as the source of a relation
// You may want to edit this...
var ignoreList = ["grouping", "junction", "location", "node", "representation"];
var checkIt = 0;
function newTriplet(thisTriplet, thisList)
{
// Does thisTriplet exist in the comboList?
var foundIt = false;
for (var i = 0; i < thisList.length; i++) {
if ((thisTriplet[0] +thisTriplet[1] +thisTriplet[2]) == (thisList[i][0] +thisList[i][1] +thisList[i][2])) {
foundIt = true;
break; // ..out of the for loop
}
}
return !foundIt; // if we have not found it, it is a newTriplet.
};
function checkEle(thisElementtype) {
var gotOne = false;
for (var i = 0; i < definedTypes.length; i++) {
if (thisElementtype == definedTypes[i]) {
gotOne = true;
break;
}
}
return gotOne;
};
function PartA() {
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
PART A - Create a multidimensional array of the allowable/expected (source)--(rel)->(target) combinations
from the view called ConceptDefinition, which is a cut down version of the full ArchiMate model.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
console.setTextColor(0, 0, 255); // blue
console.log("** Loading the Expected relationships **\n");
console.setDefaultTextColor();
// Get the items from the concept definition view
$(viewObj).find("element").each(function(viewItem) {
// get the outgoing relations for these items
$(viewItem).outRels().each(function(r) {
if (newTriplet([r.source.type, r.type, r.target.type], comboList)) {
// Create a (source)--(rel)->(target) triplet
comboList.push([r.source.type, r.type, r.target.type]);
}
});
});
comboList.sort(sortFunction);
function sortFunction(a, b) {
if (comboList[0] === b[0]) {
return 0;
}
else {
return (comboList[0] < b[0]) ? -1 : 1;
}
}
// List out the unique combinations
console.log("SourceType, RelType, TargetType"); //Header
for (var listNum = 0; listNum < comboList.length; listNum++) {
console.log(comboList[listNum][0], ", ", comboList[listNum][1], ", " ,comboList[listNum][2]);
};
console.log("\nNumber of combinations: ", comboList.length);
}; // Part A
function PartB() {
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
PART B - We now have an array of valid relationships called comboList; let's check the model against it.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
console.setTextColor(0, 0, 255); // blue
console.log("\n** Unexpected relationships **\n")
console.setDefaultTextColor();
console.log("Source, SourceType, RelType, Target, TargetType"); // Headers
var outputList = [];
var gotIt = false;
var checkIt2 = 0;
// loop through all the elements
$("element").each(function(sourceEle) {
checkIt = ignoreList.indexOf(sourceEle.type);
// if the source type is not in the ignore list checkIt is -1
if (checkIt == -1) {
// and get its outgoing relations (we're checking source to target)
$(sourceEle).outRels().each(function(r) {
gotIt = false;
// loop through the combos until we find a match of the source-rel-target
// let's ignore the target too, so only carry on if the target is not in the ignore list.
checkIt2 = ignoreList.indexOf(r.target.type);
if (checkIt2 == -1) {
for (comboNum = 0; comboNum < comboList.length; comboNum++) {
// have we got a match yet?
if ((r.source.type +r.type +r.target.type) == (comboList[comboNum][0] +comboList[comboNum][1] +comboList[comboNum][2]) ) {
gotIt = true;
break; // ..out of the for loop to save looking further
}
} // for loop
if (!gotIt) {
Problems++;
outputList.push([r.source.name,r.source.type,r.type,r.target.name,r.target.type]);
// console.log(r.source.name,", ",r.source.type,", ",r.type,", ",r.target.name,", ",r.target.type);
// r.prop("Unexpected","true");
}
CountUXREL++; // count of relationships checked.
} // if target ignore test.
});
} // if not an ignored item
}); // each element
outputList.sort(compareSecondColumn);
function compareSecondColumn(a, b) {
if (outputList[1] === b[1]) {
return 0;
}
else {
return (outputList[1] < b[1]) ? -1 : 1;
}
}
for (var i = 0; i < outputList.length; i++) {
console.log(outputList[i][0], ", ", outputList[i][1],", ", outputList[i][2],", ", outputList[i][3],", ", outputList[i][4]);
}
console.setTextColor(0, 0, 255); // blue
console.log('\n** Total of ', Problems.toFixed(0), ' warnings out of ',CountUXREL.toFixed());
console.setDefaultTextColor();
}; // Part B
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
PART C - Check any objects that don't appear on the definition view.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function PartC() {
var outputList = [];
console.setTextColor(0, 0, 255); // blue
console.log('\n** Unexpected object types **');
console.setDefaultTextColor();
console.log("Object, ObjectType"); // Header
$("element").each(function(Ele) {
if (!checkEle(Ele.type)) {
Ele.prop("Unexpected","true");
outputList.push([Ele.name, Ele.type]);
}
});
outputList.sort(compareSecondColumn);
function compareSecondColumn(a, b) {
if (outputList[1] === b[1]) {
return 0;
}
else {
return (outputList[1] < b[1]) ? -1 : 1;
}
}
outputList.sort();
checkIt = 0;
for (var i = 0; i < outputList.length; i++) {
checkIt = ignoreList.indexOf(outputList[i][1]);
// if the source type is not in the ignore list checkIt is -1
if (checkIt == -1) {
CountUXOBJ++;
console.log(outputList[i][0], ", ", outputList[i][1]);
}
}
}; // Part C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
setSummaries - use the representation objects on teh ConceptDefinition page to show the quality check results
as properties.
Note 1. This needs the specialisation plug in.
Note 2. You have to refresh the view manually to get the update.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function setSummaries()
{
// set the property called 'uxrels_total' on a representation called 'UXRELS'
var uxrelsRepresentation = $("Representation").filter(".UXRELS").first();
if (uxrelsRepresentation)
{
uxrelsRepresentation.prop("uxrels_total",Problems);
}
// set the property called 'uxobjects_total' on a representation called 'UXOBJECTS'
var uxobjectsRepresentation = $("Representation").filter(".UXOBJECTS").first();
if (uxobjectsRepresentation)
{
uxobjectsRepresentation.prop("uxobjects_total",CountUXOBJ);
}
} // setSummaries
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Main start here
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Check there is a concept definition view.
var viewObj = $(conceptView).first();
if (viewObj) {
console.setTextColor(150, 150, 255);
console.log("Based on view: ", viewObj.name);
console.setDefaultTextColor();
PartA();
PartB();
PartC();
setSummaries(); // This is optional if you are not using the specialisation plug in.
}
else {
window.alert("No concept diagram found.");
}
<?xml version="1.0" encoding="UTF-8"?>
<archimate:model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:archimate="http://www.archimatetool.com/archimate" name="Test Relationships" id="86e398b5-cf08-493c-91c9-4ce5d037d5e4" version="4.4.0">
<metadata/>
<folder name="Strategy" id="5ec20931-cbfb-4319-b066-09897c9b48e1" type="strategy"/>
<folder name="Business" id="4789dc8f-372e-4fd2-b990-7fd5bff35f2c" type="business">
<element xsi:type="archimate:Representation" name="UXRELS" id="b49bc03b-f97e-4c5a-b59c-152622a8d671">
<property key="uxrels_total" value="4"/>
<property key="label" value="${property:uxrels_total} Unexpected Relations"/>
</element>
<element xsi:type="archimate:Representation" name="UXOBJECTS" id="eb36c611-1b33-4e14-a07d-1875768aa0f8">
<property key="uxobjects_total" value="1"/>
<property key="label" value="${property:uxobjects_total} Unexpected Objects"/>
</element>
<element xsi:type="archimate:BusinessProcess" name="Process A" id="047bd92d-37c9-4755-8ad9-52928a64b993">
<property key="Unexpected" value="true"/>
</element>
</folder>
<folder name="Application" id="11ac5776-c231-4e99-b1d6-669d15dde5e4" type="application">
<element xsi:type="archimate:ApplicationComponent" name="App A" id="277ba456-890f-4fb0-85ee-7dd7a7a720dd"/>
<element xsi:type="archimate:ApplicationFunction" name="Function A" id="f1fd611e-3b44-4e9f-b82b-893229d06607"/>
<element xsi:type="archimate:ApplicationComponent" name="Application Component" id="36f44f30-5de6-4fe4-9798-ffaff87baa27"/>
<element xsi:type="archimate:ApplicationFunction" name="Application Function" id="d6f545ef-492b-42f6-af7c-20b19797f2ca"/>
<element xsi:type="archimate:ApplicationComponent" name="Sub App" id="fa5367d3-74f9-4dad-9ed2-f740bc683ac4"/>
<element xsi:type="archimate:ApplicationService" name="Application Service" id="ac8a0990-80f5-4526-8c3e-0afc9d38e2ae"/>
<element xsi:type="archimate:ApplicationService" name="Service A" id="5ab2bcc0-7ffe-4a14-8d7e-d509a5202924"/>
</folder>
<folder name="Technology &amp; Physical" id="19f720c4-5007-42a6-bff4-4f5959aada9a" type="technology"/>
<folder name="Motivation" id="24b59ffd-3018-4f67-b1b7-23944d6cd9f0" type="motivation"/>
<folder name="Implementation &amp; Migration" id="8e31b065-93c1-4d62-94fd-2abb3f19c1ab" type="implementation_migration"/>
<folder name="Other" id="45169efb-1a0e-48b4-bafe-0d64c6bc61d1" type="other"/>
<folder name="Relations" id="7918731a-bbaa-4046-a1f8-250c32baa761" type="relations">
<element xsi:type="archimate:AssignmentRelationship" name="expected" id="7e616189-9d5a-46f2-939c-52a89399632a" source="277ba456-890f-4fb0-85ee-7dd7a7a720dd" target="f1fd611e-3b44-4e9f-b82b-893229d06607"/>
<element xsi:type="archimate:AssignmentRelationship" id="d9077516-72cc-4026-92c1-ec463d30df6b" source="36f44f30-5de6-4fe4-9798-ffaff87baa27" target="d6f545ef-492b-42f6-af7c-20b19797f2ca"/>
<element xsi:type="archimate:CompositionRelationship" id="92fd1c9d-27ac-4620-86d1-ac191b563343" source="36f44f30-5de6-4fe4-9798-ffaff87baa27" target="36f44f30-5de6-4fe4-9798-ffaff87baa27"/>
<element xsi:type="archimate:ServingRelationship" name="unexpected" id="4b2d5f2b-eeed-4fe7-b379-fc2a026ef1ea" source="277ba456-890f-4fb0-85ee-7dd7a7a720dd" target="f1fd611e-3b44-4e9f-b82b-893229d06607"/>
<element xsi:type="archimate:CompositionRelationship" name="expected" id="4b6f5cf1-2e68-4c38-b262-7ff8e3f39ea1" source="277ba456-890f-4fb0-85ee-7dd7a7a720dd" target="fa5367d3-74f9-4dad-9ed2-f740bc683ac4"/>
<element xsi:type="archimate:RealizationRelationship" id="ecf4a4c9-7644-4b36-aee8-ccf6265e12ef" source="d6f545ef-492b-42f6-af7c-20b19797f2ca" target="ac8a0990-80f5-4526-8c3e-0afc9d38e2ae"/>
<element xsi:type="archimate:ServingRelationship" name="unexpected" id="118a87d8-9aea-4887-b231-45e3e4bb34e2" source="f1fd611e-3b44-4e9f-b82b-893229d06607" target="5ab2bcc0-7ffe-4a14-8d7e-d509a5202924"/>
<element xsi:type="archimate:AssociationRelationship" id="9971c232-f1cf-4498-b3b6-32d6c07be25e" source="d6f545ef-492b-42f6-af7c-20b19797f2ca" target="ac8a0990-80f5-4526-8c3e-0afc9d38e2ae"/>
<element xsi:type="archimate:AssociationRelationship" name="wrong way" id="1447aa31-690b-45ab-9a83-d7caf501d11a" source="5ab2bcc0-7ffe-4a14-8d7e-d509a5202924" target="f1fd611e-3b44-4e9f-b82b-893229d06607"/>
<element xsi:type="archimate:ServingRelationship" id="c6700a43-46c6-4a4c-8ee9-e28c1341cb0c" source="5ab2bcc0-7ffe-4a14-8d7e-d509a5202924" target="047bd92d-37c9-4755-8ad9-52928a64b993"/>
</folder>
<folder name="Views" id="6f21cec0-b044-4a69-a92f-d9ad099fb3ac" type="diagrams">
<element xsi:type="archimate:ArchimateDiagramModel" name="My View" id="24ec5346-0d27-4a0d-97f8-f7c42b4370e4">
<child xsi:type="archimate:DiagramObject" id="39422496-6d9f-45f9-8ddd-5bac974a7020" lineColor="#4f4f4f" fillColor="#afffff" archimateElement="277ba456-890f-4fb0-85ee-7dd7a7a720dd" type="1">
<bounds x="75" y="405" width="190" height="81"/>
<sourceConnection xsi:type="archimate:Connection" id="8c1385e8-b52e-4552-870a-80b89642d896" lineColor="#000000" source="39422496-6d9f-45f9-8ddd-5bac974a7020" target="012cbd8f-ebad-46cd-8841-90748b460cbf" archimateRelationship="7e616189-9d5a-46f2-939c-52a89399632a"/>
<sourceConnection xsi:type="archimate:Connection" id="88cb4876-f158-4513-88aa-3f0d6b5d9c2e" lineColor="#000000" source="39422496-6d9f-45f9-8ddd-5bac974a7020" target="012cbd8f-ebad-46cd-8841-90748b460cbf" archimateRelationship="4b2d5f2b-eeed-4fe7-b379-fc2a026ef1ea">
<bendpoint startX="134" startY="-15" endX="169" endY="133"/>
<bendpoint startX="134" startY="-130" endX="169" endY="18"/>
</sourceConnection>
<sourceConnection xsi:type="archimate:Connection" id="57d425f7-06cc-4d87-8f82-c39da6dd0d21" source="39422496-6d9f-45f9-8ddd-5bac974a7020" target="64e9180b-1792-41da-ae5b-bcaa09ea2302" archimateRelationship="4b6f5cf1-2e68-4c38-b262-7ff8e3f39ea1"/>
<child xsi:type="archimate:DiagramObject" id="64e9180b-1792-41da-ae5b-bcaa09ea2302" targetConnections="57d425f7-06cc-4d87-8f82-c39da6dd0d21" lineColor="#4f4f4f" fillColor="#afffff" archimateElement="fa5367d3-74f9-4dad-9ed2-f740bc683ac4" type="1">
<bounds x="15" y="20" width="120" height="55"/>
</child>
</child>
<child xsi:type="archimate:DiagramObject" id="012cbd8f-ebad-46cd-8841-90748b460cbf" targetConnections="8c1385e8-b52e-4552-870a-80b89642d896 88cb4876-f158-4513-88aa-3f0d6b5d9c2e 8612c441-0dc2-4776-8bc0-2804693cc62a" lineColor="#4f4f4f" fillColor="#ffffaf" archimateElement="f1fd611e-3b44-4e9f-b82b-893229d06607">
<bounds x="75" y="270" width="120" height="55"/>
<sourceConnection xsi:type="archimate:Connection" id="589e995e-6351-499e-8e1e-03d1fb933de2" lineColor="#000000" source="012cbd8f-ebad-46cd-8841-90748b460cbf" target="3288532b-72d0-4b25-a81d-d30a26672587" archimateRelationship="118a87d8-9aea-4887-b231-45e3e4bb34e2"/>
</child>
<child xsi:type="archimate:DiagramObject" id="3288532b-72d0-4b25-a81d-d30a26672587" targetConnections="589e995e-6351-499e-8e1e-03d1fb933de2" lineColor="#4f4f4f" fillColor="#ffffaf" archimateElement="5ab2bcc0-7ffe-4a14-8d7e-d509a5202924">
<bounds x="79" y="140" width="120" height="55"/>
<sourceConnection xsi:type="archimate:Connection" id="8612c441-0dc2-4776-8bc0-2804693cc62a" lineColor="#000000" source="3288532b-72d0-4b25-a81d-d30a26672587" target="012cbd8f-ebad-46cd-8841-90748b460cbf" archimateRelationship="1447aa31-690b-45ab-9a83-d7caf501d11a">
<bendpoint startX="-45" startY="88" endX="-41" endY="-42"/>
</sourceConnection>
<sourceConnection xsi:type="archimate:Connection" id="3f31eca9-f046-45ec-a143-483927aed4d3" lineColor="#000000" source="3288532b-72d0-4b25-a81d-d30a26672587" target="a60089bd-9b87-4772-86c8-ec62ad509722" archimateRelationship="c6700a43-46c6-4a4c-8ee9-e28c1341cb0c"/>
</child>
<child xsi:type="archimate:DiagramObject" id="a60089bd-9b87-4772-86c8-ec62ad509722" targetConnections="3f31eca9-f046-45ec-a143-483927aed4d3" lineColor="#4f4f4f" fillColor="#ffffe6" archimateElement="047bd92d-37c9-4755-8ad9-52928a64b993">
<bounds x="79" y="45" width="120" height="55"/>
</child>
</element>
<element xsi:type="archimate:ArchimateDiagramModel" name="ConceptDefinition" id="90b0f9ad-f042-4e29-a788-012ca2d40daa">
<child xsi:type="archimate:DiagramObject" id="221c4d1f-6566-4ed5-8fbc-7af9e8c645e4" targetConnections="ac1c56da-5f36-46f7-9e48-4e7fabf31d47" lineColor="#4f4f4f" fillColor="#afffff" archimateElement="36f44f30-5de6-4fe4-9798-ffaff87baa27" type="1">
<bounds x="150" y="320" width="120" height="55"/>
<sourceConnection xsi:type="archimate:Connection" id="6a214e38-c7bc-42fb-ba2e-f7686267d602" lineColor="#000000" source="221c4d1f-6566-4ed5-8fbc-7af9e8c645e4" target="525ec4b1-b2e6-4775-ad91-71c622125fd8" archimateRelationship="d9077516-72cc-4026-92c1-ec463d30df6b"/>
<sourceConnection xsi:type="archimate:Connection" id="ac1c56da-5f36-46f7-9e48-4e7fabf31d47" lineColor="#000000" source="221c4d1f-6566-4ed5-8fbc-7af9e8c645e4" target="221c4d1f-6566-4ed5-8fbc-7af9e8c645e4" archimateRelationship="92fd1c9d-27ac-4620-86d1-ac191b563343">
<bendpoint startY="60" endY="60"/>
<bendpoint startX="100" startY="60" endX="100" endY="60"/>
<bendpoint startX="100" endX="100"/>
</sourceConnection>
</child>
<child xsi:type="archimate:DiagramObject" id="525ec4b1-b2e6-4775-ad91-71c622125fd8" targetConnections="6a214e38-c7bc-42fb-ba2e-f7686267d602" lineColor="#4f4f4f" fillColor="#ffffaf" archimateElement="d6f545ef-492b-42f6-af7c-20b19797f2ca">
<bounds x="150" y="195" width="120" height="55"/>
<sourceConnection xsi:type="archimate:Connection" id="dcae4888-15f7-4299-a0b8-5b2f6b591688" lineColor="#000000" source="525ec4b1-b2e6-4775-ad91-71c622125fd8" target="d644da36-f7b3-41a5-ad11-2b36f04cffde" archimateRelationship="ecf4a4c9-7644-4b36-aee8-ccf6265e12ef"/>
<sourceConnection xsi:type="archimate:Connection" id="a514fcdb-5ec8-4857-a4f0-c9ee4e0e71bb" lineColor="#000000" source="525ec4b1-b2e6-4775-ad91-71c622125fd8" target="d644da36-f7b3-41a5-ad11-2b36f04cffde" archimateRelationship="9971c232-f1cf-4498-b3b6-32d6c07be25e">
<bendpoint startX="25" startY="-47" endX="25" endY="78"/>
</sourceConnection>
</child>
<child xsi:type="archimate:DiagramObject" id="d644da36-f7b3-41a5-ad11-2b36f04cffde" targetConnections="dcae4888-15f7-4299-a0b8-5b2f6b591688 a514fcdb-5ec8-4857-a4f0-c9ee4e0e71bb" lineColor="#4f4f4f" fillColor="#ffffaf" archimateElement="ac8a0990-80f5-4526-8c3e-0afc9d38e2ae">
<bounds x="150" y="70" width="120" height="55"/>
</child>
<child xsi:type="archimate:Group" id="37142bf3-9694-457d-bcb8-6c0e09a2848c" name="Model Conformance" fontColor="#ffffff" lineColor="#4f4f4f" textAlignment="1" fillColor="#424242">
<bounds x="345" y="70" width="251" height="181"/>
<child xsi:type="archimate:DiagramObject" id="37138a40-5a29-44fb-a0e1-189fb8af5ff4" font="1|Open Sans|14.0|0|COCOA|1|OpenSans" lineColor="#4f4f4f" fillColor="#ff9300" archimateElement="b49bc03b-f97e-4c5a-b59c-152622a8d671">
<bounds x="25" y="40" width="196" height="56"/>
</child>
<child xsi:type="archimate:DiagramObject" id="901fc1be-4196-4beb-8237-b4ebb6fb1e7f" font="1|Open Sans|14.0|0|COCOA|1|OpenSans" lineColor="#4f4f4f" fillColor="#ff7d78" archimateElement="eb36c611-1b33-4e14-a07d-1875768aa0f8">
<bounds x="25" y="105" width="196" height="49"/>
</child>
</child>
<documentation>This view defines a sub-set of the full ArchiMate model. This allows for a simpler use of the tool when starting out or just being strict.</documentation>
</element>
</folder>
<purpose>This is a test model for the use of a Concept Definition view and the Quality Check - UX Relations.ajs jArchi script to be found at https://gist.github.com/rich-biker/ded65fa63210b929978c7770746f91f7#file-quality-check-ux-relations-ajs
</purpose>
</archimate:model>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment