]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java
XML Schema converter
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / OntologyGenerator.java
diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java
new file mode 100644 (file)
index 0000000..530798e
--- /dev/null
@@ -0,0 +1,594 @@
+package org.simantics.xml.sax;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.io.PrintWriter;\r
+import java.io.StringWriter;\r
+import java.util.ArrayList;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import javax.xml.namespace.QName;\r
+\r
+import org.simantics.utils.datastructures.BijectionMap;\r
+import org.simantics.xml.sax.configuration.AttributeComposition;\r
+import org.simantics.xml.sax.configuration.Configuration;\r
+import org.simantics.xml.sax.configuration.IDReference;\r
+import org.w3._2001.xmlschema.Annotated;\r
+import org.w3._2001.xmlschema.Attribute;\r
+import org.w3._2001.xmlschema.AttributeGroup;\r
+import org.w3._2001.xmlschema.Element;\r
+import org.w3._2001.xmlschema.LocalComplexType;\r
+import org.w3._2001.xmlschema.LocalSimpleType;\r
+import org.w3._2001.xmlschema.NamedAttributeGroup;\r
+import org.w3._2001.xmlschema.OpenAttrs;\r
+import org.w3._2001.xmlschema.Restriction;\r
+import org.w3._2001.xmlschema.Schema;\r
+import org.w3._2001.xmlschema.SimpleType;\r
+import org.w3._2001.xmlschema.TopLevelAttribute;\r
+\r
+public class OntologyGenerator extends SchemaConversionBase {\r
+       \r
+       public OntologyGenerator(Configuration configuration) {\r
+               super(configuration);\r
+       }\r
+\r
+       String ontRoot = "ONT.";\r
+       String commentTag = "//";\r
+       \r
+       Schema schema;\r
+       \r
+       String className;\r
+       \r
+       SchemaConverter converter;\r
+       \r
+       PrintWriter writer = null;\r
+       \r
+       public String getClassName() {\r
+               return className;\r
+       }\r
+       \r
+       public void createOntology(Schema schema, SchemaConverter converter) throws FileNotFoundException {\r
+               this.schema = schema;\r
+               this.converter = converter;\r
+               \r
+//             for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) {\r
+//                     if (attrs instanceof Annotation) {\r
+//                             Annotation ann = (Annotation)attrs;\r
+//                             for (Object o : ann.getAppinfoOrDocumentation()) {\r
+//                                     if (o instanceof Documentation) {\r
+//                                             Documentation doc = (Documentation)o;\r
+//                                     } else if (o instanceof Appinfo) {\r
+//                                             Appinfo info = (Appinfo)o;\r
+//                                     }\r
+//                             }\r
+//                     }\r
+//             }\r
+               \r
+               \r
+               StringWriter stringWriter = null;\r
+               if (converter.getOntologyFile() == null) {\r
+                       stringWriter = new StringWriter();\r
+                       writer = new PrintWriter(stringWriter);\r
+               } else {\r
+                       writer = new PrintWriter(converter.getOntologyFile());\r
+               }\r
+       \r
+               handle(schema);\r
+               \r
+               writer.flush();\r
+               writer.close();\r
+               if (stringWriter != null)\r
+                       System.out.println(stringWriter.toString());\r
+       }\r
+       \r
+       protected void handle(Schema schema) {\r
+               String ontologyName = schema.getTargetNamespace();\r
+               if (ontologyName == null) {\r
+                       ontologyName = converter.getSchemaFile().getName();\r
+                       \r
+                       int index = ontologyName.lastIndexOf(".");\r
+                       if (index > 0)\r
+                               ontologyName = ontologyName.substring(0, index);\r
+               } \r
+               if (!ontologyName.startsWith("http"))\r
+                       ontologyName = "http://" + ontologyName;\r
+               String parts[] = ontologyName.split("/");\r
+               String name = parts[parts.length-1];\r
+               ontRoot = name.substring(0, Math.min(3, name.length())).toUpperCase();\r
+               String version = schema.getVersion();\r
+               if (version == null)\r
+                       version = "1.0";\r
+               \r
+               name = name.replaceAll("\\.", "_");\r
+               className = converter.getPluginName() + "." + name;\r
+               \r
+               for (String s : converter.getHeader()) {\r
+                       writer.println(commentTag + " " + s);   \r
+               }\r
+               writer.println();\r
+               writer.println("L0 = <http://www.simantics.org/Layer0-1.1>");\r
+               writer.println();\r
+               writer.println(ontRoot + " = <" + ontologyName +"-"+ version+"> : L0.Ontology");\r
+               writer.println("   @L0.new");\r
+               writer.println("   L0.HasResourceClass \"" + className +"\"");\r
+               writer.println();\r
+               writer.println();\r
+               \r
+               ontRoot += ".";\r
+               // TODO : these could be created in separate base ontology.\r
+               writer.println(commentTag + " Built-in types");\r
+               writer.println();\r
+               writer.println(ontRoot+"XML : L0.Library");\r
+               writer.println(ontRoot+"XML.hasAttribute <R L0.HasProperty");\r
+               writer.println(ontRoot+"XML.hasID <R "+ontRoot+"XML.hasAttribute : L0.FunctionalRelation");\r
+               writer.println("  --> L0.String");\r
+               writer.println(ontRoot+"XML.ComplexType <T L0.Entity");\r
+               writer.println(ontRoot+"XML.hasComplexType <R L0.IsComposedOf");\r
+               writer.println(ontRoot+"XML.AttributeGroup  <T L0.Entity");\r
+               writer.println(ontRoot+"XML.Element <T L0.Entity");\r
+               writer.println(ontRoot+"XML.hasElement <R L0.IsComposedOf");\r
+               writer.println(ontRoot+"XML.ElementList <T L0.List");\r
+               writer.println(ontRoot+"XML.hasElementList <R L0.IsComposedOf");\r
+               writer.println(ontRoot+"XML.hasOriginalElementList <R " + ontRoot+"XML.hasElementList");\r
+               writer.println(ontRoot+"XML.hasReference <R L0.IsRelatedTo");\r
+               writer.println(ontRoot+"XML.hasExternalReference <R L0.IsRelatedTo");\r
+               writer.println("   L0.InverseOf " + ontRoot+"XML.externalReferenceOf <R L0.IsRelatedTo");\r
+               writer.println();\r
+               writer.println(ontRoot+"ComplexTypes : L0.Library");\r
+               writer.println(ontRoot+"AttributeGroups : L0.Library");\r
+               writer.println();\r
+               writer.println(commentTag + " Interpreted from schema");\r
+               writer.println();\r
+                       \r
+               super.handle(schema);\r
+       }\r
+               \r
+       protected String getType(QName qtype) {\r
+               String ontType = getL0TypeFromPrimitiveType(qtype);\r
+               if (ontType != null)\r
+                       return ontType;\r
+               else if (isComplexTypeRef(qtype.getLocalPart()))\r
+                       return ontRoot+getComplexTypePrefix()+qtype.getLocalPart();\r
+               else if (isElementRef(qtype.getLocalPart()))\r
+                       return ontRoot+qtype.getLocalPart();\r
+               else if (qtype.getPrefix() != null && qtype.getPrefix().length() > 0) {\r
+                       return ontRoot+qtype.getPrefix()+qtype.getLocalPart();\r
+               }\r
+               throw new RuntimeException("Reference to unknown type " + qtype.getLocalPart());\r
+       }\r
+       \r
+       @Override\r
+       protected void handle(TopLevelAttribute topLevelAttribute) {\r
+               super.handle(topLevelAttribute);\r
+               writer.println();\r
+       }\r
+       \r
+       @Override\r
+       protected void handleSimpleType(SchemaObject topLevelSimpleType) {\r
+               super.handleSimpleType(topLevelSimpleType);\r
+               writer.println();\r
+       }\r
+       \r
+       \r
+       public static String getComplexTypePrefix() {\r
+               return "ComplexTypes.";\r
+       }\r
+       \r
+       public static String getAttributeGroupPrefix() {\r
+               return "AttributeGroups.";\r
+       }\r
+       \r
+       @Override\r
+       protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
+               if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {\r
+                       for (SchemaElement e : elements) {\r
+                               handle(parent, indicator, e);\r
+                       }\r
+               } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {\r
+                       String name = getChoiceName(elements);\r
+                       boolean single = true;\r
+                       for (SchemaElement e : elements) {\r
+                               if (e.getRestriction().many()) {\r
+                                       single = false;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       String relationName = ontRoot+getName(parent)+".has"+name;\r
+                       writer.print(relationName);\r
+                       \r
+                       List<String> types = new ArrayList<String>();\r
+                       for (SchemaElement e : elements) {\r
+                               Element localElement = e.getElement();\r
+                               QName refType = null;\r
+                               String type = null;\r
+                               \r
+                               if (localElement.getName() != null) {\r
+                                       refType = localElement.getType();\r
+                                       type = getL0TypeFromPrimitiveType(refType);     \r
+                               } else if (localElement.getRef() != null) {\r
+                                       refType = localElement.getRef();\r
+                                       type = getL0TypeFromPrimitiveType(refType);\r
+                               }\r
+                               if (type == null) {\r
+                                       SchemaObject obj = getWithName(parent, refType.getLocalPart());\r
+                                       types.add(ontRoot+getName(obj,"has"));\r
+                               } \r
+                       }\r
+                       if (types.size() > 0) {\r
+                               for (String type : types) {\r
+                                       writer.print(" <R " + type);\r
+                               }\r
+                       } else {\r
+                               writer.print(" <R " +  ontRoot+"XML.hasElement");\r
+                       }\r
+                       \r
+                       writer.println();\r
+                       \r
+                       for (SchemaElement e : elements) {\r
+                               Element localElement = e.getElement();\r
+                               QName refType = null;\r
+                               String type = null;\r
+                               if (localElement.getName() != null) {\r
+                                       refType = localElement.getType();\r
+                                       type = getType(refType);        \r
+                               } else if (localElement.getRef() != null) {\r
+                                       refType = localElement.getRef();\r
+                                       type = getType(refType);\r
+                               }\r
+                               if (type != null) {\r
+                                       writer.println("   --> " + type);\r
+                               }\r
+                       }\r
+                       if (!single) {\r
+                               writer.println(ontRoot+name+ "List <T "+ontRoot+"XML.ElementList");\r
+                               if (types.size() == 0) {\r
+                               writer.println(relationName+ "List <R "+ontRoot+"XML.hasElementList : L0.FunctionalRelation");\r
+                               } else {\r
+                                       writer.print(relationName+ "List");\r
+                                       for (String type : types) {\r
+                                               writer.print(" <R " + type+"List");\r
+                                       }\r
+                                       writer.println(" : L0.FunctionalRelation");\r
+                               }\r
+                               writer.println("   --> " + ontRoot+name+"List");\r
+                       }\r
+               }\r
+               \r
+       }\r
+       \r
+       \r
+       \r
+       @Override\r
+       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, QName refType) {\r
+               String type = getL0TypeFromPrimitiveType(refType);\r
+               SchemaObject obj = null;\r
+               if (type == null) {\r
+                       obj = getWithName(parent, refType.getLocalPart());\r
+                       \r
+                       writer.println(ontRoot+getName(parent)+".has"+refName + " <R " +  ontRoot+ getName(obj,"has"));\r
+                       writer.println("   --> " + ontRoot+getName(obj));\r
+               } else {\r
+                       writer.println(ontRoot+getName(parent)+".has"+refName + " <R " +  ontRoot+"XML.hasElement");\r
+                       writer.println("   --> " + getType(refType));\r
+               }\r
+               \r
+               if (useElementList(parent, indicator,element, reference, refName, refType)) {\r
+                       \r
+                       if (type == null) {\r
+                               writer.println(ontRoot+getName(parent)+"."+refName + "List <T "  + ontRoot+"XML.ElementList");\r
+                               writer.println(ontRoot+getName(parent)+".has"+refName + "List <R " +  ontRoot+getName(obj,"has")+"List : L0.FunctionalRelation");\r
+                       } else {\r
+                               writer.println(ontRoot+getName(parent)+"."+refName + "List <T "  + ontRoot+"XML.ElementList");\r
+                               writer.println(ontRoot+getName(parent)+".has"+refName + "List <R " +  ontRoot+"XML.hasElementList : L0.FunctionalRelation");    \r
+                       }\r
+               }\r
+       }\r
+       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, OpenAttrs attrs) {\r
+               SchemaObject obj = getWithObj(parent, attrs);\r
+               writer.println(ontRoot+getName(parent)+".has"+refName + " <R " +  ontRoot+ getName(obj,"has"));\r
+               writer.println("   --> " + ontRoot+getName(obj));\r
+               if (useElementList(parent, indicator,element, reference, refName, new QName(obj.getName()))) {\r
+                       writer.println(ontRoot+getName(parent)+"."+refName + "List <T "  + ontRoot+"XML.ElementList");\r
+                       writer.println(ontRoot+getName(parent)+".has"+refName + "List <R " +  ontRoot+getName(obj,"has")+"List : L0.FunctionalRelation");\r
+               }\r
+       }\r
+       \r
+       @Override\r
+       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {\r
+               \r
+       }\r
+               \r
+       @Override\r
+       protected void handle(SchemaObject parent, Attribute attribute) {\r
+               String name = attribute.getName();\r
+               QName primitiveType = attribute.getType();\r
+               LocalSimpleType simpleType = attribute.getSimpleType();\r
+               QName ref = attribute.getRef();\r
+               \r
+               String relationName;\r
+               String relationType;\r
+               if (name != null) {\r
+                       relationName = ontRoot+"has"+name;\r
+                       if (parent != null)\r
+                               relationName = ontRoot+getName(parent)+".has"+name;\r
+                       relationType = ontRoot+"XML.hasAttribute";\r
+               }\r
+               else if (ref != null && parent != null) {\r
+                       relationName = ontRoot+getName(parent)+".has"+ref.getLocalPart();\r
+                       relationType = ontRoot+"has"+ref.getLocalPart();\r
+               } else {\r
+                       throw new RuntimeException();\r
+               }\r
+               boolean id = false;\r
+               String ontType = null;\r
+               if (primitiveType != null) {\r
+                       ontType = getL0TypeFromPrimitiveType(primitiveType);\r
+                       if (ontType != null) {\r
+                               id = getTypeEntry(primitiveType).id;\r
+                               if (id)\r
+                                       relationType = ontRoot+"XML.hasID";\r
+                       } else {\r
+                               \r
+                       }\r
+               } else if (simpleType != null){\r
+                       Restriction restriction = simpleType.getRestriction();\r
+                       if (restriction == null || simpleType.getUnion() != null || simpleType.getName() != null || simpleType.getId() != null)\r
+                               throw new RuntimeException();\r
+                       QName base = restriction.getBase();\r
+                       \r
+                       \r
+                       ontType = getL0TypeFromPrimitiveType(base);\r
+                       \r
+//                     for (Object facetWrap : restriction.getFacets()) {\r
+//                             JAXBElement<?> element = (JAXBElement<?>)facetWrap;\r
+//                             QName elementName = element.getName();\r
+//                             Facet facet = (Facet)element.getValue();        \r
+//                     }\r
+               }\r
+                       \r
+               \r
+               \r
+               writer.println(relationName+ " <R " + relationType + ": L0.FunctionalRelation");\r
+               if (id) {\r
+                       // no need to add range restriction\r
+               } else if (ontType != null) {\r
+                       writer.println("   --> " + ontType);\r
+               } else if (primitiveType != null) {\r
+                       writer.println("   <R "+ontRoot+"has"+primitiveType.getLocalPart());\r
+               }\r
+       }\r
+       \r
+       @Override\r
+       protected void handleAttributes(SchemaObject simpleTypeObj) {\r
+//             SchemaObject parent = simpleTypeObj.getParent();\r
+//             SimpleType simpleType = simpleTypeObj.getSimpleType();\r
+//             Restriction restriction = simpleType.getRestriction();\r
+//             QName base = restriction.getBase();\r
+//             String ontType = getL0TypeFromPrimitiveType(base);\r
+       }\r
+       \r
+       @Override\r
+       protected void handle(SchemaObject parent, AttributeGroup attributeGroup) {\r
+               if (parent == null) {\r
+                       NamedAttributeGroup group = (NamedAttributeGroup)attributeGroup;\r
+                       writer.println(ontRoot+getAttributeGroupPrefix()+group.getName()+ " <T " + ontRoot +"XML.AttributeGroup");\r
+                       SchemaObject obj = new SchemaObject(parent,attributeGroup);\r
+                       for (Annotated annotated : group.getAttributeOrAttributeGroup()) {\r
+                               if (annotated instanceof Attribute) {\r
+                                       //handle(getAttributeGroupPrefix()+group.getName(),(Attribute)annotated);\r
+                                       handle(obj,(Attribute)annotated);\r
+                               } else if (annotated instanceof AttributeGroup) {\r
+                                       throw new RuntimeException("Cannot handle nested attribute groups");\r
+                               }\r
+                       }\r
+               } else {\r
+                       writer.println(ontRoot+getName(parent) +" L0.Inherits " + ontRoot + getAttributeGroupPrefix() + attributeGroup.getRef().getLocalPart());\r
+               }\r
+               \r
+       }\r
+       \r
+       @Override\r
+       protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
+               Attribute compositionAttribute = new Attribute();\r
+               compositionAttribute.setName(composition.getName());\r
+               QName type = new QName(CONVERSION_NS, composition.getType());\r
+               compositionAttribute.setType(type);\r
+               handle(parent, compositionAttribute);\r
+       }\r
+       \r
+       @Override\r
+       protected void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
+               SimpleType simpleType = simpleTypeObj.getSimpleType();\r
+               String name = simpleType.getName();\r
+               Restriction restriction = simpleType.getRestriction();\r
+               if (restriction == null || simpleType.getUnion() != null || simpleType.getId() != null)\r
+                       throw new RuntimeException();\r
+               QName base = restriction.getBase();\r
+               \r
+               String relationName = ontRoot+"has"+name;\r
+               if (parent != null)\r
+                       relationName = ontRoot+getName(parent)+".has"+name;\r
+               \r
+               writer.println(relationName+ " <R "+ontRoot+"XML.hasAttribute : L0.FunctionalRelation");\r
+               \r
+               String ontType = getL0Type(base);\r
+               writer.println("   --> " + ontType);\r
+       }\r
+       \r
+       @Override\r
+       protected void handleComplexType(SchemaObject topLevelComplexType) {\r
+               String name = getName(topLevelComplexType);\r
+               if (name.contains("Pcurve"))\r
+                       System.out.println();\r
+//             if (parent != null)\r
+//                     name = parent +"_"+name;\r
+               \r
+               String relationName = ontRoot+getName(topLevelComplexType,"has");//ontRoot+"has"+name;\r
+               \r
+               writer.println(relationName+ " <R "+ontRoot+"XML.hasComplexType");\r
+               writer.println(relationName+ "List <R "+ontRoot+"XML.hasElementList");\r
+               //writer.println("   --> " + ontRoot+getComplexTypePrefix()+name);\r
+               writer.println("   --> " + ontRoot+name);\r
+               writer.println();\r
+               String baseType = ontRoot+"XML.ComplexType";\r
+\r
+               QName base = getComplexTypeBase(topLevelComplexType.getComplexType());\r
+               if (base != null) {\r
+                       baseType = getType(base);\r
+               }\r
+               base = getSimpleTypeBase(topLevelComplexType.getSimpleType());\r
+               if (base != null) {\r
+                       baseType = getType(base);\r
+               }\r
+               //writer.println(ontRoot+getComplexTypePrefix()+name+ " <T "+baseType);\r
+               writer.println(ontRoot+name+ " <T "+baseType);\r
+               super.handleComplexType(topLevelComplexType);\r
+               writer.println();\r
+       }\r
+       \r
+       @Override\r
+       protected void handleElement(SchemaObject elementObj) {\r
+               Element element = elementObj.getElement();\r
+               String name = getName(elementObj);//element.getName();\r
+\r
+//             if (parent != null)\r
+//                     name = parent +"_"+name;\r
+               \r
+               String type = ontRoot+"XML.Element";\r
+               Set<String> types = new LinkedHashSet<String>();\r
+               if (element.getType() != null) {\r
+                       types.add(getType(element.getType()));\r
+               }\r
+               QName base = getElementBase(element);\r
+               if (base != null) {\r
+                       if (base.getNamespaceURI().equals(SCHEMA_NS)) {\r
+                               String l0Type = getL0Type(base);\r
+                               if (l0Type == null)\r
+                                       throw new RuntimeException("Cannot get L0 type for " + base.getLocalPart());\r
+                               types.add(l0Type);\r
+                       } else if (isElementRef(base.getLocalPart()))\r
+                               types.add(ontRoot+base.getLocalPart());\r
+                       else\r
+                               types.add(ontRoot+getComplexTypePrefix()+base.getLocalPart());\r
+               }\r
+               QName substitution = element.getSubstitutionGroup();\r
+               if (substitution != null) {\r
+                       if (isElementRef(substitution.getLocalPart()))\r
+                               types.add(ontRoot+substitution.getLocalPart());\r
+                       else\r
+                               types.add( ontRoot+getComplexTypePrefix()+substitution.getLocalPart());\r
+               }\r
+               for (String t : types) {\r
+                       type += " <T " + t;\r
+               }\r
+\r
+               String relationName =  ontRoot+getName(elementObj,"has");//ontRoot+"has"+name;\r
+//             if (elementObj.getParent() != null) {\r
+//                     //relationName = ontRoot+getComplexTypePrefix()+"has"+name.substring(getComplexTypePrefix().length());\r
+//                     relationName = ontRoot+getName(elementObj.getParent()) + "has"+element.getName();\r
+//             }\r
+               writer.println(relationName+ " <R "+ontRoot+"XML.hasElement");\r
+               writer.println(relationName+ "List <R "+ontRoot+"XML.hasElementList");\r
+               \r
+               writer.println(ontRoot+name+ " <T "+type);\r
+               \r
+               LocalComplexType complexType = element.getComplexType();\r
+               LocalSimpleType simpleType = element.getSimpleType();\r
+               \r
+               if (complexType != null) {\r
+                       SchemaObject complexTypeObj = complexTypes.get(complexType);\r
+                       handleElementComplexTypeAttributes(complexTypeObj);\r
+                       handleComplexTypeExtension(complexTypeObj);\r
+               } else if (simpleType != null) {\r
+                       SchemaObject simpleTypeObj = simpleTypes.get(simpleType);\r
+                       handleElementSimpleTypeAttributes(simpleTypeObj);\r
+               }\r
+               \r
+               List<IDReference> references = getIDReferences(element);\r
+       \r
+               for (IDReference ref : references) {\r
+                       writer.println(ontRoot+name+"."+ref.getReference().getName()+ " <R " +ontRoot+"XML.hasReference");\r
+               }\r
+               \r
+               writer.println();\r
+       }\r
+       \r
+       public static String getName(SchemaObject obj) {\r
+               if (obj.getParent() == null) {\r
+                       switch (obj.getType()) {\r
+                       case COMPLEX_TYPE:\r
+                               return getComplexTypePrefix()+obj.getName();\r
+                       case ELEMENT:\r
+                               return obj.getName();\r
+                       case ATTRIBUTE_GROUP:\r
+                               return getAttributeGroupPrefix()+obj.getName();\r
+                       case SIMPLE_TYPE:\r
+                               return obj.getName();\r
+                       }\r
+               } else {\r
+                       SchemaObject o = obj;\r
+                       SchemaObject prev = null;\r
+                       String name = "";\r
+                       while (o != null){\r
+                               if (o.getName() != null)\r
+                                       name = o.getName()+"."+name;\r
+                               prev = o;\r
+                               o = o.getParent();\r
+                       }\r
+                       name = name.substring(0, name.length()-1);\r
+                       switch (prev.getType()) {\r
+                       case COMPLEX_TYPE:\r
+                               return getComplexTypePrefix()+name;\r
+                       case ELEMENT:\r
+                               return name;\r
+                       case ATTRIBUTE_GROUP:\r
+                               return getAttributeGroupPrefix()+name;\r
+                       case SIMPLE_TYPE:\r
+                               return name;\r
+                       }\r
+               }\r
+               throw new RuntimeException();\r
+               \r
+       }\r
+       \r
+       public static String getName(SchemaObject obj, String rel) {\r
+               if (obj.getParent() == null) {\r
+                       switch (obj.getType()) {\r
+                       case COMPLEX_TYPE:\r
+                               return getComplexTypePrefix()+rel+obj.getName();\r
+                       case ELEMENT:\r
+                               return rel+obj.getName();\r
+                       case ATTRIBUTE_GROUP:\r
+                               return getAttributeGroupPrefix()+rel+obj.getName();\r
+                       case SIMPLE_TYPE:\r
+                               return rel+obj.getName();\r
+                       }\r
+               } else {\r
+                       SchemaObject o = obj;\r
+                       SchemaObject prev = null;\r
+                       String name = "";\r
+                       while (o != null){\r
+                               if (o.getName() != null)\r
+                                       name = o.getName()+"."+name;\r
+                               prev = o;\r
+                               o = o.getParent();\r
+                       }\r
+                       name = name.substring(0, name.length()-1);\r
+                       switch (prev.getType()) {\r
+                       case COMPLEX_TYPE:\r
+                               return getComplexTypePrefix()+rel+name;\r
+                       case ELEMENT:\r
+                               return rel+name;\r
+                       case ATTRIBUTE_GROUP:\r
+                               return getAttributeGroupPrefix()+rel+name;\r
+                       case SIMPLE_TYPE:\r
+                               return rel+name;\r
+                       }\r
+               }\r
+               throw new RuntimeException();\r
+               \r
+       }\r
+       \r
+       \r
+}\r