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<String, Output> oldAttr;
ingo@346:     protected Map<String, Output> newAttr;
ingo@346: 
ingo@346:     private static Logger logger = Logger.getLogger(AttributeWriter.class);
ingo@346: 
ingo@346: 
ingo@346:     public AttributeWriter(
ingo@346:         Map<String, Output> oldAttr,
ingo@346:         Map<String, Output> 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");
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: 
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<Facet> facetsA = a.getFacets();
ingo@346:         List<Facet> 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<Facet>    a,
ingo@346:         List<Facet>    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@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: 
ingo@346:     protected boolean mergeFacets(
ingo@346:         Document       doc,
ingo@346:         ElementCreator cr,
ingo@346:         Element        output,
ingo@346:         ManagedFacet   a,
ingo@346:         List<Facet>    list)
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@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 :