comparison flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java @ 147:76cc1a66a05f

Implemented a FLYSArtifactCollection that will be used in this application now. flys-artifacts/trunk@1565 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 24 Mar 2011 18:47:07 +0000
parents
children 2649ada6b053
comparison
equal deleted inserted replaced
146:e8dfe6ba2000 147:76cc1a66a05f
1 package de.intevation.flys.collections;
2
3 import java.util.Date;
4
5 import javax.xml.xpath.XPathConstants;
6
7 import org.apache.log4j.Logger;
8
9 import org.w3c.dom.Document;
10 import org.w3c.dom.Element;
11 import org.w3c.dom.Node;
12
13 import de.intevation.artifacts.Artifact;
14 import de.intevation.artifacts.ArtifactNamespaceContext;
15 import de.intevation.artifacts.CallContext;
16 import de.intevation.artifacts.CollectionItem;
17
18 import de.intevation.artifacts.common.utils.XMLUtils;
19
20 import de.intevation.artifactdatabase.DefaultArtifactCollection;
21 import de.intevation.artifactdatabase.Backend;
22 import de.intevation.artifactdatabase.Backend.PersistentArtifact;
23
24
25 /**
26 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
27 */
28 public class FLYSArtifactCollection extends DefaultArtifactCollection {
29
30 /** The logger used in this class.*/
31 private static Logger log = Logger.getLogger(FLYSArtifactCollection.class);
32
33
34 /** Constant XPath that points to the outputmodes of an artifact.*/
35 public static final String XPATH_ARTIFACT_OUTPUTMODES =
36 "/art:result/art:outputmodes";
37
38
39 @Override
40 public Document describe(CallContext context) {
41 log.debug("FLYSArtifactCollection.describe: " + identifier);
42
43 Document doc = XMLUtils.newDocument();
44
45 XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
46 doc,
47 ArtifactNamespaceContext.NAMESPACE_URI,
48 ArtifactNamespaceContext.NAMESPACE_PREFIX);
49
50 Date creationTime = getCreationTime();
51 String creation = creationTime != null
52 ? Long.toString(creationTime.getTime())
53 : "";
54
55 Element collection = ec.create("artifact-collection");
56 Element artifacts = ec.create("artifacts");
57
58 ec.addAttr(collection, "name", getName(), true);
59 ec.addAttr(collection, "uuid", identifier(), true);
60 ec.addAttr(collection, "creation", creation, true);
61
62 collection.appendChild(artifacts);
63 doc.appendChild(collection);
64
65 Document attribute = getAttribute();
66 if (attribute != null) {
67 Node child = attribute.getFirstChild();
68 collection.appendChild(doc.importNode(child, true));
69 }
70
71 Backend backend = Backend.getInstance();
72 CollectionItem[] items = backend.listCollectionArtifacts(identifier());
73
74 for (CollectionItem item: items) {
75 artifacts.appendChild(
76 buildArtifactNode(item, backend, context, ec));
77 }
78
79 return doc;
80 }
81
82
83 protected Element buildArtifactNode(
84 CollectionItem item,
85 Backend backend,
86 CallContext context,
87 XMLUtils.ElementCreator ec)
88 {
89 String uuid = item.getArtifactIdentifier();
90
91 log.debug("Append artifact '"+ uuid +"' to collection description");
92
93 Element ci = ec.create("artifact");
94 ec.addAttr(ci, "uuid", uuid);
95
96 PersistentArtifact pArtifact = backend.getArtifact(uuid);
97 Artifact artifact = pArtifact.getArtifact();
98
99 // XXX I am not sure if it works well every time with an empty document
100 // in the describe operation of an artifact.
101 Document description = artifact.describe(null, context);
102 Node outputModes = (Node) XMLUtils.xpath(
103 description,
104 XPATH_ARTIFACT_OUTPUTMODES,
105 XPathConstants.NODE,
106 ArtifactNamespaceContext.INSTANCE);
107
108 if (outputModes != null) {
109 Document doc = ci.getOwnerDocument();
110 ci.appendChild(doc.importNode(outputModes, true));
111 }
112
113 return ci;
114 }
115 }
116 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org