ingo@346: package de.intevation.flys.collections; ingo@346: ingo@346: import java.util.Iterator; ingo@346: import java.util.List; ingo@346: import java.util.Map; ingo@346: ingo@346: import org.apache.log4j.Logger; ingo@346: ingo@346: import org.w3c.dom.Document; ingo@346: import org.w3c.dom.Element; ingo@346: import org.w3c.dom.Node; ingo@346: ingo@346: import de.intevation.artifacts.ArtifactNamespaceContext; ingo@346: ingo@346: import de.intevation.artifactdatabase.state.Facet; ingo@346: import de.intevation.artifactdatabase.state.Output; ingo@346: ingo@346: import de.intevation.artifacts.common.utils.XMLUtils; ingo@346: import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator; ingo@346: ingo@346: import de.intevation.flys.artifacts.model.ManagedFacet; ingo@346: ingo@346: ingo@346: public class AttributeWriter { ingo@346: ingo@346: protected Map oldAttr; ingo@346: protected Map newAttr; ingo@346: ingo@346: private static Logger logger = Logger.getLogger(AttributeWriter.class); ingo@346: ingo@346: ingo@346: public AttributeWriter( ingo@346: Map oldAttr, ingo@346: Map newAttr) ingo@346: { ingo@346: this.oldAttr = oldAttr; ingo@346: this.newAttr = newAttr; ingo@346: } ingo@346: ingo@346: ingo@346: protected Document write() { ingo@346: Document doc = XMLUtils.newDocument(); ingo@346: ingo@346: ElementCreator cr = new ElementCreator( ingo@346: doc, ingo@346: ArtifactNamespaceContext.NAMESPACE_URI, ingo@346: ArtifactNamespaceContext.NAMESPACE_PREFIX); ingo@346: ingo@638: Element attribute = cr.create("attribute"); ingo@638: Element outs = cr.create("outputs"); ingo@638: ingo@638: attribute.appendChild(outs); ingo@638: doc.appendChild(attribute); ingo@353: ingo@346: Iterator iter = newAttr.keySet().iterator(); ingo@346: ingo@346: while (iter.hasNext()) { ingo@346: String outName = iter.next(); ingo@346: ingo@346: Output a = newAttr.get(outName); ingo@346: Output b = oldAttr.get(outName); ingo@346: ingo@353: writeOutput(doc, outs, cr, a, b); ingo@346: } ingo@346: ingo@346: return doc; ingo@346: } ingo@346: ingo@346: ingo@346: protected void writeOutput( ingo@346: Document doc, ingo@353: Node outs, ingo@346: ElementCreator cr, ingo@346: Output a, ingo@346: Output b) ingo@346: { ingo@346: Element output = cr.create("output"); ingo@346: cr.addAttr(output, "name", a.getName()); ingo@346: ingo@353: outs.appendChild(output); ingo@346: ingo@346: List facetsA = a.getFacets(); ingo@346: List facetsB = null; ingo@346: ingo@346: if (b != null) { ingo@346: facetsB = b.getFacets(); ingo@346: } ingo@346: ingo@346: writeFacets(doc, cr, output, facetsA, facetsB); ingo@346: } ingo@346: ingo@346: ingo@346: protected void writeFacets( ingo@346: Document doc, ingo@346: ElementCreator cr, ingo@346: Element output, ingo@346: List a, ingo@346: List b) ingo@346: { ingo@346: int num = a.size(); ingo@346: ingo@346: for (int i = 0; i < num; i++) { ingo@346: ManagedFacet fA = (ManagedFacet) a.get(i); ingo@346: ingo@346: if (!mergeFacets(doc, cr, output, fA, b)) { ingo@346: writeFacet(doc, cr, output, fA); ingo@346: } ingo@346: } ingo@346: } ingo@346: ingo@346: ingo@346: protected boolean mergeFacets( ingo@346: Document doc, ingo@346: ElementCreator cr, ingo@346: Element output, ingo@346: ManagedFacet a, ingo@346: List list) ingo@346: { ingo@694: String name = a.getName() + a.getIndex(); ingo@346: ingo@346: if (list == null) { ingo@638: logger.debug("No old facets found."); ingo@346: return false; ingo@346: } ingo@346: ingo@346: for (Facet facet: list) { ingo@694: if (name.equals(facet.getName() + facet.getIndex())) { ingo@346: writeFacet(doc, cr, output, (ManagedFacet) facet); ingo@346: return true; ingo@346: } ingo@346: } ingo@346: ingo@346: return false; ingo@346: } ingo@346: ingo@346: ingo@346: protected void writeFacet( ingo@346: Document doc, ingo@346: ElementCreator cr, ingo@346: Node output, ingo@346: ManagedFacet f) ingo@346: { ingo@346: Element theme = cr.create("theme"); ingo@346: cr.addAttr(theme, "artifact", f.getArtifact(), true); ingo@346: cr.addAttr(theme, "facet", f.getName(), true); ingo@346: cr.addAttr(theme, "pos", Integer.toString(f.getPosition()), true); ingo@346: cr.addAttr(theme, "active", Integer.toString(f.getActive()), true); ingo@694: cr.addAttr(theme, "index", Integer.toString(f.getIndex()), true); ingo@694: cr.addAttr(theme, "description", f.getDescription(), true); ingo@346: ingo@346: output.appendChild(theme); ingo@346: } ingo@346: } ingo@346: