package org.simantics.xml.sax; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.LinkedHashSet; import java.util.List; 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.RefType; import org.simantics.xml.sax.SchemaObject.ObjectType; import org.simantics.xml.sax.configuration.AttributeComposition; import org.simantics.xml.sax.configuration.IDReference; import org.w3._2001.xmlschema.Annotated; import org.w3._2001.xmlschema.Attribute; import org.w3._2001.xmlschema.AttributeGroup; 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.NamedGroup; import org.w3._2001.xmlschema.Schema; import org.w3._2001.xmlschema.SimpleType; //public class OntologyGenerator extends SchemaConversionBase { public class OntologyGenerator implements SchemaConversionComponent { SchemaConversionBase base; 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 void createOntology() throws FileNotFoundException { StringWriter stringWriter = null; if (converter.getOntologyFile() == null) { stringWriter = new StringWriter(); writer = new PrintWriter(stringWriter); } else { writer = new PrintWriter(converter.getOntologyFile()); } handle(); writer.flush(); writer.close(); if (stringWriter != null) System.out.println(stringWriter.toString()); } 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(); if (converter.isPrimary()) { writer.println(ontRoot + " = <" + ontologyUri +"> : L0.Ontology"); writer.println(" @L0.new"); writer.println(" L0.HasResourceClass \"" + className +"\""); } else { writer.println(ontRoot + " = <" + ontologyUri +">"); } writer.println(); 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, String rel) { String ontType = base.getL0TypeFromPrimitiveType(qtype); if (ontType != null) return ontType; 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."; } public String getAttributeGroupPrefix() { return "AttributeGroups."; } public String 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; } } String relationName = getName(parent)+".has"+name; writer.print(relationName); writer.print(" " + elementListType); } return relationName; }; @Override 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(); //refName = element.getElement().getName() SchemaObject eObj = base.getElement(element.getElement());//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(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 element = (JAXBElement)facetWrap; // QName elementName = element.getName(); // Facet facet = (Facet)element.getValue(); // } } writer.println(relationName+ " " + ontType); } else if (primitiveType != null) { writer.println(" attributes) { Attribute compositionAttribute = new Attribute(); compositionAttribute.setName(composition.getName()); QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType()); compositionAttribute.setType(type); handle(parent, compositionAttribute); } @Override public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) { SimpleType simpleType = simpleTypeObj.getSimpleType(); String name = simpleType.getName(); org.w3._2001.xmlschema.List list = simpleType.getList(); if (list != null) { // TODO : process restriction in lists String relationName = getName(simpleTypeObj, "has"); writer.println(relationName+ " " + ontType); } else { QName base = this.base.getSimpleTypeBase(simpleType); writer.println(getName(simpleTypeObj) + " " + getName(simpleTypeObj)); // 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 public void handleComplexType(SchemaObject topLevelComplexType) { String name = getName(topLevelComplexType); // if (topLevelComplexType.getName().equals("Reference")) // System.out.println(); // 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+ " " + name); writer.println(relationName+ "_List " + name + "_List"); writer.println(); // Attributes // if (!baseType.equals(inheritance.baseClass)) // System.out.println(); //super.handleComplexType(topLevelComplexType); base.handleComplexTypeAttributes(topLevelComplexType); base.handleComplexTypeExtension(topLevelComplexType); base.handleExtensionAttributes(topLevelComplexType); writer.println(); } @Override public void handleElement(SchemaObject elementObj) { Element element = elementObj.getElement(); String name = getName(elementObj);//element.getName(); if ("Text".equals(name)) System.out.println(); String type = "XML.Element"; Set types = new LinkedHashSet(); if (element.getType() != null) { types.add(getType(element.getType(), "")); } QName base = this.base.getElementBase(element); if (base != null) { 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 (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 (this.base.isElementRef(substitution.getLocalPart())) types.add(ontRoot+substitution.getLocalPart()); else types.add( ontRoot+getComplexTypePrefix()+substitution.getLocalPart()); } for (String t : types) { type += " references = this.base.getIDReferences(element); for (IDReference ref : references) { writer.println(name+"."+ref.getReference().getName()+ "