]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java
Attribute namespace + multi-schema data export
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / ImporterGenerator.java
index f1076b80bda639560696b04eff3a3db08c896466..9270c8f38db9f7d961e420692ca4379b0b831972 100644 (file)
@@ -39,10 +39,9 @@ public class ImporterGenerator extends JavaGenerator{
        
        public void createParser() throws IOException {
                
-               String parserPackagePostfix = "_elem";
                String importerClassPostfix = "Importer";
                String parserClassPostfix = "Parser";
-               elementPackageName = name+parserPackagePostfix;
+               
                
                importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
                if (!importParserDir.exists())
@@ -61,7 +60,7 @@ public class ImporterGenerator extends JavaGenerator{
                mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");
                mainWriter.println();
                mainWriter.println("   public " + name + importerClassPostfix+"(Session session, File file)  {");
-               mainWriter.println("      super(session, file, new "+name + parserClassPostfix+"());");
+               mainWriter.println("      super(session, file, new "+name + parserClassPostfix+"().resolveDependencies());");
                mainWriter.println("   }");
                mainWriter.println();
                mainWriter.println("}");
@@ -85,7 +84,29 @@ public class ImporterGenerator extends JavaGenerator{
                for (String s : ruleClassNames) {
                mainWriter.println("      add(new "+s+"());");
                }
+               mainWriter.println();
+               mainWriter.println("   }");
+               mainWriter.println();
+               if (converter.getSubConverters().size() > 0) {
+               mainWriter.println("   public void addDependencies(java.util.Map<String,XMLParser> map) {");
+               for (SchemaConverter sc : converter.getSubConverters()) {
+               String s = sc.className;
+               if (s.endsWith("Ontology"))
+                       s = s.substring(0,s.length()-"Ontology".length());
+               s +="Parser";
+               mainWriter.println("      {");
+               mainWriter.println("         XMLParser parser = new "+s+"();");
+               mainWriter.println("         if (!map.containsKey(parser.getSchemaURI())) {");
+               mainWriter.println("            map.put(parser.getSchemaURI(), parser);");
+               mainWriter.println("            parser.addDependencies(map);");
+               mainWriter.println("         } else {");
+               mainWriter.println("            parser = map.get(parser.getSchemaURI());");
+               mainWriter.println("         }");
+               mainWriter.println("         add(parser);");
+               mainWriter.println("      }");
+               }
                mainWriter.println("   }");
+               }
                mainWriter.println("}");
                
                mainWriter.println();
@@ -93,6 +114,11 @@ public class ImporterGenerator extends JavaGenerator{
                mainWriter.close();
        }
        
+       @Override
+       protected String getPackagePostFix() {
+               return "_elem";
+       }
+       
        @Override
        public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
        }
@@ -199,10 +225,11 @@ public class ImporterGenerator extends JavaGenerator{
                fw.writer.println("   @Override");
                fw.writer.println("   public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
                if (inheritance.type == InheritanceType.ComplexType) {
-               fw.writer.println("             super.configure(graph,parents,element);");
+               fw.writer.println("      super.configure(graph,parents,element);");
                }
-               fw.writer.println("        "+getOntologyImport());
-               
+               fw.writer.println("      "+getOntologyImport());
+               fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");
+               fw.writer.println("      XMLResource XML = XMLResource.getInstance(graph);");
                this.base.handleComplexTypeAttributes(complexTypeObj);
                this.base.handleExtensionAttributes(complexTypeObj);
                
@@ -230,6 +257,8 @@ public class ImporterGenerator extends JavaGenerator{
        
        @Override
        public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
+//             if (refName == null)
+//                     System.out.println();
                FileWriter fw = getWriter(parent);
                if (referenceType == RefType.Type) {
                // create internal class for handling the element and child attachment
@@ -251,26 +280,28 @@ public class ImporterGenerator extends JavaGenerator{
 
                // element type specific list
                fw.delayedWriter.println("            {");
-               fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);");
-               fw.delayedWriter.println("               if (list == null) {");
-               fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);");
-               fw.delayedWriter.println("               } else {");
-               fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("               }");
+               fw.delayedWriter.println("               element.registerListChild("+ontShort+getName(parent)+"_has"+refName + "_List, child);");
+//             fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
+//             fw.delayedWriter.println("               if (list == null) {");
+//             fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
+//             fw.delayedWriter.println("               } else {");
+//             fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("               }");
                fw.delayedWriter.println("            }");
                }
                if (useOriginalList) {
                // generic list
                fw.delayedWriter.println("            {");
                fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");
-               fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
-               fw.delayedWriter.println("               if (list == null) {");
-               fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");
-               fw.delayedWriter.println("               } else {");
-               fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("               }");
+               fw.delayedWriter.println("               element.registerListChild(XML.hasOriginalElementList, child);");
+//             fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
+//             fw.delayedWriter.println("               if (list == null) {");
+//             fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");
+//             fw.delayedWriter.println("               } else {");
+//             fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("               }");
                fw.delayedWriter.println("            }");
                }
                
@@ -279,19 +310,37 @@ public class ImporterGenerator extends JavaGenerator{
        }
        
        @Override
-       protected void createPrimitiveIndicator(SchemaObject parent, String refName, String binding) {
+       protected void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName) {
                FileWriter fw = getWriter(parent);
-               fw.writer.println("        addParser(\""+ refName +"\", "+getName(parent) +"_" +refName+".class);");
+               String className = getName(parent) +"_" +refName;
+               fw.writer.println("        addParser(\"" + refName + "\", " + className  + ".class);");
+               fw.delayedWriter2.println("   public static class " + className + " extends org.simantics.xml.sax.base.ValueElementParser {");
+               fw.delayedWriter2.println("      public "+ className +"(){");
+               fw.delayedWriter2.println("         super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+typeEntry.binding+");");
+               fw.delayedWriter2.println("      }\n");
+               fw.delayedWriter2.println("      @Override");
+               fw.delayedWriter2.println("      public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
+               fw.delayedWriter2.println("         Layer0 L0 = Layer0.getInstance(graph);");
+
+               SchemaObject simpleType = base.getSimpleType(typeName);
+               String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
+               if (ontologyClassName != null && simpleType != null) 
+                       fw.delayedWriter2.println("         graph.claim(element.getData(), L0.InstanceOf, " + ontologyClassName + ".getInstance(graph)." + getName(simpleType, "") + ");");
+               else {
+                       if (typeEntry.l0Type.startsWith("XML"))
+                               fw.delayedWriter2.println("         XMLResource XML = XMLResource.getInstance(graph);");
+                       fw.delayedWriter2.println("         graph.claim(element.getData(), L0.InstanceOf, " + typeEntry.l0Type + ");");
+               }
                
-               fw.delayedWriter2.println("   public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementParser {");
-               fw.delayedWriter2.println("      public "+ getName(parent) +"_" +refName +"(){");
-               fw.delayedWriter2.println("           super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+binding+");");
-               fw.delayedWriter2.println("       }");
+               fw.delayedWriter2.println("         graph.claimValue(element.getData(), " +getValueGetter(typeEntry) + ", " + typeEntry.binding + ");");
+               fw.delayedWriter2.println("      }");
                fw.delayedWriter2.println("   }");
        }
        
        @Override
        protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) {
+//             if (refName == null)
+//                     System.out.println();
                FileWriter fw = getWriter(parent);
                //if (!reference)
                fw.writer.println("        addParser(\""+ refName +"\", "+className+".class);");
@@ -304,26 +353,28 @@ public class ImporterGenerator extends JavaGenerator{
 
                // element type specific list
                fw.delayedWriter.println("            {");
-               fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);");
-               fw.delayedWriter.println("               if (list == null) {");
-               fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);");
-               fw.delayedWriter.println("               } else {");
-               fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("               }");
+               fw.delayedWriter.println("               element.registerListChild(" + ontShort+getName(parent)+"_has"+refName + "_List, child);");
+//             fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
+//             fw.delayedWriter.println("               if (list == null) {");
+//             fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
+//             fw.delayedWriter.println("               } else {");
+//             fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("               }");
                fw.delayedWriter.println("            }");
                }
                if (useOriginalList) {
                // generic list
                fw.delayedWriter.println("            {");
                fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");
-               fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
-               fw.delayedWriter.println("               if (list == null) {");
-               fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");
-               fw.delayedWriter.println("               } else {");
-               fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
-               fw.delayedWriter.println("               }");
+               fw.delayedWriter.println("               element.registerListChild(XML.hasOriginalElementList, child);");
+//             fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
+//             fw.delayedWriter.println("               if (list == null) {");
+//             fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");
+//             fw.delayedWriter.println("               } else {");
+//             fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
+//             fw.delayedWriter.println("               }");
                fw.delayedWriter.println("            }");
                }
                
@@ -349,22 +400,18 @@ public class ImporterGenerator extends JavaGenerator{
        public void handle(SchemaObject parent, Attribute attribute) {
                if (parent == null)
                        return;
-               String name = attribute.getName();
+               String attrName = attribute.getName();
                QName primitiveType = attribute.getType();
                SimpleType simpleType = attribute.getSimpleType();
                QName ref = attribute.getRef();
                
                String relationName;
-               String attrName;
-               if (name != null) {
-                       attrName = name;
-                       relationName = ontShort+"has"+name;
-                       if (parent != null)
-                               relationName = ontShort+getName(parent)+"_has"+name;
+               if (attrName != null) {
+                       relationName = ontShort+getName(parent)+"_has"+base.getName(attribute);
                }
                else if (ref != null && parent != null) {
                        attrName = ref.getLocalPart();
-                       relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();
+                       relationName = ontShort+getName(parent)+"_has"+base.getName(ref);
                        
                        Attribute referred = this.base.getRefAttribute(ref);
                        if (referred != null) {
@@ -386,7 +433,7 @@ public class ImporterGenerator extends JavaGenerator{
                        TypeEntry binding = this.base.getTypeEntry(primitiveType);
                        
                        if (binding != null) {
-                               writeAttribute(fw, attrName, relationName, binding, isReference);
+                               writeAttribute(fw, attrName, relationName, binding, isReference, primitiveType);
                                return;
                    } else {
                        if (simpleType == null) {
@@ -399,8 +446,9 @@ public class ImporterGenerator extends JavaGenerator{
                if (simpleType != null) {
                        org.w3._2001.xmlschema.List list = simpleType.getList();
                        if (list != null) {
-                               TypeEntry binding = this.base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));
-                               writeAttribute(fw, attrName, relationName, binding, isReference);
+                               QName typeName = new QName(SchemaConversionBase.SCHEMA_NS, "string");
+                               TypeEntry binding = this.base.getTypeEntry(typeName);
+                               writeAttribute(fw, attrName, relationName, binding, isReference, typeName);
                        } else {
 //                             Restriction restriction = simpleType.getRestriction();
 //                             if (restriction == null)
@@ -411,22 +459,24 @@ public class ImporterGenerator extends JavaGenerator{
                                
                                //String binding = getBindingFromPrimitiveType(base);
                                TypeEntry binding = this.base.getTypeEntry(base);
-                               writeAttribute(fw, attrName, relationName, binding, isReference);
+                               writeAttribute(fw, attrName, relationName, binding, isReference, base);
                        }
                } else {
                        // TODO : using default String attribute should be configured with rules.
                        //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
                        fw.writer.println("    //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
                        //writeAttribute(fw, attrName, relationName, "STRING", isReference);
-                       writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference);
+                       writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference, new QName(SchemaConversionBase.SCHEMA_NS, "string"));
                }
        }
        
-       private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {
+       private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference, QName typeName) {
+               String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
+               String ontologyType = ontologyClassName != null ? ontologyClassName + ".getInstance(graph)." + getName(base.getSimpleType(typeName)) : binding.l0Type; 
                fw.writer.println("      {");
                fw.writer.println("         Attribute a = element.getAttribute(\"" +attrName+"\");");
                fw.writer.println("         if (a != null) {");
-               fw.writer.println("            graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
+               fw.writer.println("            graph.claimLiteral(element.getData(), " + relationName + ", " + ontologyType + ", " + getValueGetterMethod(binding,"a") + ", " + binding.binding + ");");
                if (isReference)
                fw.writer.println("            idProviderValue = a.getValue();");       
                fw.writer.println("         }");
@@ -461,7 +511,7 @@ public class ImporterGenerator extends JavaGenerator{
                        FileWriter fw = getWriter(parent);
                        NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
                        fw.writer.println(commentTag+"    AttributeGroup " + group.getName());
-                       SchemaObject obj = new SchemaObject(parent,attribute);
+                       SchemaObject obj = new SchemaObject(base,parent,attribute);
                        for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
                                if (annotated instanceof Attribute) {
                                        //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
@@ -472,8 +522,6 @@ public class ImporterGenerator extends JavaGenerator{
                                }
                        }
                        //dd
-                       if(true)
-                               System.out.println();
                        fw.writer.println(commentTag+"    End of AttributeGroup " + group.getName());
                }
                
@@ -526,12 +574,7 @@ public class ImporterGenerator extends JavaGenerator{
                
        }
        
-       
-       
-       
-       
-
-       
+               
        IDProvider provider;
        @Override
        public void handleElement(SchemaObject elementObj)  {
@@ -589,9 +632,11 @@ public class ImporterGenerator extends JavaGenerator{
                fw.writer.println("   @Override");
                fw.writer.println("   public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
                if (inheritance.type == InheritanceType.ComplexType) {
-               fw.writer.println("             super.configure(graph,parents,element);");
+               fw.writer.println("      super.configure(graph,parents,element);");
                }
-               fw.writer.println("        "+getOntologyImport());
+               fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");
+               fw.writer.println("      XMLResource XML = XMLResource.getInstance(graph);");
+               fw.writer.println("      "+getOntologyImport());
                
                LocalComplexType complexType = element.getComplexType();
                LocalSimpleType simpleType = element.getSimpleType();