1 package org.simantics.xml.sax;
4 import java.io.IOException;
5 import java.io.PrintWriter;
6 import java.util.ArrayList;
7 import java.util.HashMap;
11 import javax.xml.namespace.QName;
13 import org.simantics.xml.sax.SchemaConversionBase.Inheritance;
14 import org.simantics.xml.sax.SchemaConversionBase.RefType;
15 import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;
16 import org.w3._2001.xmlschema.AttributeGroupRef;
17 import org.w3._2001.xmlschema.Element;
18 import org.w3._2001.xmlschema.Schema;
20 //public abstract class JavaGenerator extends SchemaConversionBase{
21 public abstract class JavaGenerator implements SchemaConversionComponent {
23 String commentTag = "//";
26 String ontologyClassName;
28 SchemaConverter converter;
29 SchemaConversionBase base;
31 List<String> ruleClassNames = new ArrayList<String>();
33 String ontShort = "ONT";
37 String elementPackageName;
39 Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();
41 public JavaGenerator(SchemaConverter converter, SchemaConversionBase base) {
42 this.converter = converter;
45 this.schema = base.schema;
46 this.ontologyClassName = base.className;
47 this.ontologyUri = base.ontologyURI;
48 this.converter = converter;
49 this.name = converter.name;
50 ontShort = converter.shortName;
52 elementPackageName = name+getPackagePostFix();
55 public String getElementPackageName() {
56 return elementPackageName;
60 protected PrintWriter createFile(File file) throws IOException {
63 PrintWriter writer = new PrintWriter(file);
64 for (String s : converter.getHeader()) {
65 writer.println(commentTag + " " + s);
71 protected String getValueGetterMethod(TypeEntry binding,String name) {
73 return name+".getValue()";
74 return binding.getValueGetterMethod(name);
77 protected String getValueGetter(TypeEntry binding,String name) {
80 return binding.getValueGetter(name);
83 protected String getValueGetter(TypeEntry binding) {
86 return binding.getValueGetter();
90 public String getSimpleTypePrefix() {
91 return "SimpleTypes_";
95 public String getComplexTypePrefix() {
96 return "ComplexTypes_";
100 public String getAttributeGroupPrefix() {
101 return "AttributeGroups_";
105 public String handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name) {
106 String baseRelationName = getName(parent) + ".has" + name;
108 // for (SchemaElement e : elements) {
109 // Element localElement = e.getElement();
110 // if (localElement.getName() != null) {
111 // QName refType = localElement.getType();
112 // if (refType != null)
113 // //handleIndicator(parent, indicator, e, false, name, refType);
114 // handleIndicator(parent, indicator, e, name, RefType.Type, baseRelationName);
115 // } else if (localElement.getRef() != null) {
116 // //QName refType = localElement.getRef();
117 // //handleIndicator(parent, indicator, e, true, name, refType);
118 // handleIndicator(parent, indicator, e, name, RefType.Reference, baseRelationName);
122 return baseRelationName;
125 protected String getOntologyImport() {
126 return this.ontologyClassName+" " +ontShort.substring(0,ontShort.length()-1)+" = "+this.ontologyClassName+".getInstance(graph);";
129 protected static class FileWriter {
130 public PrintWriter writer;
132 public PrintWriter delayedWriter;
133 public PrintWriter delayedWriter2;
136 protected FileWriter getWriter(SchemaObject obj) {
137 SchemaObject s = obj;
139 FileWriter fw = writers.get(s);
148 public String getName(SchemaObject obj) {
149 if (obj.getParent() == null) {
150 switch (obj.getType()) {
152 return getComplexTypePrefix()+obj.getName();
154 return obj.getName();
155 case ATTRIBUTE_GROUP:
156 return getAttributeGroupPrefix()+obj.getName();
158 return getSimpleTypePrefix()+obj.getName();
161 SchemaObject o = obj;
162 SchemaObject prev = null;
165 if (o.getName() != null)
166 name = o.getName()+"_"+name;
169 if (prev.getObj() instanceof AttributeGroupRef)
172 name = name.substring(0, name.length()-1);
173 switch (prev.getType()) {
175 return getComplexTypePrefix()+name;
178 case ATTRIBUTE_GROUP:
179 return getAttributeGroupPrefix()+name;
181 return getSimpleTypePrefix()+name;
184 throw new RuntimeException();
187 public String getName(SchemaObject obj, String rel) {
188 if (obj.getParent() == null) {
189 switch (obj.getType()) {
191 return getComplexTypePrefix()+rel+obj.getName();
193 return rel+obj.getName();
194 case ATTRIBUTE_GROUP:
195 return getAttributeGroupPrefix()+rel+obj.getName();
197 return getSimpleTypePrefix()+rel+obj.getName();
200 SchemaObject o = obj;
201 SchemaObject prev = null;
204 if (o.getName() != null)
205 name = o.getName()+"_"+name;
209 name = name.substring(0, name.length()-1);
210 switch (prev.getType()) {
212 return getComplexTypePrefix()+rel+name;
215 case ATTRIBUTE_GROUP:
216 return getAttributeGroupPrefix()+rel+name;
218 return getSimpleTypePrefix()+rel+name;
221 throw new RuntimeException();
226 protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {
227 writer.println("@SuppressWarnings(\"unused\")");
228 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
229 if (interfaces.size() > 0) {
230 writer.print(" implements ");
231 for (int i = 0; i < interfaces.size(); i++) {
232 writer.print(interfaces.get(i));
233 if (i < interfaces.size() -1 )
239 writer.println(" @Override");
240 writer.println(" public java.lang.String getElementId() {");
241 if (elementId != null)
242 writer.println(" return \""+elementId+"\";");
243 else // complex types cannot be parsed directly with name/id reference.
244 writer.println(" return null;");
245 writer.println(" }");
250 protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList);
251 protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName);
252 protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList);
254 protected abstract String getPackagePostFix();
256 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType, String baseRelationName) {
258 if (referenceType != RefType.Element) {
260 SchemaObject refObject = null;
261 if (referenceType == RefType.Type) {
262 refTypeName = element.getElement().getType();
264 refName = base.getName(element.getElement());
265 objectName = base.getName(element.getElement());
266 refObject = this.base.getComplexType(refTypeName);
267 if (refObject == null) this.base.getSimpleType(refTypeName);
269 refTypeName = element.getElement().getRef();
271 refName = base.getName(refTypeName);
272 objectName = refTypeName.getLocalPart();
273 refObject = this.base.getElement(refTypeName);
276 TypeEntry typeEntry = this.base.getTypeEntry(refTypeName);
277 if (typeEntry == null) {
278 // prefer element reference over complex type reference
279 String primaryClassName = null;
280 String secondaryClassName = null;
281 if (refObject != null) {
282 primaryClassName = getName(refObject);
283 if (refObject.getSc() != base) {
284 SchemaConverter con = refObject.getSc().converter;
285 primaryClassName = con.getPluginName() + "." + con.name +getPackagePostFix() + "." + primaryClassName;
288 else if (this.base.getSimpleType(refTypeName) != null) {
289 Inheritance inheritance = new Inheritance("");
290 this.base.getAtomicTypeInheritance(refTypeName, inheritance);
291 if (inheritance.atomicType != null) {
292 createPrimitiveIndicator(parent, refName, inheritance.atomicType, refTypeName);
296 throw new RuntimeException("No supported atomic type found for simple type " + refTypeName.toString());
300 throw new RuntimeException("Type that is neither complex nor simple??");
303 secondaryClassName = primaryClassName;
304 boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);
305 boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);
306 createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);
308 createPrimitiveIndicator(parent, refName, typeEntry, refTypeName);
311 Element attrs= element.getElement();
312 SchemaObject obj = this.base.getWithObj(parent, attrs);
314 String className = getName(obj);
316 refName = base.getName(attrs);
318 boolean useElementList = this.base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));
319 boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));
320 createElementIndicator(parent, useElementList, refName, className, useOriginalList);