]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java
XML data based schema and ontology generation
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / OntologyGenerator.java
index 74bafb99758af243ac12f8f0997ad0c5559ca6f8..aea2ff050d7fa2dceb39e8a84615b3eefe23d8d5 100644 (file)
@@ -3,6 +3,9 @@ package org.simantics.xml.sax;
 import java.io.FileNotFoundException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -86,6 +89,23 @@ public class OntologyGenerator implements SchemaConversionComponent {
                writer.println();
                writer.println();
                
+               Set<SchemaConverter> children = new HashSet<>();
+               Deque<SchemaConverter> stack = new ArrayDeque<>();
+               stack.addAll(converter.getSubConverters());
+               while (!stack.isEmpty()) {
+                       SchemaConverter sc = stack.pop();
+                       if (children.contains(sc))
+                               continue;
+                       children.add(sc);
+                       stack.addAll(sc.getSubConverters());
+               }
+               children.remove(converter);
+               for (SchemaConverter sc : children) {
+                       writer.println(sc.shortName + " = <" + sc.ontologyUri +">");
+               }
+               
+               writer.println();
+               
                ontRoot += ".";
                writer.println(ontRoot+"SimpleTypes : L0.Library");
                writer.println(ontRoot+"ComplexTypes : L0.Library");
@@ -93,6 +113,8 @@ public class OntologyGenerator implements SchemaConversionComponent {
                writer.println();
                writer.println(commentTag + " Interpreted from schema");
                writer.println();
+               
+               
                        
                base.handle(this);
        }
@@ -162,7 +184,7 @@ public class OntologyGenerator implements SchemaConversionComponent {
                        } else {
                                referenceType = element.getElement().getRef();
                                if (refName == null)
-                                       refName = referenceType.getLocalPart();
+                                       refName = base.getName(referenceType);
                        }
                        String type = base.getL0TypeFromPrimitiveType(referenceType);
                        SchemaObject obj = null;
@@ -219,7 +241,7 @@ public class OntologyGenerator implements SchemaConversionComponent {
                
        @Override
        public void handle(SchemaObject parent, Attribute attribute) {
-               String name = attribute.getName();
+               String name = base.getName(attribute);
                QName primitiveType = attribute.getType();
                LocalSimpleType simpleType = attribute.getSimpleType();
                QName ref = attribute.getRef();
@@ -233,8 +255,8 @@ public class OntologyGenerator implements SchemaConversionComponent {
                        relationType = "XML.hasAttribute";
                }
                else if (ref != null && parent != null) {
-                       relationName = getName(parent)+".has"+ref.getLocalPart();
-                       relationType = ontRoot+"has"+ref.getLocalPart();
+                       relationName = getName(parent)+".has"+base.getName(ref);
+                       relationType = converter.getShortName(ref.getNamespaceURI())+".has"+base.getName(ref);
                } else {
                        throw new RuntimeException();
                }
@@ -292,7 +314,7 @@ public class OntologyGenerator implements SchemaConversionComponent {
                if (parent == null) {
                        NamedAttributeGroup group = (NamedAttributeGroup)attributeGroup;
                        writer.println(ontRoot+getAttributeGroupPrefix()+group.getName()+ " <T XML.AttributeGroup");
-                       SchemaObject obj = new SchemaObject(parent,attributeGroup);
+                       SchemaObject obj = new SchemaObject(base,parent,attributeGroup);
                        for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
                                if (annotated instanceof Attribute) {
                                        //handle(getAttributeGroupPrefix()+group.getName(),(Attribute)annotated);
@@ -303,7 +325,7 @@ public class OntologyGenerator implements SchemaConversionComponent {
                                }
                        }
                } else {
-                       writer.println(getName(parent) +" L0.Inherits " + ontRoot + getAttributeGroupPrefix() + attributeGroup.getRef().getLocalPart());
+                       writer.println(getName(parent) +" L0.Inherits " + ontRoot + getAttributeGroupPrefix() + base.getName(attributeGroup.getRef()));
                }
                
        }
@@ -443,7 +465,7 @@ public class OntologyGenerator implements SchemaConversionComponent {
                Element element = elementObj.getElement();
                String name = getName(elementObj);//element.getName();
                
-               if ("Text".equals(name))
+               if (name.contains("Canvas"))
                        System.out.println();
                
                String type = "XML.Element";
@@ -459,16 +481,16 @@ public class OntologyGenerator implements SchemaConversionComponent {
                                        throw new RuntimeException("Cannot get L0 type for " + base.getLocalPart());
                                types.add(l0Type);
                        } else if (this.base.isElementRef(base.getLocalPart()))
-                               types.add(ontRoot+base.getLocalPart());
+                               types.add(ontRoot+this.base.getName(base));
                        else
-                               types.add(ontRoot+getComplexTypePrefix()+base.getLocalPart());
+                               types.add(ontRoot+getComplexTypePrefix()+this.base.getName(base));
                }
                QName substitution = element.getSubstitutionGroup();
                if (substitution != null) {
                        if (this.base.isElementRef(substitution.getLocalPart()))
-                               types.add(ontRoot+substitution.getLocalPart());
+                               types.add(ontRoot+this.base.getName(substitution));
                        else
-                               types.add( ontRoot+getComplexTypePrefix()+substitution.getLocalPart());
+                               types.add( ontRoot+getComplexTypePrefix()+this.base.getName(substitution));
                }
                for (String t : types) {
                        type += " <T " + t;
@@ -514,18 +536,23 @@ public class OntologyGenerator implements SchemaConversionComponent {
                throw new RuntimeException("ObjectType " + type + " has no base class");
        }
        
+       
        @Override
        public String getName(SchemaObject obj) {
                if (obj.getParent() == null) {
                        switch (obj.getType()) {
                        case COMPLEX_TYPE:
-                               return ontRoot+getComplexTypePrefix()+obj.getName();
+                               //return ontRoot+getComplexTypePrefix()+obj.getName();
+                               return obj.getLibShortName()+"."+getComplexTypePrefix()+obj.getName();
                        case ELEMENT:
-                               return ontRoot+obj.getName();
+                               //return ontRoot+obj.getName();
+                               return obj.getLibShortName()+"."+obj.getName();
                        case ATTRIBUTE_GROUP:
-                               return ontRoot+getAttributeGroupPrefix()+obj.getName();
+                               //return ontRoot+getAttributeGroupPrefix()+obj.getName();
+                               return obj.getLibShortName()+"."+getAttributeGroupPrefix()+obj.getName();
                        case SIMPLE_TYPE:
-                               return ontRoot+getSimpleTypePrefix()+obj.getName();
+                               //return ontRoot+getSimpleTypePrefix()+obj.getName();
+                               return obj.getLibShortName()+"."+getSimpleTypePrefix()+obj.getName();
                        }
                } else {
                        SchemaObject o = obj;
@@ -540,13 +567,17 @@ public class OntologyGenerator implements SchemaConversionComponent {
                        name = name.substring(0, name.length()-1);
                        switch (prev.getType()) {
                        case COMPLEX_TYPE:
-                               return ontRoot+getComplexTypePrefix()+name;
+                               //return ontRoot+getComplexTypePrefix()+name;
+                               return obj.getLibShortName()+"."+getComplexTypePrefix()+name;
                        case ELEMENT:
-                               return ontRoot+name;
+                               //return ontRoot+name;
+                               return obj.getLibShortName()+"."+name;
                        case ATTRIBUTE_GROUP:
-                               return ontRoot+getAttributeGroupPrefix()+name;
+                               //return ontRoot+getAttributeGroupPrefix()+name;
+                               return obj.getLibShortName()+"."+getAttributeGroupPrefix()+name;
                        case SIMPLE_TYPE:
-                               return ontRoot+getSimpleTypePrefix()+name;
+                               //return ontRoot+getSimpleTypePrefix()+name;
+                               return obj.getLibShortName()+"."+getSimpleTypePrefix()+name;
                        }
                }
                throw new RuntimeException();
@@ -556,7 +587,7 @@ public class OntologyGenerator implements SchemaConversionComponent {
        public String getName(SchemaObject parent, SchemaElement e, String rel) {
                QName ref = e.getElement().getRef();
                if (ref != null) {
-                       return converter.getShortName(ref.getNamespaceURI()) + rel + ref.getLocalPart();
+                       return converter.getShortName(ref.getNamespaceURI()) + rel + base.getName(ref);
                }
                else {
                        return getName(parent, "") + "." + rel + e.getElement().getName();
@@ -567,13 +598,13 @@ public class OntologyGenerator implements SchemaConversionComponent {
                if (obj.getParent() == null) {
                        switch (obj.getType()) {
                        case COMPLEX_TYPE:
-                               return ontRoot+getComplexTypePrefix()+rel+obj.getName();
+                               return obj.getLibShortName()+"."+getComplexTypePrefix()+rel+obj.getName();
                        case ELEMENT:
-                               return ontRoot+rel+obj.getName();
+                               return obj.getLibShortName()+"."+rel+obj.getName();
                        case ATTRIBUTE_GROUP:
-                               return ontRoot+getAttributeGroupPrefix()+rel+obj.getName();
+                               return obj.getLibShortName()+"."+getAttributeGroupPrefix()+rel+obj.getName();
                        case SIMPLE_TYPE:
-                               return ontRoot+getSimpleTypePrefix()+rel+obj.getName();
+                               return obj.getLibShortName()+"."+getSimpleTypePrefix()+rel+obj.getName();
                        }
                } else {
                        SchemaObject o = obj;
@@ -588,13 +619,13 @@ public class OntologyGenerator implements SchemaConversionComponent {
                        name = name.substring(0, name.length()-1);
                        switch (prev.getType()) {
                        case COMPLEX_TYPE:
-                               return ontRoot+getComplexTypePrefix()+rel+name;
+                               return obj.getLibShortName()+"."+getComplexTypePrefix()+rel+name;
                        case ELEMENT:
-                               return ontRoot+rel+name;
+                               return obj.getLibShortName()+"."+rel+name;
                        case ATTRIBUTE_GROUP:
-                               return ontRoot+getAttributeGroupPrefix()+rel+name;
+                               return obj.getLibShortName()+"."+getAttributeGroupPrefix()+rel+name;
                        case SIMPLE_TYPE:
-                               return ontRoot+getSimpleTypePrefix()+rel+name;
+                               return obj.getLibShortName()+"."+getSimpleTypePrefix()+rel+name;
                        }
                }
                throw new RuntimeException();