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.RefType;
\r
14 import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;
\r
15 import org.w3._2001.xmlschema.AttributeGroupRef;
\r
16 import org.w3._2001.xmlschema.Element;
\r
17 import org.w3._2001.xmlschema.Schema;
\r
19 //public abstract class JavaGenerator extends SchemaConversionBase{
\r
20 public abstract class JavaGenerator implements SchemaConversionComponent {
\r
22 String commentTag = "//";
\r
25 String ontologyClassName;
\r
27 SchemaConverter converter;
\r
28 SchemaConversionBase base;
\r
30 List<String> ruleClassNames = new ArrayList<String>();
\r
32 String ontShort = "ONT";
\r
35 File importParserDir;
\r
36 String elementPackageName;
\r
38 Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();
\r
40 public JavaGenerator(SchemaConverter converter, SchemaConversionBase base) {
\r
41 this.converter = converter;
\r
44 this.schema = base.schema;
\r
45 this.ontologyClassName = base.className;
\r
46 this.ontologyUri = base.ontologyURI;
\r
47 this.converter = converter;
\r
48 this.name = converter.name;
\r
49 ontShort = converter.shortName;
\r
54 protected PrintWriter createFile(File file) throws IOException {
\r
56 file.createNewFile();
\r
57 PrintWriter writer = new PrintWriter(file);
\r
58 for (String s : converter.getHeader()) {
\r
59 writer.println(commentTag + " " + s);
\r
65 protected String getValueGetterMethod(TypeEntry binding,String name) {
\r
66 if (binding == null)
\r
67 return name+".getValue()";
\r
68 return binding.getValueGetterMethod(name);
\r
71 protected String getValueGetter(TypeEntry binding,String name) {
\r
72 if (binding == null)
\r
74 return binding.getValueGetter(name);
\r
77 protected String getValueGetter(TypeEntry binding) {
\r
78 if (binding == null)
\r
80 return binding.getValueGetter();
\r
84 public String getComplexTypePrefix() {
\r
85 return "ComplexTypes_";
\r
89 public String getAttributeGroupPrefix() {
\r
90 return "AttributeGroups_";
\r
94 public void handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name) {
\r
96 for (SchemaElement e : elements) {
\r
97 Element localElement = e.getElement();
\r
98 if (localElement.getName() != null) {
\r
99 QName refType = localElement.getType();
\r
100 if (refType != null)
\r
101 //handleIndicator(parent, indicator, e, false, name, refType);
\r
102 handleIndicator(parent, indicator, e, name, RefType.Type);
\r
103 } else if (localElement.getRef() != null) {
\r
104 //QName refType = localElement.getRef();
\r
105 //handleIndicator(parent, indicator, e, true, name, refType);
\r
106 handleIndicator(parent, indicator, e, name, RefType.Reference);
\r
112 protected String getOntologyImport() {
\r
113 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";
\r
116 protected static class FileWriter {
\r
117 public PrintWriter writer;
\r
119 public PrintWriter delayedWriter;
\r
120 public PrintWriter delayedWriter2;
\r
123 protected FileWriter getWriter(SchemaObject obj) {
\r
124 SchemaObject s = obj;
\r
125 while (s != null) {
\r
126 FileWriter fw = writers.get(s);
\r
135 public String getName(SchemaObject obj) {
\r
136 if (obj.getParent() == null) {
\r
137 switch (obj.getType()) {
\r
139 return getComplexTypePrefix()+obj.getName();
\r
141 return obj.getName();
\r
142 case ATTRIBUTE_GROUP:
\r
143 return getAttributeGroupPrefix()+obj.getName();
\r
145 return obj.getName();
\r
148 SchemaObject o = obj;
\r
149 SchemaObject prev = null;
\r
152 if (o.getName() != null)
\r
153 name = o.getName()+"_"+name;
\r
156 if (prev.getObj() instanceof AttributeGroupRef)
\r
159 name = name.substring(0, name.length()-1);
\r
160 switch (prev.getType()) {
\r
162 return getComplexTypePrefix()+name;
\r
165 case ATTRIBUTE_GROUP:
\r
166 return getAttributeGroupPrefix()+name;
\r
171 throw new RuntimeException();
\r
175 public String getName(SchemaObject obj, String rel) {
\r
176 if (obj.getParent() == null) {
\r
177 switch (obj.getType()) {
\r
179 return getComplexTypePrefix()+rel+obj.getName();
\r
181 return rel+obj.getName();
\r
182 case ATTRIBUTE_GROUP:
\r
183 return getAttributeGroupPrefix()+rel+obj.getName();
\r
185 return rel+obj.getName();
\r
188 SchemaObject o = obj;
\r
189 SchemaObject prev = null;
\r
192 if (o.getName() != null)
\r
193 name = o.getName()+"_"+name;
\r
197 name = name.substring(0, name.length()-1);
\r
198 switch (prev.getType()) {
\r
200 return getComplexTypePrefix()+rel+name;
\r
203 case ATTRIBUTE_GROUP:
\r
204 return getAttributeGroupPrefix()+rel+name;
\r
209 throw new RuntimeException();
\r
214 protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {
\r
215 writer.println("@SuppressWarnings(\"unused\")");
\r
216 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
\r
217 if (interfaces.size() > 0) {
\r
218 writer.print(" implements ");
\r
219 for (int i = 0; i < interfaces.size(); i++) {
\r
220 writer.print(interfaces.get(i));
\r
221 if (i < interfaces.size() -1 )
\r
225 writer.println("{");
\r
227 writer.println(" @Override");
\r
228 writer.println(" public java.lang.String getElementId() {");
\r
229 if (elementId != null)
\r
230 writer.println(" return \""+elementId+"\";");
\r
231 else // complex types cannot be parsed directly with name/id reference.
\r
232 writer.println(" return null;");
\r
233 writer.println(" }");
\r
238 protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList);
\r
239 protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, String binding);
\r
240 protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList);
\r
243 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType) {
\r
245 if (referenceType != RefType.Element) {
\r
247 if (referenceType == RefType.Type) {
\r
248 refType = element.getElement().getType();
\r
249 if (refName == null)
\r
250 refName = element.getElement().getName();
\r
251 objectName = element.getElement().getName();
\r
253 refType = element.getElement().getRef();
\r
254 if (refName == null)
\r
255 refName = refType.getLocalPart();
\r
256 objectName = refType.getLocalPart();
\r
259 String binding = this.base.getBindingFromPrimitiveType(refType);
\r
260 if (binding == null) {
\r
261 SchemaObject refElement = this.base.elementName.get(refType.getLocalPart());
\r
262 SchemaObject refComplexType = this.base.complexTypeName.get(refType.getLocalPart());
\r
264 // prefer element reference over complex type reference
\r
265 String primaryClassName = null;
\r
266 String secondaryClassName = null;
\r
267 if (refElement != null)
\r
268 primaryClassName = getName(refElement);
\r
270 primaryClassName = getName(refComplexType);
\r
272 if (refComplexType != null) {
\r
273 secondaryClassName = getName(refComplexType);
\r
275 secondaryClassName = getName(refElement);
\r
277 boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);
\r
278 boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);
\r
279 createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);
\r
281 createPrimitiveIndicator(parent, refName, binding);
\r
284 Element attrs= element.getElement();
\r
285 SchemaObject obj = this.base.getWithObj(parent, attrs);
\r
287 String className = getName(obj);
\r
288 if (refName == null)
\r
289 refName = attrs.getName();
\r
291 boolean useElementList = this.base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));
\r
292 boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));
\r
293 createElementIndicator(parent, useElementList, refName, className, useOriginalList);
\r