ingo@147: package de.intevation.flys.collections; ingo@147: ingo@147: import java.util.Date; ingo@147: ingo@147: import javax.xml.xpath.XPathConstants; ingo@147: ingo@147: import org.apache.log4j.Logger; ingo@147: ingo@147: import org.w3c.dom.Document; ingo@147: import org.w3c.dom.Element; ingo@147: import org.w3c.dom.Node; ingo@293: import org.w3c.dom.NodeList; ingo@147: ingo@293: import de.intevation.artifacts.ArtifactDatabase; ingo@293: import de.intevation.artifacts.ArtifactDatabaseException; ingo@147: import de.intevation.artifacts.ArtifactNamespaceContext; ingo@147: import de.intevation.artifacts.CallContext; ingo@293: import de.intevation.artifacts.CallMeta; ingo@147: ingo@147: import de.intevation.artifacts.common.utils.XMLUtils; ingo@147: ingo@147: import de.intevation.artifactdatabase.DefaultArtifactCollection; ingo@147: ingo@147: ingo@147: /** ingo@147: * @author Ingo Weinzierl ingo@147: */ ingo@147: public class FLYSArtifactCollection extends DefaultArtifactCollection { ingo@147: ingo@147: /** The logger used in this class.*/ ingo@147: private static Logger log = Logger.getLogger(FLYSArtifactCollection.class); ingo@147: ingo@147: ingo@147: /** Constant XPath that points to the outputmodes of an artifact.*/ ingo@147: public static final String XPATH_ARTIFACT_OUTPUTMODES = ingo@147: "/art:result/art:outputmodes"; ingo@147: ingo@293: public static final String XPATH_COLLECTION_ITEMS = ingo@293: "/art:result/art:artifact-collection/art:collection-item"; ingo@293: ingo@147: ingo@147: @Override ingo@147: public Document describe(CallContext context) { ingo@147: log.debug("FLYSArtifactCollection.describe: " + identifier); ingo@147: ingo@147: Document doc = XMLUtils.newDocument(); ingo@147: ingo@147: XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( ingo@147: doc, ingo@147: ArtifactNamespaceContext.NAMESPACE_URI, ingo@147: ArtifactNamespaceContext.NAMESPACE_PREFIX); ingo@147: ingo@147: Date creationTime = getCreationTime(); ingo@147: String creation = creationTime != null ingo@147: ? Long.toString(creationTime.getTime()) ingo@147: : ""; ingo@147: ingo@147: Element collection = ec.create("artifact-collection"); ingo@147: Element artifacts = ec.create("artifacts"); ingo@147: ingo@147: ec.addAttr(collection, "name", getName(), true); ingo@147: ec.addAttr(collection, "uuid", identifier(), true); ingo@147: ec.addAttr(collection, "creation", creation, true); ingo@147: ingo@147: collection.appendChild(artifacts); ingo@147: doc.appendChild(collection); ingo@147: ingo@147: Document attribute = getAttribute(); ingo@147: if (attribute != null) { ingo@147: Node child = attribute.getFirstChild(); ingo@147: collection.appendChild(doc.importNode(child, true)); ingo@147: } ingo@147: ingo@293: try { ingo@293: ArtifactDatabase db = context.getDatabase(); ingo@293: CallMeta meta = context.getMeta(); ingo@147: ingo@293: Document itemList = db.listCollectionArtifacts(identifier(), meta); ingo@293: NodeList items = (NodeList) XMLUtils.xpath( ingo@293: itemList, ingo@293: XPATH_COLLECTION_ITEMS, ingo@293: XPathConstants.NODESET, ingo@293: ArtifactNamespaceContext.INSTANCE); ingo@293: ingo@293: if (items == null || items.getLength() == 0) { ingo@293: log.debug("No collection items found."); ingo@293: return doc; ingo@293: } ingo@293: ingo@293: int num = items.getLength(); ingo@293: ingo@293: for (int i = 0; i < num; i++) { ingo@293: String uuid = XMLUtils.xpathString( ingo@293: items.item(i), ingo@293: "@art:uuid", ingo@293: ArtifactNamespaceContext.INSTANCE); ingo@293: ingo@293: try { ingo@293: artifacts.appendChild( ingo@293: buildArtifactNode(db, uuid, context, ec)); ingo@293: } ingo@293: catch (ArtifactDatabaseException dbe) { ingo@293: log.warn(dbe, dbe); ingo@293: } ingo@293: } ingo@293: } ingo@293: catch (ArtifactDatabaseException ade) { ingo@293: log.error(ade, ade); ingo@147: } ingo@147: ingo@147: return doc; ingo@147: } ingo@147: ingo@147: ingo@147: protected Element buildArtifactNode( ingo@293: ArtifactDatabase database, ingo@293: String uuid, ingo@147: CallContext context, ingo@147: XMLUtils.ElementCreator ec) ingo@293: throws ArtifactDatabaseException ingo@147: { ingo@293: log.debug("Append artifact '" + uuid + "' to collection description"); ingo@147: ingo@293: // XXX I am not sure if it works well every time with an empty document ingo@293: // in the describe operation of an artifact. ingo@293: Document description = database.describe(uuid, null, context.getMeta()); ingo@147: ingo@293: de.intevation.flys.artifacts.XMLDebug.out(description); ingo@293: ingo@293: String hash = "MYHASH"; ingo@293: // TODO ingo@156: ingo@147: Element ci = ec.create("artifact"); ingo@148: ec.addAttr(ci, "uuid", uuid, true); ingo@293: ec.addAttr(ci, "hash", hash, true); ingo@147: ingo@293: Node outputModes = (Node) XMLUtils.xpath( ingo@147: description, ingo@147: XPATH_ARTIFACT_OUTPUTMODES, ingo@147: XPathConstants.NODE, ingo@147: ArtifactNamespaceContext.INSTANCE); ingo@147: ingo@147: if (outputModes != null) { ingo@147: Document doc = ci.getOwnerDocument(); ingo@147: ci.appendChild(doc.importNode(outputModes, true)); ingo@147: } ingo@147: ingo@147: return ci; ingo@147: } ingo@147: } ingo@147: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :