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.SchemaConversionBase.Inheritance;
\r
14 import org.simantics.xml.sax.SchemaConversionBase.RefType;
\r
15 import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;
\r
16 import org.w3._2001.xmlschema.AttributeGroupRef;
\r
17 import org.w3._2001.xmlschema.Element;
\r
18 import org.w3._2001.xmlschema.Schema;
\r
20 //public abstract class JavaGenerator extends SchemaConversionBase{
\r
21 public abstract class JavaGenerator implements SchemaConversionComponent {
\r
23 String commentTag = "//";
\r
26 String ontologyClassName;
\r
28 SchemaConverter converter;
\r
29 SchemaConversionBase base;
\r
31 List<String> ruleClassNames = new ArrayList<String>();
\r
33 String ontShort = "ONT";
\r
36 File importParserDir;
\r
37 String elementPackageName;
\r
39 Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();
\r
41 public JavaGenerator(SchemaConverter converter, SchemaConversionBase base) {
\r
42 this.converter = converter;
\r
45 this.schema = base.schema;
\r
46 this.ontologyClassName = base.className;
\r
47 this.ontologyUri = base.ontologyURI;
\r
48 this.converter = converter;
\r
49 this.name = converter.name;
\r
50 ontShort = converter.shortName;
\r
55 protected PrintWriter createFile(File file) throws IOException {
\r
57 file.createNewFile();
\r
58 PrintWriter writer = new PrintWriter(file);
\r
59 for (String s : converter.getHeader()) {
\r
60 writer.println(commentTag + " " + s);
\r
66 protected String getValueGetterMethod(TypeEntry binding,String name) {
\r
67 if (binding == null)
\r
68 return name+".getValue()";
\r
69 return binding.getValueGetterMethod(name);
\r
72 protected String getValueGetter(TypeEntry binding,String name) {
\r
73 if (binding == null)
\r
75 return binding.getValueGetter(name);
\r
78 protected String getValueGetter(TypeEntry binding) {
\r
79 if (binding == null)
\r
81 return binding.getValueGetter();
\r
85 public String getSimpleTypePrefix() {
\r
86 return "SimpleTypes_";
\r
90 public String getComplexTypePrefix() {
\r
91 return "ComplexTypes_";
\r
95 public String getAttributeGroupPrefix() {
\r
96 return "AttributeGroups_";
\r
100 public String handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name) {
\r
101 String baseRelationName = getName(parent) + ".has" + name;
\r
103 // for (SchemaElement e : elements) {
\r
104 // Element localElement = e.getElement();
\r
105 // if (localElement.getName() != null) {
\r
106 // QName refType = localElement.getType();
\r
107 // if (refType != null)
\r
108 // //handleIndicator(parent, indicator, e, false, name, refType);
\r
109 // handleIndicator(parent, indicator, e, name, RefType.Type, baseRelationName);
\r
110 // } else if (localElement.getRef() != null) {
\r
111 // //QName refType = localElement.getRef();
\r
112 // //handleIndicator(parent, indicator, e, true, name, refType);
\r
113 // handleIndicator(parent, indicator, e, name, RefType.Reference, baseRelationName);
\r
117 return baseRelationName;
\r
120 protected String getOntologyImport() {
\r
121 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";
\r
124 protected static class FileWriter {
\r
125 public PrintWriter writer;
\r
127 public PrintWriter delayedWriter;
\r
128 public PrintWriter delayedWriter2;
\r
131 protected FileWriter getWriter(SchemaObject obj) {
\r
132 SchemaObject s = obj;
\r
133 while (s != null) {
\r
134 FileWriter fw = writers.get(s);
\r
143 public String getName(SchemaObject obj) {
\r
144 if (obj.getParent() == null) {
\r
145 switch (obj.getType()) {
\r
147 return getComplexTypePrefix()+obj.getName();
\r
149 return obj.getName();
\r
150 case ATTRIBUTE_GROUP:
\r
151 return getAttributeGroupPrefix()+obj.getName();
\r
153 return getSimpleTypePrefix()+obj.getName();
\r
156 SchemaObject o = obj;
\r
157 SchemaObject prev = null;
\r
160 if (o.getName() != null)
\r
161 name = o.getName()+"_"+name;
\r
164 if (prev.getObj() instanceof AttributeGroupRef)
\r
167 name = name.substring(0, name.length()-1);
\r
168 switch (prev.getType()) {
\r
170 return getComplexTypePrefix()+name;
\r
173 case ATTRIBUTE_GROUP:
\r
174 return getAttributeGroupPrefix()+name;
\r
176 return getSimpleTypePrefix()+name;
\r
179 throw new RuntimeException();
\r
183 public String getName(SchemaObject obj, String rel) {
\r
184 if (obj.getParent() == null) {
\r
185 switch (obj.getType()) {
\r
187 return getComplexTypePrefix()+rel+obj.getName();
\r
189 return rel+obj.getName();
\r
190 case ATTRIBUTE_GROUP:
\r
191 return getAttributeGroupPrefix()+rel+obj.getName();
\r
193 return getSimpleTypePrefix()+rel+obj.getName();
\r
196 SchemaObject o = obj;
\r
197 SchemaObject prev = null;
\r
200 if (o.getName() != null)
\r
201 name = o.getName()+"_"+name;
\r
205 name = name.substring(0, name.length()-1);
\r
206 switch (prev.getType()) {
\r
208 return getComplexTypePrefix()+rel+name;
\r
211 case ATTRIBUTE_GROUP:
\r
212 return getAttributeGroupPrefix()+rel+name;
\r
214 return getSimpleTypePrefix()+rel+name;
\r
217 throw new RuntimeException();
\r
222 protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {
\r
223 writer.println("@SuppressWarnings(\"unused\")");
\r
224 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
\r
225 if (interfaces.size() > 0) {
\r
226 writer.print(" implements ");
\r
227 for (int i = 0; i < interfaces.size(); i++) {
\r
228 writer.print(interfaces.get(i));
\r
229 if (i < interfaces.size() -1 )
\r
233 writer.println("{");
\r
235 writer.println(" @Override");
\r
236 writer.println(" public java.lang.String getElementId() {");
\r
237 if (elementId != null)
\r
238 writer.println(" return \""+elementId+"\";");
\r
239 else // complex types cannot be parsed directly with name/id reference.
\r
240 writer.println(" return null;");
\r
241 writer.println(" }");
\r
246 protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList);
\r
247 protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName);
\r
248 protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList);
\r
251 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType, String baseRelationName) {
\r
253 if (referenceType != RefType.Element) {
\r
255 SchemaObject refObject = null;
\r
256 if (referenceType == RefType.Type) {
\r
257 refTypeName = element.getElement().getType();
\r
258 if (refName == null)
\r
259 refName = element.getElement().getName();
\r
260 objectName = element.getElement().getName();
\r
261 refObject = this.base.getComplexType(refTypeName);
\r
262 if (refObject == null) this.base.getSimpleType(refTypeName);
\r
264 refTypeName = element.getElement().getRef();
\r
265 if (refName == null)
\r
266 refName = refTypeName.getLocalPart();
\r
267 objectName = refTypeName.getLocalPart();
\r
268 refObject = this.base.getElement(refTypeName);
\r
271 TypeEntry typeEntry = this.base.getTypeEntry(refTypeName);
\r
272 if (typeEntry == null) {
\r
273 // prefer element reference over complex type reference
\r
274 String primaryClassName = null;
\r
275 String secondaryClassName = null;
\r
276 if (refObject != null)
\r
277 primaryClassName = getName(refObject);
\r
278 else if (this.base.getSimpleType(refTypeName) != null) {
\r
279 Inheritance inheritance = new Inheritance("");
\r
280 this.base.getAtomicTypeInheritance(refTypeName, inheritance);
\r
281 if (inheritance.atomicType != null) {
\r
282 createPrimitiveIndicator(parent, refName, inheritance.atomicType, refTypeName);
\r
286 throw new RuntimeException("No supported atomic type found for simple type " + refTypeName.toString());
\r
290 throw new RuntimeException("Type that is neither complex nor simple??");
\r
293 if (refObject != null) {
\r
294 secondaryClassName = getName(refObject);
\r
296 boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);
\r
297 boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);
\r
298 createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);
\r
300 createPrimitiveIndicator(parent, refName, typeEntry, refTypeName);
\r
303 Element attrs= element.getElement();
\r
304 SchemaObject obj = this.base.getWithObj(parent, attrs);
\r
306 String className = getName(obj);
\r
307 if (refName == null)
\r
308 refName = attrs.getName();
\r
310 boolean useElementList = this.base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));
\r
311 boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));
\r
312 createElementIndicator(parent, useElementList, refName, className, useOriginalList);
\r