X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.xml.sax.base%2Fsrc%2Forg%2Fsimantics%2Fxml%2Fsax%2Fbase%2FXMLElementNamedChildWriterBase.java;h=32ad6f19a6fe29da3d2e3971d32b0f97474b4c8f;hb=5985d5ea605049222dc5a4acb0accf77afd8f76f;hp=9c4ceb6b9a26a4963b143d31d6e4655762948ab2;hpb=28cdb08c2dcc6b306d8a0cbea8c0bd791e42d583;p=simantics%2Finterop.git diff --git a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLElementNamedChildWriterBase.java b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLElementNamedChildWriterBase.java index 9c4ceb6..32ad6f1 100644 --- a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLElementNamedChildWriterBase.java +++ b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLElementNamedChildWriterBase.java @@ -1,91 +1,112 @@ -package org.simantics.xml.sax.base; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; - -import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; -import org.simantics.db.exception.DatabaseException; - -public abstract class XMLElementNamedChildWriterBase implements XMLElementNamedChildWriter{ - - private Map> typeWriters = new HashMap>(); - private Map> relationWriters = new HashMap>(); - private Set> writers = new HashSet>(); - - - public XMLElementNamedChildWriterBase() { - - } - - public XMLElementNamedChildWriterBase(ReadGraph graph) { - - } - - @Override - public Resource getType(ReadGraph graph) throws DatabaseException { - return null; - } - - @Override - public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException { - writer.writeStartElement(getElementId()); - } - - @Override - public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) - throws XMLStreamException, DatabaseException { - - } - - @Override - public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException { - writer.writeEndElement(); - } - - @Override - public void children(ReadGraph graph, WriterElement instance, Set sorted) - throws XMLStreamException, DatabaseException { - - } - - @Override - public Class getWriter(ReadGraph graph, Map writers, WriterElement child) throws DatabaseException{ - Resource type = graph.getSingleType(child.instance); - Class writerClass = typeWriters.get(type); - if (writerClass != null) - return writerClass; - if (child.statement != null) { - writerClass = relationWriters.get(child.statement.getPredicate()); - if (writerClass != null) - return writerClass; - } - XMLElementWriter writer = writers.get(type); - if (writer == null) - return null; - writerClass = writer.getClass(); - if (this.writers.contains(writerClass)) - return writerClass; - for (Class c : this.writers) - if (c.isAssignableFrom(writerClass)) - return writerClass; - return null; - } - - public void addTypeWriter(Resource type, Class writer) { - typeWriters.put(type, writer); - } - - public void addRelationWriter(Resource relation, Class writer) { - relationWriters.put(relation, writer); - } - - public void addWriter(Class writer) { - writers.add(writer); - } -} +package org.simantics.xml.sax.base; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.xml.sax.ontology.XMLResource; + +public abstract class XMLElementNamedChildWriterBase implements XMLElementNamedChildWriter{ + + private Map> typeWriters = new HashMap<>(); + private Map> relationWriters = new HashMap<>(); + private Map>> relationTypeWriters = new HashMap<>(); + private Set> writers = new HashSet>(); + + + public XMLElementNamedChildWriterBase() { + + } + + public XMLElementNamedChildWriterBase(ReadGraph graph) { + + } + + @Override + public Resource getType(ReadGraph graph) throws DatabaseException { + return null; + } + + @Override + public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException { + writer.writeStartElement(getElementId()); + } + + @Override + public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) + throws XMLStreamException, DatabaseException { + + } + + @Override + public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException { + writer.writeEndElement(); + } + + @Override + public void children(ReadGraph graph, WriterElement instance, Set sorted) + throws XMLStreamException, DatabaseException { + + } + + @Override + public Class getWriter(ReadGraph graph, Map writers, WriterElement child) throws DatabaseException{ + //Resource type = graph.getSingleType(child.instance); + // hack fix for elements containing character data (Current schema conversion does not recognise such cases, leaving Literal type inheritance out). + XMLResource XML = XMLResource.getInstance(graph); + Resource type = graph.getSingleType(child.instance,XML.Element); + Class writerClass = typeWriters.get(type); + if (writerClass != null) + return writerClass; + if (child.statement != null) { + Map> typeWriters = relationTypeWriters.get(child.statement.getPredicate()); + if (typeWriters != null) { + writerClass = typeWriters.get(type); + if (writerClass != null) + return writerClass; + } + writerClass = relationWriters.get(child.statement.getPredicate()); + if (writerClass != null) + return writerClass; + } + XMLElementWriter writer = writers.get(type); + if (writer == null) + return null; + writerClass = writer.getClass(); + if (this.writers.contains(writerClass)) + return writerClass; + for (Class c : this.writers) + if (c.isAssignableFrom(writerClass)) + return writerClass; + return null; + } + + public void addTypeWriter(Resource type, Class writer) { + typeWriters.put(type, writer); + } + + public void addRelationWriter(Resource relation, Class writer) { + relationWriters.put(relation, writer); + } + + public void addRelationTypeWriter(Resource relation, Resource type, Class writer) { + Map> typeWriters = relationTypeWriters.get(relation); + if (typeWriters == null) { + typeWriters = new HashMap<>(); + relationTypeWriters.put(relation, typeWriters); + } + typeWriters.put(type, writer); + } + + + public void addWriter(Class writer) { + writers.add(writer); + } +}