--- /dev/null
+package org.simantics.xml.sax;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.PrintWriter;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.xml.namespace.QName;\r
+\r
+import org.simantics.xml.sax.configuration.Configuration;\r
+import org.w3._2001.xmlschema.AttributeGroupRef;\r
+import org.w3._2001.xmlschema.Element;\r
+import org.w3._2001.xmlschema.Schema;\r
+\r
+public abstract class JavaGenerator extends SchemaConversionBase{\r
+\r
+ String commentTag = "//";\r
+ \r
+ Schema schema;\r
+ String ontologyClassName;\r
+ SchemaConverter converter;\r
+ \r
+ List<String> ruleClassNames = new ArrayList<String>();\r
+ \r
+ String ontShort = "ONT"; \r
+ \r
+ File importParserDir;\r
+ String elementPackageName;\r
+ \r
+ Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();\r
+ \r
+ public JavaGenerator(Configuration configuration) {\r
+ super(configuration);\r
+ }\r
+ \r
+ \r
+ protected PrintWriter createFile(File file) throws IOException {\r
+ if (!file.exists())\r
+ file.createNewFile();\r
+ PrintWriter writer = new PrintWriter(file);\r
+ for (String s : converter.getHeader()) {\r
+ writer.println(commentTag + " " + s); \r
+ }\r
+ writer.println();\r
+ return writer;\r
+ }\r
+ \r
+ protected String getValueGetterMethod(TypeEntry binding,String name) {\r
+ if (binding == null)\r
+ return name+".getValue()";\r
+ return binding.getValueGetterMethod(name);\r
+ }\r
+ \r
+ protected String getValueGetter(TypeEntry binding,String name) {\r
+ if (binding == null)\r
+ return name;\r
+ return binding.getValueGetter(name);\r
+ }\r
+ protected String getValueGetter(TypeEntry binding) {\r
+ if (binding == null)\r
+ return "value";\r
+ return binding.getValueGetter();\r
+ }\r
+ \r
+ public static String getComplexTypePrefix() {\r
+ return "ComplexTypes_";\r
+ } \r
+ \r
+ public static String getAttributeGroupPrefix() {\r
+ return "AttributeGroups_";\r
+ }\r
+ \r
+ @Override\r
+ protected void handle(SchemaObject parent, SchemaElement indicator, SchemaElement element) {\r
+ Element localElement = element.getElement();\r
+ if (localElement.getName() != null) {\r
+ SchemaObject eObj = elements.get(localElement);\r
+ String refName = localElement.getName();\r
+ QName refType = localElement.getType();\r
+ if (refType != null)\r
+ handleIndicator(parent, indicator, element, false, refName, refType);\r
+ else {\r
+ handleElement(eObj);\r
+ handleIndicator(parent, indicator, element, false, refName, localElement);\r
+ }\r
+ } else if (localElement.getRef() != null) {\r
+ QName refType = localElement.getRef();\r
+ handleIndicator(parent, indicator,element, true, refType.getLocalPart(), refType);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
+ if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {\r
+ for (SchemaElement e : elements) {\r
+ handle(parent, indicator, e);\r
+ }\r
+ } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {\r
+ String name = getChoiceName(elements);\r
+\r
+ for (SchemaElement e : elements) {\r
+ Element localElement = e.getElement();\r
+ if (localElement.getName() != null) {\r
+ QName refType = localElement.getType();\r
+ if (refType != null)\r
+ handleIndicator(parent, indicator, e, false, name, refType);\r
+ } else if (localElement.getRef() != null) {\r
+ QName refType = localElement.getRef();\r
+ handleIndicator(parent, indicator, e, true, name, refType);\r
+ }\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+ protected String getOntologyImport() {\r
+ return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";\r
+ }\r
+ \r
+ protected static class FileWriter {\r
+ public PrintWriter writer;\r
+ \r
+ public PrintWriter delayedWriter;\r
+ public PrintWriter delayedWriter2;\r
+ }\r
+ \r
+ protected FileWriter getWriter(SchemaObject obj) {\r
+ SchemaObject s = obj;\r
+ while (s != null) {\r
+ FileWriter fw = writers.get(s);\r
+ if (fw != null)\r
+ return fw;\r
+ s = s.getParent();\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ \r
+ public static String getName(SchemaObject obj) {\r
+ if (obj.getParent() == null) {\r
+ switch (obj.getType()) {\r
+ case COMPLEX_TYPE:\r
+ return getComplexTypePrefix()+obj.getName();\r
+ case ELEMENT:\r
+ return obj.getName();\r
+ case ATTRIBUTE_GROUP:\r
+ return getAttributeGroupPrefix()+obj.getName();\r
+ case SIMPLE_TYPE:\r
+ return obj.getName();\r
+ }\r
+ } else {\r
+ SchemaObject o = obj;\r
+ SchemaObject prev = null;\r
+ String name = "";\r
+ while (o != null){\r
+ if (o.getName() != null)\r
+ name = o.getName()+"_"+name;\r
+ prev = o;\r
+ o = o.getParent();\r
+ if (prev.getObj() instanceof AttributeGroupRef)\r
+ o = null;\r
+ }\r
+ name = name.substring(0, name.length()-1);\r
+ switch (prev.getType()) {\r
+ case COMPLEX_TYPE:\r
+ return getComplexTypePrefix()+name;\r
+ case ELEMENT:\r
+ return name;\r
+ case ATTRIBUTE_GROUP:\r
+ return getAttributeGroupPrefix()+name;\r
+ case SIMPLE_TYPE:\r
+ return name;\r
+ }\r
+ }\r
+ throw new RuntimeException();\r
+ \r
+ }\r
+ \r
+ public static String getName(SchemaObject obj, String rel) {\r
+ if (obj.getParent() == null) {\r
+ switch (obj.getType()) {\r
+ case COMPLEX_TYPE:\r
+ return getComplexTypePrefix()+rel+obj.getName();\r
+ case ELEMENT:\r
+ return rel+obj.getName();\r
+ case ATTRIBUTE_GROUP:\r
+ return getAttributeGroupPrefix()+rel+obj.getName();\r
+ case SIMPLE_TYPE:\r
+ return rel+obj.getName();\r
+ }\r
+ } else {\r
+ SchemaObject o = obj;\r
+ SchemaObject prev = null;\r
+ String name = "";\r
+ while (o != null){\r
+ if (o.getName() != null)\r
+ name = o.getName()+"_"+name;\r
+ prev = o;\r
+ o = o.getParent();\r
+ }\r
+ name = name.substring(0, name.length()-1);\r
+ switch (prev.getType()) {\r
+ case COMPLEX_TYPE:\r
+ return getComplexTypePrefix()+rel+name;\r
+ case ELEMENT:\r
+ return rel+name;\r
+ case ATTRIBUTE_GROUP:\r
+ return getAttributeGroupPrefix()+rel+name;\r
+ case SIMPLE_TYPE:\r
+ return rel+name;\r
+ }\r
+ }\r
+ throw new RuntimeException();\r
+ }\r
+ \r
+ protected enum InheritanceType{ComplexType,AtomicType,None};\r
+ \r
+ protected class Inheritance {\r
+ public String baseClass;\r
+ public InheritanceType type;\r
+ public TypeEntry atomicType;\r
+ \r
+ public Inheritance(String baseClass) {\r
+ this.baseClass = baseClass;\r
+ this.type = InheritanceType.None;\r
+ }\r
+ }\r
+ \r
+ protected void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {\r
+ writer.println("@SuppressWarnings(\"unused\")");\r
+ writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);\r
+ if (interfaces.size() > 0) {\r
+ writer.print(" implements ");\r
+ for (int i = 0; i < interfaces.size(); i++) {\r
+ writer.print(interfaces.get(i));\r
+ if (i < interfaces.size() -1 )\r
+ writer.print(",");\r
+ }\r
+ }\r
+ writer.println("{");\r
+ writer.println();\r
+ writer.println(" @Override");\r
+ writer.println(" public java.lang.String getElementId() {");\r
+ if (name != null)\r
+ writer.println(" return \""+name+"\";");\r
+ else // complex types cannot be parsed directly with name/id reference.\r
+ writer.println(" return null;");\r
+ writer.println(" }");\r
+ writer.println();\r
+ }\r
+ \r
+ protected abstract String getBaseClass();\r
+ \r
+ protected Inheritance getElementInheritance(SchemaObject topLevelElementObj) {\r
+ Element topLevelElement = topLevelElementObj.getElement();\r
+ Inheritance inheritance = new Inheritance(getBaseClass());\r
+ if (topLevelElement.getType() != null) {\r
+ QName type = topLevelElement.getType();\r
+ if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
+ SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
+// if (obj == null)\r
+// obj = simpleTypeName.get(type.getLocalPart());\r
+ if (obj != null) {\r
+ inheritance.baseClass = getName(obj);\r
+ inheritance.type = InheritanceType.ComplexType;\r
+ }\r
+ } else {\r
+ TypeEntry entry = getTypeEntry(type);\r
+ if (entry != null) {\r
+ inheritance.type = InheritanceType.AtomicType;\r
+ inheritance.atomicType = entry;\r
+ }\r
+ }\r
+ }\r
+ if (inheritance.type == InheritanceType.None) {\r
+ QName type = getElementBase(topLevelElement);\r
+ if (type != null) {\r
+ if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
+ SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
+ inheritance.baseClass = getName(obj);\r
+ inheritance.type = InheritanceType.ComplexType;\r
+ } else {\r
+ TypeEntry entry = getTypeEntry(type);\r
+ if (entry != null) {\r
+ inheritance.type = InheritanceType.AtomicType;\r
+ inheritance.atomicType = entry;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (inheritance.type == InheritanceType.None) {\r
+ QName type = topLevelElement.getSubstitutionGroup();\r
+ if (type != null) {\r
+ if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
+ SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
+ inheritance.baseClass = getName(obj);\r
+ inheritance.type = InheritanceType.ComplexType;\r
+ } else {\r
+ TypeEntry entry = getTypeEntry(type);\r
+ if (entry != null) {\r
+ inheritance.type = InheritanceType.AtomicType;\r
+ inheritance.atomicType = entry;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ return inheritance;\r
+ } \r
+\r
+}\r