]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java
Initial support for XML export (order of Elements is not kept)
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / JavaGenerator.java
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
new file mode 100644 (file)
index 0000000..6467734
--- /dev/null
@@ -0,0 +1,314 @@
+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