]> gerrit.simantics Code Review - simantics/interop.git/commitdiff
Refactoring and preparing the conversion code to handle references between XML schemas.
authorluukkainen <luukkainen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Wed, 1 Feb 2017 09:37:23 +0000 (09:37 +0000)
committerMarko Luukkainen <marko.luukkainen@vtt.fi>
Thu, 2 Feb 2017 12:01:36 +0000 (14:01 +0200)
refs #6985

git-svn-id: https://www.simantics.org/svn/simantics/interoperability/trunk@33442 ac1ea38d-2e2b-0410-8846-a27921b304fc

org.simantics.xml.sax.ui/src/org/simantics/xml/sax/ui/wizard/SchemaConversionWizard.java
org.simantics.xml.sax/src/org/simantics/xml/sax/ExporterGenerator.java
org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java
org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java
org.simantics.xml.sax/src/org/simantics/xml/sax/ManualSchemaFileImport.java [new file with mode: 0644]
org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java
org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionBase.java
org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionComponent.java [new file with mode: 0644]
org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConverter.java
org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaElement.java
org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaObject.java

index 627381bfd84277adc17ad27210106d4c464431fb..3c27632b6bcccbbe012de1b105568ca6a6cc24e0 100644 (file)
@@ -1,11 +1,16 @@
 package org.simantics.xml.sax.ui.wizard;\r
 \r
 import java.io.File;\r
+import java.io.IOException;\r
 \r
 import org.eclipse.jface.viewers.IStructuredSelection;\r
 import org.eclipse.jface.wizard.Wizard;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.FileDialog;\r
 import org.eclipse.ui.IImportWizard;\r
 import org.eclipse.ui.IWorkbench;\r
