--- /dev/null
+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