X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.xml.sax%2Fsrc%2Forg%2Fsimantics%2Fxml%2Fsax%2FJavaGenerator.java;h=af97d82162959571c84e6edb7a5e0409095bf0c9;hb=fc60d91049c46ee5b6107da4d4c54eada4a9f21c;hp=dfcdfd3d7b78e1afbe903dc7e06cb1b969058db8;hpb=90d821c64af7690fe7e108c3f5b89da8fa5395fc;p=simantics%2Finterop.git diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java index dfcdfd3..af97d82 100644 --- a/org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java +++ b/org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java @@ -1,286 +1,324 @@ -package org.simantics.xml.sax; - -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.namespace.QName; - -import org.simantics.xml.sax.configuration.Configuration; -import org.w3._2001.xmlschema.AttributeGroupRef; -import org.w3._2001.xmlschema.Element; -import org.w3._2001.xmlschema.Schema; - -public abstract class JavaGenerator extends SchemaConversionBase{ - - String commentTag = "//"; - - Schema schema; - String ontologyClassName; - SchemaConverter converter; - - List ruleClassNames = new ArrayList(); - - String ontShort = "ONT"; - - File importParserDir; - String elementPackageName; - - Map writers = new HashMap(); - - public JavaGenerator(Configuration configuration) { - super(configuration); - } - - - protected PrintWriter createFile(File file) throws IOException { - if (!file.exists()) - file.createNewFile(); - PrintWriter writer = new PrintWriter(file); - for (String s : converter.getHeader()) { - writer.println(commentTag + " " + s); - } - writer.println(); - return writer; - } - - protected String getValueGetterMethod(TypeEntry binding,String name) { - if (binding == null) - return name+".getValue()"; - return binding.getValueGetterMethod(name); - } - - protected String getValueGetter(TypeEntry binding,String name) { - if (binding == null) - return name; - return binding.getValueGetter(name); - } - protected String getValueGetter(TypeEntry binding) { - if (binding == null) - return "value"; - return binding.getValueGetter(); - } - - public String getComplexTypePrefix() { - return "ComplexTypes_"; - } - - public String getAttributeGroupPrefix() { - return "AttributeGroups_"; - } - - @Override - protected void handle(SchemaObject parent, SchemaElement indicator, List elements) { - if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) { - for (SchemaElement e : elements) { - handle(parent, indicator, e); - } - } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) { - String name = getChoiceName(elements); - - for (SchemaElement e : elements) { - Element localElement = e.getElement(); - if (localElement.getName() != null) { - QName refType = localElement.getType(); - if (refType != null) - //handleIndicator(parent, indicator, e, false, name, refType); - handleIndicator(parent, indicator, e, name, RefType.Type); - } else if (localElement.getRef() != null) { - //QName refType = localElement.getRef(); - //handleIndicator(parent, indicator, e, true, name, refType); - handleIndicator(parent, indicator, e, name, RefType.Reference); - } - } - } - - } - - protected String getOntologyImport() { - return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);"; - } - - protected static class FileWriter { - public PrintWriter writer; - - public PrintWriter delayedWriter; - public PrintWriter delayedWriter2; - } - - protected FileWriter getWriter(SchemaObject obj) { - SchemaObject s = obj; - while (s != null) { - FileWriter fw = writers.get(s); - if (fw != null) - return fw; - s = s.getParent(); - } - return null; - } - - - public String getName(SchemaObject obj) { - if (obj.getParent() == null) { - switch (obj.getType()) { - case COMPLEX_TYPE: - return getComplexTypePrefix()+obj.getName(); - case ELEMENT: - return obj.getName(); - case ATTRIBUTE_GROUP: - return getAttributeGroupPrefix()+obj.getName(); - case SIMPLE_TYPE: - return obj.getName(); - } - } else { - SchemaObject o = obj; - SchemaObject prev = null; - String name = ""; - while (o != null){ - if (o.getName() != null) - name = o.getName()+"_"+name; - prev = o; - o = o.getParent(); - if (prev.getObj() instanceof AttributeGroupRef) - o = null; - } - name = name.substring(0, name.length()-1); - switch (prev.getType()) { - case COMPLEX_TYPE: - return getComplexTypePrefix()+name; - case ELEMENT: - return name; - case ATTRIBUTE_GROUP: - return getAttributeGroupPrefix()+name; - case SIMPLE_TYPE: - return name; - } - } - throw new RuntimeException(); - - } - - public String getName(SchemaObject obj, String rel) { - if (obj.getParent() == null) { - switch (obj.getType()) { - case COMPLEX_TYPE: - return getComplexTypePrefix()+rel+obj.getName(); - case ELEMENT: - return rel+obj.getName(); - case ATTRIBUTE_GROUP: - return getAttributeGroupPrefix()+rel+obj.getName(); - case SIMPLE_TYPE: - return rel+obj.getName(); - } - } else { - SchemaObject o = obj; - SchemaObject prev = null; - String name = ""; - while (o != null){ - if (o.getName() != null) - name = o.getName()+"_"+name; - prev = o; - o = o.getParent(); - } - name = name.substring(0, name.length()-1); - switch (prev.getType()) { - case COMPLEX_TYPE: - return getComplexTypePrefix()+rel+name; - case ELEMENT: - return rel+name; - case ATTRIBUTE_GROUP: - return getAttributeGroupPrefix()+rel+name; - case SIMPLE_TYPE: - return rel+name; - } - } - throw new RuntimeException(); - } - - - - protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List interfaces) { - writer.println("@SuppressWarnings(\"unused\")"); - writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass); - if (interfaces.size() > 0) { - writer.print(" implements "); - for (int i = 0; i < interfaces.size(); i++) { - writer.print(interfaces.get(i)); - if (i < interfaces.size() -1 ) - writer.print(","); - } - } - writer.println("{"); - writer.println(); - writer.println(" @Override"); - writer.println(" public java.lang.String getElementId() {"); - if (elementId != null) - writer.println(" return \""+elementId+"\";"); - else // complex types cannot be parsed directly with name/id reference. - writer.println(" return null;"); - writer.println(" }"); - writer.println(); - } - - protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList); - protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, String binding); - protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList); - - @Override - protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType) { - String objectName; - if (referenceType != RefType.Element) { - QName refType; - if (referenceType == RefType.Type) { - refType = element.getElement().getType(); - if (refName == null) - refName = element.getElement().getName(); - objectName = element.getElement().getName(); - } else { - refType = element.getElement().getRef(); - if (refName == null) - refName = refType.getLocalPart(); - objectName = refType.getLocalPart(); - } - - String binding = getBindingFromPrimitiveType(refType); - if (binding == null) { - SchemaObject refElement = elementName.get(refType.getLocalPart()); - SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart()); - - // prefer element reference over complex type reference - String primaryClassName = null; - String secondaryClassName = null; - if (refElement != null) - primaryClassName = getName(refElement); - else - primaryClassName = getName(refComplexType); - - if (refComplexType != null) { - secondaryClassName = getName(refComplexType); - } else { - secondaryClassName = getName(refElement); - } - boolean useElementList = useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refType); - boolean useOriginalList = useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refType); - createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList); - } else { - createPrimitiveIndicator(parent, refName, binding); - } - } else { - Element attrs= element.getElement(); - SchemaObject obj = getWithObj(parent, attrs); - - String className = getName(obj); - if (refName == null) - refName = attrs.getName(); - - boolean useElementList = useElementList(parent, indicator,element, false, refName, new QName(obj.getName())); - boolean useOriginalList = useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName())); - createElementIndicator(parent, useElementList, refName, className, useOriginalList); - } - } - -} +package org.simantics.xml.sax; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.namespace.QName; + +import org.simantics.xml.sax.SchemaConversionBase.Inheritance; +import org.simantics.xml.sax.SchemaConversionBase.RefType; +import org.simantics.xml.sax.SchemaConversionBase.TypeEntry; +import org.w3._2001.xmlschema.AttributeGroupRef; +import org.w3._2001.xmlschema.Element; +import org.w3._2001.xmlschema.Schema; + +//public abstract class JavaGenerator extends SchemaConversionBase{ +public abstract class JavaGenerator implements SchemaConversionComponent { + + String commentTag = "//"; + + Schema schema; + String ontologyClassName; + String ontologyUri; + SchemaConverter converter; + SchemaConversionBase base; + + List ruleClassNames = new ArrayList(); + + String ontShort = "ONT"; + String name; + + File importParserDir; + String elementPackageName; + + Map writers = new HashMap(); + + public JavaGenerator(SchemaConverter converter, SchemaConversionBase base) { + this.converter = converter; + this.base = base; + + this.schema = base.schema; + this.ontologyClassName = base.className; + this.ontologyUri = base.ontologyURI; + this.converter = converter; + this.name = converter.name; + ontShort = converter.shortName; + ontShort +="."; + elementPackageName = name+getPackagePostFix(); + } + + public String getElementPackageName() { + return elementPackageName; + } + + + protected PrintWriter createFile(File file) throws IOException { + if (!file.exists()) + file.createNewFile(); + PrintWriter writer = new PrintWriter(file); + for (String s : converter.getHeader()) { + writer.println(commentTag + " " + s); + } + writer.println(); + return writer; + } + + protected String getValueGetterMethod(TypeEntry binding,String name) { + if (binding == null) + return name+".getValue()"; + return binding.getValueGetterMethod(name); + } + + protected String getValueGetter(TypeEntry binding,String name) { + if (binding == null) + return name; + return binding.getValueGetter(name); + } + + protected String getValueGetter(TypeEntry binding) { + if (binding == null) + return "value"; + return binding.getValueGetter(); + } + + @Override + public String getSimpleTypePrefix() { + return "SimpleTypes_"; + } + + @Override + public String getComplexTypePrefix() { + return "ComplexTypes_"; + } + + @Override + public String getAttributeGroupPrefix() { + return "AttributeGroups_"; + } + + @Override + public String handleChoice(SchemaObject parent, SchemaElement indicator, List elements, String name) { + String baseRelationName = getName(parent) + ".has" + name; + +// for (SchemaElement e : elements) { +// Element localElement = e.getElement(); +// if (localElement.getName() != null) { +// QName refType = localElement.getType(); +// if (refType != null) +// //handleIndicator(parent, indicator, e, false, name, refType); +// handleIndicator(parent, indicator, e, name, RefType.Type, baseRelationName); +// } else if (localElement.getRef() != null) { +// //QName refType = localElement.getRef(); +// //handleIndicator(parent, indicator, e, true, name, refType); +// handleIndicator(parent, indicator, e, name, RefType.Reference, baseRelationName); +// } +// } + + return baseRelationName; + } + + protected String getOntologyImport() { + return this.ontologyClassName+" " +ontShort.substring(0,ontShort.length()-1)+" = "+this.ontologyClassName+".getInstance(graph);"; + } + + protected static class FileWriter { + public PrintWriter writer; + + public PrintWriter delayedWriter; + public PrintWriter delayedWriter2; + } + + protected FileWriter getWriter(SchemaObject obj) { + SchemaObject s = obj; + while (s != null) { + FileWriter fw = writers.get(s); + if (fw != null) + return fw; + s = s.getParent(); + } + return null; + } + + @Override + public String getName(SchemaObject obj) { + if (obj.getParent() == null) { + switch (obj.getType()) { + case COMPLEX_TYPE: + return getComplexTypePrefix()+obj.getName(); + case ELEMENT: + return obj.getName(); + case ATTRIBUTE_GROUP: + return getAttributeGroupPrefix()+obj.getName(); + case SIMPLE_TYPE: + return getSimpleTypePrefix()+obj.getName(); + } + } else { + SchemaObject o = obj; + SchemaObject prev = null; + String name = ""; + while (o != null){ + if (o.getName() != null) + name = o.getName()+"_"+name; + prev = o; + o = o.getParent(); + if (prev.getObj() instanceof AttributeGroupRef) + o = null; + } + name = name.substring(0, name.length()-1); + switch (prev.getType()) { + case COMPLEX_TYPE: + return getComplexTypePrefix()+name; + case ELEMENT: + return name; + case ATTRIBUTE_GROUP: + return getAttributeGroupPrefix()+name; + case SIMPLE_TYPE: + return getSimpleTypePrefix()+name; + } + } + throw new RuntimeException(); + } + + public String getName(SchemaObject obj, String rel) { + if (obj.getParent() == null) { + switch (obj.getType()) { + case COMPLEX_TYPE: + return getComplexTypePrefix()+rel+obj.getName(); + case ELEMENT: + return rel+obj.getName(); + case ATTRIBUTE_GROUP: + return getAttributeGroupPrefix()+rel+obj.getName(); + case SIMPLE_TYPE: + return getSimpleTypePrefix()+rel+obj.getName(); + } + } else { + SchemaObject o = obj; + SchemaObject prev = null; + String name = ""; + while (o != null){ + if (o.getName() != null) + name = o.getName()+"_"+name; + prev = o; + o = o.getParent(); + } + name = name.substring(0, name.length()-1); + switch (prev.getType()) { + case COMPLEX_TYPE: + return getComplexTypePrefix()+rel+name; + case ELEMENT: + return rel+name; + case ATTRIBUTE_GROUP: + return getAttributeGroupPrefix()+rel+name; + case SIMPLE_TYPE: + return getSimpleTypePrefix()+rel+name; + } + } + throw new RuntimeException(); + } + + + + protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List interfaces) { + writer.println("@SuppressWarnings(\"unused\")"); + writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass); + if (interfaces.size() > 0) { + writer.print(" implements "); + for (int i = 0; i < interfaces.size(); i++) { + writer.print(interfaces.get(i)); + if (i < interfaces.size() -1 ) + writer.print(","); + } + } + writer.println("{"); + writer.println(); + writer.println(" @Override"); + writer.println(" public java.lang.String getElementId() {"); + if (elementId != null) + writer.println(" return \""+elementId+"\";"); + else // complex types cannot be parsed directly with name/id reference. + writer.println(" return null;"); + writer.println(" }"); + writer.println(); + } + + + protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList); + protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName); + protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList); + + protected abstract String getPackagePostFix(); + @Override + public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType, String baseRelationName) { + String objectName; + if (referenceType != RefType.Element) { + QName refTypeName; + SchemaObject refObject = null; + if (referenceType == RefType.Type) { + refTypeName = element.getElement().getType(); + if (refName == null) + refName = base.getName(element.getElement()); + objectName = base.getName(element.getElement()); + refObject = this.base.getComplexType(refTypeName); + if (refObject == null) this.base.getSimpleType(refTypeName); + } else { + refTypeName = element.getElement().getRef(); + if (refName == null) + refName = base.getName(refTypeName); + objectName = refTypeName.getLocalPart(); + refObject = this.base.getElement(refTypeName); + } + + TypeEntry typeEntry = this.base.getTypeEntry(refTypeName); + if (typeEntry == null) { + // prefer element reference over complex type reference + String primaryClassName = null; + String secondaryClassName = null; + if (refObject != null) { + primaryClassName = getName(refObject); + if (refObject.getSc() != base) { + SchemaConverter con = refObject.getSc().converter; + primaryClassName = con.getPluginName() + "." + con.name +getPackagePostFix() + "." + primaryClassName; + } + } + else if (this.base.getSimpleType(refTypeName) != null) { + Inheritance inheritance = new Inheritance(""); + this.base.getAtomicTypeInheritance(refTypeName, inheritance); + if (inheritance.atomicType != null) { + createPrimitiveIndicator(parent, refName, inheritance.atomicType, refTypeName); + return; + } + else { + throw new RuntimeException("No supported atomic type found for simple type " + refTypeName.toString()); + } + } + else { + throw new RuntimeException("Type that is neither complex nor simple??"); + } + + secondaryClassName = primaryClassName; + boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName); + boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName); + createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList); + } else { + createPrimitiveIndicator(parent, refName, typeEntry, refTypeName); + } + } else { + Element attrs= element.getElement(); + SchemaObject obj = this.base.getWithObj(parent, attrs); + + String className = getName(obj); + if (refName == null) + refName = base.getName(attrs); + + boolean useElementList = this.base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName())); + boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName())); + createElementIndicator(parent, useElementList, refName, className, useOriginalList); + } + } + +}