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 String getComplexTypePrefix() { return "ComplexTypes_"; } 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); } } } } 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 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 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 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) { 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 (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(); } }