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, SchemaElement element) {
\r
78 Element localElement = element.getElement();
\r
79 if (localElement.getName() != null) {
\r
80 SchemaObject eObj = elements.get(localElement);
\r
81 String refName = localElement.getName();
\r
82 QName refType = localElement.getType();
\r
83 if (refType != null)
\r
84 handleIndicator(parent, indicator, element, false, refName, refType);
\r
86 handleElement(eObj);
\r
87 handleIndicator(parent, indicator, element, false, refName, localElement);
\r
89 } else if (localElement.getRef() != null) {
\r
90 QName refType = localElement.getRef();
\r
91 handleIndicator(parent, indicator,element, true, refType.getLocalPart(), refType);
\r
96 protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {
\r
97 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {
\r
98 for (SchemaElement e : elements) {
\r
99 handle(parent, indicator, e);
\r
101 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {
\r
102 String name = getChoiceName(elements);
\r
104 for (SchemaElement e : elements) {
\r
105 Element localElement = e.getElement();
\r
106 if (localElement.getName() != null) {
\r
107 QName refType = localElement.getType();
\r
108 if (refType != null)
\r
109 handleIndicator(parent, indicator, e, false, name, refType);
\r
110 } else if (localElement.getRef() != null) {
\r
111 QName refType = localElement.getRef();
\r
112 handleIndicator(parent, indicator, e, true, name, refType);
\r
119 protected String getOntologyImport() {
\r
120 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";
\r
123 protected static class FileWriter {
\r
124 public PrintWriter writer;
\r
126 public PrintWriter delayedWriter;
\r
127 public PrintWriter delayedWriter2;
\r
130 protected FileWriter getWriter(SchemaObject obj) {
\r
131 SchemaObject s = obj;
\r
132 while (s != null) {
\r
133 FileWriter fw = writers.get(s);
\r
142 public static String getName(SchemaObject obj) {
\r
143 if (obj.getParent() == null) {
\r
144 switch (obj.getType()) {
\r
146 return getComplexTypePrefix()+obj.getName();
\r
148 return obj.getName();
\r
149 case ATTRIBUTE_GROUP:
\r
150 return getAttributeGroupPrefix()+obj.getName();
\r
152 return obj.getName();
\r
155 SchemaObject o = obj;
\r
156 SchemaObject prev = null;
\r
159 if (o.getName() != null)
\r
160 name = o.getName()+"_"+name;
\r
163 if (prev.getObj() instanceof AttributeGroupRef)
\r
166 name = name.substring(0, name.length()-1);
\r
167 switch (prev.getType()) {
\r
169 return getComplexTypePrefix()+name;
\r
172 case ATTRIBUTE_GROUP:
\r
173 return getAttributeGroupPrefix()+name;
\r
178 throw new RuntimeException();
\r
182 public static String getName(SchemaObject obj, String rel) {
\r
183 if (obj.getParent() == null) {
\r
184 switch (obj.getType()) {
\r
186 return getComplexTypePrefix()+rel+obj.getName();
\r
188 return rel+obj.getName();
\r
189 case ATTRIBUTE_GROUP:
\r
190 return getAttributeGroupPrefix()+rel+obj.getName();
\r
192 return rel+obj.getName();
\r
195 SchemaObject o = obj;
\r
196 SchemaObject prev = null;
\r
199 if (o.getName() != null)
\r
200 name = o.getName()+"_"+name;
\r
204 name = name.substring(0, name.length()-1);
\r
205 switch (prev.getType()) {
\r
207 return getComplexTypePrefix()+rel+name;
\r
210 case ATTRIBUTE_GROUP:
\r
211 return getAttributeGroupPrefix()+rel+name;
\r
216 throw new RuntimeException();
\r
219 protected enum InheritanceType{ComplexType,AtomicType,None};
\r
221 protected class Inheritance {
\r
222 public String baseClass;
\r
223 public InheritanceType type;
\r
224 public TypeEntry atomicType;
\r
226 public Inheritance(String baseClass) {
\r
227 this.baseClass = baseClass;
\r
228 this.type = InheritanceType.None;
\r
232 protected void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {
\r
233 writer.println("@SuppressWarnings(\"unused\")");
\r
234 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
\r
235 if (interfaces.size() > 0) {
\r
236 writer.print(" implements ");
\r
237 for (int i = 0; i < interfaces.size(); i++) {
\r
238 writer.print(interfaces.get(i));
\r
239 if (i < interfaces.size() -1 )
\r
243 writer.println("{");
\r
245 writer.println(" @Override");
\r
246 writer.println(" public java.lang.String getElementId() {");
\r
248 writer.println(" return \""+name+"\";");
\r
249 else // complex types cannot be parsed directly with name/id reference.
\r
250 writer.println(" return null;");
\r
251 writer.println(" }");
\r
255 protected abstract String getBaseClass();
\r
257 protected Inheritance getElementInheritance(SchemaObject topLevelElementObj) {
\r
258 Element topLevelElement = topLevelElementObj.getElement();
\r
259 Inheritance inheritance = new Inheritance(getBaseClass());
\r
260 if (topLevelElement.getType() != null) {
\r
261 QName type = topLevelElement.getType();
\r
262 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
263 SchemaObject obj = complexTypeName.get(type.getLocalPart());
\r
264 // if (obj == null)
\r
265 // obj = simpleTypeName.get(type.getLocalPart());
\r
267 inheritance.baseClass = getName(obj);
\r
268 inheritance.type = InheritanceType.ComplexType;
\r
271 TypeEntry entry = getTypeEntry(type);
\r
272 if (entry != null) {
\r
273 inheritance.type = InheritanceType.AtomicType;
\r
274 inheritance.atomicType = entry;
\r
278 if (inheritance.type == InheritanceType.None) {
\r
279 QName type = getElementBase(topLevelElement);
\r
280 if (type != null) {
\r
281 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
282 SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());
\r
283 inheritance.baseClass = getName(obj);
\r
284 inheritance.type = InheritanceType.ComplexType;
\r
286 TypeEntry entry = getTypeEntry(type);
\r
287 if (entry != null) {
\r
288 inheritance.type = InheritanceType.AtomicType;
\r
289 inheritance.atomicType = entry;
\r
294 if (inheritance.type == InheritanceType.None) {
\r
295 QName type = topLevelElement.getSubstitutionGroup();
\r
296 if (type != null) {
\r
297 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
298 SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());
\r
299 inheritance.baseClass = getName(obj);
\r
300 inheritance.type = InheritanceType.ComplexType;
\r
302 TypeEntry entry = getTypeEntry(type);
\r
303 if (entry != null) {
\r
304 inheritance.type = InheritanceType.AtomicType;
\r
305 inheritance.atomicType = entry;
\r
311 return inheritance;
\r