diff flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java @ 1972:3c3e81fca092

Added a CollectionDescriptionHelper that helps generating DESCRIBE documents for Collections. flys-artifacts/trunk@3391 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 13 Dec 2011 08:43:48 +0000
parents 37a7b3841565
children 0b466bd4ab24
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java	Mon Dec 12 11:19:56 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java	Tue Dec 13 08:43:48 2011 +0000
@@ -3,7 +3,6 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -79,28 +78,9 @@
     public Document describe(CallContext context) {
         log.debug("FLYSArtifactCollection.describe: " + identifier);
 
-        Document doc = XMLUtils.newDocument();
-
-        XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
-            doc,
-            ArtifactNamespaceContext.NAMESPACE_URI,
-            ArtifactNamespaceContext.NAMESPACE_PREFIX);
-
-        Date creationTime = getCreationTime();
-        String creation   = creationTime != null
-            ? Long.toString(creationTime.getTime())
-            : "";
-
-        Element collection = ec.create("artifact-collection");
-        Element artifacts  = ec.create("artifacts");
-
-        ec.addAttr(collection, "name", getName(), true);
-        ec.addAttr(collection, "uuid", identifier(), true);
-        ec.addAttr(collection, "creation", creation,  true);
-        ec.addAttr(collection, "ttl", String.valueOf(getTTL()), true);
-
-        collection.appendChild(artifacts);
-        doc.appendChild(collection);
+        CollectionDescriptionHelper helper = new CollectionDescriptionHelper(
+            getName(), identifier(), getCreationTime(), getTTL(),
+            context);
 
         ArtifactDatabase db = context.getDatabase();
         Document oldAttrs   = getAttribute();
@@ -109,7 +89,7 @@
             String[] aUUIDs = getArtifactUUIDs(context);
             Node newAttr    = mergeAttributes(db, context, oldAttrs, aUUIDs);
 
-            collection.appendChild(doc.importNode(newAttr, true));
+            helper.setAttribute(newAttr);
 
             // Make it an empty array if null.
             if (aUUIDs == null) {
@@ -117,22 +97,18 @@
             }
 
             for (String uuid: aUUIDs) {
-                try {
-                    artifacts.appendChild(
-                        buildArtifactNode(db, uuid, context, ec));
-                }
-                catch (ArtifactDatabaseException dbe) {
-                    log.warn(dbe, dbe);
-                }
+                helper.addArtifact(uuid);
             }
         }
         catch (ArtifactDatabaseException ade) {
-            log.error(ade, ade);
+            log.error("Error while merging attribute documents.", ade);
 
-            collection.appendChild(
-                doc.importNode(oldAttrs.getFirstChild(), true));
+            helper.setAttribute(oldAttrs);
         }
 
+        Document doc = helper.toXML();
+        log.debug("HELPER DOC: " + XMLUtils.toString(doc));
+
         return doc;
     }
 
@@ -354,7 +330,8 @@
 
         return dataProviders;
     }
-    
+
+
     /**
      * @return masterartifact or null if exception/not found.
      */
@@ -365,7 +342,7 @@
             CallMeta callMeta   = context.getMeta();
             Document document   = db.getCollectionsMasterArtifact(
                 identifier(), callMeta);
-    
+
             String masterUUID   = XMLUtils.xpathString(
                 document, XPATH_MASTER_UUID, ArtifactNamespaceContext.INSTANCE);
             FLYSArtifact masterArtifact =
@@ -396,15 +373,15 @@
         FLYSContext.STATE_ENGINE_KEY);
 
         FLYSArtifact masterArtifact = getMasterArtifact(context);
-    
+
         XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
             doc,
             ArtifactNamespaceContext.NAMESPACE_URI,
             ArtifactNamespaceContext.NAMESPACE_PREFIX);
-    
+
         AttributeParser aParser = new AttributeParser();
         OutputParser    oParser = new OutputParser(db, context);
-    
+
         if (uuids != null) {
             for (String uuid: uuids) {
                 try {
@@ -830,63 +807,6 @@
 
 
     /**
-     * Create the Artifacts Node that contains outputmode and statedata.
-     * @param uuid uuid of the artifact.
-     */
-    protected Element buildArtifactNode(
-        ArtifactDatabase        database,
-        String                  uuid,
-        CallContext             context,
-        XMLUtils.ElementCreator ec)
-    throws ArtifactDatabaseException
-    {
-        log.debug("Append artifact '" + uuid + "' to collection description");
-
-        // TODO
-        String hash = "MYHASH";
-
-        Element ci = ec.create("artifact");
-        ec.addAttr(ci, "uuid", uuid, true);
-        ec.addAttr(ci, "hash", hash, true);
-
-        // XXX I am not sure if it works well every time with an empty document
-        // in the describe operation of an artifact.
-        Document description = database.describe(uuid, null, context.getMeta());
-
-        // Add outputmode element(s).
-        Node outputModes = (Node) XMLUtils.xpath(
-            description,
-            XPATH_ARTIFACT_OUTPUTMODES,
-            XPathConstants.NODE,
-            ArtifactNamespaceContext.INSTANCE);
-
-        if (outputModes != null) {
-            Document doc = ci.getOwnerDocument();
-            ci.appendChild(doc.importNode(outputModes, true));
-        }
-
-        // Add state-data element(s).
-        Node dataNode = ci.appendChild(
-            ci.getOwnerDocument().createElement("art:data-items"));
-
-        NodeList dataNodes = (NodeList) XMLUtils.xpath(
-            description,
-            XPATH_ARTIFACT_STATE_DATA,
-            XPathConstants.NODESET,
-            ArtifactNamespaceContext.INSTANCE);
-
-        if (dataNodes != null) {
-            Document doc = ci.getOwnerDocument();
-            for (int i = 0; i < dataNodes.getLength(); i++) {
-                dataNode.appendChild(doc.importNode(dataNodes.item(i), true));
-            }
-        }
-
-        return ci;
-    }
-
-
-    /**
      * Inner class to structure/order the themes of a chart.
      */
     private static class ThemeList {

http://dive4elements.wald.intevation.org