+import org.simantics.xml.sax.ManualSchemaFileImport;\r
 import org.simantics.xml.sax.SchemaConverter;\r
 \r
 public class SchemaConversionWizard extends Wizard implements IImportWizard {\r
@@ -39,18 +44,46 @@ public class SchemaConversionWizard extends Wizard implements IImportWizard {
        }\r
        \r
        public void doConversion() throws Exception {\r
-               SchemaConverter converter = new SchemaConverter();\r
-               converter.setCreateExporter(inputSelectionPage.createExporter);\r
-               converter.setCreateImporter(inputSelectionPage.createImporter);\r
-               converter.setCreatePGraph(inputSelectionPage.createPGraph);\r
-\r
+               \r
+               \r
                File inputFile = new File(inputSelectionPage.getSchemaFilename());\r
                File configurationFile = null;\r
                if (inputSelectionPage.getConfigurationFilename() != null)\r
                        configurationFile = new File(inputSelectionPage.getConfigurationFilename());\r
                File outputPlugin = new File(inputSelectionPage.getPluginFilename());\r
+\r
+               SchemaConverter converter = new SchemaConverter(inputFile,configurationFile,outputPlugin);\r
+               converter.setCreateExporter(inputSelectionPage.createExporter);\r
+               converter.setCreateImporter(inputSelectionPage.createImporter);\r
+               converter.setCreatePGraph(inputSelectionPage.createPGraph);\r
+               converter.setFileImport(new ManualSchemaFileImport() {\r
+                       \r
+                       String filename;\r
+                       @Override\r
+                       public File getFileForLocation(final String location) throws IOException {\r
+                               if (Display.getCurrent() == null)\r
+                                       Display.getDefault().syncExec(new Runnable() {\r
+                                               @Override\r
+                                               public void run() {\r
+                                                       showDialog(location);\r
+                                               }\r
+                                       });\r
+                               else {\r
+                                       showDialog(location);\r
+                               }\r
+                               if (filename == null)\r
+                                       return null;\r
+                               return new File(filename);\r
+                       }\r
+                       \r
+                       protected void showDialog(String location) {\r
+                               FileDialog dialog = new FileDialog(SchemaConversionWizard.this.getShell(), SWT.OPEN);\r
+                               dialog.setText("Open schema file for " + location);\r
+                               filename = dialog.open();\r
+                       }\r
+               });\r
                \r
-               converter.convertSchema(inputFile,configurationFile,outputPlugin);\r
+               converter.convert();\r
                \r
                schemaCombinationPage.setOutputPlugin(outputPlugin);\r
        }\r
index 243a1c2415b9f3476c270e9be542a8ff5c441f99..d1f67a426c7ff73a138c02dd25517f91f9407574 100644 (file)
@@ -11,9 +11,12 @@ import java.util.Map;
 import javax.xml.namespace.QName;\r
 \r
 import org.simantics.utils.datastructures.BijectionMap;\r
+import org.simantics.xml.sax.SchemaConversionBase.Inheritance;\r
+import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;\r
+import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
+import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;\r
 import org.simantics.xml.sax.SchemaObject.ObjectType;\r
 import org.simantics.xml.sax.configuration.AttributeComposition;\r
-import org.simantics.xml.sax.configuration.Configuration;\r
 import org.simantics.xml.sax.configuration.IDProvider;\r
 import org.simantics.xml.sax.configuration.IDReference;\r
 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;\r
@@ -25,31 +28,18 @@ import org.w3._2001.xmlschema.Element;
 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.NamedGroup;\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 ExporterGenerator extends JavaGenerator{\r
        \r
-       public ExporterGenerator(Configuration configuration) {\r
-               super(configuration);\r
+       public ExporterGenerator(SchemaConverter converter, SchemaConversionBase base) {\r
+               super(converter, base);\r
        }\r
 \r
-       \r
-       \r
-       public void createParser(Schema schema,String ontologyUri, String className, SchemaConverter converter) throws IOException {\r
-               this.schema = schema;\r
-               this.ontologyClassName = className;\r
-               this.converter = converter;\r
-               \r
-               \r
-               String packageParts[] = className.split("\\.");\r
-               String name = packageParts[packageParts.length-1];\r
-       \r
+       public void createParser() throws IOException {\r
                \r
-               ontShort = name.substring(0, 3).toUpperCase();\r
-               ontShort +=".";\r
                String parserPackagePostfix = "_exp";\r
                String importerClassPostfix = "Exporter";\r
                String parserClassPostfix = "Writer";\r
@@ -59,7 +49,7 @@ public class ExporterGenerator extends JavaGenerator{
                if (!importParserDir.exists())\r
                        importParserDir.mkdirs();\r
                \r
-               handle(schema);\r
+               base.handle(this);\r
                // Create Importer class\r
                File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");\r
                PrintWriter mainWriter = createFile(importerFile);\r
@@ -118,21 +108,28 @@ public class ExporterGenerator extends JavaGenerator{
                mainWriter.close();\r
        }\r
        \r
-       protected void handle(TopLevelAttribute topLevelAttribute) {\r
-\r
-       }\r
+//     @Override\r
+//     protected void handle(TopLevelAttribute topLevelAttribute) {\r
+//\r
+//     }\r
        \r
        @Override\r
-       protected String getBaseClass(ObjectType type) {\r
+       public String getBaseClass(ObjectType type) {\r
                return "org.simantics.xml.sax.base.XMLElementNamedChildWriterBase";\r
        }\r
        \r
        @Override\r
-       protected void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
+       public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
+       }\r
+       \r
+       @Override\r
+       public void handle(SchemaObject parent, NamedGroup attribute) {\r
+               // TODO Auto-generated method stub\r
+               \r
        }\r
 \r
        @Override\r
-       protected void handleComplexType(SchemaObject complexTypeObj) {\r
+       public void handleComplexType(SchemaObject complexTypeObj) {\r
                ComplexType topLevelComplexType = complexTypeObj.getComplexType();\r
                \r
                String name = getName(complexTypeObj);\r
@@ -161,9 +158,9 @@ public class ExporterGenerator extends JavaGenerator{
 //                             inherited = true;\r
 //                     }\r
 //             }\r
-               Inheritance inheritance = getInheritance(complexTypeObj);\r
+               Inheritance inheritance = base.getInheritance(complexTypeObj);\r
                \r
-               provider = getIDProvider(topLevelComplexType);\r
+               provider = base.getIDProvider(topLevelComplexType);\r
 //             List<IDReference> references = getIDReferences(topLevelComplexType);\r
 //             UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);\r
 \r
@@ -216,7 +213,7 @@ public class ExporterGenerator extends JavaGenerator{
                fw.writer.println("      super(graph);");\r
                fw.writer.println("      "+getOntologyImport());\r
                \r
-               handleComplexTypeExtension(complexTypeObj);\r
+               base.handleComplexTypeExtension(complexTypeObj);\r
                \r
                fw.writer.println("   }");\r
                \r
@@ -250,8 +247,8 @@ public class ExporterGenerator extends JavaGenerator{
                }\r
                fw.writer.println("        "+getOntologyImport());\r
                fw.writer.println("        for (Statement attribute : attributes) {");\r
-               handleComplexTypeAttributes(complexTypeObj);\r
-               handleExtensionAttributes(complexTypeObj);\r
+               base.handleComplexTypeAttributes(complexTypeObj);\r
+               base.handleExtensionAttributes(complexTypeObj);\r
                fw.writer.println("        }");\r
                fw.writer.println("   }");\r
                \r
@@ -400,7 +397,7 @@ public class ExporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {               \r
+       public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {          \r
                // generates overriding method that allows writing any element\r
                FileWriter fw = getWriter(parent);\r
                fw.delayedWriter2.println("   @Override");\r
@@ -415,7 +412,9 @@ public class ExporterGenerator extends JavaGenerator{
        }\r
 \r
        @Override       \r
-       protected void handle(SchemaObject parent, Attribute attribute) {\r
+       public void handle(SchemaObject parent, Attribute attribute) {\r
+               if (parent == null)\r
+                       return;\r
                String name = attribute.getName();\r
                QName primitiveType = attribute.getType();\r
                SimpleType simpleType = attribute.getSimpleType();\r
@@ -433,7 +432,7 @@ public class ExporterGenerator extends JavaGenerator{
                        attrName = ref.getLocalPart();\r
                        relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();\r
                        \r
-                       Attribute referred = getRefAttribute(ref);\r
+                       Attribute referred = base.getRefAttribute(ref);\r
                        if (referred != null) {\r
                                primitiveType = referred.getType();\r
                                simpleType = referred.getSimpleType();\r
@@ -450,14 +449,14 @@ public class ExporterGenerator extends JavaGenerator{
                if (primitiveType != null) {\r
                        \r
                        //String binding = getBindingFromPrimitiveType(primitiveType);\r
-                       TypeEntry binding = getTypeEntry(primitiveType);\r
+                       TypeEntry binding = base.getTypeEntry(primitiveType);\r
                        \r
                        if (binding != null) {\r
                                writeAttribute(fw, attrName, relationName, binding, isReference);\r
                                return;\r
                    } else {\r
                        if (simpleType == null) {\r
-                               SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart());\r
+                               SchemaObject simpleTypeObj = base.simpleTypeName.get(primitiveType.getLocalPart());\r
                                if (simpleTypeObj != null)\r
                                        simpleType = simpleTypeObj.getSimpleType();\r
                        }       \r
@@ -466,7 +465,7 @@ public class ExporterGenerator extends JavaGenerator{
                if (simpleType != null) {\r
                        org.w3._2001.xmlschema.List list = simpleType.getList();\r
                        if (list != null) {\r
-                               TypeEntry binding = getTypeEntry(new QName(SCHEMA_NS, "string"));\r
+                               TypeEntry binding = base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));\r
                                writeAttribute(fw, attrName, relationName, binding, isReference);\r
                        } else {\r
                                Restriction restriction = simpleType.getRestriction();\r
@@ -476,7 +475,7 @@ public class ExporterGenerator extends JavaGenerator{
                                \r
                                \r
                                //String binding = getBindingFromPrimitiveType(base);\r
-                               TypeEntry binding = getTypeEntry(base);\r
+                               TypeEntry binding = this.base.getTypeEntry(base);\r
                                writeAttribute(fw, attrName, relationName, binding, isReference);\r
                        }\r
                } else {\r
@@ -484,11 +483,10 @@ public class ExporterGenerator extends JavaGenerator{
                        //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());\r
                        fw.writer.println("    //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");\r
                        //writeAttribute(fw, attrName, relationName, "STRING", isReference);\r
-                       writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference);\r
+                       writeAttribute(fw, attrName, relationName, base.getTypeEntry("string"), isReference);\r
                }\r
        }\r
        \r
-       //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) {\r
        private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {\r
                fw.writer.println("      {");\r
                fw.writer.println("         if (attribute.getPredicate().equals("+relationName+")) {"); \r
@@ -501,7 +499,7 @@ public class ExporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handleAttributes(SchemaObject simpleTypeObj) {\r
+       public void handleAttributes(SchemaObject simpleTypeObj) {\r
                SchemaObject parent = simpleTypeObj.getParent();\r
                FileWriter fw = getWriter(parent);\r
                \r
@@ -513,7 +511,7 @@ public class ExporterGenerator extends JavaGenerator{
                \r
                \r
                //String binding = getBindingFromPrimitiveType(base);\r
-               TypeEntry binding = getTypeEntry(base);\r
+               TypeEntry binding = this.base.getTypeEntry(base);\r
                \r
                fw.writer.println("   @Override");\r
                fw.writer.println("   public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");\r
@@ -523,10 +521,10 @@ public class ExporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handle(SchemaObject parent, AttributeGroup attribute) {\r
+       public void handle(SchemaObject parent, AttributeGroup attribute) {\r
                if (parent != null) {\r
                        FileWriter fw = getWriter(parent);\r
-                       NamedAttributeGroup group = getAttributeGroup(attribute.getRef().getLocalPart());\r
+                       NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef().getLocalPart());\r
                        fw.writer.println(commentTag+"    AttributeGroup " + group.getName());\r
                        SchemaObject obj = new SchemaObject(parent,attribute);\r
                        for (Annotated annotated : group.getAttributeOrAttributeGroup()) {\r
@@ -544,10 +542,10 @@ public class ExporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
+       public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
                FileWriter fw = getWriter(parent);\r
-               QName type = new QName(CONVERSION_NS, composition.getType());\r
-               TypeEntry typeEntry = getTypeEntry(type);\r
+               QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());\r
+               TypeEntry typeEntry = this.base.getTypeEntry(type);\r
                String arrayBinding = typeEntry.binding;//getBindingFromPrimitiveType(type);\r
                String javaType = typeEntry.javaType;//getJavaTypeFromPrimitiveType(type);\r
                String name = composition.getName();\r
@@ -596,7 +594,7 @@ public class ExporterGenerator extends JavaGenerator{
        }\r
        \r
        protected String getDefaultValue(QName atype) {\r
-               Map<String,TypeEntry> types = typeMap.get(atype.getNamespaceURI());\r
+               Map<String,TypeEntry> types = this.base.typeMap.get(atype.getNamespaceURI());\r
                if (types == null)\r
                        return null;\r
                TypeEntry entry =  types.get(atype.getLocalPart());\r
@@ -605,14 +603,9 @@ public class ExporterGenerator extends JavaGenerator{
                return entry.defaultValue;\r
        }\r
        \r
-       \r
-       \r
-       \r
-       \r
-       \r
        IDProvider provider;\r
        @Override\r
-       protected void handleElement(SchemaObject elementObj)  {\r
+       public void handleElement(SchemaObject elementObj)  {\r
                Element element = elementObj.getElement();\r
                \r
                String name = getName(elementObj);//topLevelElement.getName();\r
@@ -627,11 +620,11 @@ public class ExporterGenerator extends JavaGenerator{
                writers.put(elementObj, fw);\r
                boolean isList = false;\r
                \r
-               Inheritance inheritance = getInheritance(elementObj);   \r
+               Inheritance inheritance = this.base.getInheritance(elementObj); \r
                \r
-               provider = getIDProvider(element);\r
-               List<IDReference> references = getIDReferences(element);\r
-               UnrecognizedChildElement unknownChildElement = getUnknown(element);\r
+               provider = this.base.getIDProvider(element);\r
+               List<IDReference> references = this.base.getIDReferences(element);\r
+               UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);\r
 \r
 //             List<String> intrerfaces = new ArrayList<String>();\r
 //             if (references.size() > 0)\r
@@ -674,8 +667,8 @@ public class ExporterGenerator extends JavaGenerator{
                fw.writer.println("        "+getOntologyImport());\r
                fw.writer.println("        for (Statement attribute : attributes) {");\r
                if (complexType != null) {\r
-                       SchemaObject obj = complexTypes.get(complexType);\r
-                       handleElementComplexTypeAttributes(obj);\r
+                       SchemaObject obj = this.base.complexTypes.get(complexType);\r
+                       this.base.handleElementComplexTypeAttributes(obj);\r
                } \r
                fw.writer.println("        }");\r
                fw.writer.println("   }");\r
@@ -724,8 +717,8 @@ public class ExporterGenerator extends JavaGenerator{
                fw.writer.println("      super(graph);");\r
                fw.writer.println("      "+getOntologyImport());\r
                if (complexType != null) {\r
-                       SchemaObject obj = complexTypes.get(complexType);\r
-                       handleComplexTypeExtension(obj);\r
+                       SchemaObject obj = this.base.complexTypes.get(complexType);\r
+                       this.base.handleComplexTypeExtension(obj);\r
                } else if (simpleType != null) {\r
                        \r
                }\r
index 80359ba895c6ea25269785a1907c6f96996141bd..2e5fb272438b917481ab6fd67fe24d3aa76ea939 100644 (file)
@@ -6,16 +6,16 @@ import java.io.PrintWriter;
 import java.io.StringWriter;\r
 import java.util.ArrayList;\r
 import java.util.List;\r
-import java.util.Map;\r
 \r
 import javax.xml.namespace.QName;\r
 \r
 import org.simantics.utils.datastructures.BijectionMap;\r
+import org.simantics.xml.sax.SchemaConversionBase.Inheritance;\r
 import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;\r
 import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
+import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;\r
 import org.simantics.xml.sax.SchemaObject.ObjectType;\r
 import org.simantics.xml.sax.configuration.AttributeComposition;\r
-import org.simantics.xml.sax.configuration.Configuration;\r
 import org.simantics.xml.sax.configuration.IDProvider;\r
 import org.simantics.xml.sax.configuration.IDReference;\r
 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;\r
@@ -27,29 +27,18 @@ import org.w3._2001.xmlschema.Element;
 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.NamedGroup;\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 ImporterGenerator extends JavaGenerator{\r
        \r
-       public ImporterGenerator(Configuration configuration) {\r
-               super(configuration);\r
+       public ImporterGenerator(SchemaConverter converter, SchemaConversionBase base) {\r
+               super(converter, base);\r
        }\r
        \r
-       public void createParser(Schema schema,String ontologyUri, String className, SchemaConverter converter) throws IOException {\r
-               this.schema = schema;\r
-               this.ontologyClassName = className;\r
-               this.converter = converter;\r
+       public void createParser() throws IOException {\r
                \r
-               \r
-               String packageParts[] = className.split("\\.");\r
-               String name = packageParts[packageParts.length-1];\r
-       \r
-               \r
-               ontShort = name.substring(0, 3).toUpperCase();\r
-               ontShort +=".";\r
                String parserPackagePostfix = "_elem";\r
                String importerClassPostfix = "Importer";\r
                String parserClassPostfix = "Parser";\r
@@ -59,7 +48,7 @@ public class ImporterGenerator extends JavaGenerator{
                if (!importParserDir.exists())\r
                        importParserDir.mkdirs();\r
                \r
-               handle(schema);\r
+               base.handle(this);\r
                // Create Importer class\r
                File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");\r
                PrintWriter mainWriter = createFile(importerFile);\r
@@ -103,16 +92,18 @@ public class ImporterGenerator extends JavaGenerator{
                mainWriter.flush();\r
                mainWriter.close();\r
        }\r
-\r
-       protected void handle(TopLevelAttribute topLevelAttribute) {\r
+       \r
+       @Override\r
+       public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
        }\r
        \r
        @Override\r
-       protected void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
+       public void handle(SchemaObject parent, NamedGroup attribute) {\r
+               // TODO Auto-generated method stub\r
        }\r
        \r
        @Override\r
-       protected void handleComplexType(SchemaObject complexTypeObj) {\r
+       public void handleComplexType(SchemaObject complexTypeObj) {\r
                ComplexType topLevelComplexType = complexTypeObj.getComplexType();\r
                \r
                String name = getName(complexTypeObj);\r
@@ -132,11 +123,11 @@ public class ImporterGenerator extends JavaGenerator{
                }\r
                writers.put(complexTypeObj, fw);\r
                \r
-               Inheritance inheritance = getInheritance(complexTypeObj);\r
+               Inheritance inheritance = this.base.getInheritance(complexTypeObj);\r
                \r
-               provider = getIDProvider(topLevelComplexType);\r
-               List<IDReference> references = getIDReferences(topLevelComplexType);\r
-               UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);\r
+               provider = this.base.getIDProvider(topLevelComplexType);\r
+               List<IDReference> references = this.base.getIDReferences(topLevelComplexType);\r
+               UnrecognizedChildElement unknownChildElement = this.base.getUnknown(topLevelComplexType);\r
 \r
                List<String> intrerfaces = new ArrayList<String>();\r
                if (references.size() > 0)\r
@@ -175,7 +166,7 @@ public class ImporterGenerator extends JavaGenerator{
                fw.writer.println("   public " + className + "() {");\r
                fw.writer.println("      super();");\r
                \r
-               handleComplexTypeExtension(complexTypeObj);\r
+               this.base.handleComplexTypeExtension(complexTypeObj);\r
                \r
                fw.writer.println("   }");\r
                \r
@@ -212,8 +203,8 @@ public class ImporterGenerator extends JavaGenerator{
                }\r
                fw.writer.println("        "+getOntologyImport());\r
                \r
-               handleComplexTypeAttributes(complexTypeObj);\r
-               handleExtensionAttributes(complexTypeObj);\r
+               this.base.handleComplexTypeAttributes(complexTypeObj);\r
+               this.base.handleExtensionAttributes(complexTypeObj);\r
                \r
                fw.writer.println("   }");\r
                \r
@@ -238,7 +229,7 @@ public class ImporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {\r
+       public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {\r
                FileWriter fw = getWriter(parent);\r
                if (referenceType == RefType.Type) {\r
                // create internal class for handling the element and child attachment\r
@@ -287,6 +278,7 @@ public class ImporterGenerator extends JavaGenerator{
                fw.delayedWriter.println("         }");\r
        }\r
        \r
+       @Override\r
        protected void createPrimitiveIndicator(SchemaObject parent, String refName, String binding) {\r
                FileWriter fw = getWriter(parent);\r
                fw.writer.println("        addParser(\""+ refName +"\", "+getName(parent) +"_" +refName+".class);");\r
@@ -298,6 +290,7 @@ public class ImporterGenerator extends JavaGenerator{
                fw.delayedWriter2.println("   }");\r
        }\r
        \r
+       @Override\r
        protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) {\r
                FileWriter fw = getWriter(parent);\r
                //if (!reference)\r
@@ -339,7 +332,7 @@ public class ImporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {               \r
+       public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {          \r
                // generates overriding method that allows parsing any element\r
                FileWriter fw = getWriter(parent);\r
                fw.delayedWriter2.println("   @Override");\r
@@ -353,7 +346,9 @@ public class ImporterGenerator extends JavaGenerator{
        }\r
 \r
        @Override       \r
-       protected void handle(SchemaObject parent, Attribute attribute) {\r
+       public void handle(SchemaObject parent, Attribute attribute) {\r
+               if (parent == null)\r
+                       return;\r
                String name = attribute.getName();\r
                QName primitiveType = attribute.getType();\r
                SimpleType simpleType = attribute.getSimpleType();\r
@@ -371,7 +366,7 @@ public class ImporterGenerator extends JavaGenerator{
                        attrName = ref.getLocalPart();\r
                        relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();\r
                        \r
-                       Attribute referred = getRefAttribute(ref);\r
+                       Attribute referred = this.base.getRefAttribute(ref);\r
                        if (referred != null) {\r
                                primitiveType = referred.getType();\r
                                simpleType = referred.getSimpleType();\r
@@ -388,14 +383,14 @@ public class ImporterGenerator extends JavaGenerator{
                if (primitiveType != null) {\r
                        \r
                        //String binding = getBindingFromPrimitiveType(primitiveType);\r
-                       TypeEntry binding = getTypeEntry(primitiveType);\r
+                       TypeEntry binding = this.base.getTypeEntry(primitiveType);\r
                        \r
                        if (binding != null) {\r
                                writeAttribute(fw, attrName, relationName, binding, isReference);\r
                                return;\r
                    } else {\r
                        if (simpleType == null) {\r
-                               SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart());\r
+                               SchemaObject simpleTypeObj = this.base.simpleTypeName.get(primitiveType.getLocalPart());\r
                                if (simpleTypeObj != null)\r
                                        simpleType = simpleTypeObj.getSimpleType();\r
                        }       \r
@@ -404,7 +399,7 @@ public class ImporterGenerator extends JavaGenerator{
                if (simpleType != null) {\r
                        org.w3._2001.xmlschema.List list = simpleType.getList();\r
                        if (list != null) {\r
-                               TypeEntry binding = getTypeEntry(new QName(SCHEMA_NS, "string"));\r
+                               TypeEntry binding = this.base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));\r
                                writeAttribute(fw, attrName, relationName, binding, isReference);\r
                        } else {\r
                                Restriction restriction = simpleType.getRestriction();\r
@@ -414,7 +409,7 @@ public class ImporterGenerator extends JavaGenerator{
                                \r
                                \r
                                //String binding = getBindingFromPrimitiveType(base);\r
-                               TypeEntry binding = getTypeEntry(base);\r
+                               TypeEntry binding = this.base.getTypeEntry(base);\r
                                writeAttribute(fw, attrName, relationName, binding, isReference);\r
                        }\r
                } else {\r
@@ -422,11 +417,10 @@ public class ImporterGenerator extends JavaGenerator{
                        //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());\r
                        fw.writer.println("    //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");\r
                        //writeAttribute(fw, attrName, relationName, "STRING", isReference);\r
-                       writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference);\r
+                       writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference);\r
                }\r
        }\r
        \r
-       //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) {\r
        private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {\r
                fw.writer.println("      {");\r
                fw.writer.println("         Attribute a = element.getAttribute(\"" +attrName+"\");");\r
@@ -439,7 +433,7 @@ public class ImporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handleAttributes(SchemaObject simpleTypeObj) {\r
+       public void handleAttributes(SchemaObject simpleTypeObj) {\r
                SchemaObject parent = simpleTypeObj.getParent();\r
                FileWriter fw = getWriter(parent);\r
                \r
@@ -451,7 +445,7 @@ public class ImporterGenerator extends JavaGenerator{
                \r
                \r
                //String binding = getBindingFromPrimitiveType(base);\r
-               TypeEntry binding = getTypeEntry(base);\r
+               TypeEntry binding = this.base.getTypeEntry(base);\r
                fw.writer.println("   @Override");\r
                fw.writer.println("   public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");\r
                //fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");\r
@@ -461,10 +455,10 @@ public class ImporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handle(SchemaObject parent, AttributeGroup attribute) {\r
+       public void handle(SchemaObject parent, AttributeGroup attribute) {\r
                if (parent != null) {\r
                        FileWriter fw = getWriter(parent);\r
-                       NamedAttributeGroup group = getAttributeGroup(attribute.getRef().getLocalPart());\r
+                       NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef().getLocalPart());\r
                        fw.writer.println(commentTag+"    AttributeGroup " + group.getName());\r
                        SchemaObject obj = new SchemaObject(parent,attribute);\r
                        for (Annotated annotated : group.getAttributeOrAttributeGroup()) {\r
@@ -482,11 +476,11 @@ public class ImporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
+       public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
                FileWriter fw = getWriter(parent);\r
-               QName type = new QName(CONVERSION_NS, composition.getType());\r
-               String arrayBinding = getBindingFromPrimitiveType(type);\r
-               String javaType = getJavaTypeFromPrimitiveType(type);\r
+               QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());\r
+               String arrayBinding = this.base.getBindingFromPrimitiveType(type);\r
+               String javaType = this.base.getJavaTypeFromPrimitiveType(type);\r
                String name = composition.getName();\r
                \r
                String relationName;\r
@@ -508,13 +502,13 @@ public class ImporterGenerator extends JavaGenerator{
                for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {\r
                        Attribute attribute = ((Attribute)attributes.getRight(a));\r
                        //QName atype = getBaseType(attribute);\r
-                       QName atype = getPrimitiveType(attribute);\r
+                       QName atype = this.base.getPrimitiveType(attribute);\r
                        String defaultValue = attribute.getDefault();\r
                        if (defaultValue == null)\r
-                           defaultValue = getDefaultValue(atype);\r
+                           defaultValue = this.base.getDefaultValue(atype);\r
                                \r
                        //String binding = getBindingFromPrimitiveType(atype);\r
-                       TypeEntry binding = getTypeEntry(atype);\r
+                       TypeEntry binding = this.base.getTypeEntry(atype);\r
                        if (i > 0)\r
                                fw.writer.print(",");\r
                        if (defaultValue != null)\r
@@ -528,15 +522,7 @@ public class ImporterGenerator extends JavaGenerator{
                \r
        }\r
        \r
-       protected String getDefaultValue(QName atype) {\r
-               Map<String,TypeEntry> types = typeMap.get(atype.getNamespaceURI());\r
-               if (types == null)\r
-                       return null;\r
-               TypeEntry entry =  types.get(atype.getLocalPart());\r
-               if (entry == null)\r
-                       return null;\r
-               return entry.defaultValue;\r
-       }\r
+       \r
        \r
        \r
        \r
@@ -544,7 +530,7 @@ public class ImporterGenerator extends JavaGenerator{
        \r
        IDProvider provider;\r
        @Override\r
-       protected void handleElement(SchemaObject elementObj)  {\r
+       public void handleElement(SchemaObject elementObj)  {\r
                Element element = elementObj.getElement();\r
                \r
                String name = getName(elementObj);//topLevelElement.getName();\r
@@ -559,11 +545,11 @@ public class ImporterGenerator extends JavaGenerator{
                writers.put(elementObj, fw);\r
                boolean isList = false;\r
                \r
-               Inheritance inheritance = getInheritance(elementObj);   \r
+               Inheritance inheritance = this.base.getInheritance(elementObj); \r
                \r
-               provider = getIDProvider(element);\r
-               List<IDReference> references = getIDReferences(element);\r
-               UnrecognizedChildElement unknownChildElement = getUnknown(element);\r
+               provider = this.base.getIDProvider(element);\r
+               List<IDReference> references = this.base.getIDReferences(element);\r
+               UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);\r
 \r
                List<String> intrerfaces = new ArrayList<String>();\r
                if (references.size() > 0)\r
@@ -607,8 +593,8 @@ public class ImporterGenerator extends JavaGenerator{
                LocalSimpleType simpleType = element.getSimpleType();\r
                \r
                if (complexType != null) {\r
-                       SchemaObject obj = complexTypes.get(complexType);\r
-                       handleElementComplexTypeAttributes(obj);\r
+                       SchemaObject obj = this.base.complexTypes.get(complexType);\r
+                       this.base.handleElementComplexTypeAttributes(obj);\r
                } \r
                fw.writer.println("   }");\r
                \r
@@ -634,8 +620,8 @@ public class ImporterGenerator extends JavaGenerator{
                fw.writer.println("      super();");\r
                \r
                if (complexType != null) {\r
-                       SchemaObject obj = complexTypes.get(complexType);\r
-                       handleComplexTypeExtension(obj);\r
+                       SchemaObject obj = this.base.complexTypes.get(complexType);\r
+                       this.base.handleComplexTypeExtension(obj);\r
                } else if (simpleType != null) {\r
                        \r
                }\r
@@ -742,7 +728,7 @@ public class ImporterGenerator extends JavaGenerator{
        }\r
        \r
        @Override\r
-       protected String getBaseClass(ObjectType type) {\r
+       public String getBaseClass(ObjectType type) {\r
                return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";\r
        }\r
        \r
index dfcdfd3d7b78e1afbe903dc7e06cb1b969058db8..126dcf45691cb3110cf5d66c3ae422479082a126 100644 (file)
@@ -10,30 +10,44 @@ import java.util.Map;
 \r
 import javax.xml.namespace.QName;\r
 \r
-import org.simantics.xml.sax.configuration.Configuration;\r
+import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
+import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;\r
 import org.w3._2001.xmlschema.AttributeGroupRef;\r
 import org.w3._2001.xmlschema.Element;\r
 import org.w3._2001.xmlschema.Schema;\r
 \r
-public abstract class JavaGenerator extends SchemaConversionBase{\r
+//public abstract class JavaGenerator extends SchemaConversionBase{\r
+public abstract class JavaGenerator implements SchemaConversionComponent {\r
 \r
        String commentTag = "//";\r
        \r
        Schema schema;\r
        String ontologyClassName;\r
+       String ontologyUri;\r
        SchemaConverter converter;\r
+       SchemaConversionBase base;\r
        \r
        List<String> ruleClassNames = new ArrayList<String>();\r
        \r
        String ontShort = "ONT"; \r
+       String name;\r
        \r
        File importParserDir;\r
        String elementPackageName;\r
        \r
        Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();\r
        \r
-       public JavaGenerator(Configuration configuration) {\r
-               super(configuration);\r
+       public JavaGenerator(SchemaConverter converter, SchemaConversionBase base) {\r
+               this.converter = converter;\r
+               this.base = base;\r
+               \r
+               this.schema = base.schema;\r
+               this.ontologyClassName = base.className;\r
+               this.ontologyUri = base.ontologyURI;\r
+               this.converter = converter;\r
+               this.name = converter.name;\r
+               ontShort = converter.shortName;\r
+               ontShort +=".";\r
        }\r
        \r
        \r
@@ -59,41 +73,37 @@ public abstract class JavaGenerator extends SchemaConversionBase{
                        return name;\r
                return binding.getValueGetter(name);\r
        }\r
+       \r
        protected String getValueGetter(TypeEntry binding) {\r
                if (binding == null)\r
                        return "value";\r
                return binding.getValueGetter();\r
        }\r
        \r
+       @Override\r
        public String getComplexTypePrefix() {\r
                return "ComplexTypes_";\r
        }       \r
        \r
+       @Override\r
        public String getAttributeGroupPrefix() {\r
                return "AttributeGroups_";\r
        }\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
+       public void handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name) {\r
 \r
-                       for (SchemaElement e : elements) {\r
-                               Element localElement = e.getElement();\r
-                               if (localElement.getName() != null) {\r
-                                       QName refType = localElement.getType();\r
-                                       if (refType != null)\r
-                                               //handleIndicator(parent, indicator, e, false, name, refType);\r
-                                               handleIndicator(parent, indicator, e, name, RefType.Type);\r
-                               } else if (localElement.getRef() != null) {\r
-                                       //QName refType = localElement.getRef();\r
-                                       //handleIndicator(parent, indicator, e, true, name, refType);\r
-                                       handleIndicator(parent, indicator, e, name, RefType.Reference);\r
-                               }\r
+               for (SchemaElement e : elements) {\r
+                       Element localElement = e.getElement();\r
+                       if (localElement.getName() != null) {\r
+                               QName refType = localElement.getType();\r
+                               if (refType != null)\r
+                                       //handleIndicator(parent, indicator, e, false, name, refType);\r
+                                       handleIndicator(parent, indicator, e, name, RefType.Type);\r
+                       } else if (localElement.getRef() != null) {\r
+                               //QName refType = localElement.getRef();\r
+                               //handleIndicator(parent, indicator, e, true, name, refType);\r
+                               handleIndicator(parent, indicator, e, name, RefType.Reference);\r
                        }\r
                }\r
                \r
@@ -121,7 +131,7 @@ public abstract class JavaGenerator extends SchemaConversionBase{
                return null;\r
        }\r
        \r
-       \r
+       @Override\r
        public String getName(SchemaObject obj) {\r
                if (obj.getParent() == null) {\r
                        switch (obj.getType()) {\r
@@ -224,12 +234,13 @@ public abstract class JavaGenerator extends SchemaConversionBase{
                writer.println();\r
        }\r
        \r
+       \r
        protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList);\r
        protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, String binding);\r
        protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList);\r
        \r
        @Override\r
-       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType) {\r
+       public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType) {\r
                String objectName;\r
                if (referenceType != RefType.Element) {\r
                        QName refType;\r
@@ -245,10 +256,10 @@ public abstract class JavaGenerator extends SchemaConversionBase{
                                objectName = refType.getLocalPart();\r
                        }\r
                        \r
-                       String binding = getBindingFromPrimitiveType(refType);\r
+                       String binding = this.base.getBindingFromPrimitiveType(refType);\r
                        if (binding == null) {\r
-                               SchemaObject refElement = elementName.get(refType.getLocalPart());\r
-                               SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart());\r
+                               SchemaObject refElement = this.base.elementName.get(refType.getLocalPart());\r
+                               SchemaObject refComplexType = this.base.complexTypeName.get(refType.getLocalPart());\r
        \r
                                // prefer element reference over complex type reference\r
                                String primaryClassName = null;\r
@@ -263,22 +274,22 @@ public abstract class JavaGenerator extends SchemaConversionBase{
                                } else {\r
                                        secondaryClassName = getName(refElement);\r
                                }\r
-                               boolean useElementList = useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);\r
-                               boolean useOriginalList = useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);\r
+                               boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);\r
+                               boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);\r
                                createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);\r
                        } else {\r
                                createPrimitiveIndicator(parent, refName, binding);\r
                        }\r
                } else {\r
                        Element attrs= element.getElement();\r
-                       SchemaObject obj = getWithObj(parent, attrs);\r
+                       SchemaObject obj = this.base.getWithObj(parent, attrs);\r
                        \r
                        String className = getName(obj);\r
                        if (refName == null)\r
                                refName = attrs.getName();\r
                        \r
-                       boolean useElementList = useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));\r
-                       boolean useOriginalList = useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));\r
+                       boolean useElementList = this.base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));\r
+                       boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));\r
                        createElementIndicator(parent, useElementList, refName, className, useOriginalList);\r
                }\r
        }\r
diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/ManualSchemaFileImport.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/ManualSchemaFileImport.java
new file mode 100644 (file)
index 0000000..a0dfb1d
--- /dev/null
@@ -0,0 +1,10 @@
+package org.simantics.xml.sax;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+\r
+public interface ManualSchemaFileImport {\r
+\r
+       \r
+       public File getFileForLocation(String location) throws IOException; \r
+}\r
index 741e197f0e2ff50bf9bb6b41c619fe94fd78471e..f98a85f5673785e292347149b5865cde0454f392 100644 (file)
@@ -11,9 +11,11 @@ import java.util.Set;
 import javax.xml.namespace.QName;\r
 \r
 import org.simantics.utils.datastructures.BijectionMap;\r
+import org.simantics.xml.sax.SchemaConversionBase.Inheritance;\r
+import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;\r
+import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
 import org.simantics.xml.sax.SchemaObject.ObjectType;\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
@@ -22,15 +24,21 @@ import org.w3._2001.xmlschema.Element;
 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.NamedGroup;\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
+//public class OntologyGenerator extends SchemaConversionBase {\r
+public class OntologyGenerator implements SchemaConversionComponent {\r
+       SchemaConversionBase base;\r
        \r
-       public OntologyGenerator(Configuration configuration) {\r
-               super(configuration);\r
+       public OntologyGenerator(SchemaConverter converter, SchemaConversionBase base) {\r
+               this.base = base;\r
+               this.converter = converter;\r
+               this.schema = base.schema;\r
+               this.ontologyUri = base.ontologyURI;\r
+               this.className = base.className;                \r
        }\r
 \r
        String ontRoot = "ONT.";\r
@@ -44,30 +52,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        \r
        PrintWriter writer = null;\r
        \r
-       \r
-       \r
-       \r
-       \r
-       public void createOntology(Schema schema, String ontologyName, String className, SchemaConverter converter) throws FileNotFoundException {\r
-               this.schema = schema;\r
-               this.converter = converter;\r
-               this.ontologyUri = ontologyName;\r
-               this.className = className;\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
+       public void createOntology() throws FileNotFoundException {\r
                StringWriter stringWriter = null;\r
                if (converter.getOntologyFile() == null) {\r
                        stringWriter = new StringWriter();\r
@@ -76,7 +61,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                        writer = new PrintWriter(converter.getOntologyFile());\r
                }\r
        \r
-               handle(schema);\r
+               handle();\r
                \r
                writer.flush();\r
                writer.close();\r
@@ -84,10 +69,8 @@ public class OntologyGenerator extends SchemaConversionBase {
                        System.out.println(stringWriter.toString());\r
        }\r
        \r
-       protected void handle(Schema schema) {\r
-               String parts[] = ontologyUri.split("/");\r
-               String name = parts[parts.length-1];\r
-               ontRoot = name.substring(0, Math.min(3, name.length())).toUpperCase();\r
+       protected void handle() {\r
+               ontRoot = converter.shortName;\r
 \r
                for (String s : converter.getHeader()) {\r
                        writer.println(commentTag + " " + s);   \r
@@ -109,18 +92,18 @@ public class OntologyGenerator extends SchemaConversionBase {
                writer.println(commentTag + " Interpreted from schema");\r
                writer.println();\r
                        \r
-               super.handle(schema);\r
+               base.handle(this);\r
        }\r
                \r
        protected String getType(QName qtype) {\r
-               String ontType = getL0TypeFromPrimitiveType(qtype);\r
+               String ontType = base.getL0TypeFromPrimitiveType(qtype);\r
                if (ontType != null)\r
                        return ontType;\r
-               else if (isComplexTypeRef(qtype.getLocalPart()))\r
+               else if (base.isComplexTypeRef(qtype.getLocalPart()))\r
                        return ontRoot+getComplexTypePrefix()+qtype.getLocalPart();\r
-               else if (isSimpleTypeRef(qtype.getLocalPart()))\r
+               else if (base.isSimpleTypeRef(qtype.getLocalPart()))\r
                        return ontRoot+qtype.getLocalPart();\r
-               else if (isElementRef(qtype.getLocalPart()))\r
+               else if (base.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
@@ -128,19 +111,6 @@ public class OntologyGenerator extends SchemaConversionBase {
                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 String getComplexTypePrefix() {\r
                return "ComplexTypes.";\r
        }\r
@@ -149,94 +119,85 @@ public class OntologyGenerator extends SchemaConversionBase {
                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
+       public void handleChoice(SchemaObject parent, SchemaElement indicator, java.util.List<SchemaElement> elements, String name) {\r
+               boolean single = true;\r
+               for (SchemaElement e : elements) {\r
+                       if (e.getRestriction().many()) {\r
+                               single = false;\r
+                               break;\r
                        }\r
-                       String relationName = getName(parent)+".has"+name;\r
-                       writer.print(relationName);\r
+               }\r
+               String relationName = 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
-                       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(getName(obj,"has"));\r
-                               } \r
+                       if (localElement.getName() != null) {\r
+                               refType = localElement.getType();\r
+                               type = base.getL0TypeFromPrimitiveType(refType);        \r
+                       } else if (localElement.getRef() != null) {\r
+                               refType = localElement.getRef();\r
+                               type = base.getL0TypeFromPrimitiveType(refType);\r
                        }\r
-                       if (types.size() > 0) {\r
-                               for (String type : types) {\r
-                                       writer.print(" <R " + type);\r
-                               }\r
-                       } else {\r
-                               writer.print(" <R XML.hasElement");\r
+                       if (type == null) {\r
+                               SchemaObject obj = base.getWithName(parent, refType.getLocalPart());\r
+                               types.add(getName(obj,"has"));\r
+                       } \r
+               }\r
+               if (types.size() > 0) {\r
+                       for (String type : types) {\r
+                               writer.print(" <R " + type);\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
+               } else {\r
+                       writer.print(" <R 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 (!single) {\r
-                               writer.println(ontRoot+name+ "List <T XML.ElementList");\r
-                               if (types.size() == 0) {\r
-                               writer.println(relationName+ "List <R 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
+                       if (type != null) {\r
+                               writer.println("   --> " + type);\r
+                       }\r
+               }\r
+               if (!single) {\r
+                       writer.println(ontRoot+name+ "List <T XML.ElementList");\r
+                       if (types.size() == 0) {\r
+                       writer.println(relationName+ "List <R 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("   --> " + ontRoot+name+"List");\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, String refName, RefType refType) {\r
+       public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) {\r
                if (refType != refType.Element) {\r
                        QName referenceType = null;\r
                        if (refType == RefType.Type) {\r
                                referenceType = element.getElement().getType();\r
                                //refName = element.getElement().getName()\r
-                               SchemaObject eObj = elements.get(element.getElement());\r
+                               SchemaObject eObj = base.elements.get(element.getElement());\r
                                if (refName == null)\r
                                        refName = eObj.getName();\r
                        } else {\r
@@ -244,10 +205,10 @@ public class OntologyGenerator extends SchemaConversionBase {
                                if (refName == null)\r
                                        refName = referenceType.getLocalPart();\r
                        }\r
-                       String type = getL0TypeFromPrimitiveType(referenceType);\r
+                       String type = base.getL0TypeFromPrimitiveType(referenceType);\r
                        SchemaObject obj = null;\r
                        if (type == null) {\r
-                               obj = getWithName(parent, referenceType.getLocalPart());\r
+                               obj = base.getWithName(parent, referenceType.getLocalPart());\r
                                \r
                                writer.println(getName(parent)+".has"+refName + " <R " +  getName(obj,"has"));\r
                                writer.println("   --> " + getName(obj));\r
@@ -256,7 +217,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                                writer.println("   --> " + getType(referenceType));\r
                        }\r
                        \r
-                       if (useElementList(parent, indicator,element, refType == RefType.Reference, refName, referenceType)) {\r
+                       if (base.useElementList(parent, indicator,element, refType == RefType.Reference, refName, referenceType)) {\r
                                \r
                                if (type == null) {\r
                                        writer.println(getName(parent)+"."+refName + "List <T XML.ElementList");\r
@@ -268,13 +229,13 @@ public class OntologyGenerator extends SchemaConversionBase {
                        }\r
                } else {\r
                        Element attrs = element.getElement();\r
-                       SchemaObject obj = getWithObj(parent, attrs);\r
+                       SchemaObject obj = base.getWithObj(parent, attrs);\r
                        if (refName == null)\r
                                refName = obj.getName();\r
                        \r
                        writer.println(getName(parent)+".has"+refName + " <R " + getName(obj,"has"));\r
                        writer.println("   --> " + getName(obj));\r
-                       if (useElementList(parent, indicator,element, false, refName, new QName(obj.getName()))) {\r
+                       if (base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()))) {\r
                                writer.println(getName(parent)+"."+refName + "List <T XML.ElementList");\r
                                writer.println(getName(parent)+".has"+refName + "List <R " +  getName(obj,"has")+"List : L0.FunctionalRelation");\r
                        }\r
@@ -283,12 +244,18 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {\r
+       public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {\r
+               \r
+       }\r
+       \r
+       @Override\r
+       public void handle(SchemaObject parent, NamedGroup attribute) {\r
+               // TODO Auto-generated method stub\r
                \r
        }\r
                \r
        @Override\r
-       protected void handle(SchemaObject parent, Attribute attribute) {\r
+       public void handle(SchemaObject parent, Attribute attribute) {\r
                String name = attribute.getName();\r
                QName primitiveType = attribute.getType();\r
                LocalSimpleType simpleType = attribute.getSimpleType();\r
@@ -311,9 +278,9 @@ public class OntologyGenerator extends SchemaConversionBase {
                boolean id = false;\r
                String ontType = null;\r
                if (primitiveType != null) {\r
-                       ontType = getL0TypeFromPrimitiveType(primitiveType);\r
+                       ontType = base.getL0TypeFromPrimitiveType(primitiveType);\r
                        if (ontType != null) {\r
-                               id = getTypeEntry(primitiveType).id;\r
+                               id = base.getTypeEntry(primitiveType).id;\r
                                if (id)\r
                                        relationType = "XML.hasID";\r
                        } else {\r
@@ -326,7 +293,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                        QName base = restriction.getBase();\r
                        \r
                        \r
-                       ontType = getL0TypeFromPrimitiveType(base);\r
+                       ontType = this.base.getL0TypeFromPrimitiveType(base);\r
                        \r
 //                     for (Object facetWrap : restriction.getFacets()) {\r
 //                             JAXBElement<?> element = (JAXBElement<?>)facetWrap;\r
@@ -348,7 +315,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handleAttributes(SchemaObject simpleTypeObj) {\r
+       public void handleAttributes(SchemaObject simpleTypeObj) {\r
 //             SchemaObject parent = simpleTypeObj.getParent();\r
 //             SimpleType simpleType = simpleTypeObj.getSimpleType();\r
 //             Restriction restriction = simpleType.getRestriction();\r
@@ -357,7 +324,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handle(SchemaObject parent, AttributeGroup attributeGroup) {\r
+       public void handle(SchemaObject parent, AttributeGroup attributeGroup) {\r
                if (parent == null) {\r
                        NamedAttributeGroup group = (NamedAttributeGroup)attributeGroup;\r
                        writer.println(ontRoot+getAttributeGroupPrefix()+group.getName()+ " <T XML.AttributeGroup");\r
@@ -367,7 +334,8 @@ public class OntologyGenerator extends SchemaConversionBase {
                                        //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
+                                       handle(obj,(AttributeGroup)annotated);\r
+                                       //throw new RuntimeException("Cannot handle nested attribute groups");\r
                                }\r
                        }\r
                } else {\r
@@ -377,16 +345,16 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
+       public 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
+               QName type = new QName(SchemaConversionBase.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
+       public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
                SimpleType simpleType = simpleTypeObj.getSimpleType();\r
                String name = simpleType.getName();\r
                \r
@@ -398,27 +366,75 @@ public class OntologyGenerator extends SchemaConversionBase {
                                relationName = getName(parent)+".has"+name;\r
                        writer.println(relationName+ " <R XML.hasAttribute : L0.FunctionalRelation");\r
                        \r
-                       String ontType = getL0Type(new QName(SCHEMA_NS, "string"));\r
+                       String ontType = base.getL0Type(new QName(SchemaConversionBase.SCHEMA_NS, "string"));\r
                        writer.println("   --> " + ontType);\r
                } else {\r
-                       Restriction restriction = simpleType.getRestriction();\r
-                       if (restriction == null || simpleType.getUnion() != null || simpleType.getId() != null)\r
-                               throw new RuntimeException(simpleType.getName() + " restriction error");\r
-                       QName base = restriction.getBase();\r
-                       \r
                        String relationName = ontRoot+"has"+name;\r
                        if (parent != null)\r
                                relationName = getName(parent)+".has"+name;\r
                        \r
                        writer.println(relationName+ " <R XML.hasAttribute : L0.FunctionalRelation");\r
                        \r
-                       String ontType = getL0Type(base);\r
-                       writer.println("   --> " + ontType);\r
+                       QName base = this.base.getSimpleTypeBase(simpleType);\r
+                       Inheritance inheritance = new Inheritance("");\r
+                       this.base.getAtomicTypeInheritance(base, inheritance);\r
+                       if (inheritance.atomicType == null)\r
+                               throw new RuntimeException("Could not locate atomic type for SimpleType " + simpleType.getName());\r
+                       writer.println("   --> " + inheritance.atomicType.l0Type);\r
+                       \r
+//                     Restriction restriction = simpleType.getRestriction();\r
+//                     if (restriction != null) {\r
+//                             \r
+//                             QName base = restriction.getBase();\r
+//                             String ontType = getL0Type(base);\r
+//                             writer.println("   --> " + ontType);\r
+//                     } else if (simpleType.getId() != null) {\r
+//                             throw new RuntimeException(simpleType.getName() + " restriction error");\r
+//                     } else if (simpleType.getUnion() != null) {\r
+//                             Union union = simpleType.getUnion();\r
+//                             String ontType = null;\r
+//                             if (union.getMemberTypes().size() > 0) {\r
+//                                     for (QName type : union.getMemberTypes()) {\r
+//                                             String sType = null;\r
+//                                             TypeEntry entry = getTypeEntry(type);\r
+//                                             if (entry == null) {\r
+//                                                     SchemaObject obj = simpleTypeName.get(type.getLocalPart());\r
+//                                                     Inheritance inheritance = new Inheritance("");\r
+//                                                     getAtomicTypeInheritance(type, obj, inheritance);\r
+//                                                     sType = inheritance.atomicType.l0Type;\r
+//                                             } else {\r
+//                                                     sType = entry.l0Type;\r
+//                                             }\r
+//                                             if (ontType == null)\r
+//                                                     ontType = sType;\r
+//                                             else if (!ontType.equals(sType))\r
+//                                                     throw new RuntimeException(simpleType.getName() + " union has incompatible member types");\r
+//                                     }\r
+//                             } else {\r
+//                                     if (union.getSimpleType().size() == 0)\r
+//                                             throw new RuntimeException(simpleType.getName() + " union error");\r
+//                                     for (SimpleType s : union.getSimpleType()) {\r
+//                                             if (restriction == null)\r
+//                                                     restriction = s.getRestriction();\r
+//                                             else  {\r
+//                                                     Restriction r = s.getRestriction();\r
+//                                                     if (!r.getBase().equals(restriction.getBase()))\r
+//                                                             throw new RuntimeException(simpleType.getName() + " union has incompatible restriction bases");\r
+//                                             }\r
+//                                     }\r
+//                                     QName base = restriction.getBase();\r
+//                                     ontType = getL0Type(base);\r
+//                             }\r
+//                             writer.println("   --> " + ontType);\r
+//                     } else {\r
+//                             throw new RuntimeException(simpleType.getName() + " restriction error");\r
+//                     }\r
+                       \r
                }\r
        }\r
        \r
        @Override\r
-       protected void handleComplexType(SchemaObject topLevelComplexType) {\r
+       public void handleComplexType(SchemaObject topLevelComplexType) {\r
                String name = getName(topLevelComplexType);\r
 //             if (topLevelComplexType.getName().equals("Reference"))\r
 //                     System.out.println();\r
@@ -440,7 +456,7 @@ public class OntologyGenerator extends SchemaConversionBase {
 //             if (base != null) {\r
 //                     baseType = getType(base);\r
 //             }\r
-               Inheritance inheritance = getInheritance(topLevelComplexType);\r
+               Inheritance inheritance = base.getInheritance(topLevelComplexType);\r
                \r
 //             writer.println(name+ " <T "+baseType);\r
                \r
@@ -451,12 +467,15 @@ public class OntologyGenerator extends SchemaConversionBase {
                }\r
 //             if (!baseType.equals(inheritance.baseClass))\r
 //                     System.out.println();\r
-               super.handleComplexType(topLevelComplexType);\r
+               //super.handleComplexType(topLevelComplexType);\r
+               base.handleComplexTypeAttributes(topLevelComplexType);\r
+               base.handleComplexTypeExtension(topLevelComplexType);\r
+               base.handleExtensionAttributes(topLevelComplexType);\r
                writer.println();\r
        }\r
        \r
        @Override\r
-       protected void handleElement(SchemaObject elementObj) {\r
+       public void handleElement(SchemaObject elementObj) {\r
                Element element = elementObj.getElement();\r
                String name = getName(elementObj);//element.getName();\r
                \r
@@ -468,21 +487,21 @@ public class OntologyGenerator extends SchemaConversionBase {
                if (element.getType() != null) {\r
                        types.add(getType(element.getType()));\r
                }\r
-               QName base = getElementBase(element);\r
+               QName base = this.base.getElementBase(element);\r
                if (base != null) {\r
-                       if (base.getNamespaceURI().equals(SCHEMA_NS)) {\r
-                               String l0Type = getL0Type(base);\r
+                       if (base.getNamespaceURI().equals(SchemaConversionBase.SCHEMA_NS)) {\r
+                               String l0Type = this.base.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
+                       } else if (this.base.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
+                       if (this.base.isElementRef(substitution.getLocalPart()))\r
                                types.add(ontRoot+substitution.getLocalPart());\r
                        else\r
                                types.add( ontRoot+getComplexTypePrefix()+substitution.getLocalPart());\r
@@ -505,15 +524,15 @@ public class OntologyGenerator extends SchemaConversionBase {
                LocalSimpleType simpleType = element.getSimpleType();\r
                \r
                if (complexType != null) {\r
-                       SchemaObject complexTypeObj = complexTypes.get(complexType);\r
-                       handleElementComplexTypeAttributes(complexTypeObj);\r
-                       handleComplexTypeExtension(complexTypeObj);\r
+                       SchemaObject complexTypeObj = this.base.complexTypes.get(complexType);\r
+                       this.base.handleElementComplexTypeAttributes(complexTypeObj);\r
+                       this.base.handleComplexTypeExtension(complexTypeObj);\r
                } else if (simpleType != null) {\r
-                       SchemaObject simpleTypeObj = simpleTypes.get(simpleType);\r
-                       handleElementSimpleTypeAttributes(simpleTypeObj);\r
+                       SchemaObject simpleTypeObj = this.base.simpleTypes.get(simpleType);\r
+                       this.base.handleElementSimpleTypeAttributes(simpleTypeObj);\r
                }\r
                \r
-               List<IDReference> references = getIDReferences(element);\r
+               List<IDReference> references = this.base.getIDReferences(element);\r
        \r
                for (IDReference ref : references) {\r
                        writer.println(name+"."+ref.getReference().getName()+ " <R XML.hasReference");\r
@@ -523,7 +542,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected String getBaseClass(ObjectType type) {\r
+       public String getBaseClass(ObjectType type) {\r
                if (type == ObjectType.ELEMENT)\r
                        return "XML.Element";\r
                if (type == ObjectType.COMPLEX_TYPE)\r
@@ -531,6 +550,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                throw new RuntimeException("ObjectType " + type + " has no base class");\r
        }\r
        \r
+       @Override\r
        public String getName(SchemaObject obj) {\r
                if (obj.getParent() == null) {\r
                        switch (obj.getType()) {\r
index 2cf2e0c76afd4b3edb400f220902ce96dd910d70..3e6c8818732a102cd5b56601e1847eaeff2963be 100644 (file)
@@ -32,10 +32,12 @@ import org.w3._2001.xmlschema.ComplexType;
 import org.w3._2001.xmlschema.Element;\r
 import org.w3._2001.xmlschema.ExplicitGroup;\r
 import org.w3._2001.xmlschema.ExtensionType;\r
-import org.w3._2001.xmlschema.LocalComplexType;\r
+import org.w3._2001.xmlschema.GroupRef;\r
 import org.w3._2001.xmlschema.LocalElement;\r
 import org.w3._2001.xmlschema.NamedAttributeGroup;\r
+import org.w3._2001.xmlschema.NamedGroup;\r
 import org.w3._2001.xmlschema.OpenAttrs;\r
+import org.w3._2001.xmlschema.RealGroup;\r
 import org.w3._2001.xmlschema.Restriction;\r
 import org.w3._2001.xmlschema.Schema;\r
 import org.w3._2001.xmlschema.SimpleContent;\r
@@ -44,21 +46,34 @@ import org.w3._2001.xmlschema.TopLevelAttribute;
 import org.w3._2001.xmlschema.TopLevelComplexType;\r
 import org.w3._2001.xmlschema.TopLevelElement;\r
 import org.w3._2001.xmlschema.TopLevelSimpleType;\r
+import org.w3._2001.xmlschema.Union;\r
 \r
-public abstract class SchemaConversionBase {\r
+public final class SchemaConversionBase {\r
        \r
        protected Schema schema;\r
+       protected SchemaConverter converter;\r
+       protected SchemaConversionComponent component;\r
        protected Configuration configuration;\r
        \r
-       protected static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";\r
-       protected static final String CONVERSION_NS = "http://www.simantics.org/Layer0";\r
+       public static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";\r
+       public static final String CONVERSION_NS = "http://www.simantics.org/Layer0";\r
        \r
        protected Map<String,Map<String,TypeEntry>> typeMap;\r
        \r
-       public SchemaConversionBase(Configuration configuration) {\r
-               this.configuration = configuration;\r
-               typeMap = new HashMap<String, Map<String,TypeEntry>>();\r
+       protected String ontologyURI;\r
+       protected String className;\r
+       \r
+       public SchemaConversionBase(SchemaConverter converter, String ontologyUri, String className) {\r
+               this.converter = converter;\r
+               this.configuration = converter.getConfiguration();\r
+               this.ontologyURI = ontologyUri;\r
+               this.className = className;\r
                \r
+               initTypes();\r
+       }\r
+       \r
+       protected void initTypes() {\r
+               typeMap = new HashMap<String, Map<String,TypeEntry>>();\r
                Map<String,TypeEntry> schemaTypes = new HashMap<String, SchemaConversionBase.TypeEntry>();\r
                typeMap.put(SCHEMA_NS, schemaTypes);\r
                Map<String,TypeEntry> l0Types = new HashMap<String, SchemaConversionBase.TypeEntry>();\r
@@ -69,6 +84,8 @@ public abstract class SchemaConversionBase {
                schemaTypes.put("token",                new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
                schemaTypes.put("ID",                   new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","","",true));\r
                schemaTypes.put("IDREF",                new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
+               schemaTypes.put("Name",                 new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
+               schemaTypes.put("NCName",               new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
                schemaTypes.put("date",                 new TypeEntry("XML.Date",                       "org.simantics.xml.sax.base.datatypes.literal.Date.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Date", "","org.simantics.xml.sax.base.datatypes.literal.Date.parseDate(",")","(",").toString()"));\r
                schemaTypes.put("time",                 new TypeEntry("XML.Time",                       "org.simantics.xml.sax.base.datatypes.literal.Time.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Time", "","org.simantics.xml.sax.base.datatypes.literal.Time.parseTime(",")","(",").toString()"));\r
                schemaTypes.put("dateTime",             new TypeEntry("XML.DateTime",           "org.simantics.xml.sax.base.datatypes.literal.DateTime.BINDING", "org.simantics.xml.sax.base.datatypes.literal.DateTime", "","org.simantics.xml.sax.base.datatypes.literal.DateTime.parseDateTime(",")","(",").toString()"));\r
@@ -92,13 +109,10 @@ public abstract class SchemaConversionBase {
                schemaTypes.put("unsignedLong", new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")"));\r
                schemaTypes.put("base64Binary", new TypeEntry("L0.ByteArray",           "Bindings.BYTE_ARRAY", "byte[]", "new byte[0]","",".getBytes(org.simantics.databoard.util.binary.UTF8.CHARSET)","new java.lang.String(",", org.simantics.databoard.util.binary.UTF8.CHARSET)"));\r
                \r
-               \r
-               \r
                l0Types.put("doubleArray",              new TypeEntry("L0.DoubleArray",  "Bindings.DOUBLE_ARRAY", "double[]", null,null,null,"java.lang.Double.toString(",")"));\r
                l0Types.put("stringArray",              new TypeEntry("L0.StringArray",  "Bindings.STRING_ARRAY", "string[]", null,null,null,"",""));\r
        }\r
        \r
-       \r
        protected TypeEntry getTypeEntry(QName type) {\r
                Map<String,TypeEntry> types = typeMap.get(type.getNamespaceURI());\r
                if (types == null)\r
@@ -154,10 +168,14 @@ public abstract class SchemaConversionBase {
        }\r
        \r
        \r
-       protected void handle(Schema schema) {  \r
+       public void init(Schema schema) {       \r
                this.schema = schema;\r
-               preload();\r
                \r
+               preload();\r
+       }\r
+       \r
+       public void handle(SchemaConversionComponent component) {\r
+               this.component = component;\r
                for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
                        if (attrs instanceof TopLevelAttribute) {\r
                                handle((TopLevelAttribute)attrs);\r
@@ -170,18 +188,22 @@ public abstract class SchemaConversionBase {
                                handleSimpleType(simpleTypes.get(attrs));\r
                        } else if (attrs instanceof NamedAttributeGroup) {\r
                                handle((NamedAttributeGroup)attrs);\r
+                       } else if (attrs instanceof NamedGroup) {\r
+                               handle((NamedGroup)attrs);\r
                        } else {\r
                                System.out.println(attrs.getClass().getName());\r
                        }\r
                }\r
        }\r
        \r
-       protected Map<String,SchemaObject> elementName = new HashMap<String, SchemaObject>();\r
-       protected Map<String,SchemaObject> complexTypeName = new HashMap<String, SchemaObject>();\r
-       protected Map<String,SchemaObject> simpleTypeName = new HashMap<String, SchemaObject>();\r
-       protected Map<Element,SchemaObject> elements = new HashMap<Element, SchemaObject>();\r
-       protected Map<ComplexType,SchemaObject> complexTypes = new HashMap<ComplexType, SchemaObject>();\r
-       protected Map<SimpleType,SchemaObject> simpleTypes = new HashMap<SimpleType, SchemaObject>();\r
+       protected Map<String,SchemaObject> elementName = new HashMap<>();\r
+       protected Map<String,SchemaObject> complexTypeName = new HashMap<>();\r
+       protected Map<String,SchemaObject> simpleTypeName = new HashMap<>();\r
+       protected Map<String,SchemaObject> modelGroupName = new HashMap<>();\r
+       protected Map<Element,SchemaObject> elements = new HashMap<>();\r
+       protected Map<ComplexType,SchemaObject> complexTypes = new HashMap<>();\r
+       protected Map<SimpleType,SchemaObject> simpleTypes = new HashMap<>();\r
+       protected Map<NamedGroup,SchemaObject> modelGroups = new HashMap<>();\r
        \r
        \r
        protected SchemaObject getWithName(SchemaObject referrer, String name) {\r
@@ -196,6 +218,18 @@ public abstract class SchemaConversionBase {
                return obj;\r
        }\r
        \r
+       protected SchemaObject getWithName(String name) {\r
+               SchemaObject obj = elementName.get(name);\r
+               if (obj == null)\r
+                       obj = complexTypeName.get(name);\r
+               if (obj == null)\r
+                       obj = simpleTypeName.get(name);\r
+               if (obj == null) {\r
+                       throw new RuntimeException("Cannot locate referred type " + name);\r
+               }\r
+               return obj;\r
+       }\r
+       \r
        protected SchemaObject getWithObj(SchemaObject referrer, OpenAttrs attrs) {\r
                SchemaObject obj = null;\r
                if (attrs instanceof Element)\r
@@ -228,12 +262,23 @@ public abstract class SchemaConversionBase {
                                SimpleType simpleType = (SimpleType)attrs;\r
                                SchemaObject obj = new SchemaObject(simpleType);\r
                                stack.push(obj);\r
+                       }  else if (attrs instanceof Attribute) {\r
+                               // Attributes are not cached\r
+                       } else if (attrs instanceof AttributeGroup) {\r
+                               // Attribute groups are not cached\r
+                       } else if (attrs instanceof NamedGroup) {\r
+                               NamedGroup group = (NamedGroup)attrs;\r
+                               SchemaObject obj = new SchemaObject(group);\r
+                               stack.push(obj);\r
+                       } else {\r
+                               System.out.println(attrs.getClass().getName());\r
                        }\r
                }\r
                \r
                while (!stack.isEmpty()) {\r
                        SchemaObject object = stack.pop();\r
-                       if (object.getType() == ObjectType.COMPLEX_TYPE) {\r
+                       switch (object.getType()) {\r
+                       case COMPLEX_TYPE:{\r
                                ComplexType ct = object.getComplexType();\r
                                if (ct.getName() != null && ct.getName().length() > 0 && ct instanceof TopLevelComplexType)\r
                                        complexTypeName.put(ct.getName(), object);\r
@@ -283,7 +328,9 @@ public abstract class SchemaConversionBase {
                                                        throw new RuntimeException("Groups not supported");\r
                                        }\r
                                }\r
-                       } else if (object.getType() == ObjectType.ELEMENT) {\r
+                               break;\r
+                       } \r
+                       case ELEMENT:{\r
                                Element e = object.getElement();\r
                                if (e instanceof TopLevelElement)\r
                                        elementName.put(e.getName(), object);\r
@@ -292,13 +339,23 @@ public abstract class SchemaConversionBase {
                                        stack.push(new SchemaObject(object,e.getComplexType()));\r
                                if (e.getSimpleType() != null)\r
                                        stack.push(new SchemaObject(object,e.getSimpleType()));\r
-                       } else if (object.getType() == ObjectType.SIMPLE_TYPE) {\r
+                               break;\r
+                       } \r
+                       case SIMPLE_TYPE:{\r
                                SimpleType e = object.getSimpleType();\r
                                if (e instanceof TopLevelSimpleType)\r
                                        simpleTypeName.put(e.getName(), object);\r
                                simpleTypes.put(e, object);\r
+                               break;\r
+                       } \r
+                       case MODEL_GROUP:{\r
+                               NamedGroup e = object.getModelGroup();\r
+                               modelGroupName.put(e.getName(), object);\r
+                               modelGroups.put(e, object);\r
+                               break;\r
                        }\r
-               }\r
+                       }\r
+               } // while\r
        }\r
        \r
        private void preload(SchemaObject parent,ExplicitGroup eg, Deque<SchemaObject> stack) {\r
@@ -310,10 +367,10 @@ public abstract class SchemaConversionBase {
                                        SchemaObject obj = new SchemaObject(parent,(Element)elemValue);\r
                                        obj.setRename(getRename((Element)elemValue));\r
                                        stack.add(obj);\r
-                               } else if (elemValue instanceof All) {\r
-                                       preload(parent,(All)elemValue, stack);\r
                                } else if (elemValue instanceof ExplicitGroup) {\r
                                        preload(parent,(ExplicitGroup)elemValue, stack);\r
+                               } else if (elemValue instanceof RealGroup) {\r
+                                       preload(parent,(RealGroup)elemValue, stack);\r
                                } else {\r
                                        throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName());\r
                                }\r
@@ -325,6 +382,15 @@ public abstract class SchemaConversionBase {
                }\r
        }\r
        \r
+       private void preload(SchemaObject parent, RealGroup eg, Deque<SchemaObject> stack) {\r
+               System.out.println(eg); \r
+               if (eg instanceof NamedGroup) {\r
+                       SchemaObject obj = new SchemaObject(parent,(NamedGroup)eg);\r
+                       stack.add(obj);\r
+               }\r
+       }\r
+\r
+       \r
        protected void handle(TopLevelAttribute topLevelAttribute) {\r
                handle(null, topLevelAttribute);\r
        }\r
@@ -337,6 +403,10 @@ public abstract class SchemaConversionBase {
                handle(null, namedAttributeGroup);\r
        }\r
        \r
+       protected void handle(NamedGroup namedAttributeGroup){\r
+               handle(null, namedAttributeGroup);\r
+       }\r
+       \r
        protected QName getComplexTypeBase(ComplexType complexType) {\r
                if (complexType == null)\r
                        return null;\r
@@ -352,9 +422,63 @@ public abstract class SchemaConversionBase {
        }\r
        \r
        protected QName getSimpleTypeBase(SimpleType simpleType) {\r
-               if (simpleType == null)\r
-                       return null;\r
-               return simpleType.getRestriction().getBase();\r
+//             if (simpleType == null)\r
+//                     return null;\r
+//             return simpleType.getRestriction().getBase();\r
+               \r
+               Restriction restriction = simpleType.getRestriction();\r
+               if (restriction != null) {\r
+                       QName base = restriction.getBase();\r
+                       return base;\r
+               } else if (simpleType.getId() != null) {\r
+                       throw new RuntimeException(simpleType.getName() + " restriction error");\r
+               } else if (simpleType.getUnion() != null) {\r
+                       Union union = simpleType.getUnion();\r
+                       if (union.getMemberTypes().size() > 0) {\r
+                               QName base = null;\r
+                               for (QName type : union.getMemberTypes()) {\r
+                                       QName sType = null;\r
+                                       TypeEntry entry = getTypeEntry(type);\r
+                                       if (entry == null) {\r
+                                               SchemaObject obj = simpleTypeName.get(type.getLocalPart());\r
+                                               if (obj == null)\r
+                                                       throw new RuntimeException(simpleType.getName() + " union has unresolved reference " + type.getLocalPart());\r
+                                               sType = getSimpleTypeBase(obj.getSimpleType());\r
+                                       } else {\r
+                                               sType = type;\r
+                                       }\r
+                                       if (base == null)\r
+                                               base = sType;\r
+                                       else if (!base.equals(sType)) {\r
+                                               //FIXME : throw new RuntimeException(simpleType.getName() + " union has incompatible member types");\r
+                                               // fall back to string. \r
+                                               base = new QName(SCHEMA_NS, "string");\r
+                                               \r
+                                       }\r
+                               }\r
+                               return base;\r
+                       } else {\r
+                               if (union.getSimpleType().size() == 0)\r
+                                       throw new RuntimeException(simpleType.getName() + " union error");\r
+                               for (SimpleType s : union.getSimpleType()) {\r
+                                       if (restriction == null)\r
+                                               restriction = s.getRestriction();\r
+                                       else  {\r
+                                               Restriction r = s.getRestriction();\r
+                                               if (!r.getBase().equals(restriction.getBase()))\r
+                                                       throw new RuntimeException(simpleType.getName() + " union has incompatible restriction bases");\r
+                                       }\r
+                               }\r
+                               QName base = restriction.getBase();\r
+                               return base;\r
+                       }\r
+               } else if (simpleType.getList() != null) {\r
+                       // FIXME: callers cannot get the information that we have a list.\r
+                       org.w3._2001.xmlschema.List list = simpleType.getList();\r
+                       return list.getItemType();\r
+               } else {\r
+                       throw new RuntimeException(simpleType.getName() + " restriction error");\r
+               }\r
        }\r
        \r
        protected QName getElementBase(Element element) {\r
@@ -393,7 +517,9 @@ public abstract class SchemaConversionBase {
                }\r
        }\r
        \r
-       protected abstract void handleAttributes(SchemaObject simpleTypeObj);\r
+       protected void handleAttributes(SchemaObject simpleTypeObj) {\r
+               component.handleAttributes(simpleTypeObj);\r
+       }\r
        \r
        protected void handleExtensionAttributes(SchemaObject complexType) {\r
                ComplexContent complexContent = complexType.getComplexType().getComplexContent();\r
@@ -503,22 +629,51 @@ public abstract class SchemaConversionBase {
                return null;\r
        }\r
        \r
-       protected abstract void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes);\r
+       //protected abstract void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes);\r
+       protected void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
+               component.handleAttributeComposition(obj, composition, attributes);\r
+       }\r
        \r
        \r
        \r
        \r
        protected void handleComplexType(SchemaObject complexType) {\r
-               handleComplexTypeAttributes(complexType);\r
-               handleComplexTypeExtension(complexType);\r
-               handleExtensionAttributes(complexType);\r
+//             handleComplexTypeAttributes(complexType);\r
+//             handleComplexTypeExtension(complexType);\r
+//             handleExtensionAttributes(complexType);\r
+               component.handleComplexType(complexType);\r
+       }\r
+       \r
+       protected void handleElement(SchemaObject topLevelElement) {\r
+//             LocalComplexType complexType = topLevelElement.getElement().getComplexType();\r
+//             \r
+//             if (complexType != null) {\r
+//                     SchemaObject complextTypeObj = complexTypes.get(complexType);\r
+//                     handleElementComplexTypeAttributes(complextTypeObj);\r
+//                     handleComplexTypeExtension(complextTypeObj);\r
+//             }       \r
+               component.handleElement(topLevelElement);\r
        }\r
        \r
        protected enum RefType{Element,Reference,Type};\r
        \r
-       protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType);\r
-       protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any);\r
-       protected abstract void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements);\r
+       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) {\r
+               component.handleIndicator(parent, indicator, element, refName, refType);\r
+       }\r
+       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {\r
+               component.handleIndicator(parent, indicator, any);\r
+       }\r
+       protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
+               //component.handle(parent, indicator, 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
+                       component.handleChoice(parent, indicator, elements, name);\r
+               }\r
+       }\r
        \r
        protected void handle(SchemaObject parent, ExplicitGroup eg, SchemaElement.ElementType indicator) {\r
                handle(parent, new SchemaElement(eg, indicator));\r
@@ -532,6 +687,7 @@ public abstract class SchemaConversionBase {
                List<SchemaElement> sequences = new ArrayList<SchemaElement>();\r
                List<SchemaElement> alls = new ArrayList<SchemaElement>();\r
                List<SchemaElement> anys = new ArrayList<SchemaElement>();\r
+               List<SchemaElement> groups = new ArrayList<SchemaElement>();\r
                \r
                for (Object o : indicator.getGroup().getParticle()) {\r
                        if (o instanceof JAXBElement<?>) {\r
@@ -549,6 +705,14 @@ public abstract class SchemaConversionBase {
                                        } else if ("sequence".equals(qname.getLocalPart())) {\r
                                                sequences.add(new SchemaElement(indicator,(ExplicitGroup)elemValue, ElementType.SEQUENCE));\r
                                        }\r
+                               } else if (elemValue instanceof RealGroup) {\r
+                                       if (elemValue instanceof GroupRef) {\r
+                                               groups.add(new SchemaElement(indicator,(GroupRef)elemValue, ElementType.GROUP_REF));\r
+                                       } else if (elemValue instanceof NamedGroup) {\r
+                                               groups.add(new SchemaElement(indicator,(NamedGroup)elemValue, ElementType.NAMED_GROUP));\r
+                                       } else {\r
+                                               throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName());\r
+                                       }\r
                                } else {\r
                                        throw new RuntimeException("Unknown ExplicitGroup element " + elemValue.getClass().getName());\r
                                }\r
@@ -559,7 +723,7 @@ public abstract class SchemaConversionBase {
                        }\r
                }\r
                \r
-               if (elements.size() == 0 && choices.size() == 0 && sequences.size() == 0 && alls.size() == 0 && anys.size() == 0) {\r
+               if (elements.size() == 0 && choices.size() == 0 && sequences.size() == 0 && alls.size() == 0 && anys.size() == 0 && groups.size() == 0) {\r
                        return;\r
                }\r
                \r
@@ -576,6 +740,10 @@ public abstract class SchemaConversionBase {
                                        for (SchemaElement c : alls) {\r
                                                handle(parent, c);\r
                                        }\r
+                                       \r
+                                       for (SchemaElement c : groups) {\r
+                                               handle(parent, c);\r
+                                       }\r
                                        handle(parent, indicator, elements);\r
                                        for (SchemaElement a : anys) {\r
                                                handleIndicator(parent, indicator, a);\r
@@ -590,9 +758,12 @@ public abstract class SchemaConversionBase {
                                        for (SchemaElement a : anys) {\r
                                                handleIndicator(parent, indicator, a);\r
                                        }\r
+                                       for (SchemaElement c : groups) {\r
+                                               handle(parent, c);\r
+                                       }\r
                                }\r
                        } else {\r
-                               if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0) {\r
+                               if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0 || groups.size() > 0) {\r
                                        throw new RuntimeException("Cannot handle Sequence with inner ExplicitGroups");\r
                                }\r
                                handle(parent, indicator, elements);\r
@@ -603,13 +774,13 @@ public abstract class SchemaConversionBase {
                \r
                } else if (indicator.getType() == SchemaElement.ElementType.CHOICE){\r
                        if (indicator.getRestriction().single()) {\r
-                               if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0) {\r
+                               if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0 || groups.size() > 0) {\r
                                        throw new RuntimeException("Cannot handle Choice that contains something else than Elements");\r
                                }\r
                                handle(parent, indicator, elements);\r
                                \r
                        } else {\r
-                               if (sequences.size() > 0 || choices.size() > 0) {\r
+                               if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0 || groups.size() > 0) {\r
                                        throw new RuntimeException("Cannot handle Choice with inner ExplicitGroups");\r
                                }\r
                                handle(parent, indicator,  elements);\r
@@ -618,7 +789,7 @@ public abstract class SchemaConversionBase {
                                }\r
                        }\r
                } else if (indicator.getType() == ElementType.ALL) {\r
-                       if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0) {\r
+                       if (sequences.size()> 0 || choices.size() > 0 || alls.size() > 0 || anys.size() > 0  || groups.size() > 0) {\r
                                throw new RuntimeException("Cannot handle All that contains something else than Elements");\r
                        }\r
                        if (!indicator.getRestriction().single()) {\r
@@ -678,12 +849,20 @@ public abstract class SchemaConversionBase {
                }\r
                return name;\r
        }\r
+               \r
+       protected void handle(SchemaObject parent, Attribute attribute) {\r
+               component.handle(parent, attribute);\r
+       }\r
+       protected void handle(SchemaObject parent, AttributeGroup attribute) {\r
+               component.handle(parent, attribute);\r
+       }\r
+       protected void handle(SchemaObject parent, NamedGroup attribute){\r
+               component.handle(parent, attribute);\r
+       };\r
        \r
-       \r
-       protected abstract void handle(SchemaObject parent, Attribute attribute) ;\r
-       protected abstract void handle(SchemaObject parent, AttributeGroup attribute) ;\r
-       \r
-       protected abstract void handleSimpleType(SchemaObject parent, SchemaObject simpleType);\r
+       protected void handleSimpleType(SchemaObject parent, SchemaObject simpleType) {\r
+               component.handleSimpleType(parent, simpleType);\r
+       }\r
        \r
        \r
        \r
@@ -723,32 +902,20 @@ public abstract class SchemaConversionBase {
                }\r
        }\r
        \r
-       protected void handleElement(SchemaObject topLevelElement) {\r
-               LocalComplexType complexType = topLevelElement.getElement().getComplexType();\r
-               \r
-               if (complexType != null) {\r
-                       SchemaObject complextTypeObj = complexTypes.get(complexType);\r
-                       handleElementComplexTypeAttributes(complextTypeObj);\r
-                       handleComplexTypeExtension(complextTypeObj);\r
-               }\r
-               \r
-               \r
-       }\r
-       \r
        \r
-       protected boolean isElementRef(String ref) {\r
+       public boolean isElementRef(String ref) {\r
                return elementName.containsKey(ref);\r
        }\r
        \r
-       protected boolean isComplexTypeRef(String ref) {\r
+       public boolean isComplexTypeRef(String ref) {\r
                return complexTypeName.containsKey(ref);\r
        }\r
        \r
-       protected boolean isSimpleTypeRef(String ref) {\r
+       public boolean isSimpleTypeRef(String ref) {\r
                return simpleTypeName.containsKey(ref);\r
        }\r
        \r
-       protected NamedAttributeGroup getAttributeGroup(String name) {\r
+       public NamedAttributeGroup getAttributeGroup(String name) {\r
                for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
                        if (attrs instanceof NamedAttributeGroup) {\r
                                NamedAttributeGroup group = (NamedAttributeGroup)attrs;\r
@@ -759,7 +926,7 @@ public abstract class SchemaConversionBase {
                return null;\r
        }\r
        \r
-       protected IDProvider getIDProvider(Element element) {\r
+       public IDProvider getIDProvider(Element element) {\r
                List<IDProvider> idProviders = new ArrayList<IDProvider>(2);\r
                for (JAXBElement<?> e : configuration.getConversionRule()) {\r
                        if (e.getValue() instanceof IDProvider) {\r
@@ -779,7 +946,7 @@ public abstract class SchemaConversionBase {
                return idProviders.get(0);\r
        }\r
        \r
-       protected IDProvider getIDProvider(ComplexType complexType) {\r
+       public IDProvider getIDProvider(ComplexType complexType) {\r
                List<IDProvider> idProviders = new ArrayList<IDProvider>(2);\r
                for (JAXBElement<?> e : configuration.getConversionRule()) {\r
                        if (e.getValue() instanceof IDProvider) {\r
@@ -799,7 +966,7 @@ public abstract class SchemaConversionBase {
                return idProviders.get(0);\r
        }\r
        \r
-       protected List<IDReference> getIDReferences(Element element) {\r
+       public List<IDReference> getIDReferences(Element element) {\r
                List<IDReference> idReferences = new ArrayList<IDReference>(2);\r
                for (JAXBElement<?> e : configuration.getConversionRule()) {\r
                        if (e.getValue() instanceof IDReference) {\r
@@ -814,7 +981,7 @@ public abstract class SchemaConversionBase {
                return idReferences;\r
        }\r
        \r
-       protected List<IDReference> getIDReferences(ComplexType complexType) {\r
+       public List<IDReference> getIDReferences(ComplexType complexType) {\r
                List<IDReference> idReferences = new ArrayList<IDReference>(2);\r
                for (JAXBElement<?> e : configuration.getConversionRule()) {\r
                        if (e.getValue() instanceof IDReference) {\r
@@ -1070,17 +1237,22 @@ public abstract class SchemaConversionBase {
                }\r
        }\r
        \r
-       public abstract String getComplexTypePrefix();  \r
-       \r
-       public abstract String getAttributeGroupPrefix();\r
-       \r
-       public abstract String getName(SchemaObject obj);\r
-       \r
-       protected abstract String getBaseClass(ObjectType type);\r
+       public String getComplexTypePrefix() {\r
+               return component.getComplexTypePrefix();\r
+       }\r
+       public String getAttributeGroupPrefix() {\r
+               return component.getAttributeGroupPrefix();\r
+       }\r
+       public String getName(SchemaObject obj) {\r
+               return component.getName(obj);\r
+       }\r
+       public String getBaseClass(ObjectType type) {\r
+               return component.getBaseClass(type);\r
+       }\r
        \r
        \r
        \r
-       protected Inheritance getInheritance(SchemaObject topLevelObj) {\r
+       public Inheritance getInheritance(SchemaObject topLevelObj) {\r
                Inheritance inheritance = null;\r
                if (topLevelObj.getType() == ObjectType.ELEMENT) {\r
                        Element topLevelElement = topLevelObj.getElement();\r
@@ -1151,7 +1323,7 @@ public abstract class SchemaConversionBase {
                                ExtensionType extensionType = simpleContent.getExtension();\r
                                if (extensionType != null) {\r
                                        type = extensionType.getBase();\r
-                                       getAtomicTypeInheritance(type, topLevelObj, inheritance);\r
+                                       getAtomicTypeInheritance(type, inheritance);\r
                                }\r
                        }\r
                }\r
@@ -1164,14 +1336,14 @@ public abstract class SchemaConversionBase {
         * @param topLevelObj\r
         * @param inheritance\r
         */\r
-       protected void getAtomicTypeInheritance(QName type, SchemaObject topLevelObj, Inheritance inheritance) {\r
+       public void getAtomicTypeInheritance(QName type, Inheritance inheritance) {\r
                if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
-                       SchemaObject obj = getWithName(topLevelObj, type.getLocalPart());\r
+                       SchemaObject obj = getWithName(type.getLocalPart());\r
                        if (obj.getType() != ObjectType.SIMPLE_TYPE)\r
                                throw new RuntimeException("SimpleContent does not use SimpleType definition");\r
                        SimpleType simpleType = obj.getSimpleType();\r
                        type = getSimpleTypeBase(simpleType);\r
-                       getAtomicTypeInheritance(type, topLevelObj, inheritance);\r
+                       getAtomicTypeInheritance(type, inheritance);\r
                } else {\r
                        TypeEntry entry = getTypeEntry(type);\r
                        if (entry != null) {\r
@@ -1180,5 +1352,15 @@ public abstract class SchemaConversionBase {
                        }\r
                }\r
        }\r
+       \r
+       public String getDefaultValue(QName atype) {\r
+               Map<String,TypeEntry> types = typeMap.get(atype.getNamespaceURI());\r
+               if (types == null)\r
+                       return null;\r
+               TypeEntry entry =  types.get(atype.getLocalPart());\r
+               if (entry == null)\r
+                       return null;\r
+               return entry.defaultValue;\r
+       }\r
 \r
 }\r
diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionComponent.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionComponent.java
new file mode 100644 (file)
index 0000000..89d8e86
--- /dev/null
@@ -0,0 +1,34 @@
+package org.simantics.xml.sax;\r
+\r
+import java.util.List;\r
+\r
+import org.simantics.utils.datastructures.BijectionMap;\r
+import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
+import org.simantics.xml.sax.SchemaObject.ObjectType;\r
+import org.simantics.xml.sax.configuration.AttributeComposition;\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.NamedGroup;\r
+\r
+\r
+public interface SchemaConversionComponent {\r
+\r
+               \r
+       void handleAttributes(SchemaObject simpleTypeObj);\r
+       void handleAttributeComposition(SchemaObject obj, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes);\r
+       void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType);\r
+       void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any);\r
+       //void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements);\r
+       void handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name);\r
+       void handle(SchemaObject parent, Attribute attribute) ;\r
+       void handle(SchemaObject parent, AttributeGroup attribute) ;\r
+       void handle(SchemaObject parent, NamedGroup attribute);\r
+       void handleSimpleType(SchemaObject parent, SchemaObject simpleType);\r
+       void handleComplexType(SchemaObject complexTypeObj);\r
+       void handleElement(SchemaObject complexTypeObj);\r
+       String getComplexTypePrefix();  \r
+       String getAttributeGroupPrefix();\r
+       String getName(SchemaObject obj);\r
+       String getBaseClass(ObjectType type);\r
+}\r
index 3b2c1a0c42749b6bddf5babe3525924696bfb844..c7167545d31b96b58077f0e097c5a8d3d285443c 100644 (file)
@@ -2,9 +2,14 @@ package org.simantics.xml.sax;
 \r
 import java.io.File;\r
 import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
+import java.util.ArrayList;\r
 import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
 \r
 import javax.xml.bind.JAXBContext;\r
 import javax.xml.bind.JAXBElement;\r
@@ -12,6 +17,10 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;\r
 \r
 import org.simantics.xml.sax.configuration.Configuration;\r
+import org.w3._2001.xmlschema.Annotation;\r
+import org.w3._2001.xmlschema.Import;\r
+import org.w3._2001.xmlschema.Include;\r
+import org.w3._2001.xmlschema.OpenAttrs;\r
 import org.w3._2001.xmlschema.Schema;\r
 \r
 /**\r
@@ -22,6 +31,7 @@ import org.w3._2001.xmlschema.Schema;
  */\r
 public class SchemaConverter {\r
        \r
+       File outputPlugin;\r
        File schemaFile;\r
        File conversionFile;\r
        File ontologyFile;\r
@@ -37,10 +47,29 @@ public class SchemaConverter {
        boolean createImporter = true;\r
        boolean createExporter = true;\r
        \r
+       private List<SchemaConverter> parent = new ArrayList<>();\r
+       private List<SchemaConverter> subConverters = new ArrayList<>();\r
+       private Map<String,SchemaConverter> nameMap;\r
        \r
+       String ontologyUri;\r
+       String className;\r
+       String name;\r
+       String shortName;\r
        \r
-\r
-       public void convertSchema(File schemaFile, File conversionFile, File outputPlugin) throws JAXBException, IOException {\r
+       SchemaConversionBase base;\r
+       \r
+       private ManualSchemaFileImport fileImport;\r
+       \r
+       public SchemaConverter(File schemaFile, File conversionFile, File outputPlugin) throws IOException {\r
+               this(null,schemaFile,conversionFile,outputPlugin);\r
+       }\r
+       \r
+       public SchemaConverter(SchemaConverter parent,File schemaFile, File conversionFile, File outputPlugin) throws IOException {\r
+               \r
+               this.outputPlugin = outputPlugin;\r
+               this.schemaFile = schemaFile;\r
+               this.conversionFile = conversionFile;\r
+               \r
                pluginName = outputPlugin.getName();\r
                String packageParts[] = pluginName.split("\\.");\r
                String outputLoc = outputPlugin.getAbsolutePath();\r
@@ -51,21 +80,23 @@ public class SchemaConverter {
                outputGraph += "/graph";\r
                outputGraph += "/" + schemaFile.getName().substring(0, schemaFile.getName().length()-4) +".pgraph";\r
                \r
-               this.schemaFile = schemaFile;\r
-               this.conversionFile = conversionFile;\r
+               \r
                this.ontologyFile = new File(outputGraph);\r
                this.parserDir = new File(outputLoc);\r
                \r
-               if (!ontologyFile.exists()) {\r
-                       ontologyFile.getParentFile().mkdirs();\r
-                       ontologyFile.createNewFile();\r
+               if (parent != null) {\r
+                       this.parent.add(parent);\r
+                       parent.subConverters.add(this);\r
+               } else {\r
+                       nameMap = new HashMap<>();\r
                }\r
-               if (!parserDir.exists())\r
-                       parserDir.mkdirs();\r
-               \r
-               convert();\r
-               \r
+               getRoot().nameMap.put(schemaFile.getAbsolutePath(), this);\r
+       }\r
+       \r
+       public void setFileImport(ManualSchemaFileImport fileImport) {\r
+               this.fileImport = fileImport;\r
        }\r
+\r
        \r
        public void setCreateExporter(boolean createExporter) {\r
                this.createExporter = createExporter;\r
@@ -79,7 +110,47 @@ public class SchemaConverter {
                this.createPGraph = createPGraph;\r
        }\r
        \r
-       private void convert() throws JAXBException, IOException {\r
+       protected SchemaConverter createSubConverter(String location) throws JAXBException, IOException {\r
+               File directory = schemaFile.getParentFile();\r
+               File schemaFile = new File(directory.getAbsolutePath()+File.separator+location);\r
+               if (!schemaFile.exists()) {\r
+                       if (getRoot().fileImport != null) {\r
+                               schemaFile = getRoot().fileImport.getFileForLocation(location);\r
+                       }\r
+                       if (!schemaFile.exists())\r
+                               throw new FileNotFoundException(schemaFile.getAbsolutePath());\r
+               }\r
+               SchemaConverter subConverter = getRoot().nameMap.get((schemaFile.getAbsolutePath()));\r
+               if (subConverter == null) {\r
+                       subConverter = new SchemaConverter(this,schemaFile, conversionFile, outputPlugin);\r
+                       subConverter.createPGraph = this.createPGraph;\r
+                       subConverter.createImporter = this.createImporter;\r
+                       subConverter.createExporter = this.createExporter;\r
+               } else {\r
+                       subConverter.parent.add(this);\r
+               }\r
+               return subConverter;\r
+       }\r
+       \r
+       protected SchemaConverter getRoot() {\r
+               SchemaConverter s = this;\r
+               while (s.parent.size() > 0)\r
+                       s = s.parent.get(0);\r
+               return s;\r
+       }\r
+       \r
+       public void convert() throws JAXBException, IOException {\r
+               \r
+               init();\r
+               doConvert();\r
+       }\r
+       \r
+       boolean init = false;\r
+       \r
+       protected void init() throws IOException, JAXBException {\r
+               if (init)\r
+                       return;\r
+               init = true;\r
                JAXBContext jc = JAXBContext.newInstance("org.w3._2001.xmlschema");\r
                Unmarshaller u = jc.createUnmarshaller();\r
                //u.setSchema(schema);\r
@@ -102,7 +173,7 @@ public class SchemaConverter {
                header[3] = "Date " + new Date().toString();\r
                \r
                \r
-               String ontologyUri = schema.getTargetNamespace();\r
+               ontologyUri = schema.getTargetNamespace();\r
                if (ontologyUri == null) {\r
                        ontologyUri = getSchemaFile().getName();\r
                        \r
@@ -112,7 +183,7 @@ public class SchemaConverter {
                } \r
                ontologyUri = ontologyUri.replaceAll(" ", "_");\r
                String parts[] = ontologyUri.split("/");\r
-               String name = parts[parts.length-1];\r
+               name = parts[parts.length-1];\r
                name = name.replaceAll("\\.", "_");\r
                if (!ontologyUri.startsWith("http://"))\r
                        ontologyUri = "http://" + ontologyUri.replaceAll("/", "_");\r
@@ -125,20 +196,56 @@ public class SchemaConverter {
                ontologyUri +="-"+ version;\r
 \r
                \r
-               String className = getPluginName() + "." + name;\r
+               className = getPluginName() + "." + name;\r
+               shortName = name.substring(0, 3).toUpperCase();\r
+               \r
+               \r
+               for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) {\r
+                       if (attrs instanceof Import) {\r
+                               Import imp = (Import)attrs;\r
+                               String location = imp.getSchemaLocation();\r
+                               SchemaConverter sc = createSubConverter(location);\r
+                               sc.init();\r
+                       } else if (attrs instanceof Include) {\r
+                               Include inc = (Include)attrs;\r
+                               String location = inc.getSchemaLocation();\r
+                               SchemaConverter sc = createSubConverter(location);\r
+                               sc.init();\r
+                       } else if (attrs instanceof Annotation) {\r
+                               \r
+                       } else {\r
+                               throw new IOException("Cannot handle schema file " + schemaFile.getName() + ", the schema uses redefine elements.");\r
+                       }\r
+               }\r
+       }\r
+       \r
+       protected void doConvert() throws IOException, JAXBException {\r
+               if (!ontologyFile.exists()) {\r
+                       ontologyFile.getParentFile().mkdirs();\r
+                       ontologyFile.createNewFile();\r
+               }\r
+               if (!parserDir.exists())\r
+                       parserDir.mkdirs();\r
+               \r
+               for (SchemaConverter sc : subConverters)\r
+                       sc.doConvert();\r
+               \r
+               base = new SchemaConversionBase(this,ontologyUri,className);\r
+               base.init(schema);\r
                \r
                if (createPGraph) {\r
-               OntologyGenerator ontologyGenerator = new OntologyGenerator(configuration);\r
-               ontologyGenerator.createOntology(schema, ontologyUri, className, this);\r
+                       OntologyGenerator ontologyGenerator = new OntologyGenerator(this,base);\r
+                       ontologyGenerator.createOntology();\r
                }\r
                if (createImporter) {\r
-               ImporterGenerator importerGenerator = new ImporterGenerator(configuration);\r
-               importerGenerator.createParser(schema, ontologyUri, className, this);\r
+                       ImporterGenerator importerGenerator = new ImporterGenerator(this,base);\r
+                       importerGenerator.createParser();\r
                }\r
                if (createExporter) {\r
-               ExporterGenerator exporterGenerator = new ExporterGenerator(configuration);\r
-               exporterGenerator.createParser(schema, ontologyUri,className, this);\r
+                       ExporterGenerator exporterGenerator = new ExporterGenerator(this,base);\r
+                       exporterGenerator.createParser();\r
                }\r
+               base.component = null;\r
        }\r
        \r
        public File getOntologyFile() {\r
index dc43781e0047a3f4d42efecbc52b7a6a4374ea8c..070c496c3ebc6632fca378a8f4e550b5536be91f 100644 (file)
@@ -6,7 +6,7 @@ import org.w3._2001.xmlschema.Group;
 \r
 public class SchemaElement {\r
 \r
-       public enum ElementType{CHOICE,SEQUENCE,ALL,ANY,ELEMENT}\r
+       public enum ElementType{CHOICE,SEQUENCE,ALL,ANY,ELEMENT,NAMED_GROUP, GROUP_REF}\r
 \r
        private Group gelement;\r
        private Any aelement;\r
index c081b8188443a6d49adf4d38fac17ccf33f41187..4138222913bb100923e0f08748d73a7445cfb55d 100644 (file)
@@ -6,11 +6,12 @@ import org.w3._2001.xmlschema.AttributeGroupRef;
 import org.w3._2001.xmlschema.ComplexType;\r
 import org.w3._2001.xmlschema.Element;\r
 import org.w3._2001.xmlschema.NamedAttributeGroup;\r
+import org.w3._2001.xmlschema.NamedGroup;\r
 import org.w3._2001.xmlschema.OpenAttrs;\r
 import org.w3._2001.xmlschema.SimpleType;\r
 \r
 public class SchemaObject {\r
-       enum ObjectType{ELEMENT,COMPLEX_TYPE,SIMPLE_TYPE,ATTRIBUTE_GROUP};\r
+       enum ObjectType{ELEMENT,COMPLEX_TYPE,SIMPLE_TYPE,ATTRIBUTE_GROUP,MODEL_GROUP};\r
        \r
        private SchemaObject parent;\r
        private ObjectType type;\r
@@ -33,6 +34,10 @@ public class SchemaObject {
                this(null, simpleType);\r
        }\r
        \r
+       public SchemaObject(NamedGroup namedGroup) {\r
+               this(null, namedGroup);\r
+       }\r
+       \r
        public SchemaObject(SchemaObject parent, Element element) {\r
                this.parent = parent;\r
                this.obj = element;\r
@@ -51,6 +56,12 @@ public class SchemaObject {
                this.type = ObjectType.ATTRIBUTE_GROUP;\r
        }\r
        \r
+       public SchemaObject(SchemaObject parent, NamedGroup namedGroup) {\r
+               this.parent = parent;\r
+               this.obj = namedGroup;\r
+               this.type = ObjectType.MODEL_GROUP;\r
+       }\r
+       \r
 \r
        public SchemaObject(SchemaObject parent, SimpleType simpleType) {\r
                this.parent = parent;\r
@@ -82,6 +93,12 @@ public class SchemaObject {
                return (AttributeGroup)obj;\r
        }\r
        \r
+       public NamedGroup getModelGroup() {\r
+               if (type != ObjectType.MODEL_GROUP)\r
+                       return null;\r
+               return (NamedGroup)obj;\r
+       }\r
+       \r
        public SchemaObject getParent() {\r
                return parent;\r
        }\r