1 package org.simantics.xml.sax;
\r
4 import java.io.IOException;
\r
5 import java.io.PrintWriter;
\r
6 import java.util.ArrayList;
\r
7 import java.util.HashMap;
\r
8 import java.util.List;
\r
9 import java.util.Map;
\r
11 import javax.xml.namespace.QName;
\r
13 import org.simantics.xml.sax.configuration.Configuration;
\r
14 import org.w3._2001.xmlschema.AttributeGroupRef;
\r
15 import org.w3._2001.xmlschema.Element;
\r
16 import org.w3._2001.xmlschema.Schema;
\r
18 public abstract class JavaGenerator extends SchemaConversionBase{
\r
20 String commentTag = "//";
\r
23 String ontologyClassName;
\r
24 SchemaConverter converter;
\r
26 List<String> ruleClassNames = new ArrayList<String>();
\r
28 String ontShort = "ONT";
\r
30 File importParserDir;
\r
31 String elementPackageName;
\r
33 Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();
\r
35 public JavaGenerator(Configuration configuration) {
\r
36 super(configuration);
\r
40 protected PrintWriter createFile(File file) throws IOException {
\r
42 file.createNewFile();
\r
43 PrintWriter writer = new PrintWriter(file);
\r
44 for (String s : converter.getHeader()) {
\r
45 writer.println(commentTag + " " + s);
\r
51 protected String getValueGetterMethod(TypeEntry binding,String name) {
\r
52 if (binding == null)
\r
53 return name+".getValue()";
\r
54 return binding.getValueGetterMethod(name);
\r
57 protected String getValueGetter(TypeEntry binding,String name) {
\r
58 if (binding == null)
\r
60 return binding.getValueGetter(name);
\r
62 protected String getValueGetter(TypeEntry binding) {
\r
63 if (binding == null)
\r
65 return binding.getValueGetter();
\r
68 public static String getComplexTypePrefix() {
\r
69 return "ComplexTypes_";
\r
72 public static String getAttributeGroupPrefix() {
\r
73 return "AttributeGroups_";
\r
77 protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {
\r
78 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {
\r
79 for (SchemaElement e : elements) {
\r
80 handle(parent, indicator, e);
\r
82 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {
\r
83 String name = getChoiceName(elements);
\r
85 for (SchemaElement e : elements) {
\r
86 Element localElement = e.getElement();
\r
87 if (localElement.getName() != null) {
\r
88 QName refType = localElement.getType();
\r
89 if (refType != null)
\r
90 //handleIndicator(parent, indicator, e, false, name, refType);
\r
91 handleIndicator(parent, indicator, e, name, RefType.Type);
\r
92 } else if (localElement.getRef() != null) {
\r
93 //QName refType = localElement.getRef();
\r
94 //handleIndicator(parent, indicator, e, true, name, refType);
\r
95 handleIndicator(parent, indicator, e, name, RefType.Reference);
\r
102 protected String getOntologyImport() {
\r
103 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";
\r
106 protected static class FileWriter {
\r
107 public PrintWriter writer;
\r
109 public PrintWriter delayedWriter;
\r
110 public PrintWriter delayedWriter2;
\r
113 protected FileWriter getWriter(SchemaObject obj) {
\r
114 SchemaObject s = obj;
\r
115 while (s != null) {
\r
116 FileWriter fw = writers.get(s);
\r
125 public static String getName(SchemaObject obj) {
\r
126 if (obj.getParent() == null) {
\r
127 switch (obj.getType()) {
\r
129 return getComplexTypePrefix()+obj.getName();
\r
131 return obj.getName();
\r
132 case ATTRIBUTE_GROUP:
\r
133 return getAttributeGroupPrefix()+obj.getName();
\r
135 return obj.getName();
\r
138 SchemaObject o = obj;
\r
139 SchemaObject prev = null;
\r
142 if (o.getName() != null)
\r
143 name = o.getName()+"_"+name;
\r
146 if (prev.getObj() instanceof AttributeGroupRef)
\r
149 name = name.substring(0, name.length()-1);
\r
150 switch (prev.getType()) {
\r
152 return getComplexTypePrefix()+name;
\r
155 case ATTRIBUTE_GROUP:
\r
156 return getAttributeGroupPrefix()+name;
\r
161 throw new RuntimeException();
\r
165 public static String getName(SchemaObject obj, String rel) {
\r
166 if (obj.getParent() == null) {
\r
167 switch (obj.getType()) {
\r
169 return getComplexTypePrefix()+rel+obj.getName();
\r
171 return rel+obj.getName();
\r
172 case ATTRIBUTE_GROUP:
\r
173 return getAttributeGroupPrefix()+rel+obj.getName();
\r
175 return rel+obj.getName();
\r
178 SchemaObject o = obj;
\r
179 SchemaObject prev = null;
\r
182 if (o.getName() != null)
\r
183 name = o.getName()+"_"+name;
\r
187 name = name.substring(0, name.length()-1);
\r
188 switch (prev.getType()) {
\r
190 return getComplexTypePrefix()+rel+name;
\r
193 case ATTRIBUTE_GROUP:
\r
194 return getAttributeGroupPrefix()+rel+name;
\r
199 throw new RuntimeException();
\r
202 protected enum InheritanceType{ComplexType,AtomicType,None};
\r
204 protected class Inheritance {
\r
205 public String baseClass;
\r
206 public InheritanceType type;
\r
207 public TypeEntry atomicType;
\r
209 public Inheritance(String baseClass) {
\r
210 this.baseClass = baseClass;
\r
211 this.type = InheritanceType.None;
\r
215 protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {
\r
216 writer.println("@SuppressWarnings(\"unused\")");
\r
217 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
\r
218 if (interfaces.size() > 0) {
\r
219 writer.print(" implements ");
\r
220 for (int i = 0; i < interfaces.size(); i++) {
\r
221 writer.print(interfaces.get(i));
\r
222 if (i < interfaces.size() -1 )
\r
226 writer.println("{");
\r
228 writer.println(" @Override");
\r
229 writer.println(" public java.lang.String getElementId() {");
\r
230 if (elementId != null)
\r
231 writer.println(" return \""+elementId+"\";");
\r
232 else // complex types cannot be parsed directly with name/id reference.
\r
233 writer.println(" return null;");
\r
234 writer.println(" }");
\r
238 protected abstract String getBaseClass();
\r
240 protected Inheritance getElementInheritance(SchemaObject topLevelElementObj) {
\r
241 Element topLevelElement = topLevelElementObj.getElement();
\r
242 Inheritance inheritance = new Inheritance(getBaseClass());
\r
243 if (topLevelElement.getType() != null) {
\r
244 QName type = topLevelElement.getType();
\r
245 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
246 SchemaObject obj = complexTypeName.get(type.getLocalPart());
\r
247 // if (obj == null)
\r
248 // obj = simpleTypeName.get(type.getLocalPart());
\r
250 inheritance.baseClass = getName(obj);
\r
251 inheritance.type = InheritanceType.ComplexType;
\r
254 TypeEntry entry = getTypeEntry(type);
\r
255 if (entry != null) {
\r
256 inheritance.type = InheritanceType.AtomicType;
\r
257 inheritance.atomicType = entry;
\r
261 if (inheritance.type == InheritanceType.None) {
\r
262 QName type = getElementBase(topLevelElement);
\r
263 if (type != null) {
\r
264 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
265 SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());
\r
266 inheritance.baseClass = getName(obj);
\r
267 inheritance.type = InheritanceType.ComplexType;
\r
269 TypeEntry entry = getTypeEntry(type);
\r
270 if (entry != null) {
\r
271 inheritance.type = InheritanceType.AtomicType;
\r
272 inheritance.atomicType = entry;
\r
277 if (inheritance.type == InheritanceType.None) {
\r
278 QName type = topLevelElement.getSubstitutionGroup();
\r
279 if (type != null) {
\r
280 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
281 SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());
\r
282 inheritance.baseClass = getName(obj);
\r
283 inheritance.type = InheritanceType.ComplexType;
\r
285 TypeEntry entry = getTypeEntry(type);
\r
286 if (entry != null) {
\r
287 inheritance.type = InheritanceType.AtomicType;
\r
288 inheritance.atomicType = entry;
\r
294 return inheritance;
\r