]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConverter.java
Schema parsing can access data from other schemas (work in progress)
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / SchemaConverter.java
index c7167545d31b96b58077f0e097c5a8d3d285443c..ed11c14cd7ad762f9cb4ffc81b49db92ad1387ef 100644 (file)
@@ -16,6 +16,7 @@ import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;\r
 import javax.xml.bind.Unmarshaller;\r
 \r
+import org.simantics.utils.datastructures.MapList;\r
 import org.simantics.xml.sax.configuration.Configuration;\r
 import org.w3._2001.xmlschema.Annotation;\r
 import org.w3._2001.xmlschema.Import;\r
@@ -49,8 +50,11 @@ public class SchemaConverter {
        \r
        private List<SchemaConverter> parent = new ArrayList<>();\r
        private List<SchemaConverter> subConverters = new ArrayList<>();\r
-       private Map<String,SchemaConverter> nameMap;\r
+       private Map<String,SchemaConverter> fileMap;\r
+       private MapList<String,SchemaConverter> schemaNSMap;\r
+       private MapList<String,SchemaConverter> shortNameMap;\r
        \r
+       String schemaNs;\r
        String ontologyUri;\r
        String className;\r
        String name;\r
@@ -88,9 +92,15 @@ public class SchemaConverter {
                        this.parent.add(parent);\r
                        parent.subConverters.add(this);\r
                } else {\r
-                       nameMap = new HashMap<>();\r
+                       fileMap = new HashMap<>();\r
+                       schemaNSMap = new MapList<>();\r
+                       shortNameMap = new MapList<>();\r
                }\r
-               getRoot().nameMap.put(schemaFile.getAbsolutePath(), this);\r
+               getRoot().fileMap.put(schemaFile.getAbsolutePath(), this);\r
+       }\r
+       \r
+       public List<SchemaConverter> getConverter(String schemaNS) {\r
+               return getRoot().schemaNSMap.getValues(schemaNS);\r
        }\r
        \r
        public void setFileImport(ManualSchemaFileImport fileImport) {\r
@@ -120,7 +130,7 @@ public class SchemaConverter {
                        if (!schemaFile.exists())\r
                                throw new FileNotFoundException(schemaFile.getAbsolutePath());\r
                }\r
-               SchemaConverter subConverter = getRoot().nameMap.get((schemaFile.getAbsolutePath()));\r
+               SchemaConverter subConverter = getRoot().fileMap.get((schemaFile.getAbsolutePath()));\r
                if (subConverter == null) {\r
                        subConverter = new SchemaConverter(this,schemaFile, conversionFile, outputPlugin);\r
                        subConverter.createPGraph = this.createPGraph;\r
@@ -147,6 +157,38 @@ public class SchemaConverter {
        \r
        boolean init = false;\r
        \r
+       protected void assignShortName() {\r
+               shortName = name.substring(0, 3).toUpperCase();\r
+               SchemaConverter root = getRoot();\r
+               if (!root.shortNameMap.containsKey(shortName)) {\r
+                       root.shortNameMap.add(shortName, this);\r
+                       return;\r
+               } else {\r
+                       SchemaConverter sc = root.shortNameMap.getValues(shortName).get(0);\r
+                       if (sc.schemaNs.equals(schemaNs)) {\r
+                               root.shortNameMap.add(shortName, this);\r
+                               return;\r
+                       }\r
+               }\r
+               int i = 1;\r
+               while (true) {\r
+                       String n = shortName+i;\r
+                       if (!root.shortNameMap.containsKey(n)) {\r
+                               shortName = n;\r
+                               root.shortNameMap.add(shortName, this);\r
+                               return;\r
+                       } else {\r
+                               SchemaConverter sc = root.shortNameMap.getValues(n).get(0);\r
+                               if (sc.schemaNs.equals(schemaNs)) {\r
+                                       shortName = n;\r
+                                       root.shortNameMap.add(shortName, this);\r
+                                       return;\r
+                               }\r
+                       }\r
+                       i++;\r
+               }\r
+       }\r
+       \r
        protected void init() throws IOException, JAXBException {\r
                if (init)\r
                        return;\r
@@ -172,8 +214,8 @@ public class SchemaConverter {
                header[2] = "File " + schemaFile.getAbsolutePath();\r
                header[3] = "Date " + new Date().toString();\r
                \r
-               \r
-               ontologyUri = schema.getTargetNamespace();\r
+               schemaNs = schema.getTargetNamespace();\r
+               ontologyUri = schemaNs;\r
                if (ontologyUri == null) {\r
                        ontologyUri = getSchemaFile().getName();\r
                        \r
@@ -197,7 +239,9 @@ public class SchemaConverter {
 \r
                \r
                className = getPluginName() + "." + name;\r
-               shortName = name.substring(0, 3).toUpperCase();\r
+               assignShortName();\r
+               if (schemaNs != null)\r
+                       getRoot().schemaNSMap.add(schemaNs, this);\r
                \r
                \r
                for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) {\r