Skip to content

Instantly share code, notes, and snippets.

@ovace
Forked from nfigay/ExportToOWL.ajs
Created May 14, 2024 20:30
Show Gist options
  • Save ovace/74fb3fe7f23094ff1bc2fd05f8e0aed5 to your computer and use it in GitHub Desktop.
Save ovace/74fb3fe7f23094ff1bc2fd05f8e0aed5 to your computer and use it in GitHub Desktop.
This #jArchi script export the content of a selected model as an OWL2 file.
/*
* ArchiMate Model export as OWL2 file
* Author: Nicolas Figay 2021
* Version: 0.1
* This script creates a vis.js graph
*/
console.log("Export to Ontology Web Language");
load(__DIR__ + "lib/archimate.js");
var header='<?xml version="1.0"?>'
+'<rdf:RDF xmlns="http://www.plm-interop.net/archimate/'+model.name+'#"\n'
+' xml:base="http://www.plm-interop.net/archimate/'+model.name+'"\n'
+' xmlns:owl="http://www.w3.org/2002/07/owl#"\n'
+' xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\n'
+' xmlns:xml="http://www.w3.org/XML/1998/namespace"\n'
+' xmlns:xsd="http://www.w3.org/2001/XMLSchema#"\n'
+' xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"\n'
+' xmlns:basic="http://www.plm-interop.net/archimate/jarchi/basic/"\n'
+' xmlns:mymodel="http://www.plm-interop.net/archimate/'+model.name+'#">\n'
//+' <owl:Ontology rdf:about="http://www.plm-interop.net/archimate/'+model.name+'">\n'
//+' <owl:imports rdf:resource="http://www.plm-interop.net/archimate/jarchi/basic/3.1"/>\n'
//+' </owl:Ontology>\n'
;
var FileWriter=Java.type("java.io.FileWriter");
var fileName = window.promptSaveFile( { title: "Archi OWL export", filterExtensions: [ "*.owl" ], fileName: model.name + ".owl" } );
if(fileName) {
var fw = new FileWriter(fileName);
fw.write(header);
var elements=$("element");
elements.each(function(element){
var namedIndividual='<owl:NamedIndividual rdf:about="http://www.plm-interop.net/archimate/mymodel#'+element.id+'">\n'
+'<rdf:type rdf:resource="http://www.plm-interop.net/archimate/jarchi/basic/'+element.type+'"/>\n'
+'<basic:Documentation>' + element.documentation.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")+'</basic:Documentation>\n'
+'<basic:Name>'+ element.name.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") +'</basic:Name>\n' ;
fw.write(namedIndividual);
var label='<rdfs:label>'+ element.labelValue+'</rdfs:label>';
if (label.lenght > 0){fw.write(label);}
var labelExpression='<basic:labelExpression>'+ element.labelValue+'</rdfs:labelExpression>';
if (labelExpression.lenght > 0){fw.write(labelExpression);}
var properties=element.prop();
if (properties.length >0){
properties.forEach(function(propName){
element.prop(propName,true).forEach(function(propValue){
var propertyDefinition = '<basic:' + propName.replace(/\s/g,'') + '>' + propValue.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") +'</basic:'+propName.replace(/\s/g,'')+'>\n' ;
fw.write(propertyDefinition);
})})}
fw.write('</owl:NamedIndividual>\n\n');
$("#"+element.id).objectRefs().each(function(visualObject){
var namedIndividual='<owl:NamedIndividual rdf:about="http://www.plm-interop.net/archimate/mymodel#'+visualObject.id+'">\n'
+'<rdf:type rdf:resource="http://www.plm-interop.net/archimate/jarchi/basic/visual-object"/>\n';
fw.write(namedIndividual);
var label=visualObject.labelValue;
var naming='<basic:Name>'+ visualObject.name.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")+'</basic:Name>\n';
if (typeof label !== 'undefined'){
var naming='<rdfs:label>'+ label.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")+'</rdfs:label>\n';
}
fw.write(naming);
var conceptOP='<basic:concept rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+element.id+'"/>\n';
fw.write (conceptOP);
var definedInOP='<basic:definedIn rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+visualObject.view.id+'"/>\n';
fw.write (definedInOP);
fw.write('</owl:NamedIndividual>\n\n');
})
})
var relationships=$("relationship");
relationships.each(function(relationship){
var namedIndividual='<owl:NamedIndividual rdf:about="http://www.plm-interop.net/archimate/mymodel#'+relationship.id+'">\n'
+'<rdf:type rdf:resource="http://www.plm-interop.net/archimate/jarchi/basic/'+relationship.type+'"/>\n'
+'<basic:'+relationship.type+'-source rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+ relationship.source.id+'"/>\n'
+'<basic:'+relationship.type+'-target rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+ relationship.target.id+'"/>\n'
+'<basic:Documentation>' + relationship.documentation.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")+'</basic:Documentation>\n'
+'<basic:Name>'+ relationship.name.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") +'</basic:Name>\n' ;
fw.write(namedIndividual);
var label='<rdfs:label>'+ relationship.labelValue+'</rdfs:label>';
if (label.lenght > 0){fw.write(label);}
var labelExpression='<basic:labelExpression>'+ relationship.labelValue+'</rdfs:labelExpression>';
if (labelExpression.lenght > 0){fw.write(labelExpression);}
var properties=relationship.prop();
if (properties.length >0){
properties.forEach(function(propName){
relationship.prop(propName,true).forEach(function(propValue){
var propertyDefinition = '<basic:' + propName.replace(/\s/g,'') + '>' + propValue.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") +'</basic:'+propName.replace(/\s/g,'')+'>\n' ;
fw.write(propertyDefinition);
})})}
fw.write('</owl:NamedIndividual>\n');
})
arrayViewpoint=['application_cooperation','application_structure','application_usage','business_process_cooperation', 'capability','goal_realization','implementation_deployment','implementation_migration','information_structure','layered','migration','motivation','organization','outcome_realization','physical','product','project','requirements_realization','resource','service_realization','stakeholder','strategy','technology','technology_usage','value_stream'];
arrayViewpoint.forEach(function(viewpoint){
var viewpointDefinition = '<owl:NamedIndividual rdf:about="http://www.plm-interop.net/archimate/jarchi/viewpoint/'+viewpoint+'">\n'
+'<rdf:type rdf:resource="http://www.plm-interop.net/archimate/jarchi/basic/archimate3Viewpoint"/>\n'
+'</owl:NamedIndividual>\n';
fw.write(viewpointDefinition);
})
var views = $("archimate-diagram-model");
views.each(function(view){
var namedIndividual='<owl:NamedIndividual rdf:about="http://www.plm-interop.net/archimate/mymodel#'+view.id+'">\n'
+'<rdf:type rdf:resource="http://www.plm-interop.net/archimate/jarchi/basic/view"/>\n'
+'<basic:Documentation>' + view.documentation.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")+'</basic:Documentation>\n'
+'<basic:Name>'+ view.name.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") +'</basic:Name>\n';
fw.write(namedIndividual);
var viewpoint=view.viewpoint.id;
if (viewpoint.length >0) {
var viewpointDP='<basic:viewpoint>'+viewpoint+'</basic:viewpoint>\n';
//console.log (viewpointDP);
fw.write (viewpointDP);
var viewpointOP='<basic:hasViewpoint rdf:resource="http://www.plm-interop.net/archimate/jarchi/viewpoint/'+viewpoint+'"/>\n';
fw.write (viewpointOP);
}
fw.write ('</owl:NamedIndividual>\n');
did="#"+view.id;
$(did).find().filter('relationship').each(function(visualObject) {
var namedIndividual='<owl:NamedIndividual rdf:about="http://www.plm-interop.net/archimate/mymodel#'+visualObject.id+'">\n'
+'<rdf:type rdf:resource="http://www.plm-interop.net/archimate/jarchi/basic/visual-connection"/>\n';
fw.write(namedIndividual);
var label=visualObject.labelValue;
var naming='<basic:Name>'+ visualObject.name.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")+'</basic:Name>\n';
if (typeof label !== 'undefined'){
var naming='<rdfs:label>'+ label.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")+'</rdfs:label>\n';
}
fw.write(naming);
//rejouter la fonction permettant de retrouver element
var conceptOP='<basic:concept rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+visualObject.concept.id+'"/>\n';
fw.write (conceptOP);
var definedInOP='<basic:definedIn rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+visualObject.view.id+'"/>\n';
fw.write (definedInOP);
var source='<basic:'+visualObject.concept.type+'-source rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+ visualObject.source.id+'"/>\n';
fw.write(source);
var target='<basic:'+visualObject.concept.type+'-target rdf:resource="http://www.plm-interop.net/archimate/mymodel#'+ visualObject.target.id+'"/>\n';
fw.write(target);
fw.write('</owl:NamedIndividual>\n\n');
})
})
fw.write("</rdf:RDF>");
fw.close(); // forgetting to close it results in a truncated file
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment