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=dfcdfd3d7b78e1afbe903dc7e06cb1b969058db8;hb=fb01c21839aea801224aeb82b64bd261120619d5;hp=b6b4fedbe0218e435fc157e180d4c7a90fbff6cf;hpb=28cdb08c2dcc6b306d8a0cbea8c0bd791e42d583;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 b6b4fed..dfcdfd3 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 @@ -65,33 +65,14 @@ public abstract class JavaGenerator extends SchemaConversionBase{ return binding.getValueGetter(); } - public static String getComplexTypePrefix() { + public String getComplexTypePrefix() { return "ComplexTypes_"; } - public static String getAttributeGroupPrefix() { + public String getAttributeGroupPrefix() { return "AttributeGroups_"; } - -// @Override -// protected void handle(SchemaObject parent, SchemaElement indicator, SchemaElement element) { -// Element localElement = element.getElement(); -// if (localElement.getName() != null) { -// SchemaObject eObj = elements.get(localElement); -// String refName = localElement.getName(); -// QName refType = localElement.getType(); -// if (refType != null) -// handleIndicator(parent, indicator, element, false, refName, refType); -// else { -// handleElement(eObj); -// handleIndicator(parent, indicator, element, false, refName, localElement); -// } -// } else if (localElement.getRef() != null) { -// QName refType = localElement.getRef(); -// handleIndicator(parent, indicator,element, true, refType.getLocalPart(), refType); -// } -// } - + @Override protected void handle(SchemaObject parent, SchemaElement indicator, List elements) { if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) { @@ -141,7 +122,7 @@ public abstract class JavaGenerator extends SchemaConversionBase{ } - public static String getName(SchemaObject obj) { + public String getName(SchemaObject obj) { if (obj.getParent() == null) { switch (obj.getType()) { case COMPLEX_TYPE: @@ -181,7 +162,7 @@ public abstract class JavaGenerator extends SchemaConversionBase{ } - 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: @@ -218,20 +199,9 @@ public abstract class JavaGenerator extends SchemaConversionBase{ 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 name, String className, String baseClass, List interfaces) { + 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) { @@ -246,71 +216,71 @@ public abstract class JavaGenerator extends SchemaConversionBase{ writer.println(); writer.println(" @Override"); writer.println(" public java.lang.String getElementId() {"); - if (name != null) - writer.println(" return \""+name+"\";"); + 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 String getBaseClass(); + 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); - 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; - } + @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 { - 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(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; - } - } + refType = element.getElement().getRef(); + if (refName == null) + refName = refType.getLocalPart(); + objectName = refType.getLocalPart(); } - } - 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; + + 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 { - TypeEntry entry = getTypeEntry(type); - if (entry != null) { - inheritance.type = InheritanceType.AtomicType; - inheritance.atomicType = entry; - } + 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); } - - return inheritance; - } + } }