Switch to side-by-side view

--- a
+++ b/ConvertArchi2OWL_v2.0.php
@@ -0,0 +1,174 @@
+<?php
+
+/*
+ * Script that create the Archinsurance part of an Ontology.
+ * This script generate a xml file to add in the Archimate with extensions 
+ * Ontology file, the generated file add the Archinsurance concepts
+ * (Individuals and Object Properties) in the Archimate with extensions OWL file.
+ * 
+ * The script take as source the CSV file exported using the Archi Tool.
+ * @author INESC-ID
+ */
+
+//path to input file
+$csv = fopen("input.csv", "r");
+Header('Content-type: text/xml');
+
+$xml = simplexml_load_file(getInput() . ".archimate");
+$newsXML = new SimpleXMLElement('<RDF/>');
+
+//Read Archi File --------------------------------------------------------------
+$arrayRelationAccessType = array('Write', 'Read', 'Access', 'Read_Write');
+$hashAccessRelations = null;
+foreach ($arrayRelationAccessType as $value) {
+
+    $property = $newsXML->addChild('SubObjectPropertyOf');
+    $subProp = $property->addChild("ObjectProperty");
+    $subProp->addAttribute("IRI", "#" . $value);
+    $subPropOf = $property->addChild("ObjectProperty");
+    $subPropOf->addAttribute("IRI", "#accesses");
+}
+$att = $xml->xpath('//element[@accessType]');
+foreach ($att as $simpleXmlObject) {
+
+    $source = $simpleXmlObject->attributes()['source'];
+    $sourceElementObject = $xml->xpath(sprintf("//element[@id='%d']", $source));
+    $sourceElement = format_string($sourceElementObject[0]->attributes()['name']);
+
+    $target = $simpleXmlObject->attributes()['target'];
+    $targetElementObject = $xml->xpath(sprintf("//element[@id='%d']", $target));
+    $targetElement = format_string($targetElementObject[0]->attributes()['name']);
+    $accessType = $simpleXmlObject->attributes()['accessType'];
+
+    $relation = $newsXML->addChild("ObjectPropertyAssertion");
+    $op = $relation->addChild("ObjectProperty");
+    $op->addAttribute("IRI", "#" . $arrayRelationAccessType[(int) $accessType]);
+    $name1 = $relation->addChild("NamedIndividual");
+    $name1->addAttribute("IRI", "#" . $sourceElement);
+    $name2 = $relation->addChild("NamedIndividual");
+    $name2->addAttribute("IRI", "#" . $targetElement);
+
+    $hashAccessRelations[$sourceElement][$targetElement] = true;
+}
+
+//Read CSV File-----------------------------------------------------------------
+$arrayOperations = array();
+$firstline = true;
+while (!feof($csv)) {
+
+    $line = fgetcsv($csv);
+    if ($firstline) {
+        $firstline = false;
+        continue;
+    }
+
+    $elementName = format_string($line[1]);
+    $sourceName = format_string($line[4]);
+    $targetName = format_string($line[6]);
+    $type = str_replace("Relationship", "", $line[0]);
+
+    if ($line[3] == "" && $type != "") {
+        $classAssertion = $newsXML->addChild("ClassAssertion");
+        $entity = $classAssertion->addChild("Class");
+        $entity->addAttribute('IRI', "#" . $type);
+        $individual = $classAssertion->addChild("NamedIndividual");
+        $individual->addAttribute('IRI', "#" . $elementName);
+    } else {
+        $type = strtolower($type);
+        switch ($type) {
+            case 'access':
+                $type = 'accesses';
+                break;
+            case 'aggregation':
+                $type = 'aggregates';
+                break;
+            case 'assignment':
+                $type = 'assignedFrom';
+                break;
+            case 'composition':
+                $type = 'composedOf';
+                break;
+            case 'flow':
+                $type = 'flowTo';
+                break;
+            case 'influence':
+                $type = 'influencedBy';
+                break;
+            case 'realisation':
+                $type = 'realizes';
+                break;
+            case 'specialisation':
+                $type = 'specialization';
+                break;
+            case 'triggering':
+                $type = 'triggers';
+                break;
+            case 'usedby':
+                $type = 'usedBy';
+                break;
+
+            default:
+                break;
+        }
+        if ($elementName) {
+
+            if (array_search("$elementName.$type", $arrayOperations) === false) {
+                $property = $newsXML->addChild('SubObjectPropertyOf');
+                $subProp = $property->addChild("ObjectProperty");
+                $subProp->addAttribute("IRI", "#" . $elementName);
+                $subPropOf = $property->addChild("ObjectProperty");
+                $subPropOf->addAttribute("IRI", "#" . $type);
+                array_push($arrayOperations, "$elementName.$type");
+            }
+        }
+
+        $operation = $elementName ? $elementName : $type;
+
+
+        $relation = $newsXML->addChild("ObjectPropertyAssertion");
+        $op = $relation->addChild("ObjectProperty");
+        $op->addAttribute("IRI", "#" . $operation);
+        $name1 = $relation->addChild("NamedIndividual");
+        $name1->addAttribute("IRI", "#" . $sourceName);
+        $name2 = $relation->addChild("NamedIndividual");
+        $name2->addAttribute("IRI", "#" . $targetName);
+
+        if ($type == 'accesses' &&
+                !$hashAccessRelations[$sourceName][$targetName]) {
+
+            $relation = $newsXML->addChild("ObjectPropertyAssertion");
+            $op = $relation->addChild("ObjectProperty");
+            $op->addAttribute("IRI", "#Write");
+            $name1 = $relation->addChild("NamedIndividual");
+            $name1->addAttribute("IRI", "#" . $sourceName);
+            $name2 = $relation->addChild("NamedIndividual");
+            $name2->addAttribute("IRI", "#" . $targetName);
+        }
+    }
+}
+
+//path to output file
+//Format XML to save indented tree rather than one line
+$dom = new DOMDocument('1.0');
+$dom->preserveWhiteSpace = false;
+$dom->formatOutput = true;
+$dom->loadXML($newsXML->asXML());
+//echo $dom->saveXML();
+$dom->save('output.owl');
+
+function format_string($string) {
+
+    $elementName = str_replace(" ", "_", $string);
+    $elementName = str_replace("(", "-", $elementName);
+    $elementName = str_replace(")", "-", $elementName);
+    $elementName = str_replace("/", "_", $elementName);
+    return $elementName;
+}
+
+function getInput() {
+    fwrite(STDOUT, 'Type the .archimate file name:');
+    $input = fgets(STDIN);
+    return rtrim($input);
+}
+
+?>