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 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); 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); } }