X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=org.simantics.xml.sax%2Fsrc%2Forg%2Fsimantics%2Fxml%2Fsax%2FImporterGenerator.java;h=4245e3e1b4d471cd19e233e757bd0ae977554578;hb=47791aa9453c9d90786bc8ca7de102fb3ee90f3b;hp=eb99b5324ab2eb7e5f786bd011564b359c5b8d7f;hpb=bcfe73ff5f614ff83f20ce7bf5bfc0fa1b045978;p=simantics%2Finterop.git diff --git a/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java b/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java index eb99b53..4245e3e 100644 --- a/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java +++ b/org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java @@ -12,7 +12,6 @@ import java.util.Map; import javax.xml.namespace.QName; import org.simantics.utils.datastructures.BijectionMap; -import org.simantics.utils.datastructures.Pair; import org.simantics.xml.sax.configuration.AttributeComposition; import org.simantics.xml.sax.configuration.Configuration; import org.simantics.xml.sax.configuration.IDProvider; @@ -66,6 +65,7 @@ public class ImporterGenerator extends SchemaConversionBase{ ontShort +="."; String parserPackagePostfix = "_elem"; String importerClassPostfix = "Importer"; + String parserClassPostfix = "Parser"; elementPackageName = name+parserPackagePostfix; importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName); @@ -73,26 +73,47 @@ public class ImporterGenerator extends SchemaConversionBase{ importParserDir.mkdirs(); handle(schema); - - File importParserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java"); - PrintWriter mainWriter = createFile(importParserFile); + // Create Importer class + File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java"); + PrintWriter mainWriter = createFile(importerFile); mainWriter.println("package " + converter.getPluginName() +";"); mainWriter.println(); mainWriter.println("import java.io.File;"); mainWriter.println("import org.simantics.db.Session;"); mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;"); - mainWriter.println("import org.simantics.xml.sax.base.XMLParser;"); mainWriter.println(); mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {"); mainWriter.println(); mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {"); - mainWriter.println(" super(session,file);"); + mainWriter.println(" super(session, file, new "+name + parserClassPostfix+"());"); mainWriter.println(" }"); mainWriter.println(); - mainWriter.println(" @Override"); - mainWriter.println(" public void configure(XMLParser parser) {"); +// mainWriter.println(" @Override"); +// mainWriter.println(" public void configure(XMLParser parser) {"); +// for (String s : ruleClassNames) { +// mainWriter.println(" parser.add(new "+s+"());"); +// } +// mainWriter.println(" }"); + mainWriter.println("}"); + + mainWriter.println(); + mainWriter.flush(); + mainWriter.close(); + + // Create Parser class + File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java"); + mainWriter = createFile(parserFile); + mainWriter.println("package " + converter.getPluginName() +";"); + mainWriter.println(); + mainWriter.println("import org.simantics.xml.sax.base.XMLParser;"); + mainWriter.println(); + mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {"); + mainWriter.println(); + mainWriter.println(" public " + name + parserClassPostfix+"() {"); + if (schema.getTargetNamespace() != null) + mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");"); for (String s : ruleClassNames) { - mainWriter.println(" parser.add(new "+s+"());"); + mainWriter.println(" add(new "+s+"());"); } mainWriter.println(" }"); mainWriter.println("}"); @@ -113,36 +134,51 @@ public class ImporterGenerator extends SchemaConversionBase{ return writer; } - protected String getValueGetter(String binding,String name) { +// protected String getValueGetter(String binding,String name) { +// if (binding == null) +// return name+".getValue()"; +// if ("STRING".equals(binding)) +// return name+".getValue()"; +// if ("BOOLEAN".equals(binding)) +// return "Boolean.parseBoolean("+name+".getValue())"; +// if ("INTEGER".equals(binding)) +// return "Integer.parseInt("+name+".getValue())"; +// if ("DOUBLE".equals(binding)) +// return "Double.parseDouble("+name+".getValue())"; +// if ("FLOAT".equals(binding)) +// return "Float.parseFloat("+name+".getValue())"; +// return name+".getValue()"; +// } +// protected String getValueGetter(String binding) { +// if (binding == null) +// return "value"; +// if ("STRING".equals(binding)) +// return "value"; +// if ("BOOLEAN".equals(binding)) +// return "Boolean.parseBoolean(value)"; +// if ("INTEGER".equals(binding)) +// return "Integer.parseInt(value)"; +// if ("DOUBLE".equals(binding)) +// return "Double.parseDouble(value)"; +// if ("FLOAT".equals(binding)) +// return "Float.parseFloat(value)"; +// return "value"; +// } + protected String getValueGetterMethod(TypeEntry binding,String name) { if (binding == null) return name+".getValue()"; - if ("STRING".equals(binding)) - return name+".getValue()"; - if ("BOOLEAN".equals(binding)) - return "Boolean.parseBoolean("+name+".getValue())"; - if ("INTEGER".equals(binding)) - return "Integer.parseInt("+name+".getValue())"; - if ("DOUBLE".equals(binding)) - return "Double.parseDouble("+name+".getValue())"; - if ("FLOAT".equals(binding)) - return "Float.parseFloat("+name+".getValue())"; - return name+".getValue()"; - } - - protected String getValueGetter(String binding) { + return binding.getValueGetterMethod(name); + } + + protected String getValueGetter(TypeEntry binding,String name) { + if (binding == null) + return name; + return binding.getValueGetter(name); + } + protected String getValueGetter(TypeEntry binding) { if (binding == null) return "value"; - if ("STRING".equals(binding)) - return "value"; - if ("BOOLEAN".equals(binding)) - return "Boolean.parseBoolean(value)"; - if ("INTEGER".equals(binding)) - return "Integer.parseInt(value)"; - if ("DOUBLE".equals(binding)) - return "Double.parseDouble(value)"; - if ("FLOAT".equals(binding)) - return "Float.parseFloat(value)"; - return "value"; + return binding.getValueGetter(); } protected void handle(TopLevelAttribute topLevelAttribute) { @@ -199,7 +235,7 @@ public class ImporterGenerator extends SchemaConversionBase{ intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); createClassHeader(fw.writer, isList); - writeClass(fw.writer,true, null, className, baseClass, intrerfaces); + writeClass(fw.writer,false, null, className, baseClass, intrerfaces); writeIDProvider(fw.writer); @@ -345,7 +381,7 @@ public class ImporterGenerator extends SchemaConversionBase{ if (!className.equals(refClassName)) fw.writer.println(" addParser("+refClassName+".class);"); - fw.delayedWriter.println(" if (child.getParser() instanceof "+refClassName+"){"); + fw.delayedWriter.println(" if (child.getElementParser() instanceof "+refClassName+"){"); fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());"); if (useElementList(parent, indicator,element, reference, ref, refType)) { @@ -363,10 +399,13 @@ public class ImporterGenerator extends SchemaConversionBase{ if (useOriginalList(parent, indicator,element, reference, ref, refType)) { // generic list fw.delayedWriter.println(" {"); - fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);"); + //fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);"); + 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(),"+ontShort+"XML_hasOriginalElementList,list);"); + //fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);"); + 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(" }"); @@ -380,8 +419,8 @@ public class ImporterGenerator extends SchemaConversionBase{ fw.writer.println(" addParser(\""+ ref +"\", "+getName(parent) +"_" +ref+".class);"); fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +ref+" extends org.simantics.xml.sax.base.ValueElementParser {"); - fw.delayedWriter2.println(" "+ getName(parent) +"_" +ref +"(){"); - fw.delayedWriter2.println(" super(\""+ref+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+ref+", Bindings."+binding+");"); + fw.delayedWriter2.println(" public "+ getName(parent) +"_" +ref +"(){"); + fw.delayedWriter2.println(" super(\""+ref+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+ref+", "+binding+");"); fw.delayedWriter2.println(" }"); fw.delayedWriter2.println(" }"); } @@ -409,7 +448,7 @@ public class ImporterGenerator extends SchemaConversionBase{ else fw.writer.println(" addParser("+className+".class);"); - fw.delayedWriter.println(" if (child.getParser() instanceof "+className+"){"); + fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){"); fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());"); if (useElementList(parent, indicator,element, reference, ref, new QName(obj.getName()))) { @@ -427,10 +466,13 @@ public class ImporterGenerator extends SchemaConversionBase{ if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) { // generic list fw.delayedWriter.println(" {"); - fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);"); + //fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);"); + 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(),"+ontShort+"XML_hasOriginalElementList,list);"); + //fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);"); + 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(" }"); @@ -502,7 +544,8 @@ public class ImporterGenerator extends SchemaConversionBase{ FileWriter fw = getWriter(parent); if (primitiveType != null) { - String binding = getBindingFromPrimitiveType(primitiveType); + //String binding = getBindingFromPrimitiveType(primitiveType); + TypeEntry binding = getTypeEntry(primitiveType); if (binding != null) { writeAttribute(fw, attrName, relationName, binding, isReference); @@ -516,25 +559,36 @@ public class ImporterGenerator extends SchemaConversionBase{ } } if (simpleType != null) { - Restriction restriction = simpleType.getRestriction(); - if (restriction == null) - throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset"); - QName base = restriction.getBase(); - - - String binding = getBindingFromPrimitiveType(base); - writeAttribute(fw, attrName, relationName, binding, isReference); + org.w3._2001.xmlschema.List list = simpleType.getList(); + if (list != null) { + TypeEntry binding = getTypeEntry(new QName(SCHEMA_NS, "string")); + writeAttribute(fw, attrName, relationName, binding, isReference); + } else { + Restriction restriction = simpleType.getRestriction(); + if (restriction == null) + throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset"); + QName base = restriction.getBase(); + + + //String binding = getBindingFromPrimitiveType(base); + TypeEntry binding = getTypeEntry(base); + writeAttribute(fw, attrName, relationName, binding, isReference); + } } else { + // TODO : using default String attribute should be configured with rules. //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()); - //writeAttribute(fw, attrName, relationName, binding, isReference); + fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String"); + //writeAttribute(fw, attrName, relationName, "STRING", isReference); + writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference); } } - private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) { + //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) { + private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) { 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+","+getValueGetter(binding,"a")+", Bindings."+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(" }"); @@ -553,10 +607,12 @@ public class ImporterGenerator extends SchemaConversionBase{ QName base = restriction.getBase(); - String binding = getBindingFromPrimitiveType(base); + //String binding = getBindingFromPrimitiveType(base); + TypeEntry binding = getTypeEntry(base); fw.writer.println(" @Override"); fw.writer.println(" public void configure(WriteGraph graph, Element element, java.lang.String value) throws DatabaseException {"); - fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");"); + //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");"); + fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");"); fw.writer.println(" }"); } @@ -614,16 +670,17 @@ public class ImporterGenerator extends SchemaConversionBase{ if (defaultValue == null) defaultValue = getDefaultValue(atype); - String binding = getBindingFromPrimitiveType(atype); + //String binding = getBindingFromPrimitiveType(atype); + TypeEntry binding = getTypeEntry(atype); if (i > 0) fw.writer.print(","); if (defaultValue != null) - fw.writer.print("a"+(i)+"!= null ? "+ getValueGetter(binding,"a"+(i++)) + " : " +defaultValue); + fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue); else - fw.writer.print(getValueGetter(binding,"a"+(i++))); + fw.writer.print(getValueGetterMethod(binding,"a"+(i++))); } fw.writer.println("};"); - fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, Bindings."+arrayBinding+");"); + fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");"); fw.writer.println(" }"); } @@ -663,10 +720,7 @@ public class ImporterGenerator extends SchemaConversionBase{ writers.put(elementObj, fw); boolean isList = false; - Pair inhertiance = getElementInheritance(elementObj); - boolean inherited = inhertiance.second; - String baseClass = inhertiance.first;//"org.simantics.xml.sax.base.XMLElementParserBase"; - + Inheritance inhertiance = getElementInheritance(elementObj); provider = getIDProvider(element); List references = getIDReferences(element); @@ -679,7 +733,7 @@ public class ImporterGenerator extends SchemaConversionBase{ intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser"); createClassHeader(fw.writer, isList); - writeClass(fw.writer,false, element.getName(), className, baseClass, intrerfaces); + writeClass(fw.writer,false, element.getName(), className, inhertiance.baseClass, intrerfaces); writeIDProvider(fw.writer); fw.writer.println(" @Override"); fw.writer.println(" public Resource create(WriteGraph graph, Element element) throws DatabaseException{"); @@ -705,7 +759,7 @@ public class ImporterGenerator extends SchemaConversionBase{ fw.writer.println(" @Override"); fw.writer.println(" public void configure(WriteGraph graph, Deque parents, Element element) throws DatabaseException {"); - if (inherited) { + if (inhertiance.type == InheritanceType.ComplexType) { fw.writer.println(" super.configure(graph,parents,element);"); } fw.writer.println(" "+getOntologyImport()); @@ -719,6 +773,13 @@ public class ImporterGenerator extends SchemaConversionBase{ } fw.writer.println(" }"); + if (inhertiance.type == InheritanceType.AtomicType) { + fw.writer.println(); + fw.writer.println(" @Override"); + fw.writer.println(" public void configure(WriteGraph graph, Element element, java.lang.String string) throws DatabaseException {"); + fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inhertiance.atomicType,"string")+", "+inhertiance.atomicType.binding+");"); + fw.writer.println(" }"); + } if (simpleType != null) { SchemaObject obj = simpleTypes.get(simpleType); handleElementSimpleTypeAttributes(obj); @@ -749,7 +810,7 @@ public class ImporterGenerator extends SchemaConversionBase{ if (stringWriter.getBuffer().length() > 0) { fw.writer.write(stringWriter.toString()); } - if (inherited) { + if (inhertiance.type == InheritanceType.ComplexType) { fw.writer.println(" return super.connectChild(graph,element,child);"); } else { fw.writer.println(" return false;"); @@ -782,40 +843,74 @@ public class ImporterGenerator extends SchemaConversionBase{ ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name); } - private Pair getElementInheritance(SchemaObject topLevelElementObj) { + private enum InheritanceType{ComplexType,AtomicType,None}; + + private class Inheritance { + public String baseClass; + public InheritanceType type; + public TypeEntry atomicType; + + public Inheritance() { + baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase"; + type = InheritanceType.None; + } + } + + private Inheritance getElementInheritance(SchemaObject topLevelElementObj) { Element topLevelElement = topLevelElementObj.getElement(); - String baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase"; - boolean inherited = false; + Inheritance inheritance = new Inheritance(); if (topLevelElement.getType() != null) { QName type = topLevelElement.getType(); if (!type.getNamespaceURI().equals(SCHEMA_NS)) { SchemaObject obj = complexTypeName.get(type.getLocalPart()); - baseClass = getName(obj); - inherited = true; - } +// if (obj == null) +// obj = simpleTypeName.get(type.getLocalPart()); + if (obj != null) { + inheritance.baseClass = getName(obj); + inheritance.type = InheritanceType.ComplexType; + } + } else { + TypeEntry entry = getTypeEntry(type); + if (entry != null) { + inheritance.type = InheritanceType.AtomicType; + inheritance.atomicType = entry; + } + } } - if (!inherited) { + if (inheritance.type == InheritanceType.None) { QName type = getElementBase(topLevelElement); if (type != null) { if (!type.getNamespaceURI().equals(SCHEMA_NS)) { SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart()); - baseClass = getName(obj); - inherited = true; - } + inheritance.baseClass = getName(obj); + inheritance.type = InheritanceType.ComplexType; + } else { + TypeEntry entry = getTypeEntry(type); + if (entry != null) { + inheritance.type = InheritanceType.AtomicType; + inheritance.atomicType = entry; + } + } } } - if (!inherited) { + if (inheritance.type == InheritanceType.None) { QName type = topLevelElement.getSubstitutionGroup(); if (type != null) { if (!type.getNamespaceURI().equals(SCHEMA_NS)) { SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart()); - baseClass = getName(obj); - inherited = true; - } + inheritance.baseClass = getName(obj); + inheritance.type = InheritanceType.ComplexType; + } else { + TypeEntry entry = getTypeEntry(type); + if (entry != null) { + inheritance.type = InheritanceType.AtomicType; + inheritance.atomicType = entry; + } + } } } - return new Pair(baseClass, inherited); + return inheritance; } private void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List interfaces) { @@ -909,6 +1004,7 @@ public class ImporterGenerator extends SchemaConversionBase{ writer.println("import org.simantics.db.exception.DatabaseException;"); writer.println("import org.simantics.xml.sax.base.Attribute;"); writer.println("import org.simantics.xml.sax.base.Element;"); + writer.println("import org.simantics.xml.sax.ontology.XMLResource;"); if (!isList) { writer.println("import org.simantics.layer0.Layer0;"); } else {