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 String getComplexTypePrefix() {
\r
69 return "ComplexTypes_";
\r
72 public 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 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 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
204 protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {
\r
205 writer.println("@SuppressWarnings(\"unused\")");
\r
206 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
\r
207 if (interfaces.size() > 0) {
\r
208 writer.print(" implements ");
\r
209 for (int i = 0; i < interfaces.size(); i++) {
\r
210 writer.print(interfaces.get(i));
\r
211 if (i < interfaces.size() -1 )
\r
215 writer.println("{");
\r
217 writer.println(" @Override");
\r
218 writer.println(" public java.lang.String getElementId() {");
\r
219 if (elementId != null)
\r
220 writer.println(" return \""+elementId+"\";");
\r
221 else // complex types cannot be parsed directly with name/id reference.
\r
222 writer.println(" return null;");
\r
223 writer.println(" }");
\r
227 protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList);
\r
228 protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, String binding);
\r
229 protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList);
\r
232 protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType) {
\r
234 if (referenceType != RefType.Element) {
\r
236 if (referenceType == RefType.Type) {
\r
237 refType = element.getElement().getType();
\r
238 if (refName == null)
\r
239 refName = element.getElement().getName();
\r
240 objectName = element.getElement().getName();
\r
242 refType = element.getElement().getRef();
\r
243 if (refName == null)
\r
244 refName = refType.getLocalPart();
\r
245 objectName = refType.getLocalPart();
\r
248 String binding = getBindingFromPrimitiveType(refType);
\r
249 if (binding == null) {
\r
250 SchemaObject refElement = elementName.get(refType.getLocalPart());
\r
251 SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart());
\r
253 // prefer element reference over complex type reference
\r
254 String primaryClassName = null;
\r
255 String secondaryClassName = null;
\r
256 if (refElement != null)
\r
257 primaryClassName = getName(refElement);
\r
259 primaryClassName = getName(refComplexType);
\r
261 if (refComplexType != null) {
\r
262 secondaryClassName = getName(refComplexType);
\r
264 secondaryClassName = getName(refElement);
\r
266 boolean useElementList = useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);
\r
267 boolean useOriginalList = useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);
\r
268 createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);
\r
270 createPrimitiveIndicator(parent, refName, binding);
\r
273 Element attrs= element.getElement();
\r
274 SchemaObject obj = getWithObj(parent, attrs);
\r
276 String className = getName(obj);
\r
277 if (refName == null)
\r
278 refName = attrs.getName();
\r
280 boolean useElementList = useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));
\r
281 boolean useOriginalList = useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));
\r
282 createElementIndicator(parent, useElementList, refName, className, useOriginalList);
\r