ingo@346: package de.intevation.flys.collections; ingo@346: 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: felix@1628: /** felix@1628: * Create document felix@1628: */ 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"); sascha@705: Element outs = cr.create("outputs"); ingo@638: ingo@638: attribute.appendChild(outs); ingo@638: doc.appendChild(attribute); ingo@353: sascha@705: for (String outName: newAttr.keySet()) { ingo@346: ingo@346: Output a = newAttr.get(outName); ingo@346: Output b = oldAttr.get(outName); ingo@945: ingo@353: writeOutput(doc, outs, cr, a, b); ingo@346: } ingo@346: ingo@346: return doc; ingo@346: } ingo@346: felix@1628: /** felix@1628: * @param doc Document to add output nodes to felix@1628: * @param outs Node in Document to add output nodes to felix@1628: * @param a the new output felix@1628: * @param b the old output felix@1628: */ ingo@346: protected void writeOutput( ingo@346: Document doc, ingo@353: Node outs, ingo@346: ElementCreator cr, ingo@1171: Output a, /* new output */ ingo@1171: Output b) /* old output */ 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: felix@1628: /** felix@1628: * @param doc Document to add facet nodes to felix@1628: * @param output Node in Document to add facet nodes to felix@1628: * @param a the new facets felix@1628: * @param b the old facets felix@1628: */ ingo@346: protected void writeFacets( ingo@346: Document doc, ingo@346: ElementCreator cr, ingo@346: Element output, ingo@1171: List a, /* new facets */ ingo@1171: List b) /* old facets */ 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@945: Node n = fA.toXML(doc); ingo@945: ingo@945: if (n != null) { ingo@945: output.appendChild(n); ingo@945: } ingo@346: } ingo@346: } ingo@346: } ingo@346: ingo@346: felix@1628: /** felix@1628: * @param a new facets felix@1628: * @param list old facets felix@1628: */ ingo@346: protected boolean mergeFacets( ingo@346: Document doc, ingo@346: ElementCreator cr, ingo@346: Element output, ingo@1171: ManagedFacet a, /* new facets */ ingo@1171: List list) /* old facets */ ingo@346: { ingo@945: String nameA = 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@945: String nameB = facet.getName() + facet.getIndex(); ingo@945: ingo@945: if (nameA.equals(nameB)) { ingo@1171: ManagedFacet b = (ManagedFacet) facet; ingo@1171: ingo@1171: if (!b.getArtifact().equals(a.getArtifact())) { ingo@1171: continue; ingo@1171: } ingo@1171: ingo@945: Node n = facet.toXML(doc); ingo@945: ingo@945: if (n != null) { ingo@945: output.appendChild(n); ingo@945: } ingo@945: ingo@346: return true; ingo@346: } ingo@346: } ingo@346: ingo@346: return false; ingo@346: } ingo@346: } sascha@705: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :