ingo@346: package de.intevation.flys.collections;
ingo@346: 
felix@1779: import java.util.List;
ingo@346: import java.util.Map;
ingo@346: 
ingo@346: import javax.xml.xpath.XPathConstants;
ingo@346: 
ingo@346: import org.apache.log4j.Logger;
ingo@346: 
ingo@346: import org.w3c.dom.Document;
ingo@694: import org.w3c.dom.Element;
ingo@346: import org.w3c.dom.Node;
ingo@346: import org.w3c.dom.NodeList;
ingo@346: 
ingo@346: import de.intevation.artifacts.ArtifactNamespaceContext;
ingo@346: 
ingo@346: import de.intevation.artifactdatabase.state.DefaultOutput;
felix@1779: import de.intevation.artifactdatabase.state.Facet;
ingo@346: import de.intevation.artifactdatabase.state.Output;
ingo@1994: import de.intevation.artifactdatabase.state.Settings;
ingo@346: 
ingo@346: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@346: 
ingo@945: import de.intevation.flys.artifacts.model.ManagedDomFacet;
ingo@1994: import de.intevation.flys.exports.ChartSettings;
ingo@346: 
felix@1779: /**
felix@1779:  * Access parts of the Attribute parts of a FLYSCollections description
felix@1779:  * document.
felix@1779:  */
ingo@346: public class AttributeParser {
ingo@346: 
felix@1624:     /** Constant XPath that points to the outputmodes of an artifact. */
ingo@346:     public static final String XPATH_ARTIFACT_OUTPUTMODES =
ingo@638:         "/art:attribute/art:outputs/art:output";
ingo@346: 
ingo@1976: 
ingo@346:     private static Logger logger = Logger.getLogger(AttributeParser.class);
ingo@346: 
ingo@346: 
ingo@1976:     protected Document attributeDocument;
ingo@1976: 
ingo@1976:     protected CollectionAttribute attribute;
felix@1779: 
ingo@346: 
ingo@1976:     public AttributeParser(Document attributeDocument) {
ingo@1976:         this.attributeDocument = attributeDocument;
ingo@346:     }
ingo@346: 
ingo@346: 
ingo@1976:     public void parse() {
ingo@346:         logger.debug("AttributeParser.parse");
ingo@346: 
ingo@1976:         attribute = new CollectionAttribute();
ingo@1976: 
ingo@346:         NodeList outs = (NodeList) XMLUtils.xpath(
ingo@1976:             attributeDocument,
ingo@346:             XPATH_ARTIFACT_OUTPUTMODES,
ingo@346:             XPathConstants.NODESET,
ingo@346:             ArtifactNamespaceContext.INSTANCE);
ingo@346: 
ingo@346:         int num = outs != null ? outs.getLength() : 0;
ingo@346: 
ingo@346:         logger.debug("Attribute has " + num + " outputs.");
ingo@346: 
ingo@346:         for (int i = 0; i < num; i++) {
ingo@346:             Node out = outs.item(i);
ingo@346: 
ingo@346:             parseOutput(out);
ingo@346:         }
ingo@346:     }
ingo@346: 
ingo@346: 
ingo@1976:     public CollectionAttribute getCollectionAttribute() {
ingo@1976:         if (attribute == null) {
ingo@1976:             parse();
ingo@1976:         }
ingo@1976: 
ingo@1976:         return attribute;
ingo@346:     }
ingo@346: 
ingo@346: 
ingo@1976:     public Document getAttributeDocument() {
ingo@1976:         return attributeDocument;
ingo@346:     }
ingo@346: 
ingo@346: 
ingo@1976:     public Map<String, Output> getOuts() {
ingo@1976:         return attribute.getOutputs();
ingo@346:     }
ingo@346: 
ingo@346: 
felix@1779:     /**
felix@1779:      * Access all facets.
felix@1779:      * @return list of all facets.
felix@1779:      */
felix@1779:     public List<Facet> getFacets() {
ingo@1976:         return attribute.getFacets();
ingo@1976:     }
ingo@1976: 
ingo@1976: 
ingo@1976:     protected void parseOutput(Node out) {
sascha@2779:         String name = ((Element)out).getAttribute("name");
ingo@1976: 
sascha@2779:         if (name.length() == 0) {
ingo@1976:             logger.warn("No Output name specified. Cancel parsing!");
ingo@1976:             return;
ingo@1976:         }
ingo@1976: 
ingo@1976:         Output o = attribute.getOutput(name);
ingo@1976: 
ingo@1976:         if (o == null) {
ingo@1976:             logger.debug("Create new output: " + name);
ingo@1976: 
ingo@1976:             o = new DefaultOutput(name, null, null);
ingo@1976:             attribute.addOutput(name, o);
ingo@1976:         }
ingo@1976: 
ingo@1994:         parseSettings(out, name);
ingo@1976:         parseItems(out, name);
felix@1779:     }
felix@1779: 
sascha@3191:     private static final Node getChild(Element element, String name) {
sascha@3191:         NodeList children = element.getChildNodes();
sascha@3191:         for (int i = 0, N = children.getLength(); i < N; ++i) {
sascha@3191:             Node child = children.item(i);
sascha@3191:             if (child.getNodeType() == Node.ELEMENT_NODE
sascha@3191:             && child.getLocalName().equals(name)) {
sascha@3191:                 return child;
sascha@3191:             }
sascha@3191:         }
sascha@3191:         return null;
sascha@3191:     }
sascha@3191: 
felix@1779: 
ingo@1994:     protected void parseSettings(Node out, String outname) {
sascha@3191:         Node settingsNode = getChild((Element)out, "settings");
ingo@1994: 
ingo@1994:         if (settingsNode == null) {
ingo@1994:             logger.debug("No Settings found for Output '" + outname + "'");
ingo@1994:             return;
ingo@1994:         }
ingo@1994: 
ingo@1994:         Settings settings = ChartSettings.parse(settingsNode);
ingo@1994:         attribute.setSettings(outname, settings);
ingo@1994:     }
ingo@1994: 
ingo@1994: 
ingo@346:     protected void parseItems(Node out, String outname) {
sascha@3191:         String uri = ArtifactNamespaceContext.NAMESPACE_URI;
sascha@3191:         Element element = (Element)out;
ingo@346: 
sascha@3191:         NodeList themes = element.getElementsByTagNameNS(uri, "facet");
sascha@3191: 
sascha@3191:         int num = themes.getLength();
ingo@346: 
ingo@346:         logger.debug("Output has " + num + " themes.");
ingo@346: 
ingo@694:         for (int i = 0; i < num; i++) {
ingo@694:             Element theme = (Element) themes.item(i);
sascha@3191:             if (theme.getParentNode() == out) {
sascha@3191:                 attribute.addFacet(outname, new ManagedDomFacet(theme));
sascha@3191:             }
ingo@346:         }
ingo@346:     }
ingo@346: }
ingo@346: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :