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=f98a85f5673785e292347149b5865cde0454f392;hb=d788a05e77b983199f0982a0e56629e7fc30c691;hp=0b7aa3c00aefa89263005c0a2fd87bf2fd3f849a;hpb=bcfe73ff5f614ff83f20ce7bf5bfc0fa1b045978;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 0b7aa3c..f98a85f 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 @@ -11,8 +11,11 @@ import java.util.Set; 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; -import org.simantics.xml.sax.configuration.Configuration; import org.simantics.xml.sax.configuration.IDReference; import org.w3._2001.xmlschema.Annotated; import org.w3._2001.xmlschema.Attribute; @@ -21,51 +24,35 @@ import org.w3._2001.xmlschema.Element; import org.w3._2001.xmlschema.LocalComplexType; import org.w3._2001.xmlschema.LocalSimpleType; import org.w3._2001.xmlschema.NamedAttributeGroup; -import org.w3._2001.xmlschema.OpenAttrs; +import org.w3._2001.xmlschema.NamedGroup; import org.w3._2001.xmlschema.Restriction; import org.w3._2001.xmlschema.Schema; import org.w3._2001.xmlschema.SimpleType; -import org.w3._2001.xmlschema.TopLevelAttribute; -public class OntologyGenerator extends SchemaConversionBase { +//public class OntologyGenerator extends SchemaConversionBase { +public class OntologyGenerator implements SchemaConversionComponent { + SchemaConversionBase base; - public OntologyGenerator(Configuration configuration) { - super(configuration); + public OntologyGenerator(SchemaConverter converter, SchemaConversionBase base) { + this.base = base; + this.converter = converter; + this.schema = base.schema; + this.ontologyUri = base.ontologyURI; + this.className = base.className; } String ontRoot = "ONT."; String commentTag = "//"; Schema schema; - + String ontologyUri; String className; SchemaConverter converter; PrintWriter writer = null; - public String getClassName() { - return className; - } - - public void createOntology(Schema schema, SchemaConverter converter) throws FileNotFoundException { - this.schema = schema; - this.converter = converter; - -// for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) { -// if (attrs instanceof Annotation) { -// Annotation ann = (Annotation)attrs; -// for (Object o : ann.getAppinfoOrDocumentation()) { -// if (o instanceof Documentation) { -// Documentation doc = (Documentation)o; -// } else if (o instanceof Appinfo) { -// Appinfo info = (Appinfo)o; -// } -// } -// } -// } - - + public void createOntology() throws FileNotFoundException { StringWriter stringWriter = null; if (converter.getOntologyFile() == null) { stringWriter = new StringWriter(); @@ -74,7 +61,7 @@ public class OntologyGenerator extends SchemaConversionBase { writer = new PrintWriter(converter.getOntologyFile()); } - handle(schema); + handle(); writer.flush(); writer.close(); @@ -82,76 +69,41 @@ public class OntologyGenerator extends SchemaConversionBase { System.out.println(stringWriter.toString()); } - protected void handle(Schema schema) { - String ontologyName = schema.getTargetNamespace(); - if (ontologyName == null) { - ontologyName = converter.getSchemaFile().getName(); - - int index = ontologyName.lastIndexOf("."); - if (index > 0) - ontologyName = ontologyName.substring(0, index); - } - if (!ontologyName.startsWith("http")) - ontologyName = "http://" + ontologyName; - String parts[] = ontologyName.split("/"); - String name = parts[parts.length-1]; - ontRoot = name.substring(0, Math.min(3, name.length())).toUpperCase(); - String version = schema.getVersion(); - if (version == null) - version = "1.0"; - - name = name.replaceAll("\\.", "_"); - name = name.replaceAll(" ", "_"); - className = converter.getPluginName() + "." + name; - + protected void handle() { + ontRoot = converter.shortName; + for (String s : converter.getHeader()) { writer.println(commentTag + " " + s); } writer.println(); writer.println("L0 = "); + writer.println("XML = "); writer.println(); - writer.println(ontRoot + " = <" + ontologyName +"-"+ version+"> : L0.Ontology"); + writer.println(ontRoot + " = <" + ontologyUri +"> : L0.Ontology"); writer.println(" @L0.new"); writer.println(" L0.HasResourceClass \"" + className +"\""); writer.println(); writer.println(); ontRoot += "."; - // TODO : these could be created in separate base ontology. - writer.println(commentTag + " Built-in types"); - writer.println(); - writer.println(ontRoot+"XML : L0.Library"); - writer.println(ontRoot+"XML.hasAttribute L0.String"); - writer.println(ontRoot+"XML.ComplexType 0) { return ontRoot+qtype.getPrefix()+qtype.getLocalPart(); @@ -159,149 +111,151 @@ public class OntologyGenerator extends SchemaConversionBase { throw new RuntimeException("Reference to unknown type " + qtype.getLocalPart()); } - @Override - protected void handle(TopLevelAttribute topLevelAttribute) { - super.handle(topLevelAttribute); - writer.println(); - } - - @Override - protected void handleSimpleType(SchemaObject topLevelSimpleType) { - super.handleSimpleType(topLevelSimpleType); - writer.println(); - } - - - public static String getComplexTypePrefix() { + public String getComplexTypePrefix() { return "ComplexTypes."; } - public static String getAttributeGroupPrefix() { + public String getAttributeGroupPrefix() { return "AttributeGroups."; } - @Override - protected void handle(SchemaObject parent, SchemaElement indicator, List elements) { - if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) { - for (SchemaElement e : elements) { - handle(parent, indicator, e); + public void handleChoice(SchemaObject parent, SchemaElement indicator, java.util.List elements, String name) { + boolean single = true; + for (SchemaElement e : elements) { + if (e.getRestriction().many()) { + single = false; + break; } - } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) { - String name = getChoiceName(elements); - boolean single = true; - for (SchemaElement e : elements) { - if (e.getRestriction().many()) { - single = false; - break; - } - } - String relationName = ontRoot+getName(parent)+".has"+name; - writer.print(relationName); + } + 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; - 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 = getL0TypeFromPrimitiveType(refType); - } else if (localElement.getRef() != null) { - refType = localElement.getRef(); - type = getL0TypeFromPrimitiveType(refType); - } - if (type == null) { - SchemaObject obj = getWithName(parent, refType.getLocalPart()); - types.add(ontRoot+getName(obj,"has")); - } + if (localElement.getName() != null) { + refType = localElement.getType(); + type = base.getL0TypeFromPrimitiveType(refType); + } else if (localElement.getRef() != null) { + refType = localElement.getRef(); + type = base.getL0TypeFromPrimitiveType(refType); } - if (types.size() > 0) { - for (String type : types) { - writer.print(" 0) { + for (String type : types) { + writer.print(" " + type); - } + } else { + writer.print(" " + type); + } + } + if (!single) { + writer.println(ontRoot+name+ "List " + ontRoot+name+"List"); + writer.println(" : L0.FunctionalRelation"); } + writer.println(" --> " + ontRoot+name+"List"); } - - } + }; @Override - protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, QName refType) { - String type = getL0TypeFromPrimitiveType(refType); - SchemaObject obj = null; - if (type == null) { - obj = getWithName(parent, refType.getLocalPart()); + public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) { + if (refType != refType.Element) { + QName referenceType = null; + if (refType == RefType.Type) { + referenceType = element.getElement().getType(); + //refName = element.getElement().getName() + SchemaObject eObj = base.elements.get(element.getElement()); + if (refName == null) + refName = eObj.getName(); + } else { + referenceType = element.getElement().getRef(); + if (refName == null) + refName = referenceType.getLocalPart(); + } + String type = base.getL0TypeFromPrimitiveType(referenceType); + SchemaObject obj = null; + if (type == null) { + obj = base.getWithName(parent, referenceType.getLocalPart()); + + writer.println(getName(parent)+".has"+refName + " " + getName(obj)); + } else { + writer.println(getName(parent)+".has"+refName + " " + getType(referenceType)); + } - writer.println(ontRoot+getName(parent)+".has"+refName + " " + ontRoot+getName(obj)); + if (base.useElementList(parent, indicator,element, refType == RefType.Reference, refName, referenceType)) { + + if (type == null) { + writer.println(getName(parent)+"."+refName + "List " + getType(refType)); - } - - if (useElementList(parent, indicator,element, reference, refName, refType)) { + Element attrs = element.getElement(); + SchemaObject obj = base.getWithObj(parent, attrs); + if (refName == null) + refName = obj.getName(); - if (type == null) { - writer.println(ontRoot+getName(parent)+"."+refName + "List " + getName(obj)); + if (base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()))) { + writer.println(getName(parent)+"."+refName + "List " + ontRoot+getName(obj)); - if (useElementList(parent, indicator,element, reference, refName, new QName(obj.getName()))) { - writer.println(ontRoot+getName(parent)+"."+refName + "List element = (JAXBElement)facetWrap; @@ -361,7 +315,7 @@ public class OntologyGenerator extends SchemaConversionBase { } @Override - protected void handleAttributes(SchemaObject simpleTypeObj) { + public void handleAttributes(SchemaObject simpleTypeObj) { // SchemaObject parent = simpleTypeObj.getParent(); // SimpleType simpleType = simpleTypeObj.getSimpleType(); // Restriction restriction = simpleType.getRestriction(); @@ -370,115 +324,184 @@ public class OntologyGenerator extends SchemaConversionBase { } @Override - protected void handle(SchemaObject parent, AttributeGroup attributeGroup) { + public void handle(SchemaObject parent, AttributeGroup attributeGroup) { if (parent == null) { NamedAttributeGroup group = (NamedAttributeGroup)attributeGroup; - writer.println(ontRoot+getAttributeGroupPrefix()+group.getName()+ " attributes) { + public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap attributes) { Attribute compositionAttribute = new Attribute(); compositionAttribute.setName(composition.getName()); - QName type = new QName(CONVERSION_NS, composition.getType()); + QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType()); compositionAttribute.setType(type); handle(parent, compositionAttribute); } @Override - protected void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) { + public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) { SimpleType simpleType = simpleTypeObj.getSimpleType(); String name = simpleType.getName(); - Restriction restriction = simpleType.getRestriction(); - if (restriction == null || simpleType.getUnion() != null || simpleType.getId() != null) - throw new RuntimeException(); - QName base = restriction.getBase(); - String relationName = ontRoot+"has"+name; - if (parent != null) - relationName = ontRoot+getName(parent)+".has"+name; - - writer.println(relationName+ " " + ontType); + org.w3._2001.xmlschema.List list = simpleType.getList(); + if (list != null) { + // TODO : process restriction in lists + String relationName = ontRoot+"has"+name; + if (parent != null) + relationName = getName(parent)+".has"+name; + writer.println(relationName+ " " + ontType); + } else { + String relationName = ontRoot+"has"+name; + if (parent != null) + relationName = getName(parent)+".has"+name; + + writer.println(relationName+ " " + inheritance.atomicType.l0Type); + +// Restriction restriction = simpleType.getRestriction(); +// if (restriction != null) { +// +// QName base = restriction.getBase(); +// String ontType = getL0Type(base); +// writer.println(" --> " + ontType); +// } else if (simpleType.getId() != null) { +// throw new RuntimeException(simpleType.getName() + " restriction error"); +// } else if (simpleType.getUnion() != null) { +// Union union = simpleType.getUnion(); +// String ontType = null; +// if (union.getMemberTypes().size() > 0) { +// for (QName type : union.getMemberTypes()) { +// String sType = null; +// TypeEntry entry = getTypeEntry(type); +// if (entry == null) { +// SchemaObject obj = simpleTypeName.get(type.getLocalPart()); +// Inheritance inheritance = new Inheritance(""); +// getAtomicTypeInheritance(type, obj, inheritance); +// sType = inheritance.atomicType.l0Type; +// } else { +// sType = entry.l0Type; +// } +// if (ontType == null) +// ontType = sType; +// else if (!ontType.equals(sType)) +// throw new RuntimeException(simpleType.getName() + " union has incompatible member types"); +// } +// } else { +// if (union.getSimpleType().size() == 0) +// throw new RuntimeException(simpleType.getName() + " union error"); +// for (SimpleType s : union.getSimpleType()) { +// if (restriction == null) +// restriction = s.getRestriction(); +// else { +// Restriction r = s.getRestriction(); +// if (!r.getBase().equals(restriction.getBase())) +// throw new RuntimeException(simpleType.getName() + " union has incompatible restriction bases"); +// } +// } +// QName base = restriction.getBase(); +// ontType = getL0Type(base); +// } +// writer.println(" --> " + ontType); +// } else { +// throw new RuntimeException(simpleType.getName() + " restriction error"); +// } + + } } @Override - protected void handleComplexType(SchemaObject topLevelComplexType) { + public void handleComplexType(SchemaObject topLevelComplexType) { String name = getName(topLevelComplexType); - if (name.contains("Pcurve")) - System.out.println(); -// if (parent != null) -// name = parent +"_"+name; +// if (topLevelComplexType.getName().equals("Reference")) +// System.out.println(); - String relationName = ontRoot+getName(topLevelComplexType,"has");//ontRoot+"has"+name; + String relationName = getName(topLevelComplexType,"has");//ontRoot+"has"+name; - writer.println(relationName+ " " + ontRoot+getComplexTypePrefix()+name); - writer.println(" --> " + ontRoot+name); + writer.println(" --> " + name); writer.println(); - String baseType = ontRoot+"XML.ComplexType"; - - QName base = getComplexTypeBase(topLevelComplexType.getComplexType()); - if (base != null) { - baseType = getType(base); - } - base = getSimpleTypeBase(topLevelComplexType.getSimpleType()); - if (base != null) { - baseType = getType(base); +// String baseType = "XML.ComplexType"; +// +// QName base = getComplexTypeBase(topLevelComplexType.getComplexType()); +// if (base != null) { +// baseType = getType(base); +// } +// base = getSimpleTypeBase(topLevelComplexType.getSimpleType()); +// if (base != null) { +// baseType = getType(base); +// } + Inheritance inheritance = base.getInheritance(topLevelComplexType); + +// writer.println(name+ " types = new LinkedHashSet(); if (element.getType() != null) { types.add(getType(element.getType())); } - QName base = getElementBase(element); + QName base = this.base.getElementBase(element); if (base != null) { - if (base.getNamespaceURI().equals(SCHEMA_NS)) { - String l0Type = getL0Type(base); + if (base.getNamespaceURI().equals(SchemaConversionBase.SCHEMA_NS)) { + String l0Type = this.base.getL0Type(base); if (l0Type == null) throw new RuntimeException("Cannot get L0 type for " + base.getLocalPart()); types.add(l0Type); - } else if (isElementRef(base.getLocalPart())) + } else if (this.base.isElementRef(base.getLocalPart())) types.add(ontRoot+base.getLocalPart()); else types.add(ontRoot+getComplexTypePrefix()+base.getLocalPart()); } QName substitution = element.getSubstitutionGroup(); if (substitution != null) { - if (isElementRef(substitution.getLocalPart())) + if (this.base.isElementRef(substitution.getLocalPart())) types.add(ontRoot+substitution.getLocalPart()); else types.add( ontRoot+getComplexTypePrefix()+substitution.getLocalPart()); @@ -487,48 +510,58 @@ public class OntologyGenerator extends SchemaConversionBase { type += " references = getIDReferences(element); + List references = this.base.getIDReferences(element); for (IDReference ref : references) { - writer.println(ontRoot+name+"."+ref.getReference().getName()+ "