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=4869e0711e073297f01c390aac96849dcf9d6be3;hb=04f3fb6796cd6225be090e1e1feb866ae0d03173;hp=887bd1ec34e3611ccb0d715eaa6fba71d1abc7b2;hpb=404be73748777cdd2d09b2f29308ae6f4a3d730c;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 887bd1e..4869e07 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 @@ -10,30 +10,45 @@ import java.util.Map; import javax.xml.namespace.QName; -import org.simantics.xml.sax.configuration.Configuration; +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 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(Configuration configuration) { - super(configuration); + 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 +="."; } @@ -59,44 +74,47 @@ public abstract class JavaGenerator extends SchemaConversionBase{ return name; return binding.getValueGetter(name); } + protected String getValueGetter(TypeEntry binding) { if (binding == null) return "value"; return binding.getValueGetter(); } - public static String getComplexTypePrefix() { + @Override + public String getSimpleTypePrefix() { + return "SimpleTypes_"; + } + + @Override + public String getComplexTypePrefix() { return "ComplexTypes_"; } - public static String getAttributeGroupPrefix() { + @Override + 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); - } - } - } + 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() { @@ -121,8 +139,8 @@ public abstract class JavaGenerator extends SchemaConversionBase{ return null; } - - public static String getName(SchemaObject obj) { + @Override + public String getName(SchemaObject obj) { if (obj.getParent() == null) { switch (obj.getType()) { case COMPLEX_TYPE: @@ -132,7 +150,7 @@ public abstract class JavaGenerator extends SchemaConversionBase{ case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+obj.getName(); case SIMPLE_TYPE: - return obj.getName(); + return getSimpleTypePrefix()+obj.getName(); } } else { SchemaObject o = obj; @@ -155,14 +173,14 @@ public abstract class JavaGenerator extends SchemaConversionBase{ case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+name; case SIMPLE_TYPE: - return name; + return getSimpleTypePrefix()+name; } } throw new RuntimeException(); } - public static String getName(SchemaObject obj, String rel) { + public String getName(SchemaObject obj, String rel) { if (obj.getParent() == null) { switch (obj.getType()) { case COMPLEX_TYPE: @@ -172,7 +190,7 @@ public abstract class JavaGenerator extends SchemaConversionBase{ case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+rel+obj.getName(); case SIMPLE_TYPE: - return rel+obj.getName(); + return getSimpleTypePrefix()+rel+obj.getName(); } } else { SchemaObject o = obj; @@ -193,24 +211,13 @@ public abstract class JavaGenerator extends SchemaConversionBase{ case ATTRIBUTE_GROUP: return getAttributeGroupPrefix()+rel+name; case SIMPLE_TYPE: - return rel+name; + return getSimpleTypePrefix()+rel+name; } } throw new RuntimeException(); } - protected enum InheritanceType{ComplexType,AtomicType,None}; - protected class Inheritance { - public String baseClass; - public InheritanceType type; - public TypeEntry atomicType; - - public Inheritance(String baseClass) { - this.baseClass = baseClass; - this.type = InheritanceType.None; - } - } protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List interfaces) { writer.println("@SuppressWarnings(\"unused\")"); @@ -235,63 +242,75 @@ public abstract class JavaGenerator extends SchemaConversionBase{ writer.println(); } - protected abstract String getBaseClass(); - protected Inheritance getElementInheritance(SchemaObject topLevelElementObj) { - Element topLevelElement = topLevelElementObj.getElement(); - Inheritance inheritance = new Inheritance(getBaseClass()); - 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; - } + 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); + + @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 = element.getElement().getName(); + objectName = element.getElement().getName(); + refObject = this.base.getComplexType(refTypeName); + if (refObject == null) this.base.getSimpleType(refTypeName); } else { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; - } + refTypeName = element.getElement().getRef(); + if (refName == null) + refName = refTypeName.getLocalPart(); + objectName = refTypeName.getLocalPart(); + refObject = this.base.getElement(refTypeName); } - } - if (inheritance.type == InheritanceType.None) { - QName type = getElementBase(topLevelElement); - if (type != null) { - if (!type.getNamespaceURI().equals(SCHEMA_NS)) { - SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart()); - inheritance.baseClass = getName(obj); - inheritance.type = InheritanceType.ComplexType; - } else { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; + + 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); + 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; } - } - } - } - if (inheritance.type == InheritanceType.None) { - QName type = topLevelElement.getSubstitutionGroup(); - if (type != null) { - if (!type.getNamespaceURI().equals(SCHEMA_NS)) { - SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart()); - inheritance.baseClass = getName(obj); - inheritance.type = InheritanceType.ComplexType; - } else { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; + 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??"); + } + + if (refObject != null) { + secondaryClassName = getName(refObject); + } + 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 = attrs.getName(); + + 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); } - - return inheritance; - } + } }