]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java
Using XML ontology as base of converted XML schemas
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / ImporterGenerator.java
1 package org.simantics.xml.sax;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 import java.io.PrintWriter;\r
6 import java.io.StringWriter;\r
7 import java.util.ArrayList;\r
8 import java.util.HashMap;\r
9 import java.util.List;\r
10 import java.util.Map;\r
11 \r
12 import javax.xml.namespace.QName;\r
13 \r
14 import org.simantics.utils.datastructures.BijectionMap;\r
15 import org.simantics.utils.datastructures.Pair;\r
16 import org.simantics.xml.sax.configuration.AttributeComposition;\r
17 import org.simantics.xml.sax.configuration.Configuration;\r
18 import org.simantics.xml.sax.configuration.IDProvider;\r
19 import org.simantics.xml.sax.configuration.IDReference;\r
20 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;\r
21 import org.w3._2001.xmlschema.Annotated;\r
22 import org.w3._2001.xmlschema.Attribute;\r
23 import org.w3._2001.xmlschema.AttributeGroup;\r
24 import org.w3._2001.xmlschema.AttributeGroupRef;\r
25 import org.w3._2001.xmlschema.ComplexType;\r
26 import org.w3._2001.xmlschema.Element;\r
27 import org.w3._2001.xmlschema.LocalComplexType;\r
28 import org.w3._2001.xmlschema.LocalSimpleType;\r
29 import org.w3._2001.xmlschema.NamedAttributeGroup;\r
30 import org.w3._2001.xmlschema.OpenAttrs;\r
31 import org.w3._2001.xmlschema.Restriction;\r
32 import org.w3._2001.xmlschema.Schema;\r
33 import org.w3._2001.xmlschema.SimpleType;\r
34 import org.w3._2001.xmlschema.TopLevelAttribute;\r
35 \r
36 public class ImporterGenerator extends SchemaConversionBase{\r
37         \r
38         public ImporterGenerator(Configuration configuration) {\r
39                 super(configuration);\r
40         }\r
41 \r
42         String commentTag = "//";\r
43         \r
44         Schema schema;\r
45         String ontologyClassName;\r
46         SchemaConverter converter;\r
47         \r
48         List<String> ruleClassNames = new ArrayList<String>();\r
49         \r
50         String ontShort = "ONT"; \r
51         \r
52         File importParserDir;\r
53         String elementPackageName;\r
54         \r
55         public void createParser(Schema schema,String className, SchemaConverter converter) throws IOException {\r
56                 this.schema = schema;\r
57                 this.ontologyClassName = className;\r
58                 this.converter = converter;\r
59                 \r
60                 \r
61                 String packageParts[] = className.split("\\.");\r
62                 String name = packageParts[packageParts.length-1];\r
63         \r
64                 \r
65                 ontShort = name.substring(0, 3).toUpperCase();\r
66                 ontShort +=".";\r
67                 String parserPackagePostfix = "_elem";\r
68                 String importerClassPostfix = "Importer";\r
69                 elementPackageName = name+parserPackagePostfix;\r
70                 \r
71                 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);\r
72                 if (!importParserDir.exists())\r
73                         importParserDir.mkdirs();\r
74                 \r
75                 handle(schema);\r
76                 \r
77                 File importParserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");\r
78                 PrintWriter mainWriter = createFile(importParserFile);\r
79                 mainWriter.println("package " + converter.getPluginName() +";");\r
80                 mainWriter.println();\r
81                 mainWriter.println("import java.io.File;");\r
82                 mainWriter.println("import org.simantics.db.Session;");\r
83                 mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;");\r
84                 mainWriter.println("import org.simantics.xml.sax.base.XMLParser;");\r
85                 mainWriter.println();\r
86                 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");\r
87                 mainWriter.println();\r
88                 mainWriter.println("   public " + name + importerClassPostfix+"(Session session, File file)  {");\r
89                 mainWriter.println("      super(session,file);");\r
90                 mainWriter.println("   }");\r
91                 mainWriter.println();\r
92                 mainWriter.println("   @Override");\r
93                 mainWriter.println("   public void configure(XMLParser parser) {");\r
94                 for (String s : ruleClassNames) {\r
95                 mainWriter.println("      parser.add(new "+s+"());");\r
96                 }\r
97                 mainWriter.println("   }");\r
98                 mainWriter.println("}");\r
99                 \r
100                 mainWriter.println();\r
101                 mainWriter.flush();\r
102                 mainWriter.close();\r
103         }\r
104         \r
105         protected PrintWriter createFile(File file) throws IOException {\r
106                 if (!file.exists())\r
107                         file.createNewFile();\r
108                 PrintWriter writer = new PrintWriter(file);\r
109                 for (String s : converter.getHeader()) {\r
110                         writer.println(commentTag + " " + s);   \r
111                 }\r
112                 writer.println();\r
113                 return writer;\r
114         }\r
115         \r
116 //      protected String getValueGetter(String binding,String name) {\r
117 //              if (binding == null)\r
118 //                      return name+".getValue()";\r
119 //              if ("STRING".equals(binding))\r
120 //                      return name+".getValue()";\r
121 //              if ("BOOLEAN".equals(binding))\r
122 //                      return "Boolean.parseBoolean("+name+".getValue())";\r
123 //              if ("INTEGER".equals(binding))\r
124 //                      return "Integer.parseInt("+name+".getValue())";\r
125 //              if ("DOUBLE".equals(binding))\r
126 //                      return "Double.parseDouble("+name+".getValue())";\r
127 //              if ("FLOAT".equals(binding))\r
128 //                      return "Float.parseFloat("+name+".getValue())";\r
129 //              return name+".getValue()";\r
130 //      }\r
131 //      protected String getValueGetter(String binding) {\r
132 //              if (binding == null)\r
133 //                      return "value";\r
134 //              if ("STRING".equals(binding))\r
135 //                      return "value";\r
136 //              if ("BOOLEAN".equals(binding))\r
137 //                      return "Boolean.parseBoolean(value)";\r
138 //              if ("INTEGER".equals(binding))\r
139 //                      return "Integer.parseInt(value)";\r
140 //              if ("DOUBLE".equals(binding))\r
141 //                      return "Double.parseDouble(value)";\r
142 //              if ("FLOAT".equals(binding))\r
143 //                      return "Float.parseFloat(value)";\r
144 //              return "value";\r
145 //      }\r
146         protected String getValueGetter(TypeEntry binding,String name) {\r
147                 if (binding == null)\r
148                         return name+".getValue()";\r
149                 return binding.getValueGetter(name);\r
150         }\r
151         protected String getValueGetter(TypeEntry binding) {\r
152                 if (binding == null)\r
153                         return "value";\r
154                 return binding.getValueGetter();\r
155         }\r
156         \r
157         protected void handle(TopLevelAttribute topLevelAttribute) {\r
158 \r
159         }\r
160         \r
161 \r
162         \r
163         public static String getComplexTypePrefix() {\r
164                 return "ComplexTypes_";\r
165         }       \r
166         \r
167         public static String getAttributeGroupPrefix() {\r
168                 return "AttributeGroups_";\r
169         }\r
170         \r
171         private Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();\r
172         @Override\r
173         protected void handleComplexType(SchemaObject complexTypeObj) {\r
174                 ComplexType topLevelComplexType = complexTypeObj.getComplexType();\r
175                 \r
176                 String name = getName(complexTypeObj);//topLevelComplexType.getName();\r
177                 \r
178                 String className = name;//"_"+name;\r
179                 \r
180                 FileWriter fw = new FileWriter();\r
181                 try {\r
182                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));\r
183                 } catch (IOException e) {\r
184                         throw new RuntimeException(e);\r
185                 }\r
186                 writers.put(complexTypeObj, fw);\r
187                 \r
188                 boolean isList = false;\r
189 \r
190                 String baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";\r
191                 \r
192                 boolean inherited = false;\r
193                 \r
194                 QName type = getComplexTypeBase(topLevelComplexType);\r
195                 if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {\r
196                         baseClass = getName(complexTypeName.get(type.getLocalPart()));\r
197                         inherited = true;\r
198                 }\r
199                 \r
200                 provider = getIDProvider(topLevelComplexType);\r
201                 List<IDReference> references = getIDReferences(topLevelComplexType);\r
202                 UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);\r
203 \r
204                 List<String> intrerfaces = new ArrayList<String>();\r
205                 if (references.size() > 0)\r
206                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");\r
207                 if (unknownChildElement != null)\r
208                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");\r
209                 \r
210                 createClassHeader(fw.writer, isList);\r
211                 writeClass(fw.writer,true, null, className, baseClass, intrerfaces);\r
212                         \r
213                 writeIDProvider(fw.writer);\r
214         \r
215                 fw.writer.println("   @Override");\r
216                 fw.writer.println("   public Resource create(WriteGraph graph, Element element) throws DatabaseException{");\r
217                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");\r
218                 fw.writer.println("      "+getOntologyImport());\r
219                 if (!isList) {\r
220                 fw.writer.println("      Resource res = graph.newResource();");\r
221                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");\r
222                 } else {\r
223                 fw.writer.println("      Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");\r
224                 }\r
225                 fw.writer.println("      return res;");\r
226                 fw.writer.println("   }");\r
227                 fw.writer.println();\r
228                 \r
229                 fw.writer.println("   @Override");\r
230                 fw.writer.println("   public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{");\r
231                 fw.writer.println("      "+getOntologyImport());\r
232                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");\r
233                 fw.writer.println("      return true;");\r
234                 fw.writer.println("   }");\r
235                 fw.writer.println();\r
236                                 \r
237                 StringWriter stringWriter = new StringWriter();\r
238                 fw.delayedWriter = new PrintWriter(stringWriter);\r
239                 StringWriter stringWriter2 = new StringWriter();\r
240                 fw.delayedWriter2 = new PrintWriter(stringWriter2);\r
241                 \r
242                 fw.writer.println("   public " + className + "() {");\r
243                 fw.writer.println("      super();");\r
244                 \r
245                 handleComplexTypeExtension(complexTypeObj);\r
246                 \r
247                 fw.writer.println("   }");\r
248                 \r
249                 fw.writer.println("   @Override");\r
250                 fw.writer.println("   public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{");\r
251                 fw.writer.println("      "+getOntologyImport());\r
252                 \r
253                 if (stringWriter.getBuffer().length() > 0) {\r
254                         fw.writer.write(stringWriter.toString());\r
255                 }\r
256                 \r
257                 \r
258                 fw.writer.println("      return false;");\r
259                 fw.writer.println("   }");\r
260                 fw.writer.println();\r
261                 \r
262                 if (stringWriter2.getBuffer().length() > 0) {\r
263                         fw.writer.write(stringWriter2.toString());\r
264                 }\r
265                 \r
266                 stringWriter = null;\r
267                 fw.delayedWriter.close();\r
268                 fw.delayedWriter=null;\r
269                 stringWriter2 = null;\r
270                 fw.delayedWriter2.close();\r
271                 fw.delayedWriter2 = null;\r
272                 \r
273                 fw.writer.println("   @Override");\r
274                 fw.writer.println("   public void configure(WriteGraph graph, Deque<Element> parents, Element element) throws DatabaseException {");\r
275                 if (inherited) {\r
276                 fw.writer.println("             super.configure(graph,parents,element);");\r
277                 }\r
278                 fw.writer.println("        "+getOntologyImport());\r
279                 \r
280                 handleComplexTypeAttributes(complexTypeObj);\r
281                 handleExtensionAttributes(complexTypeObj);\r
282                 \r
283                 fw.writer.println("   }");\r
284                 \r
285                 writeIDReferences(fw.writer,name, references);\r
286                 writeUnknownChild(fw.writer,name,unknownChildElement);\r
287                 \r
288                 fw.writer.println("}");\r
289                 fw.writer.println();\r
290                 fw.writer.flush();\r
291                 fw.writer.close();\r
292                 fw.writer = null;\r
293                 writers.remove(complexTypeObj);\r
294                 provider = null;\r
295         }\r
296         \r
297         @Override\r
298         protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
299                 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {\r
300                         for (SchemaElement e : elements) {\r
301                                 handle(parent, indicator, e);\r
302                         }\r
303                 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {\r
304                         String name = getChoiceName(elements);\r
305 \r
306                         for (SchemaElement e : elements) {\r
307                                 Element localElement = e.getElement();\r
308                                 if (localElement.getName() != null) {\r
309                                         QName refType = localElement.getType();\r
310                                         if (refType != null)\r
311                                                 handleIndicator(parent, indicator, e, false, name, refType);\r
312                                 } else if (localElement.getRef() != null) {\r
313                                         QName refType = localElement.getRef();\r
314                                         handleIndicator(parent, indicator, e, true, name, refType);\r
315                                 }\r
316                         }\r
317                 }\r
318                 \r
319         }\r
320         \r
321         @Override\r
322         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element,  boolean reference, String ref, QName refType) {\r
323                 FileWriter fw = getWriter(parent);\r
324                 String binding = getBindingFromPrimitiveType(refType);\r
325                 if (binding == null) {\r
326                         SchemaObject refElement = elementName.get(refType.getLocalPart());\r
327                         SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart());\r
328 //                      String className = refType.getLocalPart();\r
329 //                      if (!isElementRef(refType.getLocalPart())) { \r
330 //                              className = "_"+className;\r
331 //                      }\r
332 //                      \r
333 //                      String refClassName = refType.getLocalPart();\r
334 //                      if (isComplexTypeRef(refClassName)) {\r
335 //                              refClassName = "_"+refClassName;\r
336 //                      }\r
337                         String className = null;\r
338                         String refClassName = null;\r
339                         if (refElement != null)\r
340                                 className = getName(refElement);\r
341                         else\r
342                                 className = getName(refComplexType);\r
343                         \r
344                         if (refComplexType != null) {\r
345                                 refClassName = getName(refComplexType);\r
346                         } else {\r
347                                 refClassName = getName(refElement);\r
348                         }\r
349                         \r
350                         if (!reference)\r
351                         fw.writer.println("        addParser(\""+ ref +"\", "+className+".class);");\r
352                         else\r
353                         fw.writer.println("        addParser("+className+".class);");\r
354                         if (!className.equals(refClassName))\r
355                         fw.writer.println("        addParser("+refClassName+".class);");\r
356                         \r
357                         fw.delayedWriter.println("         if (child.getParser() instanceof "+refClassName+"){");\r
358                         fw.delayedWriter.println("            graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");\r
359                         if (useElementList(parent, indicator,element, reference, ref, refType)) {\r
360         \r
361                         // element type specific list\r
362                         fw.delayedWriter.println("            {");\r
363                         fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List);");\r
364                         fw.delayedWriter.println("               if (list == null) {");\r
365                         fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
366                         fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List,list);");\r
367                         fw.delayedWriter.println("               } else {");\r
368                         fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
369                         fw.delayedWriter.println("               }");\r
370                         fw.delayedWriter.println("            }");\r
371                         }\r
372                         if (useOriginalList(parent, indicator,element, reference, ref, refType)) {\r
373                         // generic list\r
374                         fw.delayedWriter.println("            {");\r
375                         //fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);");\r
376                         fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");\r
377                         fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");\r
378                         fw.delayedWriter.println("               if (list == null) {");\r
379                         fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
380                         //fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);");\r
381                         fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");\r
382                         fw.delayedWriter.println("               } else {");\r
383                         fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
384                         fw.delayedWriter.println("               }");\r
385                         fw.delayedWriter.println("            }");\r
386                         }\r
387                         \r
388                         fw.delayedWriter.println("            return true;");\r
389                         fw.delayedWriter.println("         }");\r
390                 } else {\r
391                         //writer.println(commentTag+ontShort+"."+parent+".has"+ref + " <R " +  ontShort+".hasElement");\r
392                         fw.writer.println("        addParser(\""+ ref +"\", "+getName(parent) +"_" +ref+".class);");\r
393                         \r
394                         fw.delayedWriter2.println("   public static class " + getName(parent) +"_" +ref+" extends org.simantics.xml.sax.base.ValueElementParser {");\r
395                         fw.delayedWriter2.println("      "+ getName(parent) +"_" +ref +"(){");\r
396                         fw.delayedWriter2.println("           super(\""+ref+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+ref+", "+binding+");");\r
397                         fw.delayedWriter2.println("       }");\r
398                         fw.delayedWriter2.println("   }");\r
399                 }\r
400         }\r
401         \r
402         @Override\r
403         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element,  boolean reference, String ref, OpenAttrs attrs) {\r
404                 FileWriter fw = getWriter(parent);\r
405                 SchemaObject obj = getWithObj(parent, attrs);\r
406         \r
407 //              String className = refType.getLocalPart();\r
408 //              if (!isElementRef(refType.getLocalPart())) { \r
409 //                      className = "_"+className;\r
410 //              }\r
411 //              \r
412 //              String refClassName = refType.getLocalPart();\r
413 //              if (isComplexTypeRef(refClassName)) {\r
414 //                      refClassName = "_"+refClassName;\r
415 //              }\r
416                 String className = getName(obj);\r
417                 \r
418                 \r
419                 if (!reference)\r
420                 fw.writer.println("        addParser(\""+ ref +"\", "+className+".class);");\r
421                 else\r
422                 fw.writer.println("        addParser("+className+".class);");\r
423                 \r
424                 fw.delayedWriter.println("         if (child.getParser() instanceof "+className+"){");\r
425                 fw.delayedWriter.println("            graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");\r
426                 if (useElementList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {\r
427 \r
428                 // element type specific list\r
429                 fw.delayedWriter.println("            {");\r
430                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List);");\r
431                 fw.delayedWriter.println("               if (list == null) {");\r
432                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
433                 fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List,list);");\r
434                 fw.delayedWriter.println("               } else {");\r
435                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
436                 fw.delayedWriter.println("               }");\r
437                 fw.delayedWriter.println("            }");\r
438                 }\r
439                 if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {\r
440                 // generic list\r
441                 fw.delayedWriter.println("            {");\r
442                 //fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);");\r
443                 fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");\r
444                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");\r
445                 fw.delayedWriter.println("               if (list == null) {");\r
446                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
447                 //fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);");\r
448                 fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");\r
449                 fw.delayedWriter.println("               } else {");\r
450                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
451                 fw.delayedWriter.println("               }");\r
452                 fw.delayedWriter.println("            }");\r
453                 }\r
454                 \r
455                 fw.delayedWriter.println("            return true;");\r
456                 fw.delayedWriter.println("         }");\r
457                 \r
458         }\r
459         \r
460         @Override\r
461         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {               \r
462                 FileWriter fw = getWriter(parent);\r
463                 fw.delayedWriter2.println("   @Override");\r
464                 fw.delayedWriter2.println("   public Class<? extends org.simantics.xml.sax.base.XMLElementParser> getParser(java.util.Map<java.lang.String,org.simantics.xml.sax.base.XMLElementParser> parsers, Element element, Element child) {");\r
465                 fw.delayedWriter2.println("      Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");\r
466                 fw.delayedWriter2.println("      if (parserClass != null) return parserClass;");\r
467                 fw.delayedWriter2.println("      org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");\r
468                 fw.delayedWriter2.println("      if (parser != null) return parser.getClass();");\r
469                 fw.delayedWriter2.println("      return null;");\r
470                 fw.delayedWriter2.println("   }");\r
471         }\r
472         \r
473         private FileWriter getWriter(SchemaObject obj) {\r
474                 SchemaObject s = obj;\r
475                 while (s != null) {\r
476                         FileWriter fw = writers.get(s);\r
477                         if (fw != null)\r
478                                 return fw;\r
479                         s = s.getParent();\r
480                 }\r
481                 return null;\r
482         }\r
483         \r
484         \r
485         @Override       \r
486         protected void handle(SchemaObject parent, Attribute attribute) {\r
487                 String name = attribute.getName();\r
488                 QName primitiveType = attribute.getType();\r
489                 SimpleType simpleType = attribute.getSimpleType();\r
490                 QName ref = attribute.getRef();\r
491                 \r
492                 String relationName;\r
493                 String attrName;\r
494                 if (name != null) {\r
495                         attrName = name;\r
496                         relationName = ontShort+"has"+name;\r
497                         if (parent != null)\r
498                                 relationName = ontShort+getName(parent)+"_has"+name;\r
499                 }\r
500                 else if (ref != null && parent != null) {\r
501                         attrName = ref.getLocalPart();\r
502                         relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();\r
503                         \r
504                         Attribute referred = getRefAttribute(ref);\r
505                         if (referred != null) {\r
506                                 primitiveType = referred.getType();\r
507                                 simpleType = referred.getSimpleType();\r
508                         }\r
509                         \r
510                 } else {\r
511                         throw new RuntimeException();\r
512                 }\r
513                 boolean isReference = false;\r
514                 if (provider!= null && provider.getAttribute().getName().equals(attrName))\r
515                         isReference = true;\r
516                 \r
517                 FileWriter fw = getWriter(parent);\r
518                 if (primitiveType != null) {\r
519                         \r
520                         //String binding = getBindingFromPrimitiveType(primitiveType);\r
521                         TypeEntry binding = getTypeEntry(primitiveType);\r
522                         \r
523                         if (binding != null) {\r
524                                 writeAttribute(fw, attrName, relationName, binding, isReference);\r
525                                 return;\r
526                     } else {\r
527                         if (simpleType == null) {\r
528                                 SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart());\r
529                                 if (simpleTypeObj != null)\r
530                                         simpleType = simpleTypeObj.getSimpleType();\r
531                         }       \r
532                     }\r
533                 } \r
534                 if (simpleType != null) {\r
535                         Restriction restriction = simpleType.getRestriction();\r
536                         if (restriction == null)\r
537                                 throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");\r
538                         QName base = restriction.getBase();\r
539                         \r
540                         \r
541                         //String binding = getBindingFromPrimitiveType(base);\r
542                         TypeEntry binding = getTypeEntry(base);\r
543                         writeAttribute(fw, attrName, relationName, binding, isReference);\r
544                 } else {\r
545                         // TODO : using default String attribute should be configured with rules.\r
546                         //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());\r
547                         fw.writer.println("    //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");\r
548                         //writeAttribute(fw, attrName, relationName, "STRING", isReference);\r
549                         writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference);\r
550                 }\r
551         }\r
552         \r
553         //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) {\r
554         private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {\r
555                 fw.writer.println("      {");\r
556                 fw.writer.println("         Attribute a = element.getAttribute(\"" +attrName+"\");");\r
557                 fw.writer.println("         if (a != null) {");\r
558                 fw.writer.println("            graph.claimLiteral(element.getData(),"+relationName+","+getValueGetter(binding,"a")+", "+binding.binding+");");\r
559                 if (isReference)\r
560                 fw.writer.println("            idProviderValue = a.getValue();");       \r
561                 fw.writer.println("         }");\r
562                 fw.writer.println("      }");\r
563         }\r
564         \r
565         @Override\r
566         protected void handleAttributes(SchemaObject simpleTypeObj) {\r
567                 SchemaObject parent = simpleTypeObj.getParent();\r
568                 FileWriter fw = getWriter(parent);\r
569                 \r
570                 SimpleType simpleType = simpleTypeObj.getSimpleType();\r
571                 Restriction restriction = simpleType.getRestriction();\r
572                 if (restriction == null)\r
573                         throw new RuntimeException("Cannot resolve type for Element " + getName(parent));\r
574                 QName base = restriction.getBase();\r
575                 \r
576                 \r
577                 //String binding = getBindingFromPrimitiveType(base);\r
578                 TypeEntry binding = getTypeEntry(base);\r
579                 fw.writer.println("   @Override");\r
580                 fw.writer.println("   public void configure(WriteGraph graph, Element element, java.lang.String value) throws DatabaseException {");\r
581                 //fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");\r
582                 fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");\r
583                 fw.writer.println("   }");\r
584                 \r
585         }\r
586         \r
587         @Override\r
588         protected void handle(SchemaObject parent, AttributeGroup attribute) {\r
589                 if (parent != null) {\r
590                         FileWriter fw = getWriter(parent);\r
591                         NamedAttributeGroup group = getAttributeGroup(attribute.getRef().getLocalPart());\r
592                         fw.writer.println(commentTag+"    AttributeGroup " + group.getName());\r
593                         SchemaObject obj = new SchemaObject(parent,attribute);\r
594                         for (Annotated annotated : group.getAttributeOrAttributeGroup()) {\r
595                                 if (annotated instanceof Attribute) {\r
596                                         //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);\r
597                                         handle(obj,(Attribute)annotated);\r
598                                 } else if (annotated instanceof AttributeGroup) {\r
599                                         //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);\r
600                                         handle(obj,(AttributeGroup)annotated);\r
601                                 }\r
602                         }\r
603                         fw.writer.println(commentTag+"    End of AttributeGroup " + group.getName());\r
604                 }\r
605                 \r
606         }\r
607         \r
608         @Override\r
609         protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
610                 FileWriter fw = getWriter(parent);\r
611                 QName type = new QName(CONVERSION_NS, composition.getType());\r
612                 String arrayBinding = getBindingFromPrimitiveType(type);\r
613                 String javaType = getJavaTypeFromPrimitiveType(type);\r
614                 String name = composition.getName();\r
615                 \r
616                 String relationName;\r
617                 if (name != null) {\r
618                         relationName = ontShort+"has"+name;\r
619                         if (parent != null)\r
620                                 relationName = ontShort+getName(parent)+"_has"+name;\r
621                 } else {\r
622                         throw new RuntimeException();\r
623                 }\r
624                 \r
625                 fw.writer.println("      {");\r
626                 int i = 0;\r
627                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())\r
628                 fw.writer.println("         Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");\r
629                 fw.writer.print  ("         "+javaType + " value = new "+javaType+"{");\r
630                 i = 0;\r
631                 // FIXME : handle optional attributes properly.\r
632                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {\r
633                         Attribute attribute = ((Attribute)attributes.getRight(a));\r
634                         //QName atype = getBaseType(attribute);\r
635                         QName atype = getPrimitiveType(attribute);\r
636                         String defaultValue = attribute.getDefault();\r
637                         if (defaultValue == null)\r
638                             defaultValue = getDefaultValue(atype);\r
639                                 \r
640                         //String binding = getBindingFromPrimitiveType(atype);\r
641                         TypeEntry binding = getTypeEntry(atype);\r
642                         if (i > 0)\r
643                                 fw.writer.print(",");\r
644                         if (defaultValue != null)\r
645                                 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetter(binding,"a"+(i++)) + " : " +defaultValue);\r
646                         else\r
647                                 fw.writer.print(getValueGetter(binding,"a"+(i++)));\r
648                 }\r
649                 fw.writer.println("};");\r
650                 fw.writer.println("         graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");\r
651                 fw.writer.println("      }");\r
652                 \r
653         }\r
654         \r
655         protected String getDefaultValue(QName atype) {\r
656                 Map<String,TypeEntry> types = typeMap.get(atype.getNamespaceURI());\r
657                 if (types == null)\r
658                         return null;\r
659                 TypeEntry entry =  types.get(atype.getLocalPart());\r
660                 if (entry == null)\r
661                         return null;\r
662                 return entry.defaultValue;\r
663         }\r
664         \r
665         \r
666         @Override\r
667         protected void handleSimpleType(SchemaObject parent, SchemaObject simpleType) {\r
668 \r
669         }\r
670         \r
671         \r
672         \r
673         IDProvider provider;\r
674         @Override\r
675         protected void handleElement(SchemaObject elementObj)  {\r
676                 Element element = elementObj.getElement();\r
677                 \r
678                 String name = getName(elementObj);//topLevelElement.getName();\r
679                 String className = name;\r
680                 \r
681                 FileWriter fw = new FileWriter();\r
682                 try {\r
683                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));\r
684                 } catch (IOException e) {\r
685                         throw new RuntimeException(e);\r
686                 }\r
687                 writers.put(elementObj, fw);\r
688                 boolean isList = false;\r
689                 \r
690                 Pair<String, Boolean> inhertiance = getElementInheritance(elementObj);\r
691                 boolean inherited = inhertiance.second;\r
692                 String baseClass = inhertiance.first;//"org.simantics.xml.sax.base.XMLElementParserBase";\r
693                 \r
694                 \r
695                 provider = getIDProvider(element);\r
696                 List<IDReference> references = getIDReferences(element);\r
697                 UnrecognizedChildElement unknownChildElement = getUnknown(element);\r
698 \r
699                 List<String> intrerfaces = new ArrayList<String>();\r
700                 if (references.size() > 0)\r
701                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");\r
702                 if (unknownChildElement != null)\r
703                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");\r
704 \r
705                 createClassHeader(fw.writer, isList);\r
706                 writeClass(fw.writer,false, element.getName(), className, baseClass, intrerfaces);\r
707                 writeIDProvider(fw.writer);\r
708                 fw.writer.println("   @Override");\r
709                 fw.writer.println("   public Resource create(WriteGraph graph, Element element) throws DatabaseException{");\r
710                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");\r
711                 fw.writer.println("      "+getOntologyImport());\r
712                 if (!isList) {\r
713                 fw.writer.println("      Resource res = graph.newResource();");\r
714                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");\r
715                 } else {\r
716                 fw.writer.println("      Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");\r
717                 }\r
718                 fw.writer.println("      return res;");\r
719                 fw.writer.println("   }");\r
720                 fw.writer.println();\r
721                 \r
722                 fw.writer.println("   @Override");\r
723                 fw.writer.println("   public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{");\r
724                 fw.writer.println("      "+getOntologyImport());\r
725                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");\r
726                 fw.writer.println("      return true;");\r
727                 fw.writer.println("   }");\r
728                 fw.writer.println();\r
729                 \r
730                 fw.writer.println("   @Override");\r
731                 fw.writer.println("   public void configure(WriteGraph graph, Deque<Element> parents, Element element) throws DatabaseException {");\r
732                 if (inherited) {\r
733                 fw.writer.println("             super.configure(graph,parents,element);");\r
734                 }\r
735                 fw.writer.println("        "+getOntologyImport());\r
736                 \r
737                 LocalComplexType complexType = element.getComplexType();\r
738                 LocalSimpleType simpleType = element.getSimpleType();\r
739                 \r
740                 if (complexType != null) {\r
741                         SchemaObject obj = complexTypes.get(complexType);\r
742                         handleElementComplexTypeAttributes(obj);\r
743                 } \r
744                 fw.writer.println("   }");\r
745                 \r
746                 if (simpleType != null) {\r
747                         SchemaObject obj = simpleTypes.get(simpleType);\r
748                         handleElementSimpleTypeAttributes(obj);\r
749                 }\r
750                 \r
751                 \r
752                 StringWriter stringWriter = new StringWriter();\r
753                 fw.delayedWriter = new PrintWriter(stringWriter);\r
754                 StringWriter stringWriter2 = new StringWriter();\r
755                 fw.delayedWriter2 = new PrintWriter(stringWriter2);\r
756                 \r
757                 fw.writer.println("   public " + className + "() {");\r
758                 fw.writer.println("      super();");\r
759                 \r
760                 if (complexType != null) {\r
761                         SchemaObject obj = complexTypes.get(complexType);\r
762                         handleComplexTypeExtension(obj);\r
763                 } else if (simpleType != null) {\r
764                         \r
765                 }\r
766                 \r
767                 fw.writer.println("   }");\r
768                 \r
769                 fw.writer.println("   @Override");\r
770                 fw.writer.println("   public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{");\r
771                 fw.writer.println("      "+getOntologyImport());\r
772                 \r
773                 if (stringWriter.getBuffer().length() > 0) {\r
774                         fw.writer.write(stringWriter.toString());\r
775                 }\r
776                 if (inherited) {\r
777                 fw.writer.println("      return super.connectChild(graph,element,child);");     \r
778                 } else {\r
779                 fw.writer.println("      return false;");\r
780                 }\r
781                 fw.writer.println("   }");\r
782                 fw.writer.println();\r
783                 \r
784                 if (stringWriter2.getBuffer().length() > 0) {\r
785                         fw.writer.write(stringWriter2.toString());\r
786                 }\r
787                 \r
788                 stringWriter = null;\r
789                 fw.delayedWriter.close();\r
790                 fw.delayedWriter = null;\r
791                 stringWriter2 = null;\r
792                 fw.delayedWriter2.close();\r
793                 fw.delayedWriter2 = null;\r
794                 \r
795                 writeIDReferences(fw.writer,name, references);\r
796                 writeUnknownChild(fw.writer,name,unknownChildElement);\r
797 \r
798                 fw.writer.println("}");\r
799                 fw.writer.println();\r
800                 fw.writer.flush();\r
801                 fw.writer.close();\r
802                 fw.writer = null;\r
803                 writers.remove(elementObj);\r
804                 provider = null;\r
805                 \r
806                 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);\r
807         }\r
808         \r
809         private Pair<String,Boolean> getElementInheritance(SchemaObject topLevelElementObj) {\r
810                 Element topLevelElement = topLevelElementObj.getElement();\r
811                 String baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";\r
812                 boolean inherited = false;\r
813                 if (topLevelElement.getType() != null) {\r
814                         QName type = topLevelElement.getType();\r
815                         if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
816                                 SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
817                                 baseClass = getName(obj);\r
818                                 inherited = true;\r
819                         }       \r
820                 }\r
821                 if (!inherited) {\r
822                         QName type = getElementBase(topLevelElement);\r
823                         if (type != null) {\r
824                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
825                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
826                                         baseClass = getName(obj);\r
827                                         inherited = true;\r
828                                 }       \r
829                         }\r
830                 }\r
831                 if (!inherited) {\r
832                         QName type = topLevelElement.getSubstitutionGroup();\r
833                         if (type != null) {\r
834                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
835                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
836                                         baseClass = getName(obj);\r
837                                         inherited = true;\r
838                                 }       \r
839                         }\r
840                 }\r
841                 \r
842                 return new Pair<String, Boolean>(baseClass, inherited);\r
843         }\r
844         \r
845         private void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {\r
846                 writer.println("@SuppressWarnings(\"unused\")");\r
847                 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);\r
848                 if (interfaces.size() > 0) {\r
849                         writer.print(" implements ");\r
850                         for (int i = 0; i < interfaces.size(); i++) {\r
851                                 writer.print(interfaces.get(i));\r
852                                 if (i < interfaces.size() -1 )\r
853                                         writer.print(",");\r
854                         }\r
855                 }\r
856                 writer.println("{");\r
857                 writer.println();\r
858                 writer.println("   @Override");\r
859                 writer.println("   public java.lang.String getElementId() {");\r
860                 if (name != null)\r
861                 writer.println("      return \""+name+"\";");\r
862                 else // complex types cannot be parsed directly with name/id reference.\r
863                 writer.println("      return null;");\r
864                 writer.println("   }");\r
865                 writer.println();\r
866         }\r
867         \r
868         private void writeIDProvider(PrintWriter writer) {\r
869                 if (provider != null) {\r
870                 writer.println("   java.lang.String idProviderValue = null;");\r
871                 writer.println();\r
872                 writer.println("   @Override");\r
873                 writer.println("   public java.lang.String getID() {");\r
874                 writer.println("        java.lang.String s = idProviderValue;");\r
875                 writer.println("        idProviderValue = null;");\r
876                 writer.println("        return s;");\r
877                 writer.println("   }");\r
878                 writer.println();\r
879                 if (provider.getPriority() != null) {\r
880                 writer.println("   @Override");\r
881                 writer.println("   public int idPriority() {");\r
882                 writer.println("        return " + provider.getPriority().intValue()+";");\r
883                 writer.println("   }"); \r
884                 }\r
885                 }\r
886         }\r
887         \r
888         private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {\r
889                 if (references.size() > 0) {\r
890                 writer.println("   @Override");\r
891                 writer.println("   public boolean connectReferences(WriteGraph graph, Element element, java.util.Map<java.lang.String, Element> map) throws DatabaseException {");\r
892                 writer.println("      "+getOntologyImport());\r
893                 writer.println("      boolean result = true;");\r
894                 for (IDReference ref : references) {\r
895                 writer.println("      {");\r
896                 writer.println("         Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");\r
897                 writer.println("         if (a != null) {");\r
898                 writer.println("            Element refEle = map.get(a.value);");\r
899                 writer.println("            if (refEle != null) {");\r
900                 writer.println("               Resource ref = refEle.getData();");\r
901                 writer.println("               graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");\r
902                 writer.println("            } else {");\r
903                 writer.println("               result = false;");\r
904                 writer.println("            }");\r
905                 writer.println("         }");\r
906                 writer.println("      }");\r
907                 }\r
908                 writer.println("      return result;");\r
909                 writer.println("   }");\r
910                 writer.println();\r
911                 }\r
912         }\r
913         \r
914         private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {\r
915                 if (unknownChildElement == null)\r
916                         return;\r
917                 \r
918                 writer.println("   @Override");\r
919                 writer.println("   public void configureChild(WriteGraph graph, Deque<Element> parents, Element element, Element child) throws DatabaseException {");\r
920                 writer.println("    " + unknownChildElement.getJavaMethod());\r
921                 writer.println("   }");\r
922                 writer.println();\r
923                 \r
924         }\r
925         \r
926         protected void createClassHeader(PrintWriter writer, boolean isList) {\r
927                 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");\r
928                 writer.println();\r
929                 writer.println("import java.util.Deque;");\r
930                 writer.println("import org.simantics.databoard.Bindings;");\r
931                 writer.println("import org.simantics.db.Resource;");\r
932                 writer.println("import org.simantics.db.WriteGraph;");\r
933                 writer.println("import org.simantics.db.exception.DatabaseException;");\r
934                 writer.println("import org.simantics.xml.sax.base.Attribute;");\r
935                 writer.println("import org.simantics.xml.sax.base.Element;");\r
936                 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");\r
937                 if (!isList) {\r
938                 writer.println("import org.simantics.layer0.Layer0;");\r
939             } else {\r
940             writer.println("import java.util.Collections;");\r
941                 writer.println("import org.simantics.db.common.utils.ListUtils;");\r
942                 }\r
943                 writer.println();\r
944         }\r
945         \r
946         private String getOntologyImport() {\r
947                 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";\r
948         }\r
949         \r
950         \r
951         private static class FileWriter {\r
952                 public PrintWriter writer;\r
953                 \r
954                 public PrintWriter delayedWriter;\r
955                 public PrintWriter delayedWriter2;\r
956         }\r
957         \r
958         public static String getName(SchemaObject obj) {\r
959                 if (obj.getParent() == null) {\r
960                         switch (obj.getType()) {\r
961                         case COMPLEX_TYPE:\r
962                                 return getComplexTypePrefix()+obj.getName();\r
963                         case ELEMENT:\r
964                                 return obj.getName();\r
965                         case ATTRIBUTE_GROUP:\r
966                                 return getAttributeGroupPrefix()+obj.getName();\r
967                         case SIMPLE_TYPE:\r
968                                 return obj.getName();\r
969                         }\r
970                 } else {\r
971                         SchemaObject o = obj;\r
972                         SchemaObject prev = null;\r
973                         String name = "";\r
974                         while (o != null){\r
975                                 if (o.getName() != null)\r
976                                         name = o.getName()+"_"+name;\r
977                                 prev = o;\r
978                                 o = o.getParent();\r
979                                 if (prev.getObj() instanceof AttributeGroupRef)\r
980                                         o = null;\r
981                         }\r
982                         name = name.substring(0, name.length()-1);\r
983                         switch (prev.getType()) {\r
984                         case COMPLEX_TYPE:\r
985                                 return getComplexTypePrefix()+name;\r
986                         case ELEMENT:\r
987                                 return name;\r
988                         case ATTRIBUTE_GROUP:\r
989                                 return getAttributeGroupPrefix()+name;\r
990                         case SIMPLE_TYPE:\r
991                                 return name;\r
992                         }\r
993                 }\r
994                 throw new RuntimeException();\r
995                 \r
996         }\r
997         \r
998         public static String getName(SchemaObject obj, String rel) {\r
999                 if (obj.getParent() == null) {\r
1000                         switch (obj.getType()) {\r
1001                         case COMPLEX_TYPE:\r
1002                                 return getComplexTypePrefix()+rel+obj.getName();\r
1003                         case ELEMENT:\r
1004                                 return rel+obj.getName();\r
1005                         case ATTRIBUTE_GROUP:\r
1006                                 return getAttributeGroupPrefix()+rel+obj.getName();\r
1007                         case SIMPLE_TYPE:\r
1008                                 return rel+obj.getName();\r
1009                         }\r
1010                 } else {\r
1011                         SchemaObject o = obj;\r
1012                         SchemaObject prev = null;\r
1013                         String name = "";\r
1014                         while (o != null){\r
1015                                 if (o.getName() != null)\r
1016                                         name = o.getName()+"_"+name;\r
1017                                 prev = o;\r
1018                                 o = o.getParent();\r
1019                         }\r
1020                         name = name.substring(0, name.length()-1);\r
1021                         switch (prev.getType()) {\r
1022                         case COMPLEX_TYPE:\r
1023                                 return getComplexTypePrefix()+rel+name;\r
1024                         case ELEMENT:\r
1025                                 return rel+name;\r
1026                         case ATTRIBUTE_GROUP:\r
1027                                 return getAttributeGroupPrefix()+rel+name;\r
1028                         case SIMPLE_TYPE:\r
1029                                 return rel+name;\r
1030                         }\r
1031                 }\r
1032                 throw new RuntimeException();\r
1033                 \r
1034         }\r
1035 }\r