From 7f59891d2747280b09e77bc833bc70e05eece706 Mon Sep 17 00:00:00 2001 From: Marko Luukkainen Date: Mon, 20 Mar 2017 14:52:48 +0200 Subject: [PATCH] Dependency analysis for XML-schemas consisting of multiple files refs #6985 Change-Id: I4462e565f49233faee581bdbfe2529bc158255a7 --- .../simantics/xml/sax/ImporterGenerator.java | 1517 ++++----- .../simantics/xml/sax/OntologyGenerator.java | 1267 +++---- .../xml/sax/SchemaConversionBase.java | 2953 +++++++++-------- .../simantics/xml/sax/SchemaConverter.java | 665 ++-- 4 files changed, 3224 insertions(+), 3178 deletions(-) diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java index 3d137cf..f1076b8 100644 --- a/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java +++ b/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java @@ -1,758 +1,759 @@ -package org.simantics.xml.sax; - -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; - -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.SchemaConversionBase.TypeEntry; -import org.simantics.xml.sax.SchemaObject.ObjectType; -import org.simantics.xml.sax.configuration.AttributeComposition; -import org.simantics.xml.sax.configuration.IDProvider; -import org.simantics.xml.sax.configuration.IDReference; -import org.simantics.xml.sax.configuration.UnrecognizedChildElement; -import org.w3._2001.xmlschema.Annotated; -import org.w3._2001.xmlschema.Attribute; -import org.w3._2001.xmlschema.AttributeGroup; -import org.w3._2001.xmlschema.ComplexType; -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.Restriction; -import org.w3._2001.xmlschema.SimpleType; - -public class ImporterGenerator extends JavaGenerator{ - - public ImporterGenerator(SchemaConverter converter, SchemaConversionBase base) { - super(converter, base); - } - - public void createParser() throws IOException { - - String parserPackagePostfix = "_elem"; - String importerClassPostfix = "Importer"; - String parserClassPostfix = "Parser"; - elementPackageName = name+parserPackagePostfix; - - importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName); - if (!importParserDir.exists()) - importParserDir.mkdirs(); - - base.handle(this); - // Create Importer class - File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java"); - PrintWriter mainWriter = createFile(importerFile); - mainWriter.println("package " + converter.getPluginName() +";"); - mainWriter.println(); - mainWriter.println("import java.io.File;"); - mainWriter.println("import org.simantics.db.Session;"); - mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;"); - mainWriter.println(); - mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {"); - mainWriter.println(); - mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {"); - mainWriter.println(" super(session, file, new "+name + parserClassPostfix+"());"); - mainWriter.println(" }"); - mainWriter.println(); - mainWriter.println("}"); - - mainWriter.println(); - mainWriter.flush(); - mainWriter.close(); - - // Create Parser class - File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java"); - mainWriter = createFile(parserFile); - mainWriter.println("package " + converter.getPluginName() +";"); - mainWriter.println(); - mainWriter.println("import org.simantics.xml.sax.base.XMLParser;"); - mainWriter.println(); - mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {"); - mainWriter.println(); - mainWriter.println(" public " + name + parserClassPostfix+"() {"); - if (schema.getTargetNamespace() != null) - mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");"); - for (String s : ruleClassNames) { - mainWriter.println(" add(new "+s+"());"); - } - mainWriter.println(" }"); - mainWriter.println("}"); - - mainWriter.println(); - mainWriter.flush(); - mainWriter.close(); - } - - @Override - public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) { - } - - @Override - public void handle(SchemaObject parent, NamedGroup attribute) { - // TODO Auto-generated method stub - } - - @Override - public void handleComplexType(SchemaObject complexTypeObj) { - ComplexType topLevelComplexType = complexTypeObj.getComplexType(); - - String name = getName(complexTypeObj); - - //if (topLevelComplexType.getName().equals("LocalizedText")) - //if (topLevelComplexType.getName().equals("Reference")) -// if (topLevelComplexType.getName().equals("NodeIdAlias")) -// System.out.println(); - - String className = name;//"_"+name; - - FileWriter fw = new FileWriter(); - try { - fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java")); - } catch (IOException e) { - throw new RuntimeException(e); - } - writers.put(complexTypeObj, fw); - - Inheritance inheritance = this.base.getInheritance(complexTypeObj); - - provider = this.base.getIDProvider(topLevelComplexType); - List references = this.base.getIDReferences(topLevelComplexType); - UnrecognizedChildElement unknownChildElement = this.base.getUnknown(topLevelComplexType); - - List intrerfaces = new ArrayList(); - if (references.size() > 0) - intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser"); - if (unknownChildElement != null) - intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); - - createClassHeader(fw.writer, false); - writeClass(fw.writer,false, null, className, inheritance.baseClass, intrerfaces); - - writeIDProvider(fw.writer); - - fw.writer.println(" @Override"); - fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{"); - fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);"); - fw.writer.println(" "+getOntologyImport()); - fw.writer.println(" Resource res = graph.newResource();"); - fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");"); - fw.writer.println(" return res;"); - fw.writer.println(" }"); - fw.writer.println(); - - fw.writer.println(" @Override"); - fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{"); - fw.writer.println(" "+getOntologyImport()); - fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());"); - fw.writer.println(" return true;"); - fw.writer.println(" }"); - fw.writer.println(); - - StringWriter stringWriter = new StringWriter(); - fw.delayedWriter = new PrintWriter(stringWriter); - StringWriter stringWriter2 = new StringWriter(); - fw.delayedWriter2 = new PrintWriter(stringWriter2); - - fw.writer.println(" public " + className + "() {"); - fw.writer.println(" super();"); - - this.base.handleComplexTypeExtension(complexTypeObj); - - fw.writer.println(" }"); - - fw.writer.println(" @Override"); - fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{"); - fw.writer.println(" "+getOntologyImport()); - - if (stringWriter.getBuffer().length() > 0) { - fw.writer.write(stringWriter.toString()); - } - if (inheritance.type == InheritanceType.ComplexType) { - fw.writer.println(" return super.connectChild(graph,element,child);"); - }else{ - fw.writer.println(" return false;"); - } - fw.writer.println(" }"); - fw.writer.println(); - - if (stringWriter2.getBuffer().length() > 0) { - fw.writer.write(stringWriter2.toString()); - } - - stringWriter = null; - fw.delayedWriter.close(); - fw.delayedWriter=null; - stringWriter2 = null; - fw.delayedWriter2.close(); - fw.delayedWriter2 = null; - - fw.writer.println(" @Override"); - fw.writer.println(" public void configure(WriteGraph graph, Deque parents, ParserElement element) throws DatabaseException {"); - if (inheritance.type == InheritanceType.ComplexType) { - fw.writer.println(" super.configure(graph,parents,element);"); - } - fw.writer.println(" "+getOntologyImport()); - - this.base.handleComplexTypeAttributes(complexTypeObj); - this.base.handleExtensionAttributes(complexTypeObj); - - fw.writer.println(" }"); - - if (inheritance.type == InheritanceType.AtomicType) { - fw.writer.println(); - fw.writer.println(" @Override"); - fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {"); - fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");"); - fw.writer.println(" }"); - } - - writeIDReferences(fw.writer,name, references); - writeUnknownChild(fw.writer,name,unknownChildElement); - - fw.writer.println("}"); - fw.writer.println(); - fw.writer.flush(); - fw.writer.close(); - fw.writer = null; - writers.remove(complexTypeObj); - provider = null; - } - - @Override - public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) { - FileWriter fw = getWriter(parent); - if (referenceType == RefType.Type) { - // create internal class for handling the element and child attachment - secondaryClassName = getName(parent) +"_" +objectName; - fw.writer.println(" addParser(\""+ objectName +"\", "+secondaryClassName+".class);"); - fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{"); - fw.delayedWriter2.println(" public "+ secondaryClassName +"(){"); - fw.delayedWriter2.println(" }"); - fw.delayedWriter2.println(" }"); - } else { // referenceType == RefType.Reference - fw.writer.println(" addParser("+primaryClassName+".class);"); - if (!primaryClassName.equals(secondaryClassName)) - fw.writer.println(" addParser("+secondaryClassName+".class);"); - } - - fw.delayedWriter.println(" if (child.getElementParser() instanceof "+secondaryClassName+"){"); - fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());"); - if (useElementList) { - - // element type specific list - fw.delayedWriter.println(" {"); - fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);"); - fw.delayedWriter.println(" if (list == null) {"); - fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);"); - fw.delayedWriter.println(" } else {"); - fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" }"); - fw.delayedWriter.println(" }"); - } - if (useOriginalList) { - // generic list - fw.delayedWriter.println(" {"); - fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);"); - fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);"); - fw.delayedWriter.println(" if (list == null) {"); - fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);"); - fw.delayedWriter.println(" } else {"); - fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" }"); - fw.delayedWriter.println(" }"); - } - - fw.delayedWriter.println(" return true;"); - fw.delayedWriter.println(" }"); - } - - @Override - protected void createPrimitiveIndicator(SchemaObject parent, String refName, String binding) { - FileWriter fw = getWriter(parent); - fw.writer.println(" addParser(\""+ refName +"\", "+getName(parent) +"_" +refName+".class);"); - - fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementParser {"); - fw.delayedWriter2.println(" public "+ getName(parent) +"_" +refName +"(){"); - fw.delayedWriter2.println(" super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+binding+");"); - fw.delayedWriter2.println(" }"); - fw.delayedWriter2.println(" }"); - } - - @Override - protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) { - FileWriter fw = getWriter(parent); - //if (!reference) - fw.writer.println(" addParser(\""+ refName +"\", "+className+".class);"); -// else -// fw.writer.println(" addParser("+className+".class);"); - - fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){"); - fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());"); - if (useElementList) { - - // element type specific list - fw.delayedWriter.println(" {"); - fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);"); - fw.delayedWriter.println(" if (list == null) {"); - fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);"); - fw.delayedWriter.println(" } else {"); - fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" }"); - fw.delayedWriter.println(" }"); - } - if (useOriginalList) { - // generic list - fw.delayedWriter.println(" {"); - fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);"); - fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);"); - fw.delayedWriter.println(" if (list == null) {"); - fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);"); - fw.delayedWriter.println(" } else {"); - fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); - fw.delayedWriter.println(" }"); - fw.delayedWriter.println(" }"); - } - - fw.delayedWriter.println(" return true;"); - fw.delayedWriter.println(" }"); - } - - @Override - public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) { - // generates overriding method that allows parsing any element - FileWriter fw = getWriter(parent); - fw.delayedWriter2.println(" @Override"); - fw.delayedWriter2.println(" public Class getParser(java.util.Map parsers, ParserElement element, ParserElement child) {"); - fw.delayedWriter2.println(" Class parserClass = super.getParser(parsers, element, child);"); - fw.delayedWriter2.println(" if (parserClass != null) return parserClass;"); - fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());"); - fw.delayedWriter2.println(" if (parser != null) return parser.getClass();"); - fw.delayedWriter2.println(" return null;"); - fw.delayedWriter2.println(" }"); - } - - @Override - public void handle(SchemaObject parent, Attribute attribute) { - if (parent == null) - return; - String name = attribute.getName(); - QName primitiveType = attribute.getType(); - SimpleType simpleType = attribute.getSimpleType(); - QName ref = attribute.getRef(); - - String relationName; - String attrName; - if (name != null) { - attrName = name; - relationName = ontShort+"has"+name; - if (parent != null) - relationName = ontShort+getName(parent)+"_has"+name; - } - else if (ref != null && parent != null) { - attrName = ref.getLocalPart(); - relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart(); - - Attribute referred = this.base.getRefAttribute(ref); - if (referred != null) { - primitiveType = referred.getType(); - simpleType = referred.getSimpleType(); - } - - } else { - throw new RuntimeException(); - } - boolean isReference = false; - if (provider!= null && provider.getAttribute().getName().equals(attrName)) - isReference = true; - - FileWriter fw = getWriter(parent); - if (primitiveType != null) { - - //String binding = getBindingFromPrimitiveType(primitiveType); - TypeEntry binding = this.base.getTypeEntry(primitiveType); - - if (binding != null) { - writeAttribute(fw, attrName, relationName, binding, isReference); - return; - } else { - if (simpleType == null) { - SchemaObject simpleTypeObj = this.base.getSimpleType(primitiveType);//this.base.simpleTypeName.get(primitiveType.getLocalPart()); - if (simpleTypeObj != null) - simpleType = simpleTypeObj.getSimpleType(); - } - } - } - if (simpleType != null) { - org.w3._2001.xmlschema.List list = simpleType.getList(); - if (list != null) { - TypeEntry binding = this.base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string")); - writeAttribute(fw, attrName, relationName, binding, isReference); - } else { - Restriction restriction = simpleType.getRestriction(); - if (restriction == null) - throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset"); - QName base = restriction.getBase(); - - - //String binding = getBindingFromPrimitiveType(base); - TypeEntry binding = this.base.getTypeEntry(base); - writeAttribute(fw, attrName, relationName, binding, isReference); - } - } else { - // TODO : using default String attribute should be configured with rules. - //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()); - fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String"); - //writeAttribute(fw, attrName, relationName, "STRING", isReference); - writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference); - } - } - - private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) { - fw.writer.println(" {"); - fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");"); - fw.writer.println(" if (a != null) {"); - fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");"); - if (isReference) - fw.writer.println(" idProviderValue = a.getValue();"); - fw.writer.println(" }"); - fw.writer.println(" }"); - } - - @Override - public void handleAttributes(SchemaObject simpleTypeObj) { - SchemaObject parent = simpleTypeObj.getParent(); - FileWriter fw = getWriter(parent); - - SimpleType simpleType = simpleTypeObj.getSimpleType(); - Restriction restriction = simpleType.getRestriction(); - if (restriction == null) - throw new RuntimeException("Cannot resolve type for Element " + getName(parent)); - QName base = restriction.getBase(); - - - //String binding = getBindingFromPrimitiveType(base); - TypeEntry binding = this.base.getTypeEntry(base); - fw.writer.println(" @Override"); - fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {"); - //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");"); - fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");"); - fw.writer.println(" }"); - - } - - @Override - public void handle(SchemaObject parent, AttributeGroup attribute) { - if (parent != null) { - FileWriter fw = getWriter(parent); - NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef()); - fw.writer.println(commentTag+" AttributeGroup " + group.getName()); - SchemaObject obj = new SchemaObject(parent,attribute); - for (Annotated annotated : group.getAttributeOrAttributeGroup()) { - if (annotated instanceof Attribute) { - //handle("AttributeGroups_"+group.getName(),(Attribute)annotated); - handle(obj,(Attribute)annotated); - } else if (annotated instanceof AttributeGroup) { - //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated); - handle(obj,(AttributeGroup)annotated); - } - } - //dd - if(true) - System.out.println(); - fw.writer.println(commentTag+" End of AttributeGroup " + group.getName()); - } - - } - - @Override - public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap attributes) { - FileWriter fw = getWriter(parent); - QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType()); - String arrayBinding = this.base.getBindingFromPrimitiveType(type); - String javaType = this.base.getJavaTypeFromPrimitiveType(type); - String name = composition.getName(); - - String relationName; - if (name != null) { - relationName = ontShort+"has"+name; - if (parent != null) - relationName = ontShort+getName(parent)+"_has"+name; - } else { - throw new RuntimeException(); - } - - fw.writer.println(" {"); - int i = 0; - for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) - fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");"); - fw.writer.print (" "+javaType + " value = new "+javaType+"{"); - i = 0; - // FIXME : handle optional attributes properly. - for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) { - Attribute attribute = ((Attribute)attributes.getRight(a)); - //QName atype = getBaseType(attribute); - QName atype = this.base.getPrimitiveType(attribute); - String defaultValue = attribute.getDefault(); - if (defaultValue == null) - defaultValue = this.base.getDefaultValue(atype); - - //String binding = getBindingFromPrimitiveType(atype); - TypeEntry binding = this.base.getTypeEntry(atype); - if (i > 0) - fw.writer.print(","); - if (defaultValue != null) - fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue); - else - fw.writer.print(getValueGetterMethod(binding,"a"+(i++))); - } - fw.writer.println("};"); - fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");"); - fw.writer.println(" }"); - - } - - - - - - - - IDProvider provider; - @Override - public void handleElement(SchemaObject elementObj) { - Element element = elementObj.getElement(); - - String name = getName(elementObj);//topLevelElement.getName(); - String className = name; - - FileWriter fw = new FileWriter(); - try { - fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java")); - } catch (IOException e) { - throw new RuntimeException(e); - } - writers.put(elementObj, fw); - boolean isList = false; - - Inheritance inheritance = this.base.getInheritance(elementObj); - - provider = this.base.getIDProvider(element); - List references = this.base.getIDReferences(element); - UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element); - - List intrerfaces = new ArrayList(); - if (references.size() > 0) - intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser"); - if (unknownChildElement != null) - intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); - - createClassHeader(fw.writer, isList); - writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces); - writeIDProvider(fw.writer); - fw.writer.println(" @Override"); - fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{"); - fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);"); - fw.writer.println(" "+getOntologyImport()); - if (!isList) { - fw.writer.println(" Resource res = graph.newResource();"); - fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");"); - } else { - fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);"); - } - fw.writer.println(" return res;"); - fw.writer.println(" }"); - fw.writer.println(); - - fw.writer.println(" @Override"); - fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{"); - fw.writer.println(" "+getOntologyImport()); - fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());"); - fw.writer.println(" return true;"); - fw.writer.println(" }"); - fw.writer.println(); - - fw.writer.println(" @Override"); - fw.writer.println(" public void configure(WriteGraph graph, Deque parents, ParserElement element) throws DatabaseException {"); - if (inheritance.type == InheritanceType.ComplexType) { - fw.writer.println(" super.configure(graph,parents,element);"); - } - fw.writer.println(" "+getOntologyImport()); - - LocalComplexType complexType = element.getComplexType(); - LocalSimpleType simpleType = element.getSimpleType(); - - if (complexType != null) { - SchemaObject obj = this.base.getComplexType(complexType); - this.base.handleElementComplexTypeAttributes(obj); - } - fw.writer.println(" }"); - - if (inheritance.type == InheritanceType.AtomicType) { - fw.writer.println(); - fw.writer.println(" @Override"); - fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {"); - fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");"); - fw.writer.println(" }"); - } -// if (simpleType != null) { -// SchemaObject obj = simpleTypes.get(simpleType); -// handleElementSimpleTypeAttributes(obj); -// } - - - StringWriter stringWriter = new StringWriter(); - fw.delayedWriter = new PrintWriter(stringWriter); - StringWriter stringWriter2 = new StringWriter(); - fw.delayedWriter2 = new PrintWriter(stringWriter2); - - fw.writer.println(" public " + className + "() {"); - fw.writer.println(" super();"); - - if (complexType != null) { - SchemaObject obj = this.base.getComplexType(complexType); - this.base.handleComplexTypeExtension(obj); - } else if (simpleType != null) { - - } - - fw.writer.println(" }"); - - fw.writer.println(" @Override"); - fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{"); - fw.writer.println(" "+getOntologyImport()); - - if (stringWriter.getBuffer().length() > 0) { - fw.writer.write(stringWriter.toString()); - } - if (inheritance.type == InheritanceType.ComplexType) { - fw.writer.println(" return super.connectChild(graph,element,child);"); - } else { - fw.writer.println(" return false;"); - } - fw.writer.println(" }"); - fw.writer.println(); - - if (stringWriter2.getBuffer().length() > 0) { - fw.writer.write(stringWriter2.toString()); - } - - stringWriter = null; - fw.delayedWriter.close(); - fw.delayedWriter = null; - stringWriter2 = null; - fw.delayedWriter2.close(); - fw.delayedWriter2 = null; - - writeIDReferences(fw.writer,name, references); - writeUnknownChild(fw.writer,name,unknownChildElement); - - fw.writer.println("}"); - fw.writer.println(); - fw.writer.flush(); - fw.writer.close(); - fw.writer = null; - writers.remove(elementObj); - provider = null; - - ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name); - } - - - private void writeIDProvider(PrintWriter writer) { - if (provider != null) { - writer.println(" java.lang.String idProviderValue = null;"); - writer.println(); - writer.println(" @Override"); - writer.println(" public java.lang.String getID() {"); - writer.println(" java.lang.String s = idProviderValue;"); - writer.println(" idProviderValue = null;"); - writer.println(" return s;"); - writer.println(" }"); - writer.println(); - if (provider.getPriority() != null) { - writer.println(" @Override"); - writer.println(" public int idPriority() {"); - writer.println(" return " + provider.getPriority().intValue()+";"); - writer.println(" }"); - } - } - } - - private void writeIDReferences(PrintWriter writer,String name, List references) { - if (references.size() > 0) { - writer.println(" @Override"); - writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map map) throws DatabaseException {"); - writer.println(" "+getOntologyImport()); - writer.println(" boolean result = true;"); - for (IDReference ref : references) { - writer.println(" {"); - writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");"); - writer.println(" if (a != null) {"); - writer.println(" ParserElement refEle = map.get(a.value);"); - writer.println(" if (refEle != null) {"); - writer.println(" Resource ref = refEle.getData();"); - writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);"); - writer.println(" } else {"); - writer.println(" result = false;"); - writer.println(" }"); - writer.println(" }"); - writer.println(" }"); - } - writer.println(" return result;"); - writer.println(" }"); - writer.println(); - } - } - - private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) { - if (unknownChildElement == null) - return; - - writer.println(" @Override"); - writer.println(" public void configureChild(WriteGraph graph, Deque parents, ParserElement element, ParserElement child) throws DatabaseException {"); - writer.println(" " + unknownChildElement.getJavaMethod()); - writer.println(" }"); - writer.println(); - - } - - @Override - public String getBaseClass(ObjectType type) { - return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase"; - } - - protected void createClassHeader(PrintWriter writer, boolean isList) { - writer.println("package " + converter.getPluginName() +"."+elementPackageName+";"); - writer.println(); - writer.println("import java.util.Deque;"); - writer.println("import org.simantics.databoard.Bindings;"); - writer.println("import org.simantics.db.Resource;"); - writer.println("import org.simantics.db.WriteGraph;"); - writer.println("import org.simantics.db.exception.DatabaseException;"); - writer.println("import org.simantics.xml.sax.base.Attribute;"); - writer.println("import org.simantics.xml.sax.base.ParserElement;"); - writer.println("import org.simantics.xml.sax.ontology.XMLResource;"); - if (!isList) { - writer.println("import org.simantics.layer0.Layer0;"); - } else { - writer.println("import java.util.Collections;"); - writer.println("import org.simantics.db.common.utils.ListUtils;"); - } - writer.println(); - } - -} +package org.simantics.xml.sax; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +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.SchemaConversionBase.TypeEntry; +import org.simantics.xml.sax.SchemaObject.ObjectType; +import org.simantics.xml.sax.configuration.AttributeComposition; +import org.simantics.xml.sax.configuration.IDProvider; +import org.simantics.xml.sax.configuration.IDReference; +import org.simantics.xml.sax.configuration.UnrecognizedChildElement; +import org.w3._2001.xmlschema.Annotated; +import org.w3._2001.xmlschema.Attribute; +import org.w3._2001.xmlschema.AttributeGroup; +import org.w3._2001.xmlschema.ComplexType; +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.Restriction; +import org.w3._2001.xmlschema.SimpleType; + +public class ImporterGenerator extends JavaGenerator{ + + public ImporterGenerator(SchemaConverter converter, SchemaConversionBase base) { + super(converter, base); + } + + public void createParser() throws IOException { + + String parserPackagePostfix = "_elem"; + String importerClassPostfix = "Importer"; + String parserClassPostfix = "Parser"; + elementPackageName = name+parserPackagePostfix; + + importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName); + if (!importParserDir.exists()) + importParserDir.mkdirs(); + + base.handle(this); + // Create Importer class + File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java"); + PrintWriter mainWriter = createFile(importerFile); + mainWriter.println("package " + converter.getPluginName() +";"); + mainWriter.println(); + mainWriter.println("import java.io.File;"); + mainWriter.println("import org.simantics.db.Session;"); + mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;"); + mainWriter.println(); + mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {"); + mainWriter.println(); + mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {"); + mainWriter.println(" super(session, file, new "+name + parserClassPostfix+"());"); + mainWriter.println(" }"); + mainWriter.println(); + mainWriter.println("}"); + + mainWriter.println(); + mainWriter.flush(); + mainWriter.close(); + + // Create Parser class + File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java"); + mainWriter = createFile(parserFile); + mainWriter.println("package " + converter.getPluginName() +";"); + mainWriter.println(); + mainWriter.println("import org.simantics.xml.sax.base.XMLParser;"); + mainWriter.println(); + mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {"); + mainWriter.println(); + mainWriter.println(" public " + name + parserClassPostfix+"() {"); + if (schema.getTargetNamespace() != null) + mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");"); + for (String s : ruleClassNames) { + mainWriter.println(" add(new "+s+"());"); + } + mainWriter.println(" }"); + mainWriter.println("}"); + + mainWriter.println(); + mainWriter.flush(); + mainWriter.close(); + } + + @Override + public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) { + } + + @Override + public void handle(SchemaObject parent, NamedGroup attribute) { + // TODO Auto-generated method stub + } + + @Override + public void handleComplexType(SchemaObject complexTypeObj) { + ComplexType topLevelComplexType = complexTypeObj.getComplexType(); + + String name = getName(complexTypeObj); + + //if (topLevelComplexType.getName().equals("LocalizedText")) + //if (topLevelComplexType.getName().equals("Reference")) +// if (topLevelComplexType.getName().equals("NodeIdAlias")) +// System.out.println(); + + String className = name;//"_"+name; + + FileWriter fw = new FileWriter(); + try { + fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java")); + } catch (IOException e) { + throw new RuntimeException(e); + } + writers.put(complexTypeObj, fw); + + Inheritance inheritance = this.base.getInheritance(complexTypeObj); + + provider = this.base.getIDProvider(topLevelComplexType); + List references = this.base.getIDReferences(topLevelComplexType); + UnrecognizedChildElement unknownChildElement = this.base.getUnknown(topLevelComplexType); + + List intrerfaces = new ArrayList(); + if (references.size() > 0) + intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser"); + if (unknownChildElement != null) + intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); + + createClassHeader(fw.writer, false); + writeClass(fw.writer,false, null, className, inheritance.baseClass, intrerfaces); + + writeIDProvider(fw.writer); + + fw.writer.println(" @Override"); + fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{"); + fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);"); + fw.writer.println(" "+getOntologyImport()); + fw.writer.println(" Resource res = graph.newResource();"); + fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");"); + fw.writer.println(" return res;"); + fw.writer.println(" }"); + fw.writer.println(); + + fw.writer.println(" @Override"); + fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{"); + fw.writer.println(" "+getOntologyImport()); + fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());"); + fw.writer.println(" return true;"); + fw.writer.println(" }"); + fw.writer.println(); + + StringWriter stringWriter = new StringWriter(); + fw.delayedWriter = new PrintWriter(stringWriter); + StringWriter stringWriter2 = new StringWriter(); + fw.delayedWriter2 = new PrintWriter(stringWriter2); + + fw.writer.println(" public " + className + "() {"); + fw.writer.println(" super();"); + + this.base.handleComplexTypeExtension(complexTypeObj); + + fw.writer.println(" }"); + + fw.writer.println(" @Override"); + fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{"); + fw.writer.println(" "+getOntologyImport()); + + if (stringWriter.getBuffer().length() > 0) { + fw.writer.write(stringWriter.toString()); + } + if (inheritance.type == InheritanceType.ComplexType) { + fw.writer.println(" return super.connectChild(graph,element,child);"); + }else{ + fw.writer.println(" return false;"); + } + fw.writer.println(" }"); + fw.writer.println(); + + if (stringWriter2.getBuffer().length() > 0) { + fw.writer.write(stringWriter2.toString()); + } + + stringWriter = null; + fw.delayedWriter.close(); + fw.delayedWriter=null; + stringWriter2 = null; + fw.delayedWriter2.close(); + fw.delayedWriter2 = null; + + fw.writer.println(" @Override"); + fw.writer.println(" public void configure(WriteGraph graph, Deque parents, ParserElement element) throws DatabaseException {"); + if (inheritance.type == InheritanceType.ComplexType) { + fw.writer.println(" super.configure(graph,parents,element);"); + } + fw.writer.println(" "+getOntologyImport()); + + this.base.handleComplexTypeAttributes(complexTypeObj); + this.base.handleExtensionAttributes(complexTypeObj); + + fw.writer.println(" }"); + + if (inheritance.type == InheritanceType.AtomicType) { + fw.writer.println(); + fw.writer.println(" @Override"); + fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {"); + fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");"); + fw.writer.println(" }"); + } + + writeIDReferences(fw.writer,name, references); + writeUnknownChild(fw.writer,name,unknownChildElement); + + fw.writer.println("}"); + fw.writer.println(); + fw.writer.flush(); + fw.writer.close(); + fw.writer = null; + writers.remove(complexTypeObj); + provider = null; + } + + @Override + public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) { + FileWriter fw = getWriter(parent); + if (referenceType == RefType.Type) { + // create internal class for handling the element and child attachment + secondaryClassName = getName(parent) +"_" +objectName; + fw.writer.println(" addParser(\""+ objectName +"\", "+secondaryClassName+".class);"); + fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{"); + fw.delayedWriter2.println(" public "+ secondaryClassName +"(){"); + fw.delayedWriter2.println(" }"); + fw.delayedWriter2.println(" }"); + } else { // referenceType == RefType.Reference + fw.writer.println(" addParser("+primaryClassName+".class);"); + if (!primaryClassName.equals(secondaryClassName)) + fw.writer.println(" addParser("+secondaryClassName+".class);"); + } + + fw.delayedWriter.println(" if (child.getElementParser() instanceof "+secondaryClassName+"){"); + fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());"); + if (useElementList) { + + // element type specific list + fw.delayedWriter.println(" {"); + fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);"); + fw.delayedWriter.println(" if (list == null) {"); + fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);"); + fw.delayedWriter.println(" } else {"); + fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" }"); + fw.delayedWriter.println(" }"); + } + if (useOriginalList) { + // generic list + fw.delayedWriter.println(" {"); + fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);"); + fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);"); + fw.delayedWriter.println(" if (list == null) {"); + fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);"); + fw.delayedWriter.println(" } else {"); + fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" }"); + fw.delayedWriter.println(" }"); + } + + fw.delayedWriter.println(" return true;"); + fw.delayedWriter.println(" }"); + } + + @Override + protected void createPrimitiveIndicator(SchemaObject parent, String refName, String binding) { + FileWriter fw = getWriter(parent); + fw.writer.println(" addParser(\""+ refName +"\", "+getName(parent) +"_" +refName+".class);"); + + fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementParser {"); + fw.delayedWriter2.println(" public "+ getName(parent) +"_" +refName +"(){"); + fw.delayedWriter2.println(" super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+binding+");"); + fw.delayedWriter2.println(" }"); + fw.delayedWriter2.println(" }"); + } + + @Override + protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) { + FileWriter fw = getWriter(parent); + //if (!reference) + fw.writer.println(" addParser(\""+ refName +"\", "+className+".class);"); +// else +// fw.writer.println(" addParser("+className+".class);"); + + fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){"); + fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());"); + if (useElementList) { + + // element type specific list + fw.delayedWriter.println(" {"); + fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);"); + fw.delayedWriter.println(" if (list == null) {"); + fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);"); + fw.delayedWriter.println(" } else {"); + fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" }"); + fw.delayedWriter.println(" }"); + } + if (useOriginalList) { + // generic list + fw.delayedWriter.println(" {"); + fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);"); + fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);"); + fw.delayedWriter.println(" if (list == null) {"); + fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);"); + fw.delayedWriter.println(" } else {"); + fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));"); + fw.delayedWriter.println(" }"); + fw.delayedWriter.println(" }"); + } + + fw.delayedWriter.println(" return true;"); + fw.delayedWriter.println(" }"); + } + + @Override + public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) { + // generates overriding method that allows parsing any element + FileWriter fw = getWriter(parent); + fw.delayedWriter2.println(" @Override"); + fw.delayedWriter2.println(" public Class getParser(java.util.Map parsers, ParserElement element, ParserElement child) {"); + fw.delayedWriter2.println(" Class parserClass = super.getParser(parsers, element, child);"); + fw.delayedWriter2.println(" if (parserClass != null) return parserClass;"); + fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());"); + fw.delayedWriter2.println(" if (parser != null) return parser.getClass();"); + fw.delayedWriter2.println(" return null;"); + fw.delayedWriter2.println(" }"); + } + + @Override + public void handle(SchemaObject parent, Attribute attribute) { + if (parent == null) + return; + String name = attribute.getName(); + QName primitiveType = attribute.getType(); + SimpleType simpleType = attribute.getSimpleType(); + QName ref = attribute.getRef(); + + String relationName; + String attrName; + if (name != null) { + attrName = name; + relationName = ontShort+"has"+name; + if (parent != null) + relationName = ontShort+getName(parent)+"_has"+name; + } + else if (ref != null && parent != null) { + attrName = ref.getLocalPart(); + relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart(); + + Attribute referred = this.base.getRefAttribute(ref); + if (referred != null) { + primitiveType = referred.getType(); + simpleType = referred.getSimpleType(); + } + + } else { + throw new RuntimeException(); + } + boolean isReference = false; + if (provider!= null && provider.getAttribute().getName().equals(attrName)) + isReference = true; + + FileWriter fw = getWriter(parent); + if (primitiveType != null) { + + //String binding = getBindingFromPrimitiveType(primitiveType); + TypeEntry binding = this.base.getTypeEntry(primitiveType); + + if (binding != null) { + writeAttribute(fw, attrName, relationName, binding, isReference); + return; + } else { + if (simpleType == null) { + SchemaObject simpleTypeObj = this.base.getSimpleType(primitiveType);//this.base.simpleTypeName.get(primitiveType.getLocalPart()); + if (simpleTypeObj != null) + simpleType = simpleTypeObj.getSimpleType(); + } + } + } + if (simpleType != null) { + org.w3._2001.xmlschema.List list = simpleType.getList(); + if (list != null) { + TypeEntry binding = this.base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string")); + writeAttribute(fw, attrName, relationName, binding, isReference); + } else { +// Restriction restriction = simpleType.getRestriction(); +// if (restriction == null) +// throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset"); +// QName base = restriction.getBase(); + QName base = this.base.getSimpleTypeBase(simpleType); + + + //String binding = getBindingFromPrimitiveType(base); + TypeEntry binding = this.base.getTypeEntry(base); + writeAttribute(fw, attrName, relationName, binding, isReference); + } + } else { + // TODO : using default String attribute should be configured with rules. + //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()); + fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String"); + //writeAttribute(fw, attrName, relationName, "STRING", isReference); + writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference); + } + } + + private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) { + fw.writer.println(" {"); + fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");"); + fw.writer.println(" if (a != null) {"); + fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");"); + if (isReference) + fw.writer.println(" idProviderValue = a.getValue();"); + fw.writer.println(" }"); + fw.writer.println(" }"); + } + + @Override + public void handleAttributes(SchemaObject simpleTypeObj) { + SchemaObject parent = simpleTypeObj.getParent(); + FileWriter fw = getWriter(parent); + + SimpleType simpleType = simpleTypeObj.getSimpleType(); + Restriction restriction = simpleType.getRestriction(); + if (restriction == null) + throw new RuntimeException("Cannot resolve type for Element " + getName(parent)); + QName base = restriction.getBase(); + + + //String binding = getBindingFromPrimitiveType(base); + TypeEntry binding = this.base.getTypeEntry(base); + fw.writer.println(" @Override"); + fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {"); + //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");"); + fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");"); + fw.writer.println(" }"); + + } + + @Override + public void handle(SchemaObject parent, AttributeGroup attribute) { + if (parent != null) { + FileWriter fw = getWriter(parent); + NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef()); + fw.writer.println(commentTag+" AttributeGroup " + group.getName()); + SchemaObject obj = new SchemaObject(parent,attribute); + for (Annotated annotated : group.getAttributeOrAttributeGroup()) { + if (annotated instanceof Attribute) { + //handle("AttributeGroups_"+group.getName(),(Attribute)annotated); + handle(obj,(Attribute)annotated); + } else if (annotated instanceof AttributeGroup) { + //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated); + handle(obj,(AttributeGroup)annotated); + } + } + //dd + if(true) + System.out.println(); + fw.writer.println(commentTag+" End of AttributeGroup " + group.getName()); + } + + } + + @Override + public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap attributes) { + FileWriter fw = getWriter(parent); + QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType()); + String arrayBinding = this.base.getBindingFromPrimitiveType(type); + String javaType = this.base.getJavaTypeFromPrimitiveType(type); + String name = composition.getName(); + + String relationName; + if (name != null) { + relationName = ontShort+"has"+name; + if (parent != null) + relationName = ontShort+getName(parent)+"_has"+name; + } else { + throw new RuntimeException(); + } + + fw.writer.println(" {"); + int i = 0; + for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) + fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");"); + fw.writer.print (" "+javaType + " value = new "+javaType+"{"); + i = 0; + // FIXME : handle optional attributes properly. + for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) { + Attribute attribute = ((Attribute)attributes.getRight(a)); + //QName atype = getBaseType(attribute); + QName atype = this.base.getPrimitiveType(attribute); + String defaultValue = attribute.getDefault(); + if (defaultValue == null) + defaultValue = this.base.getDefaultValue(atype); + + //String binding = getBindingFromPrimitiveType(atype); + TypeEntry binding = this.base.getTypeEntry(atype); + if (i > 0) + fw.writer.print(","); + if (defaultValue != null) + fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue); + else + fw.writer.print(getValueGetterMethod(binding,"a"+(i++))); + } + fw.writer.println("};"); + fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");"); + fw.writer.println(" }"); + + } + + + + + + + + IDProvider provider; + @Override + public void handleElement(SchemaObject elementObj) { + Element element = elementObj.getElement(); + + String name = getName(elementObj);//topLevelElement.getName(); + String className = name; + + FileWriter fw = new FileWriter(); + try { + fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java")); + } catch (IOException e) { + throw new RuntimeException(e); + } + writers.put(elementObj, fw); + boolean isList = false; + + Inheritance inheritance = this.base.getInheritance(elementObj); + + provider = this.base.getIDProvider(element); + List references = this.base.getIDReferences(element); + UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element); + + List intrerfaces = new ArrayList(); + if (references.size() > 0) + intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser"); + if (unknownChildElement != null) + intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); + + createClassHeader(fw.writer, isList); + writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces); + writeIDProvider(fw.writer); + fw.writer.println(" @Override"); + fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{"); + fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);"); + fw.writer.println(" "+getOntologyImport()); + if (!isList) { + fw.writer.println(" Resource res = graph.newResource();"); + fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");"); + } else { + fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);"); + } + fw.writer.println(" return res;"); + fw.writer.println(" }"); + fw.writer.println(); + + fw.writer.println(" @Override"); + fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{"); + fw.writer.println(" "+getOntologyImport()); + fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());"); + fw.writer.println(" return true;"); + fw.writer.println(" }"); + fw.writer.println(); + + fw.writer.println(" @Override"); + fw.writer.println(" public void configure(WriteGraph graph, Deque parents, ParserElement element) throws DatabaseException {"); + if (inheritance.type == InheritanceType.ComplexType) { + fw.writer.println(" super.configure(graph,parents,element);"); + } + fw.writer.println(" "+getOntologyImport()); + + LocalComplexType complexType = element.getComplexType(); + LocalSimpleType simpleType = element.getSimpleType(); + + if (complexType != null) { + SchemaObject obj = this.base.getComplexType(complexType); + this.base.handleElementComplexTypeAttributes(obj); + } + fw.writer.println(" }"); + + if (inheritance.type == InheritanceType.AtomicType) { + fw.writer.println(); + fw.writer.println(" @Override"); + fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {"); + fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");"); + fw.writer.println(" }"); + } +// if (simpleType != null) { +// SchemaObject obj = simpleTypes.get(simpleType); +// handleElementSimpleTypeAttributes(obj); +// } + + + StringWriter stringWriter = new StringWriter(); + fw.delayedWriter = new PrintWriter(stringWriter); + StringWriter stringWriter2 = new StringWriter(); + fw.delayedWriter2 = new PrintWriter(stringWriter2); + + fw.writer.println(" public " + className + "() {"); + fw.writer.println(" super();"); + + if (complexType != null) { + SchemaObject obj = this.base.getComplexType(complexType); + this.base.handleComplexTypeExtension(obj); + } else if (simpleType != null) { + + } + + fw.writer.println(" }"); + + fw.writer.println(" @Override"); + fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{"); + fw.writer.println(" "+getOntologyImport()); + + if (stringWriter.getBuffer().length() > 0) { + fw.writer.write(stringWriter.toString()); + } + if (inheritance.type == InheritanceType.ComplexType) { + fw.writer.println(" return super.connectChild(graph,element,child);"); + } else { + fw.writer.println(" return false;"); + } + fw.writer.println(" }"); + fw.writer.println(); + + if (stringWriter2.getBuffer().length() > 0) { + fw.writer.write(stringWriter2.toString()); + } + + stringWriter = null; + fw.delayedWriter.close(); + fw.delayedWriter = null; + stringWriter2 = null; + fw.delayedWriter2.close(); + fw.delayedWriter2 = null; + + writeIDReferences(fw.writer,name, references); + writeUnknownChild(fw.writer,name,unknownChildElement); + + fw.writer.println("}"); + fw.writer.println(); + fw.writer.flush(); + fw.writer.close(); + fw.writer = null; + writers.remove(elementObj); + provider = null; + + ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name); + } + + + private void writeIDProvider(PrintWriter writer) { + if (provider != null) { + writer.println(" java.lang.String idProviderValue = null;"); + writer.println(); + writer.println(" @Override"); + writer.println(" public java.lang.String getID() {"); + writer.println(" java.lang.String s = idProviderValue;"); + writer.println(" idProviderValue = null;"); + writer.println(" return s;"); + writer.println(" }"); + writer.println(); + if (provider.getPriority() != null) { + writer.println(" @Override"); + writer.println(" public int idPriority() {"); + writer.println(" return " + provider.getPriority().intValue()+";"); + writer.println(" }"); + } + } + } + + private void writeIDReferences(PrintWriter writer,String name, List references) { + if (references.size() > 0) { + writer.println(" @Override"); + writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map map) throws DatabaseException {"); + writer.println(" "+getOntologyImport()); + writer.println(" boolean result = true;"); + for (IDReference ref : references) { + writer.println(" {"); + writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");"); + writer.println(" if (a != null) {"); + writer.println(" ParserElement refEle = map.get(a.value);"); + writer.println(" if (refEle != null) {"); + writer.println(" Resource ref = refEle.getData();"); + writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);"); + writer.println(" } else {"); + writer.println(" result = false;"); + writer.println(" }"); + writer.println(" }"); + writer.println(" }"); + } + writer.println(" return result;"); + writer.println(" }"); + writer.println(); + } + } + + private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) { + if (unknownChildElement == null) + return; + + writer.println(" @Override"); + writer.println(" public void configureChild(WriteGraph graph, Deque parents, ParserElement element, ParserElement child) throws DatabaseException {"); + writer.println(" " + unknownChildElement.getJavaMethod()); + writer.println(" }"); + writer.println(); + + } + + @Override + public String getBaseClass(ObjectType type) { + return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase"; + } + + protected void createClassHeader(PrintWriter writer, boolean isList) { + writer.println("package " + converter.getPluginName() +"."+elementPackageName+";"); + writer.println(); + writer.println("import java.util.Deque;"); + writer.println("import org.simantics.databoard.Bindings;"); + writer.println("import org.simantics.db.Resource;"); + writer.println("import org.simantics.db.WriteGraph;"); + writer.println("import org.simantics.db.exception.DatabaseException;"); + writer.println("import org.simantics.xml.sax.base.Attribute;"); + writer.println("import org.simantics.xml.sax.base.ParserElement;"); + writer.println("import org.simantics.xml.sax.ontology.XMLResource;"); + if (!isList) { + writer.println("import org.simantics.layer0.Layer0;"); + } else { + writer.println("import java.util.Collections;"); + writer.println("import org.simantics.db.common.utils.ListUtils;"); + } + writer.println(); + } + +} 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 2de5908..6e43558 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 @@ -1,631 +1,636 @@ -package org.simantics.xml.sax; - -import java.io.FileNotFoundException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -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.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.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.Restriction; -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(); - writer.println(ontRoot + " = <" + ontologyUri +"> : L0.Ontology"); - writer.println(" @L0.new"); - writer.println(" L0.HasResourceClass \"" + className +"\""); - writer.println(); - writer.println(); - - ontRoot += "."; - 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 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(); - } - throw new RuntimeException("Reference to unknown type " + qtype.getLocalPart()); - } - - public String getComplexTypePrefix() { - return "ComplexTypes."; - } - - public String getAttributeGroupPrefix() { - return "AttributeGroups."; - } - - 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; - } - } - 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"); - } - }; - - - - @Override - 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.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.println(getName(parent)+".has"+refName + " " + getName(obj)); - } else { - writer.println(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 = 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 - public void handleComplexType(SchemaObject topLevelComplexType) { - String name = getName(topLevelComplexType); -// 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()); -// 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 = 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()+ " "); + 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+"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 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(); + } + throw new RuntimeException("Reference to unknown type " + qtype.getLocalPart()); + } + + public String getComplexTypePrefix() { + return "ComplexTypes."; + } + + public String getAttributeGroupPrefix() { + return "AttributeGroups."; + } + + 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; + } + } + 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"); + } + }; + + + + @Override + 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.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.println(getName(parent)+".has"+refName + " " + getName(obj)); + } else { + writer.println(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 = 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 + public void handleComplexType(SchemaObject topLevelComplexType) { + String name = getName(topLevelComplexType); +// 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()); +// 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 = 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()+ " > typeMap; - - protected String ontologyURI; - protected String className; - - public SchemaConversionBase(SchemaConverter converter, String ontologyUri, String className) { - this.converter = converter; - this.configuration = converter.getConfiguration(); - this.ontologyURI = ontologyUri; - this.className = className; - - initTypes(); - } - - protected void initTypes() { - typeMap = new HashMap>(); - Map schemaTypes = new HashMap(); - typeMap.put(SCHEMA_NS, schemaTypes); - Map l0Types = new HashMap(); - typeMap.put(CONVERSION_NS, l0Types); - - schemaTypes.put("string", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); - schemaTypes.put("NMTOKEN", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); - schemaTypes.put("token", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); - schemaTypes.put("ID", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","",true)); - schemaTypes.put("IDREF", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); - schemaTypes.put("Name", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); - schemaTypes.put("NCName", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); - schemaTypes.put("date", new TypeEntry("XML.Date", "org.simantics.xml.sax.base.datatypes.literal.Date.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Date", "","org.simantics.xml.sax.base.datatypes.literal.Date.parseDate(",")","(",").toString()")); - schemaTypes.put("time", new TypeEntry("XML.Time", "org.simantics.xml.sax.base.datatypes.literal.Time.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Time", "","org.simantics.xml.sax.base.datatypes.literal.Time.parseTime(",")","(",").toString()")); - schemaTypes.put("dateTime", new TypeEntry("XML.DateTime", "org.simantics.xml.sax.base.datatypes.literal.DateTime.BINDING", "org.simantics.xml.sax.base.datatypes.literal.DateTime", "","org.simantics.xml.sax.base.datatypes.literal.DateTime.parseDateTime(",")","(",").toString()")); - schemaTypes.put("anyURI", new TypeEntry("L0.URI", "Bindings.STRING", "java.lang.String", "","","","","")); - schemaTypes.put("double", new TypeEntry("L0.Double", "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")")); - schemaTypes.put("float", new TypeEntry("L0.Float", "Bindings.FLOAT", "float", "java.lang.Float.NaN","java.lang.Float.parseFloat(",")","java.lang.Float.toString(",")")); - schemaTypes.put("decimal", new TypeEntry("L0.Double", "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")")); - schemaTypes.put("boolean", new TypeEntry("L0.Boolean", "Bindings.BOOLEAN", "boolean", "false","java.lang.Boolean.parseBoolean(",")","java.lang.Boolean.toString(",")")); - schemaTypes.put("integer", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("positiveInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("nonPositiveInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("nonNegativeInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("negativeInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("unsignedInt", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("int", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("short", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("unsignedShort",new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); - schemaTypes.put("byte", new TypeEntry("L0.Byte", "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")")); - schemaTypes.put("unsignedByte", new TypeEntry("L0.Byte", "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")")); - schemaTypes.put("long", new TypeEntry("L0.Long", "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")")); - schemaTypes.put("unsignedLong", new TypeEntry("L0.Long", "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")")); - schemaTypes.put("base64Binary", new TypeEntry("L0.ByteArray", "Bindings.BYTE_ARRAY", "byte[]", "new byte[0]","",".getBytes(org.simantics.databoard.util.binary.UTF8.CHARSET)","new java.lang.String(",", org.simantics.databoard.util.binary.UTF8.CHARSET)")); - - l0Types.put("doubleArray", new TypeEntry("L0.DoubleArray", "Bindings.DOUBLE_ARRAY", "double[]", null,null,null,"java.lang.Double.toString(",")")); - l0Types.put("stringArray", new TypeEntry("L0.StringArray", "Bindings.STRING_ARRAY", "string[]", null,null,null,"","")); - } - - protected TypeEntry getTypeEntry(QName type) { - Map types = typeMap.get(type.getNamespaceURI()); - if (types == null) - return null; - TypeEntry entry = types.get(type.getLocalPart()); - return entry; - } - protected TypeEntry getTypeEntry(String type) { - for (Map types : typeMap.values()) { - TypeEntry entry = types.get(type); - if (entry != null) - return entry; - } - return null; - } - - protected String getL0TypeFromPrimitiveType(QName primitiveType) { - TypeEntry entry = getTypeEntry(primitiveType); - if (entry == null) - return null; - return entry.l0Type; - } - - protected String getL0Type(QName primitiveType) { - String type = getL0TypeFromPrimitiveType(primitiveType); - if (type != null) - return type; - SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart()); - if (simpleTypeObj == null) - return null; - SimpleType simpleType = simpleTypeObj.getSimpleType(); - while (simpleType != null) { - QName base = simpleType.getRestriction().getBase(); - if (base != null) - return getL0Type(base); - simpleType = simpleType.getRestriction().getSimpleType(); - } - return null; - } - - protected String getBindingFromPrimitiveType(QName primitiveType) { - TypeEntry entry = getTypeEntry(primitiveType); - if (entry == null) - return null; - return entry.binding; - } - - protected String getJavaTypeFromPrimitiveType(QName primitiveType) { - TypeEntry entry = getTypeEntry(primitiveType); - if (entry == null) - return null; - return entry.javaType; - } - - - public void init(Schema schema) { - this.schema = schema; - - preload(); - } - - public void handle(SchemaConversionComponent component) { - this.component = component; - for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { - if (attrs instanceof TopLevelAttribute) { - handle((TopLevelAttribute)attrs); - - } else if (attrs instanceof TopLevelComplexType) { - handleComplexType(complexTypes.get(attrs)); - } else if (attrs instanceof TopLevelElement) { - handleElement(elements.get(attrs)); - } else if (attrs instanceof TopLevelSimpleType) { - handleSimpleType(simpleTypes.get(attrs)); - } else if (attrs instanceof NamedAttributeGroup) { - handle((NamedAttributeGroup)attrs); - } else if (attrs instanceof NamedGroup) { - handle((NamedGroup)attrs); - } else { - System.out.println(attrs.getClass().getName()); - } - } - } - - private Map elementName = new HashMap<>(); - private Map complexTypeName = new HashMap<>(); - private Map simpleTypeName = new HashMap<>(); - private Map modelGroupName = new HashMap<>(); - private Map elements = new HashMap<>(); - private Map complexTypes = new HashMap<>(); - private Map simpleTypes = new HashMap<>(); - private Map modelGroups = new HashMap<>(); - - private SchemaObject _getWithName(QName name) { - SchemaObject obj = elementName.get(name.getLocalPart()); - if (obj == null) - obj = complexTypeName.get(name.getLocalPart()); - if (obj == null) - obj = simpleTypeName.get(name.getLocalPart()); - return obj; - } - - protected SchemaObject getWithName(QName name) { - SchemaObject obj = _getWithName(name); - if (obj != null) - return obj; - if (name.getNamespaceURI() != null) { - for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { - if (sc.base != null) { - obj = sc.base._getWithName(name); - if (obj != null) { - return obj; - } - } - } - } - return null; - } - - private NamedAttributeGroup _getAttributeGroup(QName name) { - for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { - if (attrs instanceof NamedAttributeGroup) { - NamedAttributeGroup group = (NamedAttributeGroup)attrs; - if (group.getName().equals(name.getLocalPart())) - return group; - } - } - return null; - } - - public NamedAttributeGroup getAttributeGroup(QName name) { - NamedAttributeGroup group = _getAttributeGroup(name); - if (group != null) - return group; - if (name.getNamespaceURI() != null) { - for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { - if (sc.base != null) { - group = sc.base._getAttributeGroup(name); - if (group != null) { - return group; - } - } - } - } - return null; - } - - private SchemaObject _getElement(QName name) { - return elementName.get(name.getLocalPart()); - } - - protected SchemaObject getElement(QName name) { - SchemaObject obj = _getElement(name); - if (obj != null) - return obj; - if (name.getNamespaceURI() != null) { - for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { - if (sc.base != null) { - obj = sc.base._getElement(name); - if (obj != null) { - return obj; - } - } - } - } - return null; - } - - protected SchemaObject getElement(Element element) { - return elements.get(element); - } - - - private SchemaObject _getComplexType(QName name) { - return complexTypeName.get(name.getLocalPart()); - } - - protected SchemaObject getComplexType(QName name) { - SchemaObject obj = _getComplexType(name); - if (obj != null) - return obj; - if (name.getNamespaceURI() != null) { - for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { - if (sc.base != null) { - obj = sc.base._getComplexType(name); - if (obj != null) { - return obj; - } - } - } - } - return null; - } - - protected SchemaObject getComplexType(ComplexType complexType) { - return complexTypes.get(complexType); - } - - private SchemaObject _getSimpleType(QName name) { - return simpleTypeName.get(name.getLocalPart()); - } - - protected SchemaObject getSimpleType(QName name) { - SchemaObject obj = _getSimpleType(name); - if (obj != null) - return obj; - if (name.getNamespaceURI() != null) { - for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { - if (sc.base != null) { - obj = sc.base._getSimpleType(name); - if (obj != null) { - return obj; - } - } - } - } - return null; - } - - protected SchemaObject getSimpleType(SimpleType simpleType) { - return simpleTypes.get(simpleType); - } - - protected SchemaObject getWithObj(SchemaObject referrer, OpenAttrs attrs) { - // FIXME : this method cannot handle references to other schemas. - SchemaObject obj = null; - if (attrs instanceof Element) - obj = elements.get(attrs); - else if (attrs instanceof ComplexType) - obj = complexTypes.get(attrs); - else if (attrs instanceof SimpleType) - obj = simpleTypes.get(attrs); - if (obj == null){ - throw new RuntimeException("Cannot locate referred object " + attrs + " when handling " + referrer.getName()); - } - return obj; - } - - private void preload() { - Deque stack = new ArrayDeque(); - //stack.addAll(schema.getSimpleTypeOrComplexTypeOrGroup()); - for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { - if (attrs instanceof Element) { - Element element = (Element)attrs; - SchemaObject obj = new SchemaObject(element); - obj.setRename(getRename(element)); - stack.push(obj); - } else if (attrs instanceof ComplexType) { - ComplexType complexType = (ComplexType)attrs; - SchemaObject obj = new SchemaObject(complexType); - obj.setRename(getRename(complexType)); - stack.push(obj); - } else if (attrs instanceof SimpleType) { - SimpleType simpleType = (SimpleType)attrs; - SchemaObject obj = new SchemaObject(simpleType); - stack.push(obj); - } else if (attrs instanceof Attribute) { - // Attributes are not cached - } else if (attrs instanceof AttributeGroup) { - // Attribute groups are not cached - } else if (attrs instanceof NamedGroup) { - NamedGroup group = (NamedGroup)attrs; - SchemaObject obj = new SchemaObject(group); - stack.push(obj); - } else { - System.out.println(attrs.getClass().getName()); - } - } - - while (!stack.isEmpty()) { - SchemaObject object = stack.pop(); - switch (object.getType()) { - case COMPLEX_TYPE:{ - ComplexType ct = object.getComplexType(); - if (ct.getName() != null && ct.getName().length() > 0 && ct instanceof TopLevelComplexType) - complexTypeName.put(ct.getName(), object); - complexTypes.put(ct, object); - if (ct.getChoice() != null) { - preload(object,ct.getChoice(), stack); - } - if (ct.getSequence() != null) { - preload(object,ct.getSequence(), stack); - } - if (ct.getAll() != null) { - preload(object,ct.getAll(), stack); - } - if (ct.getGroup() != null) - throw new RuntimeException("Groups not supported"); - if (ct.getComplexContent() != null) { - ComplexContent cc = ct.getComplexContent(); - ExtensionType extensionType = cc.getExtension(); - if (extensionType != null) { - if (extensionType.getChoice() != null) { - preload(object,extensionType.getChoice(), stack); - } - if (extensionType.getSequence()!= null) { - preload(object,extensionType.getSequence(), stack); - } - if (extensionType.getAll()!= null) { - preload(object,extensionType.getAll(), stack); - } - if (extensionType.getGroup() != null) - throw new RuntimeException("Groups not supported"); - } - } - if (ct.getSimpleContent() != null) { - SimpleContent cc = ct.getSimpleContent(); - ExtensionType extensionType = cc.getExtension(); - if (extensionType != null) { - if (extensionType.getChoice() != null) { - preload(object,extensionType.getChoice(), stack); - } - if (extensionType.getSequence()!= null) { - preload(object,extensionType.getSequence(), stack); - } - if (extensionType.getAll()!= null) { - preload(object,extensionType.getAll(), stack); - } - if (extensionType.getGroup() != null) - throw new RuntimeException("Groups not supported"); - } - } - break; - } - case ELEMENT:{ - Element e = object.getElement(); - if (e instanceof TopLevelElement) - elementName.put(e.getName(), object); - elements.put(e, object); - if (e.getComplexType() != null) - stack.push(new SchemaObject(object,e.getComplexType())); - if (e.getSimpleType() != null) - stack.push(new SchemaObject(object,e.getSimpleType())); - break; - } - case SIMPLE_TYPE:{ - SimpleType e = object.getSimpleType(); - if (e instanceof TopLevelSimpleType) - simpleTypeName.put(e.getName(), object); - simpleTypes.put(e, object); - break; - } - case MODEL_GROUP:{ - NamedGroup e = object.getModelGroup(); - modelGroupName.put(e.getName(), object); - modelGroups.put(e, object); - break; - } - } - } // while - } - - private void preload(SchemaObject parent,ExplicitGroup eg, Deque stack) { - for (Object o : eg.getParticle()) { - if (o instanceof JAXBElement) { - JAXBElement element = (JAXBElement)o; - Object elemValue = element.getValue(); - if (elemValue instanceof Element) { - SchemaObject obj = new SchemaObject(parent,(Element)elemValue); - obj.setRename(getRename((Element)elemValue)); - stack.add(obj); - } else if (elemValue instanceof ExplicitGroup) { - preload(parent,(ExplicitGroup)elemValue, stack); - } else if (elemValue instanceof RealGroup) { - preload(parent,(RealGroup)elemValue, stack); - } else { - throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName()); - } - } else if (o instanceof Any){ - - } else { - throw new RuntimeException("Unknown ExplicitGroup reference " + o.getClass().getName()); - } - } - } - - private void preload(SchemaObject parent, RealGroup eg, Deque stack) { - System.out.println(eg); - if (eg instanceof NamedGroup) { - SchemaObject obj = new SchemaObject(parent,(NamedGroup)eg); - stack.add(obj); - } - } - - - protected void handle(TopLevelAttribute topLevelAttribute) { - handle(null, topLevelAttribute); - } - - protected void handleSimpleType(SchemaObject topLevelSimpleType) { - handleSimpleType(null,topLevelSimpleType); - } - - protected void handle(NamedAttributeGroup namedAttributeGroup){ - handle(null, namedAttributeGroup); - } - - protected void handle(NamedGroup namedAttributeGroup){ - handle(null, namedAttributeGroup); - } - - protected QName getComplexTypeBase(ComplexType complexType) { - if (complexType == null) - return null; - ComplexContent complexContent = complexType.getComplexContent(); - if (complexContent != null) { - ExtensionType extensionType = complexContent.getExtension(); - if (extensionType != null) { - QName type = extensionType.getBase(); - return type; - } - } - return null; - } - - protected QName getSimpleTypeBase(SimpleType simpleType) { -// if (simpleType == null) -// return null; -// return simpleType.getRestriction().getBase(); - - Restriction restriction = simpleType.getRestriction(); - if (restriction != null) { - QName base = restriction.getBase(); - return base; - } else if (simpleType.getId() != null) { - throw new RuntimeException(simpleType.getName() + " restriction error"); - } else if (simpleType.getUnion() != null) { - Union union = simpleType.getUnion(); - if (union.getMemberTypes().size() > 0) { - QName base = null; - for (QName type : union.getMemberTypes()) { - QName sType = null; - TypeEntry entry = getTypeEntry(type); - if (entry == null) { - SchemaObject obj = simpleTypeName.get(type.getLocalPart()); - if (obj == null) - throw new RuntimeException(simpleType.getName() + " union has unresolved reference " + type.getLocalPart()); - sType = getSimpleTypeBase(obj.getSimpleType()); - } else { - sType = type; - } - if (base == null) - base = sType; - else if (!base.equals(sType)) { - //FIXME : throw new RuntimeException(simpleType.getName() + " union has incompatible member types"); - // fall back to string. - base = new QName(SCHEMA_NS, "string"); - - } - } - return base; - } 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(); - return base; - } - } else if (simpleType.getList() != null) { - // FIXME: callers cannot get the information that we have a list. - org.w3._2001.xmlschema.List list = simpleType.getList(); - return list.getItemType(); - } else { - throw new RuntimeException(simpleType.getName() + " restriction error"); - } - } - - protected QName getElementBase(Element element) { - ComplexType complexType = element.getComplexType(); - SimpleType simpleType = element.getSimpleType(); - if (complexType != null) - return getComplexTypeBase(complexType); - if (simpleType != null) { - return getSimpleTypeBase(simpleType); - } - return null; - } - - private void handleAttributes(SchemaObject complexType, List attributeOrAttributeGroup) { - //name = getComplexTypePrefix()+complexType.getName() - - Set handled = handleAttributeCompositions(complexType,attributeOrAttributeGroup); - for (Annotated annotated : attributeOrAttributeGroup) { - if (handled.contains(annotated)) - continue; - if (annotated instanceof Attribute) { - handle(complexType,(Attribute)annotated); - } else if (annotated instanceof AttributeGroup){ - handle(complexType,(AttributeGroup)annotated); - //comment("AttributeGroup " + ((AttributeGroup)annotated).getRef().getLocalPart()); - } else { - throw new RuntimeException(); - } - } - } - - protected void handleAttributes(SchemaObject simpleTypeObj) { - component.handleAttributes(simpleTypeObj); - } - - protected void handleExtensionAttributes(SchemaObject complexType) { - ComplexContent complexContent = complexType.getComplexType().getComplexContent(); - if (complexContent != null) { - ExtensionType extensionType = complexContent.getExtension(); - if (extensionType != null) { - handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup()); - } - } - SimpleContent simpleContent = complexType.getComplexType().getSimpleContent(); - if (simpleContent != null) { - ExtensionType extensionType = simpleContent.getExtension(); - if (extensionType != null) { - handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup()); - } - } - } - - - - protected void handleComplexTypeAttributes(SchemaObject complexType) { - handleAttributes(complexType,complexType.getComplexType().getAttributeOrAttributeGroup()); - } - - protected void handleElementComplexTypeAttributes(SchemaObject complexType) { - if (complexType != null) { - handleComplexTypeAttributes(complexType); - handleExtensionAttributes(complexType); - } - } - - protected void handleElementSimpleTypeAttributes(SchemaObject simpleType) { - if (simpleType != null) { - handleAttributes(simpleType); - } - } - - protected Set handleAttributeCompositions(SchemaObject obj, List attributeOrAttributeGroup) { - - Set handled = new HashSet(); - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof AttributeComposition) { - AttributeComposition composition = (AttributeComposition)e.getValue(); - if (composition.getAttribute().size() < 2) - throw new RuntimeException("Attribute Composition is not valid"); - BijectionMap map = new BijectionMap(); - for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) { - for (Annotated annotated : attributeOrAttributeGroup) { - if (annotated instanceof Attribute) { - Attribute attribute = (Attribute)annotated; - QName type = getBaseType(attribute); - if (a.getName().equals(attribute.getName()) && type != null && a.getType().equals(type.getLocalPart())) { - map.map(a, attribute); - } - } - } - } - if (composition.getAttribute().size() == map.size()) { - handled.addAll(map.getRightSet()); - handleAttributeComposition(obj, composition, map); - } - } - } - return handled; - } - - protected QName getBaseType(Attribute attribute) { - if (attribute.getType() != null) - return attribute.getType(); - if (attribute.getRef() != null) - return attribute.getRef(); - SimpleType simpleType = attribute.getSimpleType(); - if (simpleType != null) { - Restriction restriction = simpleType.getRestriction(); - if (restriction != null) - if (restriction.getBase() != null) - return restriction.getBase(); - } - return null; - } - - protected QName getPrimitiveType(Attribute attribute) { - QName type = getBaseType(attribute); - String b = getBindingFromPrimitiveType(type); - while (b==null && type != null) { - SchemaObject baseType = simpleTypeName.get(type.getLocalPart()); - if (baseType != null) { - Restriction restriction = baseType.getSimpleType().getRestriction(); - if (restriction != null) - if (restriction.getBase() != null) { - type = restriction.getBase(); - b = getBindingFromPrimitiveType(type); - } - } - } - return type; - } - - protected Attribute getRefAttribute(QName ref) { - for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { - if (attrs instanceof TopLevelAttribute) { - TopLevelAttribute attribute = (TopLevelAttribute)attrs; - if (attribute.getName().equals(ref.getLocalPart())) - return attribute; - } - } - return null; - } - - //protected abstract void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap attributes); - protected void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap attributes) { - component.handleAttributeComposition(obj, composition, attributes); - } - - - - - protected void handleComplexType(SchemaObject complexType) { -// handleComplexTypeAttributes(complexType); -// handleComplexTypeExtension(complexType); -// handleExtensionAttributes(complexType); - component.handleComplexType(complexType); - } - - protected void handleElement(SchemaObject topLevelElement) { -// LocalComplexType complexType = topLevelElement.getElement().getComplexType(); -// -// if (complexType != null) { -// SchemaObject complextTypeObj = complexTypes.get(complexType); -// handleElementComplexTypeAttributes(complextTypeObj); -// handleComplexTypeExtension(complextTypeObj); -// } - component.handleElement(topLevelElement); - } - - protected enum RefType{Element,Reference,Type}; - - protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) { - component.handleIndicator(parent, indicator, element, refName, refType); - } - protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) { - component.handleIndicator(parent, indicator, any); - } - protected void handle(SchemaObject parent, SchemaElement indicator, List elements) { - //component.handle(parent, indicator, elements); - if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) { - for (SchemaElement e : elements) { - handle(parent, indicator, e); - } - } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) { - String name = getChoiceName(elements); - component.handleChoice(parent, indicator, elements, name); - } - } - - protected void handle(SchemaObject parent, ExplicitGroup eg, SchemaElement.ElementType indicator) { - handle(parent, new SchemaElement(eg, indicator)); - } - - protected void handle(SchemaObject parent, SchemaElement indicator) { - - - List elements = new ArrayList(); - List choices = new ArrayList(); - List sequences = new ArrayList(); - List alls = new ArrayList(); - List anys = new ArrayList(); - List groups = new ArrayList(); - - for (Object o : indicator.getGroup().getParticle()) { - if (o instanceof JAXBElement) { - JAXBElement element = (JAXBElement)o; - Object elemValue = element.getValue(); - if (elemValue instanceof LocalElement) { - LocalElement localElement = (LocalElement)elemValue; - elements.add(new SchemaElement(indicator,localElement, ElementType.ELEMENT)); - } else if (elemValue instanceof All) { - alls.add(new SchemaElement(indicator,(All)elemValue, ElementType.ALL)); - } else if (elemValue instanceof ExplicitGroup) { - QName qname = element.getName(); - if ("choice".equals(qname.getLocalPart())) { - choices.add(new SchemaElement(indicator,(ExplicitGroup)elemValue, ElementType.CHOICE)); - } else if ("sequence".equals(qname.getLocalPart())) { - sequences.add(new SchemaElement(indicator,(ExplicitGroup)elemValue, ElementType.SEQUENCE)); - } - } else if (elemValue instanceof RealGroup) { - if (elemValue instanceof GroupRef) { - groups.add(new SchemaElement(indicator,(GroupRef)elemValue, ElementType.GROUP_REF)); - } else if (elemValue instanceof NamedGroup) { - groups.add(new SchemaElement(indicator,(NamedGroup)elemValue, ElementType.NAMED_GROUP)); - } else { - throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName()); - } - } else { - throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName()); - } - } else if (o instanceof Any){ - anys.add(new SchemaElement(indicator,(Any)o, ElementType.ANY)); - } else { - throw new RuntimeException("Unknown ExplicitGroup reference " + o.getClass().getName()); - } - } - - if (elements.size() == 0 && choices.size() == 0 && sequences.size() == 0 && alls.size() == 0 && anys.size() == 0 && groups.size() == 0) { - return; - } - - if (indicator.getType() == SchemaElement.ElementType.SEQUENCE) { - if (indicator.getRestriction().single()) { - if (elements.size() > 0) { - for (SchemaElement e : sequences) { - handle(parent, e); - } - for (SchemaElement c : choices) { - handle(parent, c); - } - - for (SchemaElement c : alls) { - handle(parent, c); - } - - for (SchemaElement c : groups) { - handle(parent, c); - } - handle(parent, indicator, elements); - for (SchemaElement a : anys) { - handleIndicator(parent, indicator, a); - } - } else { - if (sequences.size() > 0) { - throw new RuntimeException("Cannot handle Sequence with inner Sequences"); - } - for (SchemaElement c : choices) { - handle(parent, c); - } - for (SchemaElement a : anys) { - handleIndicator(parent, indicator, a); - } - for (SchemaElement c : groups) { - handle(parent, c); - } - } - } else { - if (choices.size() == 1 && sequences.size() == 0 && alls.size() == 0 && groups.size() == 0) { - // special case: handle lone choice inside sequence with maxOccurs > 1 - SchemaElement choice = choices.get(0); - // move multiplicity restrictions to choice - if (indicator.getRestriction().max == -1 || (choice.getRestriction().max > 0 && indicator.getRestriction().max > choice.getRestriction().max)) - choice.getRestriction().max = indicator.getRestriction().max; - if (indicator.getRestriction().min == 0 || choice.getRestriction().min > indicator.getRestriction().min) - choice.getRestriction().min = indicator.getRestriction().min; - handle(parent, choice, elements); - return; - } - if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0 || groups.size() > 0) { - throw new RuntimeException("Cannot handle Sequence with inner ExplicitGroups"); - } - handle(parent, indicator, elements); - for (SchemaElement a : anys) { - handleIndicator(parent, indicator, a); - } - } - - } else if (indicator.getType() == SchemaElement.ElementType.CHOICE){ - if (indicator.getRestriction().single()) { - if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0 || groups.size() > 0) { - throw new RuntimeException("Cannot handle Choice that contains something else than Elements"); - } - handle(parent, indicator, elements); - - } else { - if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0 || groups.size() > 0) { - throw new RuntimeException("Cannot handle Choice with inner ExplicitGroups"); - } - handle(parent, indicator, elements); - for (SchemaElement a : anys) { - handleIndicator(parent, indicator, a); - } - } - } else if (indicator.getType() == ElementType.ALL) { - if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0 || groups.size() > 0) { - throw new RuntimeException("Cannot handle All that contains something else than Elements"); - } - if (!indicator.getRestriction().single()) { - throw new RuntimeException("All indicator must have maxOccurs=1"); - } - handle(parent, indicator, elements); - } - } - - - protected void handle(SchemaObject parent, SchemaElement indicator, SchemaElement element) { - Element localElement = element.getElement(); - if (localElement.getName() != null) { - SchemaObject eObj = elements.get(localElement); - QName refType = localElement.getType(); - if (refType != null) - handleIndicator(parent, indicator, element, null, RefType.Type); - else { - handleElement(eObj); - handleIndicator(parent, indicator, element, null, RefType.Element); - } - } else if (localElement.getRef() != null) { - handleIndicator(parent, indicator,element, null, RefType.Reference); - } - } - - protected String getElementName(Element localElement) { - if (localElement.getName() != null) { - String refName = localElement.getName(); - QName refType = localElement.getType(); - if (refType != null) - return refName; - } else if (localElement.getRef() != null) { - QName refType = localElement.getRef(); - if (refType != null) - return refType.getLocalPart(); - } - return null; - } - - protected String getChoiceName(List elements) { - if (elements.size() == 1) { - return getElementName(elements.get(0).getElement()); - } - List names = new ArrayList(); - for (SchemaElement e : elements) { - String name = getElementName(e.getElement()); - if (name != null) - names.add(name); - } - String name = ""; - for (int i = 0; i < names.size(); i++) { - if (i == 0) - name = names.get(i); - else - name += "Or"+names.get(i); - } - return name; - } - - protected void handle(SchemaObject parent, Attribute attribute) { - component.handle(parent, attribute); - } - protected void handle(SchemaObject parent, AttributeGroup attribute) { - component.handle(parent, attribute); - } - protected void handle(SchemaObject parent, NamedGroup attribute){ - component.handle(parent, attribute); - }; - - protected void handleSimpleType(SchemaObject parent, SchemaObject simpleType) { - component.handleSimpleType(parent, simpleType); - } - - - - protected void handleComplexTypeExtension(SchemaObject complexTypeObj) { - ComplexType complexType = complexTypeObj.getComplexType(); - if (complexType != null) { - if (complexType.getChoice() != null) - handle(complexTypeObj, complexType.getChoice(), SchemaElement.ElementType.CHOICE); - if (complexType.getSequence() != null) - handle(complexTypeObj, complexType.getSequence(), SchemaElement.ElementType.SEQUENCE); - if (complexType.getAll() != null) - handle(complexTypeObj, complexType.getAll(), SchemaElement.ElementType.ALL); - if (complexType.getGroup() != null) - throw new RuntimeException("Groups not supported"); - ComplexContent complexContent = complexType.getComplexContent(); - if (complexContent != null) { - ExtensionType extensionType = complexContent.getExtension(); - if (extensionType != null) { - if (extensionType.getChoice() != null) { - handle(complexTypeObj, extensionType.getChoice(), SchemaElement.ElementType.CHOICE); - } - if (extensionType.getSequence()!= null) { - handle(complexTypeObj, extensionType.getSequence(), SchemaElement.ElementType.SEQUENCE); - } - if (extensionType.getAll()!= null) { - handle(complexTypeObj, extensionType.getAll(), SchemaElement.ElementType.ALL); - } - if (extensionType.getGroup() != null) { - throw new RuntimeException("Groups not supported"); - } - } - } -// SimpleContent simpleContent = complexType.getSimpleContent(); -// if (simpleContent != null) { -// ExtensionType extensionType = simpleContent.getExtension(); -// } - } - } - - - public boolean isElementRef(String ref) { - return elementName.containsKey(ref); - } - - public boolean isComplexTypeRef(String ref) { - return complexTypeName.containsKey(ref); - } - - public boolean isSimpleTypeRef(String ref) { - return simpleTypeName.containsKey(ref); - } - - public IDProvider getIDProvider(Element element) { - List idProviders = new ArrayList(2); - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof IDProvider) { - IDProvider ref = (IDProvider)e.getValue(); - org.simantics.xml.sax.configuration.Element element2 = ref.getElement(); - if (element2 != null) { - if (element.getName().equals(element2.getName())) - idProviders.add(ref); - } - - } - } - if (idProviders.size() == 0) - return null; - if (idProviders.size() > 1) - throw new RuntimeException("Element " + element.getName() + " contains " + idProviders.size() + " id provider rules, only one is allowed."); - return idProviders.get(0); - } - - public IDProvider getIDProvider(ComplexType complexType) { - List idProviders = new ArrayList(2); - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof IDProvider) { - IDProvider ref = (IDProvider)e.getValue(); - org.simantics.xml.sax.configuration.ComplexType complexType2 = ref.getComplexType(); - if (complexType2 != null) { - if (complexType.getName().equals(complexType2.getName())) - idProviders.add(ref); - } - - } - } - if (idProviders.size() == 0) - return null; - if (idProviders.size() > 1) - throw new RuntimeException("Element " + complexType.getName() + " contains " + idProviders.size() + " id provider rules, only one is allowed."); - return idProviders.get(0); - } - - public List getIDReferences(Element element) { - List idReferences = new ArrayList(2); - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof IDReference) { - IDReference ref = (IDReference)e.getValue(); - org.simantics.xml.sax.configuration.Element element2 = ref.getElement(); - if (element2 != null) { - if (element.getName().equals(element2.getName())) - idReferences.add(ref); - } - } - } - return idReferences; - } - - public List getIDReferences(ComplexType complexType) { - List idReferences = new ArrayList(2); - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof IDReference) { - IDReference ref = (IDReference)e.getValue(); - org.simantics.xml.sax.configuration.ComplexType complexType2 = ref.getComplexType(); - if (complexType2 != null) { - if (complexType.getName().equals(complexType2.getName())) - idReferences.add(ref); - } - } - } - return idReferences; - } - - public UnrecognizedChildElement getUnknown(ComplexType complexType) { - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof UnrecognizedChildElement) { - UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue(); - org.simantics.xml.sax.configuration.ComplexType complexType2 = rule.getComplexType(); - if (complexType2 != null) { - if (complexType.getName().equals(complexType2.getName())) - return rule; - } - } - } - return null; - } - - public UnrecognizedChildElement getUnknown(Element element) { - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof UnrecognizedChildElement) { - UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue(); - org.simantics.xml.sax.configuration.Element element2 = rule.getElement(); - if (element2 != null) { - if (element.getName().equals(element2.getName())) - return rule; - } - } - } - return null; - } - - public Rename getRename(Attribute element) { - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof Rename) { - Rename rule = (Rename)e.getValue(); - Object ref = rule.getElementOrComplexTypeOrAttribute().get(0); - if (!(ref instanceof org.simantics.xml.sax.configuration.Attribute)) - continue; - org.simantics.xml.sax.configuration.Attribute element2 = (org.simantics.xml.sax.configuration.Attribute)ref; - if (element2.getName().equals(element.getName())) { - return rule; - } - } - } - return null; - } - - public Rename getRename(ComplexType element) { - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof Rename) { - Rename rule = (Rename)e.getValue(); - Object ref = rule.getElementOrComplexTypeOrAttribute().get(0); - if (!(ref instanceof org.simantics.xml.sax.configuration.ComplexType)) - continue; - org.simantics.xml.sax.configuration.ComplexType element2 = (org.simantics.xml.sax.configuration.ComplexType)ref; - if (element2.getName().equals(element.getName())) { - return rule; - } - } - } - return null; - } - - public Rename getRename(Element element) { - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof Rename) { - Rename rule = (Rename)e.getValue(); - Object ref = rule.getElementOrComplexTypeOrAttribute().get(0); - if (!(ref instanceof org.simantics.xml.sax.configuration.Element)) - continue; - org.simantics.xml.sax.configuration.Element element2 = (org.simantics.xml.sax.configuration.Element)ref; - if (element2.getName().equals(element.getName())) { - return rule; - } - } - } - return null; - } - - - public boolean useOriginalList(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String ref, QName refType) { - if (parent.getName() == null) - parent = parent.getParent(); - if (parent.getName().contains("PipingNetworkSegment")) - System.out.println(); - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof OrderedChild) { - OrderedChild oc = (OrderedChild)e.getValue(); - org.simantics.xml.sax.configuration.Element element2 = oc.getElement(); - org.simantics.xml.sax.configuration.ComplexType complexType = oc.getComplexType(); - org.simantics.xml.sax.configuration.Element child = oc.getChild(); - if (!oc.getType().equals("original")) - continue; - boolean match = false; - if (element2 != null) { - if (parent.getType() == ObjectType.ELEMENT && parent.getName().equals(element2.getName())) { - match = true; - } - } else if (complexType != null) { - if (parent.getType() == ObjectType.COMPLEX_TYPE && parent.getName() != null && parent.getName().equals(complexType.getName())) { - match = true; - } - - } - if (match) { - if (child != null) { - if (matchChild(child, ref, refType)) { - if (oc.getValue().equals("disable")) - return false; - else return true; - } - } else { - if (oc.getValue().equals("disable")) - return false; - return true; - } - - } - } - } - return indicator.order(); - } - - public boolean useElementList(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, QName refType) { - if (parent.getName() == null) - parent = parent.getParent(); - if (parent.getName() == "PipingNetworkSegment") - System.out.println(); - for (JAXBElement e : configuration.getConversionRule()) { - if (e.getValue() instanceof OrderedChild) { - OrderedChild oc = (OrderedChild)e.getValue(); - org.simantics.xml.sax.configuration.Element element2 = oc.getElement(); - org.simantics.xml.sax.configuration.ComplexType complexType = oc.getComplexType(); - org.simantics.xml.sax.configuration.Element child = oc.getChild(); - if (!oc.getType().equals("child")) - continue; - boolean match = false; - if (element2 != null) { - if (parent.getType() == ObjectType.ELEMENT && parent.getName().equals(element2.getName())) { - match = true; - } - } else if (complexType != null) { - if (parent.getType() == ObjectType.COMPLEX_TYPE && parent.getName() != null && parent.getName().equals(complexType.getName())) { - match = true; - } - - } - if (match) { - if (child != null) { - if (matchChild(child, refName, refType)) { - if (oc.getValue().equals("disable")) - return false; - else return true; - } - } else { - if (oc.getValue().equals("disable")) - return false; - return true; - } - - } - } - } - return element.many() && element.order(); - } - - private boolean matchChild(org.simantics.xml.sax.configuration.Element child, String refName, QName refType) { - if (refType != null && refType.getLocalPart().equals(child.getName())) - return true; - if (refName != null && refName.equals(child.getName())) - return true; - return false; - } - - public static class TypeEntry { - String l0Type; - String binding; - String javaType; - String defaultValue; - boolean id; - String getterPrefix; - String getterPostfix; - String stringPrefix; - String stringPostfix; - public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix) { - super(); - this.l0Type = l0Type; - this.binding = binding; - this.javaType = javaType; - this.defaultValue = defaultValue; - this.id = false; - this.getterPrefix = getterPrefix; - this.getterPostfix = getterPostfix; - this.stringPrefix = stringPrefix; - this.stringPostfix = stringPostfix; - } - - public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix, boolean id) { - super(); - this.l0Type = l0Type; - this.binding = binding; - this.javaType = javaType; - this.defaultValue = defaultValue; - this.id = id; - this.getterPrefix = getterPrefix; - this.getterPostfix = getterPostfix; - this.stringPrefix = stringPrefix; - this.stringPostfix = stringPostfix; - } - - public String getValueGetterMethod(String name) { - return getterPrefix + name + ".getValue()"+getterPostfix; - } - public String getValueGetter(String name) { - return getterPrefix + name+getterPostfix; - } - public String getValueGetter() - { - return getValueGetter("value"); - } - - public String getToString(String name) { - return stringPrefix +"("+javaType+")"+name+stringPostfix; - } - - public String getElementToString(String name) { - return stringPrefix + name+stringPostfix; - } - - } - - public enum InheritanceType{ComplexType,AtomicType,None}; - - public static class Inheritance { - public String baseClass; - public InheritanceType type; - public TypeEntry atomicType; - - public Inheritance(String baseClass) { - this.baseClass = baseClass; - this.type = InheritanceType.None; - } - } - - public String getComplexTypePrefix() { - return component.getComplexTypePrefix(); - } - public String getAttributeGroupPrefix() { - return component.getAttributeGroupPrefix(); - } - public String getName(SchemaObject obj) { - return component.getName(obj); - } - public String getBaseClass(ObjectType type) { - return component.getBaseClass(type); - } - - - - public Inheritance getInheritance(SchemaObject topLevelObj) { - Inheritance inheritance = null; - if (topLevelObj.getType() == ObjectType.ELEMENT) { - Element topLevelElement = topLevelObj.getElement(); - inheritance = new Inheritance(getBaseClass(ObjectType.ELEMENT)); - if (topLevelElement.getType() != null) { - QName type = topLevelElement.getType(); - if (!type.getNamespaceURI().equals(SCHEMA_NS)) { - SchemaObject obj = complexTypeName.get(type.getLocalPart()); - // if (obj == null) - // obj = simpleTypeName.get(type.getLocalPart()); - if (obj != null) { - inheritance.baseClass = getName(obj); - inheritance.type = InheritanceType.ComplexType; - } - } else { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; - } - } - } - if (inheritance.type == InheritanceType.None) { - QName type = getElementBase(topLevelElement); - if (type != null) { - if (!type.getNamespaceURI().equals(SCHEMA_NS)) { - SchemaObject obj = getWithName(type); - inheritance.baseClass = getName(obj); - inheritance.type = InheritanceType.ComplexType; - } else { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; - } - } - } - } - if (inheritance.type == InheritanceType.None) { - QName type = topLevelElement.getSubstitutionGroup(); - if (type != null) { - if (!type.getNamespaceURI().equals(SCHEMA_NS)) { - SchemaObject obj = getWithName(type); - inheritance.baseClass = getName(obj); - inheritance.type = InheritanceType.ComplexType; - } else { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; - } - } - } - } - } else if (topLevelObj.getType() == ObjectType.COMPLEX_TYPE) { - ComplexType complexType = topLevelObj.getComplexType(); - QName type = getComplexTypeBase(complexType); - inheritance = new Inheritance(getBaseClass(ObjectType.COMPLEX_TYPE)); - if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) { - SchemaObject obj = complexTypeName.get(type.getLocalPart()); - if (obj != null) { - inheritance.baseClass = getName(obj); - inheritance.type = InheritanceType.ComplexType; - } - } - SimpleContent simpleContent = complexType.getSimpleContent(); - if (simpleContent != null) { - ExtensionType extensionType = simpleContent.getExtension(); - if (extensionType != null) { - type = extensionType.getBase(); - getAtomicTypeInheritance(type, inheritance); - } - } - } - - return inheritance; - } - /** - * Goes through chain of SimpleTypes until locates Atomic Type (type defined in XML schema). - * @param type - * @param topLevelObj - * @param inheritance - */ - public void getAtomicTypeInheritance(QName type, Inheritance inheritance) { - if (!type.getNamespaceURI().equals(SCHEMA_NS)) { - SchemaObject obj = getWithName(type); - System.out.println(); - if (obj.getType() != ObjectType.SIMPLE_TYPE) - throw new RuntimeException("SimpleContent does not use SimpleType definition"); - SimpleType simpleType = obj.getSimpleType(); - type = getSimpleTypeBase(simpleType); - getAtomicTypeInheritance(type, inheritance); - } else { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; - } - } - } - - public String getDefaultValue(QName atype) { - Map types = typeMap.get(atype.getNamespaceURI()); - if (types == null) - return null; - TypeEntry entry = types.get(atype.getLocalPart()); - if (entry == null) - return null; - return entry.defaultValue; - } - -} +package org.simantics.xml.sax; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; + +import org.simantics.utils.datastructures.BijectionMap; +import org.simantics.xml.sax.SchemaElement.ElementType; +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.IDProvider; +import org.simantics.xml.sax.configuration.IDReference; +import org.simantics.xml.sax.configuration.OrderedChild; +import org.simantics.xml.sax.configuration.Rename; +import org.simantics.xml.sax.configuration.UnrecognizedChildElement; +import org.w3._2001.xmlschema.All; +import org.w3._2001.xmlschema.Annotated; +import org.w3._2001.xmlschema.Any; +import org.w3._2001.xmlschema.Attribute; +import org.w3._2001.xmlschema.AttributeGroup; +import org.w3._2001.xmlschema.ComplexContent; +import org.w3._2001.xmlschema.ComplexType; +import org.w3._2001.xmlschema.Element; +import org.w3._2001.xmlschema.ExplicitGroup; +import org.w3._2001.xmlschema.ExtensionType; +import org.w3._2001.xmlschema.GroupRef; +import org.w3._2001.xmlschema.LocalElement; +import org.w3._2001.xmlschema.NamedAttributeGroup; +import org.w3._2001.xmlschema.NamedGroup; +import org.w3._2001.xmlschema.OpenAttrs; +import org.w3._2001.xmlschema.RealGroup; +import org.w3._2001.xmlschema.Restriction; +import org.w3._2001.xmlschema.Schema; +import org.w3._2001.xmlschema.SimpleContent; +import org.w3._2001.xmlschema.SimpleType; +import org.w3._2001.xmlschema.TopLevelAttribute; +import org.w3._2001.xmlschema.TopLevelComplexType; +import org.w3._2001.xmlschema.TopLevelElement; +import org.w3._2001.xmlschema.TopLevelSimpleType; +import org.w3._2001.xmlschema.Union; + +public final class SchemaConversionBase { + + protected Schema schema; + protected SchemaConverter converter; + protected SchemaConversionComponent component; + protected Configuration configuration; + + public static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema"; + public static final String CONVERSION_NS = "http://www.simantics.org/Layer0"; + + protected Map> typeMap; + + protected String ontologyURI; + protected String className; + + public SchemaConversionBase(SchemaConverter converter, String ontologyUri, String className) { + this.converter = converter; + this.configuration = converter.getConfiguration(); + this.ontologyURI = ontologyUri; + this.className = className; + + initTypes(); + } + + protected void initTypes() { + typeMap = new HashMap>(); + Map schemaTypes = new HashMap(); + typeMap.put(SCHEMA_NS, schemaTypes); + Map l0Types = new HashMap(); + typeMap.put(CONVERSION_NS, l0Types); + + schemaTypes.put("string", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("NMTOKEN", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("token", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("ID", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","",true)); + schemaTypes.put("IDREF", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("Name", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("NCName", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("date", new TypeEntry("XML.Date", "org.simantics.xml.sax.base.datatypes.literal.Date.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Date", "","org.simantics.xml.sax.base.datatypes.literal.Date.parseDate(",")","(",").toString()")); + schemaTypes.put("time", new TypeEntry("XML.Time", "org.simantics.xml.sax.base.datatypes.literal.Time.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Time", "","org.simantics.xml.sax.base.datatypes.literal.Time.parseTime(",")","(",").toString()")); + schemaTypes.put("dateTime", new TypeEntry("XML.DateTime", "org.simantics.xml.sax.base.datatypes.literal.DateTime.BINDING", "org.simantics.xml.sax.base.datatypes.literal.DateTime", "","org.simantics.xml.sax.base.datatypes.literal.DateTime.parseDateTime(",")","(",").toString()")); + schemaTypes.put("gYearMonth", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("gYear", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("gMonth", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("gMonthDay", new TypeEntry("L0.String", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("anyURI", new TypeEntry("L0.URI", "Bindings.STRING", "java.lang.String", "","","","","")); + schemaTypes.put("double", new TypeEntry("L0.Double", "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")")); + schemaTypes.put("float", new TypeEntry("L0.Float", "Bindings.FLOAT", "float", "java.lang.Float.NaN","java.lang.Float.parseFloat(",")","java.lang.Float.toString(",")")); + schemaTypes.put("decimal", new TypeEntry("L0.Double", "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")")); + schemaTypes.put("boolean", new TypeEntry("L0.Boolean", "Bindings.BOOLEAN", "boolean", "false","java.lang.Boolean.parseBoolean(",")","java.lang.Boolean.toString(",")")); + schemaTypes.put("integer", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("positiveInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("nonPositiveInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("nonNegativeInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("negativeInteger", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("unsignedInt", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("int", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("short", new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("unsignedShort",new TypeEntry("L0.Integer", "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")")); + schemaTypes.put("byte", new TypeEntry("L0.Byte", "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")")); + schemaTypes.put("unsignedByte", new TypeEntry("L0.Byte", "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")")); + schemaTypes.put("long", new TypeEntry("L0.Long", "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")")); + schemaTypes.put("unsignedLong", new TypeEntry("L0.Long", "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")")); + schemaTypes.put("base64Binary", new TypeEntry("L0.ByteArray", "Bindings.BYTE_ARRAY", "byte[]", "new byte[0]","",".getBytes(org.simantics.databoard.util.binary.UTF8.CHARSET)","new java.lang.String(",", org.simantics.databoard.util.binary.UTF8.CHARSET)")); + + l0Types.put("doubleArray", new TypeEntry("L0.DoubleArray", "Bindings.DOUBLE_ARRAY", "double[]", null,null,null,"java.lang.Double.toString(",")")); + l0Types.put("stringArray", new TypeEntry("L0.StringArray", "Bindings.STRING_ARRAY", "string[]", null,null,null,"","")); + } + + protected TypeEntry getTypeEntry(QName type) { + Map types = typeMap.get(type.getNamespaceURI()); + if (types == null) + return null; + TypeEntry entry = types.get(type.getLocalPart()); + return entry; + } + protected TypeEntry getTypeEntry(String type) { + for (Map types : typeMap.values()) { + TypeEntry entry = types.get(type); + if (entry != null) + return entry; + } + return null; + } + + protected String getL0TypeFromPrimitiveType(QName primitiveType) { + TypeEntry entry = getTypeEntry(primitiveType); + if (entry == null) + return null; + return entry.l0Type; + } + + protected String getL0Type(QName primitiveType) { + String type = getL0TypeFromPrimitiveType(primitiveType); + if (type != null) + return type; + SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart()); + if (simpleTypeObj == null) + return null; + SimpleType simpleType = simpleTypeObj.getSimpleType(); + while (simpleType != null) { + QName base = simpleType.getRestriction().getBase(); + if (base != null) + return getL0Type(base); + simpleType = simpleType.getRestriction().getSimpleType(); + } + return null; + } + + protected String getBindingFromPrimitiveType(QName primitiveType) { + TypeEntry entry = getTypeEntry(primitiveType); + if (entry == null) + return null; + return entry.binding; + } + + protected String getJavaTypeFromPrimitiveType(QName primitiveType) { + TypeEntry entry = getTypeEntry(primitiveType); + if (entry == null) + return null; + return entry.javaType; + } + + + public void init(Schema schema) { + this.schema = schema; + + preload(); + } + + public void handle(SchemaConversionComponent component) { + this.component = component; + for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { + if (attrs instanceof TopLevelAttribute) { + handle((TopLevelAttribute)attrs); + + } else if (attrs instanceof TopLevelComplexType) { + handleComplexType(complexTypes.get(attrs)); + } else if (attrs instanceof TopLevelElement) { + handleElement(elements.get(attrs)); + } else if (attrs instanceof TopLevelSimpleType) { + handleSimpleType(simpleTypes.get(attrs)); + } else if (attrs instanceof NamedAttributeGroup) { + handle((NamedAttributeGroup)attrs); + } else if (attrs instanceof NamedGroup) { + handle((NamedGroup)attrs); + } else { + System.out.println(attrs.getClass().getName()); + } + } + } + + private Map elementName = new HashMap<>(); + private Map complexTypeName = new HashMap<>(); + private Map simpleTypeName = new HashMap<>(); + private Map modelGroupName = new HashMap<>(); + private Map elements = new HashMap<>(); + private Map complexTypes = new HashMap<>(); + private Map simpleTypes = new HashMap<>(); + private Map modelGroups = new HashMap<>(); + + private SchemaObject _getWithName(QName name) { + SchemaObject obj = elementName.get(name.getLocalPart()); + if (obj == null) + obj = complexTypeName.get(name.getLocalPart()); + if (obj == null) + obj = simpleTypeName.get(name.getLocalPart()); + return obj; + } + + protected SchemaObject getWithName(QName name) { + SchemaObject obj = _getWithName(name); + if (obj != null) + return obj; + if (name.getNamespaceURI() != null) { + for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { + if (sc.base != null) { + obj = sc.base._getWithName(name); + if (obj != null) { + return obj; + } + } + } + } + return null; + } + + private NamedAttributeGroup _getAttributeGroup(QName name) { + for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { + if (attrs instanceof NamedAttributeGroup) { + NamedAttributeGroup group = (NamedAttributeGroup)attrs; + if (group.getName().equals(name.getLocalPart())) + return group; + } + } + return null; + } + + public NamedAttributeGroup getAttributeGroup(QName name) { + NamedAttributeGroup group = _getAttributeGroup(name); + if (group != null) + return group; + if (name.getNamespaceURI() != null) { + for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { + if (sc.base != null) { + group = sc.base._getAttributeGroup(name); + if (group != null) { + return group; + } + } + } + } + return null; + } + + private SchemaObject _getElement(QName name) { + return elementName.get(name.getLocalPart()); + } + + protected SchemaObject getElement(QName name) { + SchemaObject obj = _getElement(name); + if (obj != null) + return obj; + if (name.getNamespaceURI() != null) { + for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { + if (sc.base != null) { + obj = sc.base._getElement(name); + if (obj != null) { + return obj; + } + } + } + } + return null; + } + + protected SchemaObject getElement(Element element) { + return elements.get(element); + } + + + private SchemaObject _getComplexType(QName name) { + return complexTypeName.get(name.getLocalPart()); + } + + protected SchemaObject getComplexType(QName name) { + SchemaObject obj = _getComplexType(name); + if (obj != null) + return obj; + if (name.getNamespaceURI() != null) { + for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { + if (sc.base != null) { + obj = sc.base._getComplexType(name); + if (obj != null) { + return obj; + } + } + } + } + return null; + } + + protected SchemaObject getComplexType(ComplexType complexType) { + return complexTypes.get(complexType); + } + + private SchemaObject _getSimpleType(QName name) { + return simpleTypeName.get(name.getLocalPart()); + } + + protected SchemaObject getSimpleType(QName name) { + SchemaObject obj = _getSimpleType(name); + if (obj != null) + return obj; + if (name.getNamespaceURI() != null) { + for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) { + if (sc.base != null) { + obj = sc.base._getSimpleType(name); + if (obj != null) { + return obj; + } + } + } + } + return null; + } + + protected SchemaObject getSimpleType(SimpleType simpleType) { + return simpleTypes.get(simpleType); + } + + protected SchemaObject getWithObj(SchemaObject referrer, OpenAttrs attrs) { + // FIXME : this method cannot handle references to other schemas. + SchemaObject obj = null; + if (attrs instanceof Element) + obj = elements.get(attrs); + else if (attrs instanceof ComplexType) + obj = complexTypes.get(attrs); + else if (attrs instanceof SimpleType) + obj = simpleTypes.get(attrs); + if (obj == null){ + throw new RuntimeException("Cannot locate referred object " + attrs + " when handling " + referrer.getName()); + } + return obj; + } + + private void preload() { + Deque stack = new ArrayDeque(); + //stack.addAll(schema.getSimpleTypeOrComplexTypeOrGroup()); + for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { + if (attrs instanceof Element) { + Element element = (Element)attrs; + SchemaObject obj = new SchemaObject(element); + obj.setRename(getRename(element)); + stack.push(obj); + } else if (attrs instanceof ComplexType) { + ComplexType complexType = (ComplexType)attrs; + SchemaObject obj = new SchemaObject(complexType); + obj.setRename(getRename(complexType)); + stack.push(obj); + } else if (attrs instanceof SimpleType) { + SimpleType simpleType = (SimpleType)attrs; + SchemaObject obj = new SchemaObject(simpleType); + stack.push(obj); + } else if (attrs instanceof Attribute) { + // Attributes are not cached + } else if (attrs instanceof AttributeGroup) { + // Attribute groups are not cached + } else if (attrs instanceof NamedGroup) { + NamedGroup group = (NamedGroup)attrs; + SchemaObject obj = new SchemaObject(group); + stack.push(obj); + } else { + System.out.println(attrs.getClass().getName()); + } + } + + while (!stack.isEmpty()) { + SchemaObject object = stack.pop(); + switch (object.getType()) { + case COMPLEX_TYPE:{ + ComplexType ct = object.getComplexType(); + if (ct.getName() != null && ct.getName().length() > 0 && ct instanceof TopLevelComplexType) + complexTypeName.put(ct.getName(), object); + complexTypes.put(ct, object); + if (ct.getChoice() != null) { + preload(object,ct.getChoice(), stack); + } + if (ct.getSequence() != null) { + preload(object,ct.getSequence(), stack); + } + if (ct.getAll() != null) { + preload(object,ct.getAll(), stack); + } + if (ct.getGroup() != null) + throw new RuntimeException("Groups not supported"); + if (ct.getComplexContent() != null) { + ComplexContent cc = ct.getComplexContent(); + ExtensionType extensionType = cc.getExtension(); + if (extensionType != null) { + if (extensionType.getChoice() != null) { + preload(object,extensionType.getChoice(), stack); + } + if (extensionType.getSequence()!= null) { + preload(object,extensionType.getSequence(), stack); + } + if (extensionType.getAll()!= null) { + preload(object,extensionType.getAll(), stack); + } + if (extensionType.getGroup() != null) { + throw new RuntimeException("Groups not supported"); + //preload(object,extensionType.getGroup(), stack); + } + } + } + if (ct.getSimpleContent() != null) { + SimpleContent cc = ct.getSimpleContent(); + ExtensionType extensionType = cc.getExtension(); + if (extensionType != null) { + if (extensionType.getChoice() != null) { + preload(object,extensionType.getChoice(), stack); + } + if (extensionType.getSequence()!= null) { + preload(object,extensionType.getSequence(), stack); + } + if (extensionType.getAll()!= null) { + preload(object,extensionType.getAll(), stack); + } + if (extensionType.getGroup() != null) + throw new RuntimeException("Groups not supported"); + } + } + break; + } + case ELEMENT:{ + Element e = object.getElement(); + if (e instanceof TopLevelElement) + elementName.put(e.getName(), object); + elements.put(e, object); + if (e.getComplexType() != null) + stack.push(new SchemaObject(object,e.getComplexType())); + if (e.getSimpleType() != null) + stack.push(new SchemaObject(object,e.getSimpleType())); + break; + } + case SIMPLE_TYPE:{ + SimpleType e = object.getSimpleType(); + if (e instanceof TopLevelSimpleType) + simpleTypeName.put(e.getName(), object); + simpleTypes.put(e, object); + break; + } + case MODEL_GROUP:{ + NamedGroup e = object.getModelGroup(); + modelGroupName.put(e.getName(), object); + modelGroups.put(e, object); + break; + } + } + } // while + } + + private void preload(SchemaObject parent,ExplicitGroup eg, Deque stack) { + for (Object o : eg.getParticle()) { + if (o instanceof JAXBElement) { + JAXBElement element = (JAXBElement)o; + Object elemValue = element.getValue(); + if (elemValue instanceof Element) { + SchemaObject obj = new SchemaObject(parent,(Element)elemValue); + obj.setRename(getRename((Element)elemValue)); + stack.add(obj); + } else if (elemValue instanceof ExplicitGroup) { + preload(parent,(ExplicitGroup)elemValue, stack); + } else if (elemValue instanceof RealGroup) { + preload(parent,(RealGroup)elemValue, stack); + } else { + throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName()); + } + } else if (o instanceof Any){ + + } else { + throw new RuntimeException("Unknown ExplicitGroup reference " + o.getClass().getName()); + } + } + } + + private void preload(SchemaObject parent, RealGroup eg, Deque stack) { + System.out.println(eg); + if (eg instanceof NamedGroup) { + SchemaObject obj = new SchemaObject(parent,(NamedGroup)eg); + stack.add(obj); + } + } + + + protected void handle(TopLevelAttribute topLevelAttribute) { + handle(null, topLevelAttribute); + } + + protected void handleSimpleType(SchemaObject topLevelSimpleType) { + handleSimpleType(null,topLevelSimpleType); + } + + protected void handle(NamedAttributeGroup namedAttributeGroup){ + handle(null, namedAttributeGroup); + } + + protected void handle(NamedGroup namedAttributeGroup){ + handle(null, namedAttributeGroup); + } + + protected QName getComplexTypeBase(ComplexType complexType) { + if (complexType == null) + return null; + ComplexContent complexContent = complexType.getComplexContent(); + if (complexContent != null) { + ExtensionType extensionType = complexContent.getExtension(); + if (extensionType != null) { + QName type = extensionType.getBase(); + return type; + } + } + return null; + } + + protected QName getSimpleTypeBase(SimpleType simpleType) { +// if (simpleType == null) +// return null; +// return simpleType.getRestriction().getBase(); + + Restriction restriction = simpleType.getRestriction(); + if (restriction != null) { + QName base = restriction.getBase(); + return base; + } else if (simpleType.getId() != null) { + throw new RuntimeException(simpleType.getName() + " restriction error"); + } else if (simpleType.getUnion() != null) { + Union union = simpleType.getUnion(); + if (union.getMemberTypes().size() > 0) { + QName base = null; + for (QName type : union.getMemberTypes()) { + QName sType = null; + TypeEntry entry = getTypeEntry(type); + if (entry == null) { + //SchemaObject obj = simpleTypeName.get(type.getLocalPart()); + SchemaObject obj = getSimpleType(type); + if (obj == null) + throw new RuntimeException(simpleType.getName() + " union has unresolved reference " + type.getLocalPart()); + sType = getSimpleTypeBase(obj.getSimpleType()); + } else { + sType = type; + } + if (base == null) + base = sType; + else if (!base.equals(sType)) { + //FIXME : throw new RuntimeException(simpleType.getName() + " union has incompatible member types"); + // fall back to string. + base = new QName(SCHEMA_NS, "string"); + + } + } + return base; + } 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())) { + Inheritance rI = new Inheritance(""); + getAtomicTypeInheritance(r.getBase(), rI); + Inheritance restI = new Inheritance(""); + getAtomicTypeInheritance(restriction.getBase(), restI); + if (!rI.atomicType.l0Type.equals(restI.atomicType.l0Type)) + throw new RuntimeException(simpleType.getName() + " union has incompatible restriction bases"); + } + } + } + QName base = restriction.getBase(); + return base; + } + } else if (simpleType.getList() != null) { + // FIXME: callers cannot get the information that we have a list. + org.w3._2001.xmlschema.List list = simpleType.getList(); + return list.getItemType(); + } else { + throw new RuntimeException(simpleType.getName() + " restriction error"); + } + } + + protected QName getElementBase(Element element) { + ComplexType complexType = element.getComplexType(); + SimpleType simpleType = element.getSimpleType(); + if (complexType != null) + return getComplexTypeBase(complexType); + if (simpleType != null) { + return getSimpleTypeBase(simpleType); + } + return null; + } + + private void handleAttributes(SchemaObject complexType, List attributeOrAttributeGroup) { + //name = getComplexTypePrefix()+complexType.getName() + + Set handled = handleAttributeCompositions(complexType,attributeOrAttributeGroup); + for (Annotated annotated : attributeOrAttributeGroup) { + if (handled.contains(annotated)) + continue; + if (annotated instanceof Attribute) { + handle(complexType,(Attribute)annotated); + } else if (annotated instanceof AttributeGroup){ + handle(complexType,(AttributeGroup)annotated); + //comment("AttributeGroup " + ((AttributeGroup)annotated).getRef().getLocalPart()); + } else { + throw new RuntimeException(); + } + } + } + + protected void handleAttributes(SchemaObject simpleTypeObj) { + component.handleAttributes(simpleTypeObj); + } + + protected void handleExtensionAttributes(SchemaObject complexType) { + ComplexContent complexContent = complexType.getComplexType().getComplexContent(); + if (complexContent != null) { + ExtensionType extensionType = complexContent.getExtension(); + if (extensionType != null) { + handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup()); + } + } + SimpleContent simpleContent = complexType.getComplexType().getSimpleContent(); + if (simpleContent != null) { + ExtensionType extensionType = simpleContent.getExtension(); + if (extensionType != null) { + handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup()); + } + } + } + + + + protected void handleComplexTypeAttributes(SchemaObject complexType) { + handleAttributes(complexType,complexType.getComplexType().getAttributeOrAttributeGroup()); + } + + protected void handleElementComplexTypeAttributes(SchemaObject complexType) { + if (complexType != null) { + handleComplexTypeAttributes(complexType); + handleExtensionAttributes(complexType); + } + } + + protected void handleElementSimpleTypeAttributes(SchemaObject simpleType) { + if (simpleType != null) { + handleAttributes(simpleType); + } + } + + protected Set handleAttributeCompositions(SchemaObject obj, List attributeOrAttributeGroup) { + + Set handled = new HashSet(); + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof AttributeComposition) { + AttributeComposition composition = (AttributeComposition)e.getValue(); + if (composition.getAttribute().size() < 2) + throw new RuntimeException("Attribute Composition is not valid"); + BijectionMap map = new BijectionMap(); + for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) { + for (Annotated annotated : attributeOrAttributeGroup) { + if (annotated instanceof Attribute) { + Attribute attribute = (Attribute)annotated; + QName type = getBaseType(attribute); + if (a.getName().equals(attribute.getName()) && type != null && a.getType().equals(type.getLocalPart())) { + map.map(a, attribute); + } + } + } + } + if (composition.getAttribute().size() == map.size()) { + handled.addAll(map.getRightSet()); + handleAttributeComposition(obj, composition, map); + } + } + } + return handled; + } + + protected QName getBaseType(Attribute attribute) { + if (attribute.getType() != null) + return attribute.getType(); + if (attribute.getRef() != null) + return attribute.getRef(); + SimpleType simpleType = attribute.getSimpleType(); + if (simpleType != null) { + Restriction restriction = simpleType.getRestriction(); + if (restriction != null) + if (restriction.getBase() != null) + return restriction.getBase(); + } + return null; + } + + protected QName getPrimitiveType(Attribute attribute) { + QName type = getBaseType(attribute); + String b = getBindingFromPrimitiveType(type); + while (b==null && type != null) { + SchemaObject baseType = simpleTypeName.get(type.getLocalPart()); + if (baseType != null) { + Restriction restriction = baseType.getSimpleType().getRestriction(); + if (restriction != null) + if (restriction.getBase() != null) { + type = restriction.getBase(); + b = getBindingFromPrimitiveType(type); + } + } + } + return type; + } + + protected Attribute getRefAttribute(QName ref) { + for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) { + if (attrs instanceof TopLevelAttribute) { + TopLevelAttribute attribute = (TopLevelAttribute)attrs; + if (attribute.getName().equals(ref.getLocalPart())) + return attribute; + } + } + return null; + } + + //protected abstract void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap attributes); + protected void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap attributes) { + component.handleAttributeComposition(obj, composition, attributes); + } + + + + + protected void handleComplexType(SchemaObject complexType) { +// handleComplexTypeAttributes(complexType); +// handleComplexTypeExtension(complexType); +// handleExtensionAttributes(complexType); + component.handleComplexType(complexType); + } + + protected void handleElement(SchemaObject topLevelElement) { +// LocalComplexType complexType = topLevelElement.getElement().getComplexType(); +// +// if (complexType != null) { +// SchemaObject complextTypeObj = complexTypes.get(complexType); +// handleElementComplexTypeAttributes(complextTypeObj); +// handleComplexTypeExtension(complextTypeObj); +// } + component.handleElement(topLevelElement); + } + + protected enum RefType{Element,Reference,Type}; + + protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) { + component.handleIndicator(parent, indicator, element, refName, refType); + } + protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) { + component.handleIndicator(parent, indicator, any); + } + protected void handle(SchemaObject parent, SchemaElement indicator, List elements) { + //component.handle(parent, indicator, elements); + if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) { + for (SchemaElement e : elements) { + handle(parent, indicator, e); + } + } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) { + String name = getChoiceName(elements); + component.handleChoice(parent, indicator, elements, name); + } + } + + protected void handle(SchemaObject parent, ExplicitGroup eg, SchemaElement.ElementType indicator) { + handle(parent, new SchemaElement(eg, indicator)); + } + + protected void handle(SchemaObject parent, GroupRef eg, SchemaElement.ElementType indicator) { + handle(parent, new SchemaElement(eg, indicator)); + } + + protected void handle(SchemaObject parent, SchemaElement indicator) { + + + List elements = new ArrayList(); + List choices = new ArrayList(); + List sequences = new ArrayList(); + List alls = new ArrayList(); + List anys = new ArrayList(); + List groups = new ArrayList(); + + for (Object o : indicator.getGroup().getParticle()) { + if (o instanceof JAXBElement) { + JAXBElement element = (JAXBElement)o; + Object elemValue = element.getValue(); + if (elemValue instanceof LocalElement) { + LocalElement localElement = (LocalElement)elemValue; + elements.add(new SchemaElement(indicator,localElement, ElementType.ELEMENT)); + } else if (elemValue instanceof All) { + alls.add(new SchemaElement(indicator,(All)elemValue, ElementType.ALL)); + } else if (elemValue instanceof ExplicitGroup) { + QName qname = element.getName(); + if ("choice".equals(qname.getLocalPart())) { + choices.add(new SchemaElement(indicator,(ExplicitGroup)elemValue, ElementType.CHOICE)); + } else if ("sequence".equals(qname.getLocalPart())) { + sequences.add(new SchemaElement(indicator,(ExplicitGroup)elemValue, ElementType.SEQUENCE)); + } + } else if (elemValue instanceof RealGroup) { + if (elemValue instanceof GroupRef) { + groups.add(new SchemaElement(indicator,(GroupRef)elemValue, ElementType.GROUP_REF)); + } else if (elemValue instanceof NamedGroup) { + groups.add(new SchemaElement(indicator,(NamedGroup)elemValue, ElementType.NAMED_GROUP)); + } else { + throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName()); + } + } else { + throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName()); + } + } else if (o instanceof Any){ + anys.add(new SchemaElement(indicator,(Any)o, ElementType.ANY)); + } else { + throw new RuntimeException("Unknown ExplicitGroup reference " + o.getClass().getName()); + } + } + + if (elements.size() == 0 && choices.size() == 0 && sequences.size() == 0 && alls.size() == 0 && anys.size() == 0 && groups.size() == 0) { + return; + } + + if (indicator.getType() == SchemaElement.ElementType.SEQUENCE) { + if (indicator.getRestriction().single()) { + if (elements.size() > 0) { + for (SchemaElement e : sequences) { + handle(parent, e); + } + for (SchemaElement c : choices) { + handle(parent, c); + } + + for (SchemaElement c : alls) { + handle(parent, c); + } + + for (SchemaElement c : groups) { + handle(parent, c); + } + handle(parent, indicator, elements); + for (SchemaElement a : anys) { + handleIndicator(parent, indicator, a); + } + } else { + if (sequences.size() > 0) { + throw new RuntimeException("Cannot handle Sequence with inner Sequences"); + } + for (SchemaElement c : choices) { + handle(parent, c); + } + for (SchemaElement a : anys) { + handleIndicator(parent, indicator, a); + } + for (SchemaElement c : groups) { + handle(parent, c); + } + } + } else { + if (choices.size() == 1 && sequences.size() == 0 && alls.size() == 0 && groups.size() == 0) { + // special case: handle lone choice inside sequence with maxOccurs > 1 + SchemaElement choice = choices.get(0); + // move multiplicity restrictions to choice + if (indicator.getRestriction().max == -1 || (choice.getRestriction().max > 0 && indicator.getRestriction().max > choice.getRestriction().max)) + choice.getRestriction().max = indicator.getRestriction().max; + if (indicator.getRestriction().min == 0 || choice.getRestriction().min > indicator.getRestriction().min) + choice.getRestriction().min = indicator.getRestriction().min; + handle(parent, choice, elements); + return; + } + if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0 || groups.size() > 0) { + throw new RuntimeException("Cannot handle Sequence with inner ExplicitGroups"); + } + handle(parent, indicator, elements); + for (SchemaElement a : anys) { + handleIndicator(parent, indicator, a); + } + } + + } else if (indicator.getType() == SchemaElement.ElementType.CHOICE){ + if (indicator.getRestriction().single()) { + if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0 || groups.size() > 0) { + throw new RuntimeException("Cannot handle Choice that contains something else than Elements"); + //System.out.println("Cannot handle Choice that contains something else than Elements"); + //return; + } + handle(parent, indicator, elements); + + } else { + if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0 || groups.size() > 0) { + throw new RuntimeException("Cannot handle Choice with inner ExplicitGroups"); + //System.out.println("Cannot handle Choice with inner ExplicitGroups"); + //return; + } + handle(parent, indicator, elements); + for (SchemaElement a : anys) { + handleIndicator(parent, indicator, a); + } + } + } else if (indicator.getType() == ElementType.ALL) { + if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0 || groups.size() > 0) { + throw new RuntimeException("Cannot handle All that contains something else than Elements"); + } + if (!indicator.getRestriction().single()) { + throw new RuntimeException("All indicator must have maxOccurs=1"); + } + handle(parent, indicator, elements); + } + } + + + protected void handle(SchemaObject parent, SchemaElement indicator, SchemaElement element) { + Element localElement = element.getElement(); + if (localElement.getName() != null) { + SchemaObject eObj = elements.get(localElement); + QName refType = localElement.getType(); + if (refType != null) + handleIndicator(parent, indicator, element, null, RefType.Type); + else { + handleElement(eObj); + handleIndicator(parent, indicator, element, null, RefType.Element); + } + } else if (localElement.getRef() != null) { + handleIndicator(parent, indicator,element, null, RefType.Reference); + } + } + + protected String getElementName(Element localElement) { + if (localElement.getName() != null) { + String refName = localElement.getName(); + QName refType = localElement.getType(); + if (refType != null) + return refName; + } else if (localElement.getRef() != null) { + QName refType = localElement.getRef(); + if (refType != null) + return refType.getLocalPart(); + } + return null; + } + + protected String getChoiceName(List elements) { + if (elements.size() == 1) { + return getElementName(elements.get(0).getElement()); + } + List names = new ArrayList(); + for (SchemaElement e : elements) { + String name = getElementName(e.getElement()); + if (name != null) + names.add(name); + } + String name = ""; + for (int i = 0; i < names.size(); i++) { + if (i == 0) + name = names.get(i); + else + name += "Or"+names.get(i); + } + return name; + } + + protected void handle(SchemaObject parent, Attribute attribute) { + component.handle(parent, attribute); + } + protected void handle(SchemaObject parent, AttributeGroup attribute) { + component.handle(parent, attribute); + } + protected void handle(SchemaObject parent, NamedGroup attribute){ + component.handle(parent, attribute); + }; + + protected void handleSimpleType(SchemaObject parent, SchemaObject simpleType) { + component.handleSimpleType(parent, simpleType); + } + + + + protected void handleComplexTypeExtension(SchemaObject complexTypeObj) { + ComplexType complexType = complexTypeObj.getComplexType(); + if (complexType != null) { + if (complexType.getChoice() != null) + handle(complexTypeObj, complexType.getChoice(), SchemaElement.ElementType.CHOICE); + if (complexType.getSequence() != null) + handle(complexTypeObj, complexType.getSequence(), SchemaElement.ElementType.SEQUENCE); + if (complexType.getAll() != null) + handle(complexTypeObj, complexType.getAll(), SchemaElement.ElementType.ALL); + if (complexType.getGroup() != null) + throw new RuntimeException("Groups not supported"); + ComplexContent complexContent = complexType.getComplexContent(); + if (complexContent != null) { + ExtensionType extensionType = complexContent.getExtension(); + if (extensionType != null) { + if (extensionType.getChoice() != null) { + handle(complexTypeObj, extensionType.getChoice(), SchemaElement.ElementType.CHOICE); + } + if (extensionType.getSequence()!= null) { + handle(complexTypeObj, extensionType.getSequence(), SchemaElement.ElementType.SEQUENCE); + } + if (extensionType.getAll()!= null) { + handle(complexTypeObj, extensionType.getAll(), SchemaElement.ElementType.ALL); + } + if (extensionType.getGroup() != null) { + throw new RuntimeException("Groups not supported"); + //handle(complexTypeObj, extensionType.getGroup(), SchemaElement.ElementType.GROUP_REF); + } + } + } +// SimpleContent simpleContent = complexType.getSimpleContent(); +// if (simpleContent != null) { +// ExtensionType extensionType = simpleContent.getExtension(); +// } + } + } + + + public boolean isElementRef(String ref) { + return elementName.containsKey(ref); + } + + public boolean isComplexTypeRef(String ref) { + return complexTypeName.containsKey(ref); + } + + public boolean isSimpleTypeRef(String ref) { + return simpleTypeName.containsKey(ref); + } + + public IDProvider getIDProvider(Element element) { + List idProviders = new ArrayList(2); + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof IDProvider) { + IDProvider ref = (IDProvider)e.getValue(); + org.simantics.xml.sax.configuration.Element element2 = ref.getElement(); + if (element2 != null) { + if (element.getName().equals(element2.getName())) + idProviders.add(ref); + } + + } + } + if (idProviders.size() == 0) + return null; + if (idProviders.size() > 1) + throw new RuntimeException("Element " + element.getName() + " contains " + idProviders.size() + " id provider rules, only one is allowed."); + return idProviders.get(0); + } + + public IDProvider getIDProvider(ComplexType complexType) { + List idProviders = new ArrayList(2); + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof IDProvider) { + IDProvider ref = (IDProvider)e.getValue(); + org.simantics.xml.sax.configuration.ComplexType complexType2 = ref.getComplexType(); + if (complexType2 != null) { + if (complexType.getName().equals(complexType2.getName())) + idProviders.add(ref); + } + + } + } + if (idProviders.size() == 0) + return null; + if (idProviders.size() > 1) + throw new RuntimeException("Element " + complexType.getName() + " contains " + idProviders.size() + " id provider rules, only one is allowed."); + return idProviders.get(0); + } + + public List getIDReferences(Element element) { + List idReferences = new ArrayList(2); + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof IDReference) { + IDReference ref = (IDReference)e.getValue(); + org.simantics.xml.sax.configuration.Element element2 = ref.getElement(); + if (element2 != null) { + if (element.getName().equals(element2.getName())) + idReferences.add(ref); + } + } + } + return idReferences; + } + + public List getIDReferences(ComplexType complexType) { + List idReferences = new ArrayList(2); + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof IDReference) { + IDReference ref = (IDReference)e.getValue(); + org.simantics.xml.sax.configuration.ComplexType complexType2 = ref.getComplexType(); + if (complexType2 != null) { + if (complexType.getName().equals(complexType2.getName())) + idReferences.add(ref); + } + } + } + return idReferences; + } + + public UnrecognizedChildElement getUnknown(ComplexType complexType) { + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof UnrecognizedChildElement) { + UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue(); + org.simantics.xml.sax.configuration.ComplexType complexType2 = rule.getComplexType(); + if (complexType2 != null) { + if (complexType.getName().equals(complexType2.getName())) + return rule; + } + } + } + return null; + } + + public UnrecognizedChildElement getUnknown(Element element) { + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof UnrecognizedChildElement) { + UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue(); + org.simantics.xml.sax.configuration.Element element2 = rule.getElement(); + if (element2 != null) { + if (element.getName().equals(element2.getName())) + return rule; + } + } + } + return null; + } + + public Rename getRename(Attribute element) { + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof Rename) { + Rename rule = (Rename)e.getValue(); + Object ref = rule.getElementOrComplexTypeOrAttribute().get(0); + if (!(ref instanceof org.simantics.xml.sax.configuration.Attribute)) + continue; + org.simantics.xml.sax.configuration.Attribute element2 = (org.simantics.xml.sax.configuration.Attribute)ref; + if (element2.getName().equals(element.getName())) { + return rule; + } + } + } + return null; + } + + public Rename getRename(ComplexType element) { + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof Rename) { + Rename rule = (Rename)e.getValue(); + Object ref = rule.getElementOrComplexTypeOrAttribute().get(0); + if (!(ref instanceof org.simantics.xml.sax.configuration.ComplexType)) + continue; + org.simantics.xml.sax.configuration.ComplexType element2 = (org.simantics.xml.sax.configuration.ComplexType)ref; + if (element2.getName().equals(element.getName())) { + return rule; + } + } + } + return null; + } + + public Rename getRename(Element element) { + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof Rename) { + Rename rule = (Rename)e.getValue(); + Object ref = rule.getElementOrComplexTypeOrAttribute().get(0); + if (!(ref instanceof org.simantics.xml.sax.configuration.Element)) + continue; + org.simantics.xml.sax.configuration.Element element2 = (org.simantics.xml.sax.configuration.Element)ref; + if (element2.getName().equals(element.getName())) { + return rule; + } + } + } + return null; + } + + + public boolean useOriginalList(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String ref, QName refType) { + if (parent.getName() == null) + parent = parent.getParent(); + if (parent.getName().contains("PipingNetworkSegment")) + System.out.println(); + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof OrderedChild) { + OrderedChild oc = (OrderedChild)e.getValue(); + org.simantics.xml.sax.configuration.Element element2 = oc.getElement(); + org.simantics.xml.sax.configuration.ComplexType complexType = oc.getComplexType(); + org.simantics.xml.sax.configuration.Element child = oc.getChild(); + if (!oc.getType().equals("original")) + continue; + boolean match = false; + if (element2 != null) { + if (parent.getType() == ObjectType.ELEMENT && parent.getName().equals(element2.getName())) { + match = true; + } + } else if (complexType != null) { + if (parent.getType() == ObjectType.COMPLEX_TYPE && parent.getName() != null && parent.getName().equals(complexType.getName())) { + match = true; + } + + } + if (match) { + if (child != null) { + if (matchChild(child, ref, refType)) { + if (oc.getValue().equals("disable")) + return false; + else return true; + } + } else { + if (oc.getValue().equals("disable")) + return false; + return true; + } + + } + } + } + return indicator.order(); + } + + public boolean useElementList(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, QName refType) { + if (parent.getName() == null) + parent = parent.getParent(); + if (parent.getName() == "PipingNetworkSegment") + System.out.println(); + for (JAXBElement e : configuration.getConversionRule()) { + if (e.getValue() instanceof OrderedChild) { + OrderedChild oc = (OrderedChild)e.getValue(); + org.simantics.xml.sax.configuration.Element element2 = oc.getElement(); + org.simantics.xml.sax.configuration.ComplexType complexType = oc.getComplexType(); + org.simantics.xml.sax.configuration.Element child = oc.getChild(); + if (!oc.getType().equals("child")) + continue; + boolean match = false; + if (element2 != null) { + if (parent.getType() == ObjectType.ELEMENT && parent.getName().equals(element2.getName())) { + match = true; + } + } else if (complexType != null) { + if (parent.getType() == ObjectType.COMPLEX_TYPE && parent.getName() != null && parent.getName().equals(complexType.getName())) { + match = true; + } + + } + if (match) { + if (child != null) { + if (matchChild(child, refName, refType)) { + if (oc.getValue().equals("disable")) + return false; + else return true; + } + } else { + if (oc.getValue().equals("disable")) + return false; + return true; + } + + } + } + } + return element.many() && element.order(); + } + + private boolean matchChild(org.simantics.xml.sax.configuration.Element child, String refName, QName refType) { + if (refType != null && refType.getLocalPart().equals(child.getName())) + return true; + if (refName != null && refName.equals(child.getName())) + return true; + return false; + } + + public static class TypeEntry { + String l0Type; + String binding; + String javaType; + String defaultValue; + boolean id; + String getterPrefix; + String getterPostfix; + String stringPrefix; + String stringPostfix; + public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix) { + super(); + this.l0Type = l0Type; + this.binding = binding; + this.javaType = javaType; + this.defaultValue = defaultValue; + this.id = false; + this.getterPrefix = getterPrefix; + this.getterPostfix = getterPostfix; + this.stringPrefix = stringPrefix; + this.stringPostfix = stringPostfix; + } + + public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix, boolean id) { + super(); + this.l0Type = l0Type; + this.binding = binding; + this.javaType = javaType; + this.defaultValue = defaultValue; + this.id = id; + this.getterPrefix = getterPrefix; + this.getterPostfix = getterPostfix; + this.stringPrefix = stringPrefix; + this.stringPostfix = stringPostfix; + } + + public String getValueGetterMethod(String name) { + return getterPrefix + name + ".getValue()"+getterPostfix; + } + public String getValueGetter(String name) { + return getterPrefix + name+getterPostfix; + } + public String getValueGetter() + { + return getValueGetter("value"); + } + + public String getToString(String name) { + return stringPrefix +"("+javaType+")"+name+stringPostfix; + } + + public String getElementToString(String name) { + return stringPrefix + name+stringPostfix; + } + + } + + public enum InheritanceType{ComplexType,AtomicType,None}; + + public static class Inheritance { + public String baseClass; + public InheritanceType type; + public TypeEntry atomicType; + + public Inheritance(String baseClass) { + this.baseClass = baseClass; + this.type = InheritanceType.None; + } + } + + public String getComplexTypePrefix() { + return component.getComplexTypePrefix(); + } + public String getAttributeGroupPrefix() { + return component.getAttributeGroupPrefix(); + } + public String getName(SchemaObject obj) { + return component.getName(obj); + } + public String getBaseClass(ObjectType type) { + return component.getBaseClass(type); + } + + + + public Inheritance getInheritance(SchemaObject topLevelObj) { + Inheritance inheritance = null; + if (topLevelObj.getType() == ObjectType.ELEMENT) { + Element topLevelElement = topLevelObj.getElement(); + inheritance = new Inheritance(getBaseClass(ObjectType.ELEMENT)); + if (topLevelElement.getType() != null) { + QName type = topLevelElement.getType(); + if (!type.getNamespaceURI().equals(SCHEMA_NS)) { + SchemaObject obj = complexTypeName.get(type.getLocalPart()); + // if (obj == null) + // obj = simpleTypeName.get(type.getLocalPart()); + if (obj != null) { + inheritance.baseClass = getName(obj); + inheritance.type = InheritanceType.ComplexType; + } + } else { + TypeEntry entry = getTypeEntry(type); + if (entry != null) { + inheritance.type = InheritanceType.AtomicType; + inheritance.atomicType = entry; + } + } + } + if (inheritance.type == InheritanceType.None) { + QName type = getElementBase(topLevelElement); + if (type != null) { + if (!type.getNamespaceURI().equals(SCHEMA_NS)) { + SchemaObject obj = getWithName(type); + inheritance.baseClass = getName(obj); + inheritance.type = InheritanceType.ComplexType; + } else { + TypeEntry entry = getTypeEntry(type); + if (entry != null) { + inheritance.type = InheritanceType.AtomicType; + inheritance.atomicType = entry; + } + } + } + } + if (inheritance.type == InheritanceType.None) { + QName type = topLevelElement.getSubstitutionGroup(); + if (type != null) { + if (!type.getNamespaceURI().equals(SCHEMA_NS)) { + SchemaObject obj = getWithName(type); + inheritance.baseClass = getName(obj); + inheritance.type = InheritanceType.ComplexType; + } else { + TypeEntry entry = getTypeEntry(type); + if (entry != null) { + inheritance.type = InheritanceType.AtomicType; + inheritance.atomicType = entry; + } + } + } + } + } else if (topLevelObj.getType() == ObjectType.COMPLEX_TYPE) { + ComplexType complexType = topLevelObj.getComplexType(); + QName type = getComplexTypeBase(complexType); + inheritance = new Inheritance(getBaseClass(ObjectType.COMPLEX_TYPE)); + if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) { + SchemaObject obj = complexTypeName.get(type.getLocalPart()); + if (obj != null) { + inheritance.baseClass = getName(obj); + inheritance.type = InheritanceType.ComplexType; + } + } + SimpleContent simpleContent = complexType.getSimpleContent(); + if (simpleContent != null) { + ExtensionType extensionType = simpleContent.getExtension(); + if (extensionType != null) { + type = extensionType.getBase(); + getAtomicTypeInheritance(type, inheritance); + } + } + } + + return inheritance; + } + /** + * Goes through chain of SimpleTypes until locates Atomic Type (type defined in XML schema). + * @param type + * @param topLevelObj + * @param inheritance + */ + public void getAtomicTypeInheritance(QName type, Inheritance inheritance) { + if (!type.getNamespaceURI().equals(SCHEMA_NS)) { + SchemaObject obj = getWithName(type); + if (obj.getType() != ObjectType.SIMPLE_TYPE) + throw new RuntimeException("SimpleContent does not use SimpleType definition"); + SimpleType simpleType = obj.getSimpleType(); + type = getSimpleTypeBase(simpleType); + getAtomicTypeInheritance(type, inheritance); + } else { + TypeEntry entry = getTypeEntry(type); + if (entry != null) { + inheritance.type = InheritanceType.AtomicType; + inheritance.atomicType = entry; + } + } + } + + public String getDefaultValue(QName atype) { + Map types = typeMap.get(atype.getNamespaceURI()); + if (types == null) + return null; + TypeEntry entry = types.get(atype.getLocalPart()); + if (entry == null) + return null; + return entry.defaultValue; + } + +} diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConverter.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConverter.java index ed11c14..1b2b372 100644 --- a/org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConverter.java +++ b/org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConverter.java @@ -1,323 +1,342 @@ -package org.simantics.xml.sax; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - -import org.simantics.utils.datastructures.MapList; -import org.simantics.xml.sax.configuration.Configuration; -import org.w3._2001.xmlschema.Annotation; -import org.w3._2001.xmlschema.Import; -import org.w3._2001.xmlschema.Include; -import org.w3._2001.xmlschema.OpenAttrs; -import org.w3._2001.xmlschema.Schema; - -/** - * This file is developed for XMpLant / Proteus schema conversion is not able to handle all XML Schema definitions. - * - * @author mlmarko - * - */ -public class SchemaConverter { - - File outputPlugin; - File schemaFile; - File conversionFile; - File ontologyFile; - File parserDir; - Schema schema; - Configuration configuration; - - String pluginName; - - private String[] header; - - boolean createPGraph = true; - boolean createImporter = true; - boolean createExporter = true; - - private List parent = new ArrayList<>(); - private List subConverters = new ArrayList<>(); - private Map fileMap; - private MapList schemaNSMap; - private MapList shortNameMap; - - String schemaNs; - String ontologyUri; - String className; - String name; - String shortName; - - SchemaConversionBase base; - - private ManualSchemaFileImport fileImport; - - public SchemaConverter(File schemaFile, File conversionFile, File outputPlugin) throws IOException { - this(null,schemaFile,conversionFile,outputPlugin); - } - - public SchemaConverter(SchemaConverter parent,File schemaFile, File conversionFile, File outputPlugin) throws IOException { - - this.outputPlugin = outputPlugin; - this.schemaFile = schemaFile; - this.conversionFile = conversionFile; - - pluginName = outputPlugin.getName(); - String packageParts[] = pluginName.split("\\."); - String outputLoc = outputPlugin.getAbsolutePath(); - outputLoc += "/src"; - for (String s : packageParts) - outputLoc += "/"+s; - String outputGraph = outputPlugin.getAbsolutePath(); - outputGraph += "/graph"; - outputGraph += "/" + schemaFile.getName().substring(0, schemaFile.getName().length()-4) +".pgraph"; - - - this.ontologyFile = new File(outputGraph); - this.parserDir = new File(outputLoc); - - if (parent != null) { - this.parent.add(parent); - parent.subConverters.add(this); - } else { - fileMap = new HashMap<>(); - schemaNSMap = new MapList<>(); - shortNameMap = new MapList<>(); - } - getRoot().fileMap.put(schemaFile.getAbsolutePath(), this); - } - - public List getConverter(String schemaNS) { - return getRoot().schemaNSMap.getValues(schemaNS); - } - - public void setFileImport(ManualSchemaFileImport fileImport) { - this.fileImport = fileImport; - } - - - public void setCreateExporter(boolean createExporter) { - this.createExporter = createExporter; - } - - public void setCreateImporter(boolean createImporter) { - this.createImporter = createImporter; - } - - public void setCreatePGraph(boolean createPGraph) { - this.createPGraph = createPGraph; - } - - protected SchemaConverter createSubConverter(String location) throws JAXBException, IOException { - File directory = schemaFile.getParentFile(); - File schemaFile = new File(directory.getAbsolutePath()+File.separator+location); - if (!schemaFile.exists()) { - if (getRoot().fileImport != null) { - schemaFile = getRoot().fileImport.getFileForLocation(location); - } - if (!schemaFile.exists()) - throw new FileNotFoundException(schemaFile.getAbsolutePath()); - } - SchemaConverter subConverter = getRoot().fileMap.get((schemaFile.getAbsolutePath())); - if (subConverter == null) { - subConverter = new SchemaConverter(this,schemaFile, conversionFile, outputPlugin); - subConverter.createPGraph = this.createPGraph; - subConverter.createImporter = this.createImporter; - subConverter.createExporter = this.createExporter; - } else { - subConverter.parent.add(this); - } - return subConverter; - } - - protected SchemaConverter getRoot() { - SchemaConverter s = this; - while (s.parent.size() > 0) - s = s.parent.get(0); - return s; - } - - public void convert() throws JAXBException, IOException { - - init(); - doConvert(); - } - - boolean init = false; - - protected void assignShortName() { - shortName = name.substring(0, 3).toUpperCase(); - SchemaConverter root = getRoot(); - if (!root.shortNameMap.containsKey(shortName)) { - root.shortNameMap.add(shortName, this); - return; - } else { - SchemaConverter sc = root.shortNameMap.getValues(shortName).get(0); - if (sc.schemaNs.equals(schemaNs)) { - root.shortNameMap.add(shortName, this); - return; - } - } - int i = 1; - while (true) { - String n = shortName+i; - if (!root.shortNameMap.containsKey(n)) { - shortName = n; - root.shortNameMap.add(shortName, this); - return; - } else { - SchemaConverter sc = root.shortNameMap.getValues(n).get(0); - if (sc.schemaNs.equals(schemaNs)) { - shortName = n; - root.shortNameMap.add(shortName, this); - return; - } - } - i++; - } - } - - protected void init() throws IOException, JAXBException { - if (init) - return; - init = true; - JAXBContext jc = JAXBContext.newInstance("org.w3._2001.xmlschema"); - Unmarshaller u = jc.createUnmarshaller(); - //u.setSchema(schema); - InputStream fileStream = new FileInputStream(schemaFile); - schema = (Schema)u.unmarshal(fileStream); - - if (conversionFile != null) { - jc = JAXBContext.newInstance("org.simantics.xml.sax.configuration"); - u = jc.createUnmarshaller(); - fileStream = new FileInputStream(conversionFile); - configuration = (Configuration)((JAXBElement)u.unmarshal(fileStream)).getValue(); - } else { - configuration = new Configuration(); - } - - header = new String[4]; - header[0] = "Generated with org.simantics.xml.sax XML schema converter"; - header[1] = ""; - header[2] = "File " + schemaFile.getAbsolutePath(); - header[3] = "Date " + new Date().toString(); - - schemaNs = schema.getTargetNamespace(); - ontologyUri = schemaNs; - if (ontologyUri == null) { - ontologyUri = getSchemaFile().getName(); - - int index = ontologyUri.lastIndexOf("."); - if (index > 0) - ontologyUri = ontologyUri.substring(0, index); - } - ontologyUri = ontologyUri.replaceAll(" ", "_"); - String parts[] = ontologyUri.split("/"); - name = parts[parts.length-1]; - name = name.replaceAll("\\.", "_"); - if (!ontologyUri.startsWith("http://")) - ontologyUri = "http://" + ontologyUri.replaceAll("/", "_"); - else - ontologyUri = "http://" + ontologyUri.substring("http://".length()).replaceAll("/", "_"); - - String version = schema.getVersion(); - if (version == null) - version = "1.0"; - ontologyUri +="-"+ version; - - - className = getPluginName() + "." + name; - assignShortName(); - if (schemaNs != null) - getRoot().schemaNSMap.add(schemaNs, this); - - - for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) { - if (attrs instanceof Import) { - Import imp = (Import)attrs; - String location = imp.getSchemaLocation(); - SchemaConverter sc = createSubConverter(location); - sc.init(); - } else if (attrs instanceof Include) { - Include inc = (Include)attrs; - String location = inc.getSchemaLocation(); - SchemaConverter sc = createSubConverter(location); - sc.init(); - } else if (attrs instanceof Annotation) { - - } else { - throw new IOException("Cannot handle schema file " + schemaFile.getName() + ", the schema uses redefine elements."); - } - } - } - - protected void doConvert() throws IOException, JAXBException { - if (!ontologyFile.exists()) { - ontologyFile.getParentFile().mkdirs(); - ontologyFile.createNewFile(); - } - if (!parserDir.exists()) - parserDir.mkdirs(); - - for (SchemaConverter sc : subConverters) - sc.doConvert(); - - base = new SchemaConversionBase(this,ontologyUri,className); - base.init(schema); - - if (createPGraph) { - OntologyGenerator ontologyGenerator = new OntologyGenerator(this,base); - ontologyGenerator.createOntology(); - } - if (createImporter) { - ImporterGenerator importerGenerator = new ImporterGenerator(this,base); - importerGenerator.createParser(); - } - if (createExporter) { - ExporterGenerator exporterGenerator = new ExporterGenerator(this,base); - exporterGenerator.createParser(); - } - base.component = null; - } - - public File getOntologyFile() { - return ontologyFile; - } - public File getParserDir() { - return parserDir; - } - - public Schema getSchema() { - return schema; - } - - public File getSchemaFile() { - return schemaFile; - } - - public String getPluginName() { - return pluginName; - } - - public String[] getHeader() { - return header; - } - - public Configuration getConfiguration() { - return configuration; - } - - -} +package org.simantics.xml.sax; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + +import org.simantics.utils.datastructures.MapList; +import org.simantics.xml.sax.configuration.Configuration; +import org.w3._2001.xmlschema.Annotation; +import org.w3._2001.xmlschema.Import; +import org.w3._2001.xmlschema.Include; +import org.w3._2001.xmlschema.OpenAttrs; +import org.w3._2001.xmlschema.Schema; + +/** + * This file is developed for XMpLant / Proteus schema conversion is not able to handle all XML Schema definitions. + * + * @author mlmarko + * + */ +public class SchemaConverter { + + File outputPlugin; + File schemaFile; + File conversionFile; + File ontologyFile; + File parserDir; + Schema schema; + Configuration configuration; + + String pluginName; + + private String[] header; + + boolean createPGraph = true; + boolean createImporter = true; + boolean createExporter = true; + + private List parent = new ArrayList<>(); + private List subConverters = new ArrayList<>(); + private Map fileMap; + private MapList schemaNSMap; + private MapList shortNameMap; + + String schemaNs; + String ontologyUri; + String className; + String name; + String shortName; + + SchemaConversionBase base; + + private ManualSchemaFileImport fileImport; + + public SchemaConverter(File schemaFile, File conversionFile, File outputPlugin) throws IOException { + this(null,schemaFile,conversionFile,outputPlugin); + } + + public SchemaConverter(SchemaConverter parent,File schemaFile, File conversionFile, File outputPlugin) throws IOException { + + this.outputPlugin = outputPlugin; + this.schemaFile = schemaFile; + this.conversionFile = conversionFile; + + pluginName = outputPlugin.getName(); + String packageParts[] = pluginName.split("\\."); + String outputLoc = outputPlugin.getAbsolutePath(); + outputLoc += "/src"; + for (String s : packageParts) + outputLoc += "/"+s; + String outputGraph = outputPlugin.getAbsolutePath(); + outputGraph += "/graph"; + outputGraph += "/" + schemaFile.getName().substring(0, schemaFile.getName().length()-4) +".pgraph"; + + + this.ontologyFile = new File(outputGraph); + this.parserDir = new File(outputLoc); + + if (parent != null) { + this.parent.add(parent); + parent.subConverters.add(this); + } else { + fileMap = new HashMap<>(); + schemaNSMap = new MapList<>(); + shortNameMap = new MapList<>(); + } + getRoot().fileMap.put(schemaFile.getAbsolutePath(), this); + } + + public List getConverter(String schemaNS) { + return getRoot().schemaNSMap.getValues(schemaNS); + } + + public void setFileImport(ManualSchemaFileImport fileImport) { + this.fileImport = fileImport; + } + + + public void setCreateExporter(boolean createExporter) { + this.createExporter = createExporter; + } + + public void setCreateImporter(boolean createImporter) { + this.createImporter = createImporter; + } + + public void setCreatePGraph(boolean createPGraph) { + this.createPGraph = createPGraph; + } + + protected SchemaConverter createSubConverter(String location) throws JAXBException, IOException { + File directory = schemaFile.getParentFile(); + File schemaFile = new File(directory.getAbsolutePath()+File.separator+location); + if (!schemaFile.exists()) { + if (getRoot().fileImport != null) { + schemaFile = getRoot().fileImport.getFileForLocation(location); + } + if (!schemaFile.exists()) + throw new FileNotFoundException(schemaFile.getAbsolutePath()); + } + SchemaConverter subConverter = getRoot().fileMap.get((schemaFile.getAbsolutePath())); + if (subConverter == null) { + subConverter = new SchemaConverter(this,schemaFile, conversionFile, outputPlugin); + subConverter.createPGraph = this.createPGraph; + subConverter.createImporter = this.createImporter; + subConverter.createExporter = this.createExporter; + } else { + subConverter.parent.add(this); + } + return subConverter; + } + + protected SchemaConverter getRoot() { + SchemaConverter s = this; + if (s.fileMap != null) + return s; + while (s.parent.size() > 0) { + s = s.parent.get(0); + if (s.fileMap != null) + return s; + } + return s; + } + + public void convert() throws JAXBException, IOException { + + init(); + doConvert(); + } + + boolean init = false; + + protected void assignShortName() { + shortName = name.substring(0, 3).toUpperCase(); + SchemaConverter root = getRoot(); + if (!root.shortNameMap.containsKey(shortName)) { + root.shortNameMap.add(shortName, this); + return; + } else { + SchemaConverter sc = root.shortNameMap.getValues(shortName).get(0); + if (sc.schemaNs.equals(schemaNs)) { + root.shortNameMap.add(shortName, this); + return; + } + } + int i = 1; + while (true) { + String n = shortName+i; + if (!root.shortNameMap.containsKey(n)) { + shortName = n; + root.shortNameMap.add(shortName, this); + return; + } else { + SchemaConverter sc = root.shortNameMap.getValues(n).get(0); + if (sc.schemaNs.equals(schemaNs)) { + shortName = n; + root.shortNameMap.add(shortName, this); + return; + } + } + i++; + } + } + + protected void init() throws IOException, JAXBException { + if (init) + return; + init = true; + JAXBContext jc = JAXBContext.newInstance("org.w3._2001.xmlschema"); + Unmarshaller u = jc.createUnmarshaller(); + //u.setSchema(schema); + InputStream fileStream = new FileInputStream(schemaFile); + schema = (Schema)u.unmarshal(fileStream); + + if (conversionFile != null) { + jc = JAXBContext.newInstance("org.simantics.xml.sax.configuration"); + u = jc.createUnmarshaller(); + fileStream = new FileInputStream(conversionFile); + configuration = (Configuration)((JAXBElement)u.unmarshal(fileStream)).getValue(); + } else { + configuration = new Configuration(); + } + + header = new String[4]; + header[0] = "Generated with org.simantics.xml.sax XML schema converter"; + header[1] = ""; + header[2] = "File " + schemaFile.getAbsolutePath().replaceAll(Matcher.quoteReplacement("\\"), "/"); + header[3] = "Date " + new Date().toString(); + + schemaNs = schema.getTargetNamespace(); + ontologyUri = schemaNs; + if (ontologyUri == null) { + ontologyUri = getSchemaFile().getName(); + + int index = ontologyUri.lastIndexOf("."); + if (index > 0) + ontologyUri = ontologyUri.substring(0, index); + } + ontologyUri = ontologyUri.replaceAll(" ", "_"); + String parts[] = ontologyUri.split("/"); + for (int i = parts.length-1; i >= 0; i--) { + name = parts[i]; + if (!Character.isDigit(name.charAt(0))) + break; + } + if (name == null) { + throw new JAXBException("Could not resolve proper name for schema " + ontologyUri); + } + + + name = name.replaceAll("\\.", "_"); + if (!ontologyUri.startsWith("http://")) + ontologyUri = "http://" + ontologyUri.replaceAll("/", "_"); + else + ontologyUri = "http://" + ontologyUri.substring("http://".length()).replaceAll("/", "_"); + + String version = schema.getVersion(); + if (version == null) + version = "1.0"; + ontologyUri +="-"+ version; + + + className = getPluginName() + "." + name; + assignShortName(); + if (schemaNs != null) + getRoot().schemaNSMap.add(schemaNs, this); + + + for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) { + if (attrs instanceof Import) { + Import imp = (Import)attrs; + String location = imp.getSchemaLocation(); + SchemaConverter sc = createSubConverter(location); + sc.init(); + } else if (attrs instanceof Include) { + Include inc = (Include)attrs; + String location = inc.getSchemaLocation(); + SchemaConverter sc = createSubConverter(location); + sc.init(); + } else if (attrs instanceof Annotation) { + + } else { + throw new IOException("Cannot handle schema file " + schemaFile.getName() + ", the schema uses redefine elements."); + } + } + } + + protected void doConvert() throws IOException, JAXBException { + if (!ontologyFile.exists()) { + ontologyFile.getParentFile().mkdirs(); + ontologyFile.createNewFile(); + } + if (!parserDir.exists()) + parserDir.mkdirs(); + + for (SchemaConverter sc : subConverters) + sc.doConvert(); + + base = new SchemaConversionBase(this,ontologyUri,className); + base.init(schema); + + if (createPGraph) { + OntologyGenerator ontologyGenerator = new OntologyGenerator(this,base); + ontologyGenerator.createOntology(); + } + if (createImporter) { + ImporterGenerator importerGenerator = new ImporterGenerator(this,base); + importerGenerator.createParser(); + } + if (createExporter) { + ExporterGenerator exporterGenerator = new ExporterGenerator(this,base); + exporterGenerator.createParser(); + } + base.component = null; + } + + public File getOntologyFile() { + return ontologyFile; + } + public File getParserDir() { + return parserDir; + } + + public Schema getSchema() { + return schema; + } + + public File getSchemaFile() { + return schemaFile; + } + + public String getPluginName() { + return pluginName; + } + + public String[] getHeader() { + return header; + } + + public Configuration getConfiguration() { + return configuration; + } + + public boolean isPrimary() { + return getRoot().schemaNSMap.getValues(schemaNs).indexOf(this) == 0; + } + + +} -- 2.45.2