ingo@346: package de.intevation.flys.collections; ingo@346: ingo@346: import java.util.HashMap; 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.ArtifactDatabase; ingo@346: import de.intevation.artifacts.ArtifactDatabaseException; ingo@346: import de.intevation.artifacts.ArtifactNamespaceContext; ingo@346: import de.intevation.artifacts.CallMeta; ingo@346: ingo@346: import de.intevation.artifactdatabase.state.DefaultOutput; ingo@346: import de.intevation.artifactdatabase.state.Output; ingo@346: ingo@346: import de.intevation.artifacts.common.utils.XMLUtils; ingo@346: ingo@346: import de.intevation.flys.artifacts.model.ManagedFacet; ingo@346: ingo@346: ingo@346: public class OutputParser { ingo@346: ingo@346: /** Constant XPath that points to the outputmodes of an artifact.*/ ingo@346: public static final String XPATH_ARTIFACT_OUTPUTMODES = ingo@346: "/art:result/art:outputmodes/art:output"; ingo@346: ingo@346: ingo@346: private static Logger logger = Logger.getLogger(OutputParser.class); ingo@346: ingo@346: protected ArtifactDatabase db; ingo@346: protected CallMeta meta; ingo@346: ingo@346: protected Map outs; ingo@346: ingo@346: ingo@346: public OutputParser(ArtifactDatabase db, CallMeta meta) { ingo@346: this.db = db; ingo@346: this.meta = meta; ingo@346: this.outs = new HashMap(); ingo@346: } ingo@346: ingo@346: ingo@346: public void parse(String uuid) ingo@346: throws ArtifactDatabaseException ingo@346: { ingo@346: logger.debug("OutputParser.parse: " + uuid); ingo@346: ingo@346: // XXX I am not sure if it works well every time with an empty ingo@346: // document in the describe operation of an artifact. ingo@346: Document description = db.describe(uuid, null, meta); ingo@346: ingo@346: NodeList outs = (NodeList) XMLUtils.xpath( ingo@346: description, 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("Artifact 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(uuid, out); ingo@346: } ingo@346: } ingo@346: ingo@346: ingo@346: public Map getOuts() { ingo@346: return outs; ingo@346: } ingo@346: ingo@346: ingo@346: protected void addItem(String out, ManagedFacet item) { ingo@346: Output o = outs.get(out); ingo@346: ingo@346: if (o != null) { ingo@346: int num = o.getFacets().size(); ingo@346: item.setPosition(num+1); ingo@346: ingo@346: o.addFacet(item); ingo@346: } ingo@346: } ingo@346: ingo@346: ingo@346: protected void parseOutput(String uuid, Node out) { ingo@346: String name = XMLUtils.xpathString( ingo@346: out, "@art:name", ArtifactNamespaceContext.INSTANCE); ingo@346: ingo@346: if (outs.get(name) == null) { ingo@346: logger.debug("Create new output: " + name); ingo@346: newOutput(out, name); ingo@346: } ingo@346: ingo@346: parseItems(uuid, out, name); ingo@346: } ingo@346: ingo@346: ingo@346: protected void newOutput(Node out, String name) { ingo@346: String desc = XMLUtils.xpathString( ingo@346: out, "@art:description", ArtifactNamespaceContext.INSTANCE); ingo@346: ingo@346: String mimetype = XMLUtils.xpathString( ingo@346: out, "@art:mime-type", ArtifactNamespaceContext.INSTANCE); ingo@346: ingo@346: Output o = new DefaultOutput(name, desc, mimetype); ingo@346: ingo@346: outs.put(name, o); ingo@346: } ingo@346: ingo@346: ingo@346: protected void parseItems(String uuid, Node out, String outname) { ingo@346: NodeList facets = (NodeList) XMLUtils.xpath( ingo@346: out, "art:facets/art:facet", ingo@346: XPathConstants.NODESET, ingo@346: ArtifactNamespaceContext.INSTANCE); ingo@346: ingo@346: int num = facets != null ? facets.getLength() : 0; ingo@346: ingo@694: String uri = ArtifactNamespaceContext.NAMESPACE_URI; ingo@694: ingo@346: logger.debug("Output has " + num + " facets."); ingo@346: ingo@346: for (int i = 0; i < num; i++) { ingo@694: Element facet = (Element) facets.item(i); ingo@346: ingo@694: String name = facet.getAttributeNS(uri, "name"); ingo@694: String desc = facet.getAttributeNS(uri, "description"); ingo@694: String index = facet.getAttributeNS(uri, "index"); ingo@346: ingo@694: ManagedFacet item = new ManagedFacet( ingo@694: name, Integer.parseInt(index), desc, uuid, 1, 1); ingo@346: ingo@346: addItem(outname, item); ingo@346: } ingo@346: } ingo@346: } ingo@346: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :