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 static String getComplexTypePrefix() { return "ComplexTypes_"; } public static 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())) { 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); } else if (localElement.getRef() != null) { QName refType = localElement.getRef(); handleIndicator(parent, indicator, e, true, name, refType); } } } } 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 static 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 static 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 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) { 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 (name != null) writer.println(" return \""+name+"\";"); else // complex types cannot be parsed directly with name/id reference. writer.println(" return null;"); writer.println(" }"); 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; } } 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; } } } } 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; } } } } return inheritance; } }