X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.xml.sax%2Fsrc%2Forg%2Fsimantics%2Fxml%2Fsax%2FOntologyGenerator.java;h=3aea73436367a3ab596f94a5e9854f83c3bb8dc5;hb=HEAD;hp=6e4355876ff4c7f58e5a38162fdec8db4e3dac78;hpb=7f59891d2747280b09e77bc833bc70e05eece706;p=simantics%2Finterop.git diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java index 6e43558..3aea734 100644 --- a/org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java +++ b/org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java @@ -3,7 +3,9 @@ package org.simantics.xml.sax; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.ArrayList; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -12,7 +14,6 @@ import javax.xml.namespace.QName; import org.simantics.utils.datastructures.BijectionMap; import org.simantics.xml.sax.SchemaConversionBase.Inheritance; -import org.simantics.xml.sax.SchemaConversionBase.InheritanceType; import org.simantics.xml.sax.SchemaConversionBase.RefType; import org.simantics.xml.sax.SchemaObject.ObjectType; import org.simantics.xml.sax.configuration.AttributeComposition; @@ -25,7 +26,6 @@ import org.w3._2001.xmlschema.LocalComplexType; import org.w3._2001.xmlschema.LocalSimpleType; import org.w3._2001.xmlschema.NamedAttributeGroup; import org.w3._2001.xmlschema.NamedGroup; -import org.w3._2001.xmlschema.Restriction; import org.w3._2001.xmlschema.Schema; import org.w3._2001.xmlschema.SimpleType; @@ -89,32 +89,55 @@ public class OntologyGenerator implements SchemaConversionComponent { writer.println(); writer.println(); + Set children = new HashSet<>(); + Deque 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"); writer.println(ontRoot+"AttributeGroups : L0.Library"); writer.println(); writer.println(commentTag + " Interpreted from schema"); writer.println(); + + base.handle(this); } - protected String getType(QName qtype) { + protected String getType(QName qtype, String rel) { String ontType = base.getL0TypeFromPrimitiveType(qtype); if (ontType != null) return ontType; - else if (base.isComplexTypeRef(qtype.getLocalPart())) - return ontRoot+getComplexTypePrefix()+qtype.getLocalPart(); - else if (base.isSimpleTypeRef(qtype.getLocalPart())) - return ontRoot+qtype.getLocalPart(); - else if (base.isElementRef(qtype.getLocalPart())) - return ontRoot+qtype.getLocalPart(); - else if (qtype.getPrefix() != null && qtype.getPrefix().length() > 0) { - return ontRoot+qtype.getPrefix()+qtype.getLocalPart(); + else { + if (base.isComplexTypeRef(qtype.getLocalPart())) + return getName(base.getComplexType(qtype), rel); + else if (base.isSimpleTypeRef(qtype.getLocalPart())) + return getName(base.getSimpleType(qtype), rel); + else if (base.isElementRef(qtype.getLocalPart())) + return getName(base.getElement(qtype), rel); } throw new RuntimeException("Reference to unknown type " + qtype.getLocalPart()); } + public String getSimpleTypePrefix() { + return "SimpleTypes."; + } + public String getComplexTypePrefix() { return "ComplexTypes."; } @@ -123,7 +146,7 @@ public class OntologyGenerator implements SchemaConversionComponent { return "AttributeGroups."; } - public void handleChoice(SchemaObject parent, SchemaElement indicator, java.util.List elements, String name) { + public String handleChoice(SchemaObject parent, SchemaElement indicator, java.util.List elements, String name) { boolean single = true; for (SchemaElement e : elements) { if (e.getRestriction().many()) { @@ -133,70 +156,24 @@ public class OntologyGenerator implements SchemaConversionComponent { } String relationName = getName(parent)+".has"+name; writer.print(relationName); - - List types = new ArrayList(); - for (SchemaElement e : elements) { - Element localElement = e.getElement(); - QName refType = null; - String type = null; - - if (localElement.getName() != null) { - refType = localElement.getType(); - type = base.getL0TypeFromPrimitiveType(refType); - } else if (localElement.getRef() != null) { - refType = localElement.getRef(); - type = base.getL0TypeFromPrimitiveType(refType); - } - if (type == null) { - SchemaObject obj = base.getWithName(refType); - types.add(getName(obj,"has")); - } - } - if (types.size() > 0) { - for (String type : types) { - writer.print(" " + type); - } - } if (!single) { - writer.println(ontRoot+name+ "List " + ontRoot+name+"List"); + String elementListType = getName(parent) + "." + name + "_List"; + writer.println(elementListType + " " + elementListType); } + + return relationName; }; @Override - public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) { - if (refType != refType.Element) { + public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType, String baseRelationName) { + if (refType != RefType.Element) { QName referenceType = null; if (refType == RefType.Type) { referenceType = element.getElement().getType(); @@ -207,28 +184,30 @@ 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; if (type == null) { obj = base.getWithName(referenceType); - - writer.println(getName(parent)+".has"+refName + " " + getName(obj)); + writer.print(getName(parent)+".has"+refName + " " + getType(referenceType)); + writer.print(getName(parent)+".has"+refName + " " + getType(referenceType, "")); } if (base.useElementList(parent, indicator,element, refType == RefType.Reference, refName, referenceType)) { if (type == null) { writer.println(getName(parent)+"."+refName + "List " + getName(obj)); if (base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()))) { - writer.println(getName(parent)+"."+refName + "List " + ontType); } else if (primitiveType != null) { - writer.println(" " + ontType); } else { - String relationName = ontRoot+"has"+name; - if (parent != null) - relationName = getName(parent)+".has"+name; + QName base = this.base.getSimpleTypeBase(simpleType); + writer.println(getName(simpleTypeObj) + " " + inheritance.atomicType.l0Type); + writer.println(relationName+ " : L0.FunctionalRelation"); + writer.println(" --> " + getName(simpleTypeObj)); // Restriction restriction = simpleType.getRestriction(); // if (restriction != null) { @@ -444,13 +418,6 @@ public class OntologyGenerator implements SchemaConversionComponent { // if (topLevelComplexType.getName().equals("Reference")) // System.out.println(); - String relationName = getName(topLevelComplexType,"has");//ontRoot+"has"+name; - - writer.println(relationName+ " " + ontRoot+getComplexTypePrefix()+name); - writer.println(" --> " + name); - writer.println(); // String baseType = "XML.ComplexType"; // // QName base = getComplexTypeBase(topLevelComplexType.getComplexType()); @@ -465,11 +432,25 @@ public class OntologyGenerator implements SchemaConversionComponent { // writer.println(name+ " " + name); + writer.println(relationName+ "_List " + name + "_List"); + writer.println(); + + // Attributes // if (!baseType.equals(inheritance.baseClass)) // System.out.println(); //super.handleComplexType(topLevelComplexType); @@ -484,13 +465,13 @@ 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"; Set types = new LinkedHashSet(); if (element.getType() != null) { - types.add(getType(element.getType())); + types.add(getType(element.getType(), "")); } QName base = this.base.getElementBase(element); if (base != null) { @@ -500,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 += "