]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/ExporterGenerator.java
Attribute namespace + multi-schema data export
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / ExporterGenerator.java
index f538bcb42bae58e026e17978d0a5dd4e89945eff..e3d0add91c321085af4fa1ef8836e69331c09208 100644 (file)
@@ -40,10 +40,9 @@ public class ExporterGenerator extends JavaGenerator{
 
        public void createParser() throws IOException {
                
-               String parserPackagePostfix = "_exp";
+
                String importerClassPostfix = "Exporter";
                String parserClassPostfix = "Writer";
-               elementPackageName = name+parserPackagePostfix;
                
                importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
                if (!importParserDir.exists())
@@ -65,7 +64,7 @@ public class ExporterGenerator extends JavaGenerator{
                mainWriter.println();
                mainWriter.println("   public " + name + importerClassPostfix+"(Session session, File file, Resource root) throws DatabaseException {");
                mainWriter.println("      super(session, file, root);");
-               mainWriter.println("      setXmlWriter(new "+name + parserClassPostfix+"(session));");
+               mainWriter.println("      setXmlWriter(new "+name + parserClassPostfix+"(session).resolveDependencies(session));");
                mainWriter.println("   }");
                mainWriter.println();
                mainWriter.println("}");
@@ -101,6 +100,39 @@ public class ExporterGenerator extends JavaGenerator{
                mainWriter.println("        }");
                mainWriter.println("      });");
                mainWriter.println("   }");
+               
+               mainWriter.println();
+               if (converter.getSubConverters().size() > 0) {
+               mainWriter.println("   public void addDependencies(org.simantics.db.Session session, java.util.Map<String,XMLWriter> map) throws DatabaseException {");
+               for (SchemaConverter sc : converter.getSubConverters()) {
+               String s = sc.className;
+               if (s.endsWith("Ontology"))
+                       s = s.substring(0,s.length()-"Ontology".length());
+               s +="Writer";
+               mainWriter.println("      {");
+               mainWriter.println("         XMLWriter parser = new "+s+"(session);");
+               mainWriter.println("         if (!map.containsKey(parser.getSchemaURI())) {");
+               mainWriter.println("            map.put(parser.getSchemaURI(), parser);");
+               mainWriter.println("            parser.addDependencies(session,map);");
+               mainWriter.println("         } else {");
+               mainWriter.println("            parser = map.get(parser.getSchemaURI());");
+               mainWriter.println("         }");
+               mainWriter.println("         add(parser);");
+               mainWriter.println("      }");
+               }
+               mainWriter.println("   }");
+               
+               mainWriter.println("   public XMLWriter resolveDependencies(org.simantics.db.Session session) throws DatabaseException {");
+               mainWriter.println("      super.resolveDependencies(session);");
+               for (SchemaConverter sc : converter.getSubConverters()) {
+               String s = sc.schemaNs;
+               mainWriter.println("      if (!nsPrefixes.containsKey(\""+s+"\")) {");
+               mainWriter.println("         nsPrefixes.put(\""+s+"\", \"ns\"+nsPrefixes.size());");
+               mainWriter.println("      }");
+               }
+               mainWriter.println("      return this;");
+               mainWriter.println("   }");
+               }
                mainWriter.println("}");
                
                mainWriter.println();
@@ -108,6 +140,11 @@ public class ExporterGenerator extends JavaGenerator{
                mainWriter.close();
        }
        
+       @Override
+       protected String getPackagePostFix() {
+               return "_exp";
+       }
+       
 //     @Override
 //     protected void handle(TopLevelAttribute topLevelAttribute) {
 //
@@ -276,8 +313,6 @@ public class ExporterGenerator extends JavaGenerator{
        protected void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName,
                        String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
                FileWriter fw = getWriter(parent);
-               if ("TextOrField".equals(refName))
-                       System.out.println();
                if (referenceType == RefType.Type) {
                // create internal class for handling the element and child attachment
                secondaryClassName = getName(parent) +"_" +objectName;
@@ -426,20 +461,23 @@ public class ExporterGenerator extends JavaGenerator{
                
                String relationName;
                String attrName;
+               String ns = null;
                if (name != null) {
                        attrName = name;
-                       relationName = ontShort+"has"+name;
+                       relationName = ontShort+"has"+base.getName(attribute);
                        if (parent != null)
-                               relationName = ontShort+getName(parent)+"_has"+name;
+                               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 = base.getRefAttribute(ref);
                        if (referred != null) {
                                primitiveType = referred.getType();
                                simpleType = referred.getSimpleType();
+                               if (ref.getNamespaceURI() != null && !ref.getNamespaceURI().equals(this.converter.schemaNs))
+                                       ns = ref.getNamespaceURI();
                        }
                        
                } else {
@@ -456,7 +494,10 @@ public class ExporterGenerator extends JavaGenerator{
                        TypeEntry binding = base.getTypeEntry(primitiveType);
                        
                        if (binding != null) {
-                               writeAttribute(fw, attrName, relationName, binding, isReference);
+                               if (ns != null)
+                                       writeAttribute(fw, ns, attrName, relationName, binding, isReference);
+                               else                                    
+                                       writeAttribute(fw, attrName, relationName, binding, isReference);
                                return;
                    } else {
                        if (simpleType == null) {
@@ -466,6 +507,7 @@ public class ExporterGenerator extends JavaGenerator{
                        }       
                    }
                } 
+               
                if (simpleType != null) {
                        org.w3._2001.xmlschema.List list = simpleType.getList();
                        if (list != null) {
@@ -480,7 +522,10 @@ public class ExporterGenerator extends JavaGenerator{
                                
                                //String binding = getBindingFromPrimitiveType(base);
                                TypeEntry binding = this.base.getTypeEntry(base);
-                               writeAttribute(fw, attrName, relationName, binding, isReference);
+                               if (base.getNamespaceURI() != null)
+                                       writeAttribute(fw, base.getNamespaceURI(), attrName, relationName, binding, isReference);
+                               else
+                                       writeAttribute(fw, attrName, relationName, binding, isReference);
                        }
                } else {
                        // TODO : using default String attribute should be configured with rules.
@@ -502,6 +547,17 @@ public class ExporterGenerator extends JavaGenerator{
                fw.writer.println("      }");
        }
        
+       private void writeAttribute(FileWriter fw, String ns,  String attrName, String relationName, TypeEntry binding, boolean isReference) {
+               fw.writer.println("      {");
+               fw.writer.println("         if (attribute.getPredicate().equals("+relationName+")) {"); 
+               fw.writer.println("            writer.writeAttribute(\""+ns+"\",\""+attrName+"\", " + binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
+       //      fw.writer.println("            graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
+       //      if (isReference)
+       //      fw.writer.println("            idProviderValue = a.getValue();");       
+               fw.writer.println("         }");
+               fw.writer.println("      }");
+       }
+       
        @Override
        public void handleAttributes(SchemaObject simpleTypeObj) {
                SchemaObject parent = simpleTypeObj.getParent();
@@ -530,7 +586,7 @@ public class ExporterGenerator 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);