teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.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: teichmann@5831: import org.dive4elements.artifacts.ArtifactNamespaceContext; ingo@346: teichmann@5831: import org.dive4elements.artifactdatabase.state.DefaultOutput; teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; teichmann@5831: import org.dive4elements.artifactdatabase.state.Output; teichmann@5831: import org.dive4elements.artifactdatabase.state.Settings; ingo@346: teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils; ingo@346: teichmann@5831: import org.dive4elements.river.artifacts.model.ManagedDomFacet; teichmann@5831: import org.dive4elements.river.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 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 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 :