]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java
Using XML ontology as base of converted XML schemas
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / OntologyGenerator.java
1 package org.simantics.xml.sax;\r
2 \r
3 import java.io.FileNotFoundException;\r
4 import java.io.PrintWriter;\r
5 import java.io.StringWriter;\r
6 import java.util.ArrayList;\r
7 import java.util.LinkedHashSet;\r
8 import java.util.List;\r
9 import java.util.Set;\r
10 \r
11 import javax.xml.namespace.QName;\r
12 \r
13 import org.simantics.utils.datastructures.BijectionMap;\r
14 import org.simantics.xml.sax.configuration.AttributeComposition;\r
15 import org.simantics.xml.sax.configuration.Configuration;\r
16 import org.simantics.xml.sax.configuration.IDReference;\r
17 import org.w3._2001.xmlschema.Annotated;\r
18 import org.w3._2001.xmlschema.Attribute;\r
19 import org.w3._2001.xmlschema.AttributeGroup;\r
20 import org.w3._2001.xmlschema.Element;\r
21 import org.w3._2001.xmlschema.LocalComplexType;\r
22 import org.w3._2001.xmlschema.LocalSimpleType;\r
23 import org.w3._2001.xmlschema.NamedAttributeGroup;\r
24 import org.w3._2001.xmlschema.OpenAttrs;\r
25 import org.w3._2001.xmlschema.Restriction;\r
26 import org.w3._2001.xmlschema.Schema;\r
27 import org.w3._2001.xmlschema.SimpleType;\r
28 import org.w3._2001.xmlschema.TopLevelAttribute;\r
29 \r
30 public class OntologyGenerator extends SchemaConversionBase {\r
31         \r
32         public OntologyGenerator(Configuration configuration) {\r
33                 super(configuration);\r
34         }\r
35 \r
36         String ontRoot = "ONT.";\r
37         String commentTag = "//";\r
38         \r
39         Schema schema;\r
40         \r
41         String className;\r
42         \r
43         SchemaConverter converter;\r
44         \r
45         PrintWriter writer = null;\r
46         \r
47         public String getClassName() {\r
48                 return className;\r
49         }\r
50         \r
51         public void createOntology(Schema schema, SchemaConverter converter) throws FileNotFoundException {\r
52                 this.schema = schema;\r
53                 this.converter = converter;\r
54                 \r
55 //              for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) {\r
56 //                      if (attrs instanceof Annotation) {\r
57 //                              Annotation ann = (Annotation)attrs;\r
58 //                              for (Object o : ann.getAppinfoOrDocumentation()) {\r
59 //                                      if (o instanceof Documentation) {\r
60 //                                              Documentation doc = (Documentation)o;\r
61 //                                      } else if (o instanceof Appinfo) {\r
62 //                                              Appinfo info = (Appinfo)o;\r
63 //                                      }\r
64 //                              }\r
65 //                      }\r
66 //              }\r
67                 \r
68                 \r
69                 StringWriter stringWriter = null;\r
70                 if (converter.getOntologyFile() == null) {\r
71                         stringWriter = new StringWriter();\r
72                         writer = new PrintWriter(stringWriter);\r
73                 } else {\r
74                         writer = new PrintWriter(converter.getOntologyFile());\r
75                 }\r
76         \r
77                 handle(schema);\r
78                 \r
79                 writer.flush();\r
80                 writer.close();\r
81                 if (stringWriter != null)\r
82                         System.out.println(stringWriter.toString());\r
83         }\r
84         \r
85         protected void handle(Schema schema) {\r
86                 String ontologyName = schema.getTargetNamespace();\r
87                 if (ontologyName == null) {\r
88                         ontologyName = converter.getSchemaFile().getName();\r
89                         \r
90                         int index = ontologyName.lastIndexOf(".");\r
91                         if (index > 0)\r
92                                 ontologyName = ontologyName.substring(0, index);\r
93                 } \r
94                 if (!ontologyName.startsWith("http"))\r
95                         ontologyName = "http://" + ontologyName;\r
96                 String parts[] = ontologyName.split("/");\r
97                 String name = parts[parts.length-1];\r
98                 ontRoot = name.substring(0, Math.min(3, name.length())).toUpperCase();\r
99                 String version = schema.getVersion();\r
100                 if (version == null)\r
101                         version = "1.0";\r
102                 \r
103                 name = name.replaceAll("\\.", "_");\r
104                 name = name.replaceAll(" ", "_");\r
105                 className = converter.getPluginName() + "." + name;\r
106                 \r
107                 for (String s : converter.getHeader()) {\r
108                         writer.println(commentTag + " " + s);   \r
109                 }\r
110                 writer.println();\r
111                 writer.println("L0 = <http://www.simantics.org/Layer0-1.1>");\r
112                 writer.println("XML = <http://www.simantics.org/XML-1.0>");\r
113                 writer.println();\r
114                 writer.println(ontRoot + " = <" + ontologyName +"-"+ version+"> : L0.Ontology");\r
115                 writer.println("   @L0.new");\r
116                 writer.println("   L0.HasResourceClass \"" + className +"\"");\r
117                 writer.println();\r
118                 writer.println();\r
119                 \r
120                 ontRoot += ".";\r
121                 // TODO : these could be created in separate base ontology.\r
122 //              writer.println(commentTag + " Built-in types");\r
123 //              writer.println();\r
124 //              writer.println(ontRoot+"XML : L0.Library");\r
125 //              writer.println(ontRoot+"XML.hasAttribute <R L0.HasProperty");\r
126 //              writer.println(ontRoot+"XML.hasID <R "+ontRoot+"XML.hasAttribute : L0.FunctionalRelation");\r
127 //              writer.println("  --> L0.String");\r
128 //              writer.println(ontRoot+"XML.ComplexType <T L0.Entity");\r
129 //              writer.println(ontRoot+"XML.hasComplexType <R L0.IsComposedOf");\r
130 //              writer.println(ontRoot+"XML.AttributeGroup  <T L0.Entity");\r
131 //              writer.println(ontRoot+"XML.Element <T L0.Entity");\r
132 //              writer.println(ontRoot+"XML.hasElement <R L0.IsComposedOf");\r
133 //              writer.println(ontRoot+"XML.ElementList <T L0.List");\r
134 //              writer.println(ontRoot+"XML.hasElementList <R L0.IsComposedOf");\r
135 //              writer.println(ontRoot+"XML.hasOriginalElementList <R " + ontRoot+"XML.hasElementList");\r
136 //              writer.println(ontRoot+"XML.hasReference <R L0.IsRelatedTo");\r
137 //              writer.println(ontRoot+"XML.hasExternalReference <R L0.IsRelatedTo");\r
138 //              writer.println("   L0.InverseOf " + ontRoot+"XML.externalReferenceOf <R L0.IsRelatedTo");\r
139 //              writer.println();\r
140                 writer.println(ontRoot+"ComplexTypes : L0.Library");\r
141                 writer.println(ontRoot+"AttributeGroups : L0.Library");\r
142                 writer.println();\r
143                 writer.println(commentTag + " Interpreted from schema");\r
144                 writer.println();\r
145                         \r
146                 super.handle(schema);\r
147         }\r
148                 \r
149         protected String getType(QName qtype) {\r
150                 String ontType = getL0TypeFromPrimitiveType(qtype);\r
151                 if (ontType != null)\r
152                         return ontType;\r
153                 else if (isComplexTypeRef(qtype.getLocalPart()))\r
154                         return ontRoot+getComplexTypePrefix()+qtype.getLocalPart();\r
155                 else if (isElementRef(qtype.getLocalPart()))\r
156                         return ontRoot+qtype.getLocalPart();\r
157                 else if (qtype.getPrefix() != null && qtype.getPrefix().length() > 0) {\r
158                         return ontRoot+qtype.getPrefix()+qtype.getLocalPart();\r
159                 }\r
160                 throw new RuntimeException("Reference to unknown type " + qtype.getLocalPart());\r
161         }\r
162         \r
163         @Override\r
164         protected void handle(TopLevelAttribute topLevelAttribute) {\r
165                 super.handle(topLevelAttribute);\r
166                 writer.println();\r
167         }\r
168         \r
169         @Override\r
170         protected void handleSimpleType(SchemaObject topLevelSimpleType) {\r
171                 super.handleSimpleType(topLevelSimpleType);\r
172                 writer.println();\r
173         }\r
174         \r
175         \r
176         public static String getComplexTypePrefix() {\r
177                 return "ComplexTypes.";\r
178         }\r
179         \r
180         public static String getAttributeGroupPrefix() {\r
181                 return "AttributeGroups.";\r
182         }\r
183         \r
184         @Override\r
185         protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
186                 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {\r
187                         for (SchemaElement e : elements) {\r
188                                 handle(parent, indicator, e);\r
189                         }\r
190                 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {\r
191                         String name = getChoiceName(elements);\r
192                         boolean single = true;\r
193                         for (SchemaElement e : elements) {\r
194                                 if (e.getRestriction().many()) {\r
195                                         single = false;\r
196                                         break;\r
197                                 }\r
198                         }\r
199                         String relationName = ontRoot+getName(parent)+".has"+name;\r
200                         writer.print(relationName);\r
201                         \r
202                         List<String> types = new ArrayList<String>();\r
203                         for (SchemaElement e : elements) {\r
204                                 Element localElement = e.getElement();\r
205                                 QName refType = null;\r
206                                 String type = null;\r
207                                 \r
208                                 if (localElement.getName() != null) {\r
209                                         refType = localElement.getType();\r
210                                         type = getL0TypeFromPrimitiveType(refType);     \r
211                                 } else if (localElement.getRef() != null) {\r
212                                         refType = localElement.getRef();\r
213                                         type = getL0TypeFromPrimitiveType(refType);\r
214                                 }\r
215                                 if (type == null) {\r
216                                         SchemaObject obj = getWithName(parent, refType.getLocalPart());\r
217                                         types.add(ontRoot+getName(obj,"has"));\r
218                                 } \r
219                         }\r
220                         if (types.size() > 0) {\r
221                                 for (String type : types) {\r
222                                         writer.print(" <R " + type);\r
223                                 }\r
224                         } else {\r
225                                 writer.print(" <R XML.hasElement");\r
226                         }\r
227                         \r
228                         writer.println();\r
229                         \r
230                         for (SchemaElement e : elements) {\r
231                                 Element localElement = e.getElement();\r
232                                 QName refType = null;\r
233                                 String type = null;\r
234                                 if (localElement.getName() != null) {\r
235                                         refType = localElement.getType();\r
236                                         type = getType(refType);        \r
237                                 } else if (localElement.getRef() != null) {\r
238                                         refType = localElement.getRef();\r
239                                         type = getType(refType);\r
240                                 }\r
241                                 if (type != null) {\r
242                                         writer.println("   --> " + type);\r
243                                 }\r
244                         }\r
245                         if (!single) {\r
246                                 writer.println(ontRoot+name+ "List <T XML.ElementList");\r
247                                 if (types.size() == 0) {\r
248                                 writer.println(relationName+ "List <R XML.hasElementList : L0.FunctionalRelation");\r
249                                 } else {\r
250                                         writer.print(relationName+ "List");\r
251                                         for (String type : types) {\r
252                                                 writer.print(" <R " + type+"List");\r
253                                         }\r
254                                         writer.println(" : L0.FunctionalRelation");\r
255                                 }\r
256                                 writer.println("   --> " + ontRoot+name+"List");\r
257                         }\r
258                 }\r
259                 \r
260         }\r
261         \r
262         \r
263         \r
264         @Override\r
265         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, QName refType) {\r
266                 String type = getL0TypeFromPrimitiveType(refType);\r
267                 SchemaObject obj = null;\r
268                 if (type == null) {\r
269                         obj = getWithName(parent, refType.getLocalPart());\r
270                         \r
271                         writer.println(ontRoot+getName(parent)+".has"+refName + " <R " +  ontRoot+ getName(obj,"has"));\r
272                         writer.println("   --> " + ontRoot+getName(obj));\r
273                 } else {\r
274                         writer.println(ontRoot+getName(parent)+".has"+refName + " <R XML.hasElement");\r
275                         writer.println("   --> " + getType(refType));\r
276                 }\r
277                 \r
278                 if (useElementList(parent, indicator,element, reference, refName, refType)) {\r
279                         \r
280                         if (type == null) {\r
281                                 writer.println(ontRoot+getName(parent)+"."+refName + "List <T XML.ElementList");\r
282                                 writer.println(ontRoot+getName(parent)+".has"+refName + "List <R " +  ontRoot+getName(obj,"has")+"List : L0.FunctionalRelation");\r
283                         } else {\r
284                                 writer.println(ontRoot+getName(parent)+"."+refName + "List <T XML.ElementList");\r
285                                 writer.println(ontRoot+getName(parent)+".has"+refName + "List <R XML.hasElementList : L0.FunctionalRelation");  \r
286                         }\r
287                 }\r
288         }\r
289         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, OpenAttrs attrs) {\r
290                 SchemaObject obj = getWithObj(parent, attrs);\r
291                 writer.println(ontRoot+getName(parent)+".has"+refName + " <R " +  ontRoot+ getName(obj,"has"));\r
292                 writer.println("   --> " + ontRoot+getName(obj));\r
293                 if (useElementList(parent, indicator,element, reference, refName, new QName(obj.getName()))) {\r
294                         writer.println(ontRoot+getName(parent)+"."+refName + "List <T XML.ElementList");\r
295                         writer.println(ontRoot+getName(parent)+".has"+refName + "List <R " +  ontRoot+getName(obj,"has")+"List : L0.FunctionalRelation");\r
296                 }\r
297         }\r
298         \r
299         @Override\r
300         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {\r
301                 \r
302         }\r
303                 \r
304         @Override\r
305         protected void handle(SchemaObject parent, Attribute attribute) {\r
306                 String name = attribute.getName();\r
307                 QName primitiveType = attribute.getType();\r
308                 LocalSimpleType simpleType = attribute.getSimpleType();\r
309                 QName ref = attribute.getRef();\r
310                 \r
311                 String relationName;\r
312                 String relationType;\r
313                 if (name != null) {\r
314                         relationName = ontRoot+"has"+name;\r
315                         if (parent != null)\r
316                                 relationName = ontRoot+getName(parent)+".has"+name;\r
317                         relationType = "XML.hasAttribute";\r
318                 }\r
319                 else if (ref != null && parent != null) {\r
320                         relationName = ontRoot+getName(parent)+".has"+ref.getLocalPart();\r
321                         relationType = ontRoot+"has"+ref.getLocalPart();\r
322                 } else {\r
323                         throw new RuntimeException();\r
324                 }\r
325                 boolean id = false;\r
326                 String ontType = null;\r
327                 if (primitiveType != null) {\r
328                         ontType = getL0TypeFromPrimitiveType(primitiveType);\r
329                         if (ontType != null) {\r
330                                 id = getTypeEntry(primitiveType).id;\r
331                                 if (id)\r
332                                         relationType = "XML.hasID";\r
333                         } else {\r
334                                 \r
335                         }\r
336                 } else if (simpleType != null){\r
337                         Restriction restriction = simpleType.getRestriction();\r
338                         if (restriction == null || simpleType.getUnion() != null || simpleType.getName() != null || simpleType.getId() != null)\r
339                                 throw new RuntimeException();\r
340                         QName base = restriction.getBase();\r
341                         \r
342                         \r
343                         ontType = getL0TypeFromPrimitiveType(base);\r
344                         \r
345 //                      for (Object facetWrap : restriction.getFacets()) {\r
346 //                              JAXBElement<?> element = (JAXBElement<?>)facetWrap;\r
347 //                              QName elementName = element.getName();\r
348 //                              Facet facet = (Facet)element.getValue();        \r
349 //                      }\r
350                 }\r
351                         \r
352                 \r
353                 \r
354                 writer.println(relationName+ " <R " + relationType + ": L0.FunctionalRelation");\r
355                 if (id) {\r
356                         // no need to add range restriction\r
357                 } else if (ontType != null) {\r
358                         writer.println("   --> " + ontType);\r
359                 } else if (primitiveType != null) {\r
360                         writer.println("   <R "+ontRoot+"has"+primitiveType.getLocalPart());\r
361                 }\r
362         }\r
363         \r
364         @Override\r
365         protected void handleAttributes(SchemaObject simpleTypeObj) {\r
366 //              SchemaObject parent = simpleTypeObj.getParent();\r
367 //              SimpleType simpleType = simpleTypeObj.getSimpleType();\r
368 //              Restriction restriction = simpleType.getRestriction();\r
369 //              QName base = restriction.getBase();\r
370 //              String ontType = getL0TypeFromPrimitiveType(base);\r
371         }\r
372         \r
373         @Override\r
374         protected void handle(SchemaObject parent, AttributeGroup attributeGroup) {\r
375                 if (parent == null) {\r
376                         NamedAttributeGroup group = (NamedAttributeGroup)attributeGroup;\r
377                         writer.println(ontRoot+getAttributeGroupPrefix()+group.getName()+ " <T XML.AttributeGroup");\r
378                         SchemaObject obj = new SchemaObject(parent,attributeGroup);\r
379                         for (Annotated annotated : group.getAttributeOrAttributeGroup()) {\r
380                                 if (annotated instanceof Attribute) {\r
381                                         //handle(getAttributeGroupPrefix()+group.getName(),(Attribute)annotated);\r
382                                         handle(obj,(Attribute)annotated);\r
383                                 } else if (annotated instanceof AttributeGroup) {\r
384                                         throw new RuntimeException("Cannot handle nested attribute groups");\r
385                                 }\r
386                         }\r
387                 } else {\r
388                         writer.println(ontRoot+getName(parent) +" L0.Inherits " + ontRoot + getAttributeGroupPrefix() + attributeGroup.getRef().getLocalPart());\r
389                 }\r
390                 \r
391         }\r
392         \r
393         @Override\r
394         protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
395                 Attribute compositionAttribute = new Attribute();\r
396                 compositionAttribute.setName(composition.getName());\r
397                 QName type = new QName(CONVERSION_NS, composition.getType());\r
398                 compositionAttribute.setType(type);\r
399                 handle(parent, compositionAttribute);\r
400         }\r
401         \r
402         @Override\r
403         protected void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
404                 SimpleType simpleType = simpleTypeObj.getSimpleType();\r
405                 String name = simpleType.getName();\r
406                 Restriction restriction = simpleType.getRestriction();\r
407                 if (restriction == null || simpleType.getUnion() != null || simpleType.getId() != null)\r
408                         throw new RuntimeException();\r
409                 QName base = restriction.getBase();\r
410                 \r
411                 String relationName = ontRoot+"has"+name;\r
412                 if (parent != null)\r
413                         relationName = ontRoot+getName(parent)+".has"+name;\r
414                 \r
415                 writer.println(relationName+ " <R XML.hasAttribute : L0.FunctionalRelation");\r
416                 \r
417                 String ontType = getL0Type(base);\r
418                 writer.println("   --> " + ontType);\r
419         }\r
420         \r
421         @Override\r
422         protected void handleComplexType(SchemaObject topLevelComplexType) {\r
423                 String name = getName(topLevelComplexType);\r
424                 if (name.contains("Pcurve"))\r
425                         System.out.println();\r
426 //              if (parent != null)\r
427 //                      name = parent +"_"+name;\r
428                 \r
429                 String relationName = ontRoot+getName(topLevelComplexType,"has");//ontRoot+"has"+name;\r
430                 \r
431                 writer.println(relationName+ " <R XML.hasComplexType");\r
432                 writer.println(relationName+ "List <R XML.hasElementList");\r
433                 //writer.println("   --> " + ontRoot+getComplexTypePrefix()+name);\r
434                 writer.println("   --> " + ontRoot+name);\r
435                 writer.println();\r
436                 String baseType = "XML.ComplexType";\r
437 \r
438                 QName base = getComplexTypeBase(topLevelComplexType.getComplexType());\r
439                 if (base != null) {\r
440                         baseType = getType(base);\r
441                 }\r
442                 base = getSimpleTypeBase(topLevelComplexType.getSimpleType());\r
443                 if (base != null) {\r
444                         baseType = getType(base);\r
445                 }\r
446                 //writer.println(ontRoot+getComplexTypePrefix()+name+ " <T "+baseType);\r
447                 writer.println(ontRoot+name+ " <T "+baseType);\r
448                 super.handleComplexType(topLevelComplexType);\r
449                 writer.println();\r
450         }\r
451         \r
452         @Override\r
453         protected void handleElement(SchemaObject elementObj) {\r
454                 Element element = elementObj.getElement();\r
455                 String name = getName(elementObj);//element.getName();\r
456                 \r
457 //              if ("Presentation".equals(name))\r
458 //                      System.out.println();\r
459 \r
460 //              if (parent != null)\r
461 //                      name = parent +"_"+name;\r
462                 \r
463                 String type = "XML.Element";\r
464                 Set<String> types = new LinkedHashSet<String>();\r
465                 if (element.getType() != null) {\r
466                         types.add(getType(element.getType()));\r
467                 }\r
468                 QName base = getElementBase(element);\r
469                 if (base != null) {\r
470                         if (base.getNamespaceURI().equals(SCHEMA_NS)) {\r
471                                 String l0Type = getL0Type(base);\r
472                                 if (l0Type == null)\r
473                                         throw new RuntimeException("Cannot get L0 type for " + base.getLocalPart());\r
474                                 types.add(l0Type);\r
475                         } else if (isElementRef(base.getLocalPart()))\r
476                                 types.add(ontRoot+base.getLocalPart());\r
477                         else\r
478                                 types.add(ontRoot+getComplexTypePrefix()+base.getLocalPart());\r
479                 }\r
480                 QName substitution = element.getSubstitutionGroup();\r
481                 if (substitution != null) {\r
482                         if (isElementRef(substitution.getLocalPart()))\r
483                                 types.add(ontRoot+substitution.getLocalPart());\r
484                         else\r
485                                 types.add( ontRoot+getComplexTypePrefix()+substitution.getLocalPart());\r
486                 }\r
487                 for (String t : types) {\r
488                         type += " <T " + t;\r
489                 }\r
490 \r
491                 String relationName =  ontRoot+getName(elementObj,"has");//ontRoot+"has"+name;\r
492 //              if (elementObj.getParent() != null) {\r
493 //                      //relationName = ontRoot+getComplexTypePrefix()+"has"+name.substring(getComplexTypePrefix().length());\r
494 //                      relationName = ontRoot+getName(elementObj.getParent()) + "has"+element.getName();\r
495 //              }\r
496                 writer.println(relationName+ " <R XML.hasElement");\r
497                 writer.println(relationName+ "List <R XML.hasElementList");\r
498                 \r
499                 writer.println(ontRoot+name+ " <T "+type);\r
500                 \r
501                 LocalComplexType complexType = element.getComplexType();\r
502                 LocalSimpleType simpleType = element.getSimpleType();\r
503                 \r
504                 if (complexType != null) {\r
505                         SchemaObject complexTypeObj = complexTypes.get(complexType);\r
506                         handleElementComplexTypeAttributes(complexTypeObj);\r
507                         handleComplexTypeExtension(complexTypeObj);\r
508                 } else if (simpleType != null) {\r
509                         SchemaObject simpleTypeObj = simpleTypes.get(simpleType);\r
510                         handleElementSimpleTypeAttributes(simpleTypeObj);\r
511                 }\r
512                 \r
513                 List<IDReference> references = getIDReferences(element);\r
514         \r
515                 for (IDReference ref : references) {\r
516                         writer.println(ontRoot+name+"."+ref.getReference().getName()+ " <R XML.hasReference");\r
517                 }\r
518                 \r
519                 writer.println();\r
520         }\r
521         \r
522         public static String getName(SchemaObject obj) {\r
523                 if (obj.getParent() == null) {\r
524                         switch (obj.getType()) {\r
525                         case COMPLEX_TYPE:\r
526                                 return getComplexTypePrefix()+obj.getName();\r
527                         case ELEMENT:\r
528                                 return obj.getName();\r
529                         case ATTRIBUTE_GROUP:\r
530                                 return getAttributeGroupPrefix()+obj.getName();\r
531                         case SIMPLE_TYPE:\r
532                                 return obj.getName();\r
533                         }\r
534                 } else {\r
535                         SchemaObject o = obj;\r
536                         SchemaObject prev = null;\r
537                         String name = "";\r
538                         while (o != null){\r
539                                 if (o.getName() != null)\r
540                                         name = o.getName()+"."+name;\r
541                                 prev = o;\r
542                                 o = o.getParent();\r
543                         }\r
544                         name = name.substring(0, name.length()-1);\r
545                         switch (prev.getType()) {\r
546                         case COMPLEX_TYPE:\r
547                                 return getComplexTypePrefix()+name;\r
548                         case ELEMENT:\r
549                                 return name;\r
550                         case ATTRIBUTE_GROUP:\r
551                                 return getAttributeGroupPrefix()+name;\r
552                         case SIMPLE_TYPE:\r
553                                 return name;\r
554                         }\r
555                 }\r
556                 throw new RuntimeException();\r
557                 \r
558         }\r
559         \r
560         public static String getName(SchemaObject obj, String rel) {\r
561                 if (obj.getParent() == null) {\r
562                         switch (obj.getType()) {\r
563                         case COMPLEX_TYPE:\r
564                                 return getComplexTypePrefix()+rel+obj.getName();\r
565                         case ELEMENT:\r
566                                 return rel+obj.getName();\r
567                         case ATTRIBUTE_GROUP:\r
568                                 return getAttributeGroupPrefix()+rel+obj.getName();\r
569                         case SIMPLE_TYPE:\r
570                                 return rel+obj.getName();\r
571                         }\r
572                 } else {\r
573                         SchemaObject o = obj;\r
574                         SchemaObject prev = null;\r
575                         String name = "";\r
576                         while (o != null){\r
577                                 if (o.getName() != null)\r
578                                         name = o.getName()+"."+name;\r
579                                 prev = o;\r
580                                 o = o.getParent();\r
581                         }\r
582                         name = name.substring(0, name.length()-1);\r
583                         switch (prev.getType()) {\r
584                         case COMPLEX_TYPE:\r
585                                 return getComplexTypePrefix()+rel+name;\r
586                         case ELEMENT:\r
587                                 return rel+name;\r
588                         case ATTRIBUTE_GROUP:\r
589                                 return getAttributeGroupPrefix()+rel+name;\r
590                         case SIMPLE_TYPE:\r
591                                 return rel+name;\r
592                         }\r
593                 }\r
594                 throw new RuntimeException();\r
595                 \r
596         }\r
597         \r
598         \r
599 }\r