changeset 143:7e20702a90ed

Implemented an abstract class for the output of artifacts and collections. Added a CollectionOutResource. artifacts/trunk@1368 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 02 Mar 2011 16:02:47 +0000
parents e986e32bc7d4
children 5369582d4fbf
files ChangeLog artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactOutResource.java artifact-database/src/main/java/de/intevation/artifactdatabase/rest/BaseOutResource.java artifact-database/src/main/java/de/intevation/artifactdatabase/rest/CollectionOutResource.java artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java
diffstat 5 files changed, 249 insertions(+), 80 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Mar 02 15:10:34 2011 +0000
+++ b/ChangeLog	Wed Mar 02 16:02:47 2011 +0000
@@ -1,3 +1,23 @@
+2011-03-02  Ingo Weinzierl <ingo@intevation.de>
+
+	* artifact-database/src/main/java/de/intevation/artifactdatabase/rest/BaseOutResource.java:
+	  New. Abstract class that should be used as the base class for the
+	  artifact and collection out resource. The most stuff to handle the
+	  output is done in this class. Concrete subclasses are needed to call the
+	  correct methods in the artifact database.
+
+	* artifact-database/src/main/java/de/intevation/artifactdatabase/rest/CollectionOutResource.java:
+	  New. The OUT Resource for collections. It implements the two abstract
+	  methods of BaseOutResource.
+
+	* artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactOutResource.java:
+	  This class inherits from BaseOutResource now. The most code has been
+	  removed. Just the two abstract methods of BaseOutResource are
+	  implemented here.
+
+	* artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java:
+	  Added the CollectionOutResource.
+
 2011-03-02  Ingo Weinzierl <ingo@intevation.de>
 
 	* artifact-database/src/main/java/de/intevation/artifactdatabase/rest/CollectionResource.java:
--- a/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactOutResource.java	Wed Mar 02 15:10:34 2011 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactOutResource.java	Wed Mar 02 16:02:47 2011 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 by Intevation GmbH
+ * Copyright (c) 2010, 2011 by Intevation GmbH
  *
  * This program is free software under the LGPL (>=v2.1)
  * Read the file LGPL.txt coming with the software for details
@@ -8,112 +8,57 @@
 
 package de.intevation.artifactdatabase.rest;
 
-import de.intevation.artifactdatabase.XMLUtils;
-
 import de.intevation.artifacts.ArtifactDatabase;
 import de.intevation.artifacts.ArtifactDatabaseException;
-import de.intevation.artifacts.ArtifactNamespaceContext;
-
-import java.io.IOException;
+import de.intevation.artifacts.CallMeta;
 
 import org.apache.log4j.Logger;
 
 import org.restlet.Request;
-import org.restlet.Response;
-
-import org.restlet.data.MediaType;
-import org.restlet.data.Status;
-
-import org.restlet.ext.xml.DomRepresentation;
-
-import org.restlet.representation.EmptyRepresentation;
-import org.restlet.representation.Representation;
-
-import org.restlet.resource.ResourceException;
 
 import org.w3c.dom.Document;
 
 /**
  * Resource to serve the out()-outputs of artifacts.
  * @author <a href="mailto:sascha.teichmann@intevation">Sascha L. Teichmann</a>
+ * @author <a href="mailto:ingo.weinzierl@intevation">Ingo Weinzierl</a>
  */
 public class ArtifactOutResource
-extends      BaseResource
+extends      BaseOutResource
 {
     /**
      * server URL where to find the resource.
      */
     public static final String PATH = "/artifact/{uuid}/{type}";
 
-    /**
-     * XPath to figure out the MIME type of the requested result.
-     */
-    public static final String XPATH_MIME_TYPE =
-        "/art:action/art:out/art:mime-type/@value";
-
-    /**
-     * Default result MIME type: octet stream
-     */
-    public static final MediaType DEFAULT_MIME_TYPE =
-        MediaType.APPLICATION_OCTET_STREAM;
-
     private static Logger logger = Logger.getLogger(ArtifactOutResource.class);
 
-    @Override
-    protected Representation innerPost(Representation requestRepr)
-    throws    ResourceException
-    {
-        Document inputDocument = null;
-        try {
-            DomRepresentation input = new DomRepresentation(requestRepr);
-            input.setNamespaceAware(true);
-            inputDocument = input.getDocument();
-        }
-        catch (IOException ioe) {
-            logger.error(ioe.getMessage());
-            Response response = getResponse();
-            response.setStatus(Status.CLIENT_ERROR_BAD_REQUEST, ioe);
-            return new EmptyRepresentation();
-        }
 
-        ArtifactDatabase db = (ArtifactDatabase)getContext()
-            .getAttributes().get("database");
-
+    /**
+     * Returns the identifier of the collection.
+     *
+     * @return the identifier of the collection.
+     */
+    protected String getIdentifier() {
         Request request = getRequest();
 
-        String identifier = (String)request.getAttributes().get("uuid");
-
-        if (logger.isDebugEnabled()) {
-            logger.debug("looking for artifact id '" + identifier + "'");
-        }
-
-        String mimeTypeString = XMLUtils.xpathString(
-            inputDocument,
-            XPATH_MIME_TYPE,
-            ArtifactNamespaceContext.INSTANCE);
-
-        MediaType mimeType = DEFAULT_MIME_TYPE;
+        return (String) request.getAttributes().get("uuid");
+    }
 
-        if (mimeTypeString != null && mimeTypeString.length() != 0) {
-            try {
-                mimeType = MediaType.valueOf(mimeTypeString);
-            }
-            catch (Exception e) {
-                logger.error(e.getLocalizedMessage());
-            }
-        }
 
-        try {
-            return new OutRepresentation(
-                mimeType,
-                db.out(identifier, inputDocument, getCallMeta()));
-        }
-        catch (ArtifactDatabaseException adbe) {
-            Response response = getResponse();
-            response.setStatus(
-                Status.CLIENT_ERROR_NOT_FOUND, adbe.getMessage());
-            return new EmptyRepresentation();
-        }
+    /**
+     * Call the ArtifactDatabase.out method.
+     */
+    protected ArtifactDatabase.DeferredOutput doOut(
+        String           identifier,
+        Document         input,
+        ArtifactDatabase db,
+        CallMeta         meta)
+    throws ArtifactDatabaseException
+    {
+        logger.debug("ArtifactOutResource.doOut");
+
+        return db.out(identifier, input, meta);
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/BaseOutResource.java	Wed Mar 02 16:02:47 2011 +0000
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2011 by Intevation GmbH
+ *
+ * This program is free software under the LGPL (>=v2.1)
+ * Read the file LGPL.txt coming with the software for details
+ * or visit http://www.gnu.org/licenses/ if it does not exist.
+ */
+package de.intevation.artifactdatabase.rest;
+
+import de.intevation.artifactdatabase.XMLUtils;
+
+import de.intevation.artifacts.ArtifactDatabase;
+import de.intevation.artifacts.ArtifactDatabaseException;
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallMeta;
+
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Request;
+import org.restlet.Response;
+
+import org.restlet.data.MediaType;
+import org.restlet.data.Status;
+
+import org.restlet.ext.xml.DomRepresentation;
+
+import org.restlet.representation.EmptyRepresentation;
+import org.restlet.representation.Representation;
+
+import org.restlet.resource.ResourceException;
+
+import org.w3c.dom.Document;
+
+
+/**
+ * Base Resource to serve the out()-outputs of collections and artifacts.
+ *
+ * @author <a href="mailto:ingo.weinzierl@intevation">Ingo Weinzierl</a>
+ */
+public abstract class BaseOutResource
+extends               BaseResource
+{
+    /** The logger used in this class.*/
+    private static Logger logger = Logger.getLogger(BaseOutResource.class);
+
+    /** XPath to figure out the MIME type of the requested result.*/
+    public static final String XPATH_MIME_TYPE =
+        "/art:action/art:out/art:mime-type/@value";
+
+    /** Default result MIME type: octet stream.*/
+    public static final MediaType DEFAULT_MIME_TYPE =
+        MediaType.APPLICATION_OCTET_STREAM;
+
+
+    @Override
+    protected Representation innerPost(Representation requestRepr)
+    throws    ResourceException
+    {
+        Document inputDocument = null;
+
+        try {
+            DomRepresentation input = new DomRepresentation(requestRepr);
+            input.setNamespaceAware(true);
+            inputDocument = input.getDocument();
+        }
+        catch (IOException ioe) {
+            logger.error(ioe.getMessage());
+            Response response = getResponse();
+            response.setStatus(Status.CLIENT_ERROR_BAD_REQUEST, ioe);
+            return new EmptyRepresentation();
+        }
+
+        ArtifactDatabase db = getArtifactDatabase();
+
+        Request request = getRequest();
+
+        String identifier = getIdentifier();
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("looking for artifact id '" + identifier + "'");
+        }
+
+        String mimeTypeString = XMLUtils.xpathString(
+            inputDocument,
+            XPATH_MIME_TYPE,
+            ArtifactNamespaceContext.INSTANCE);
+
+        MediaType mimeType = DEFAULT_MIME_TYPE;
+
+        if (mimeTypeString != null && mimeTypeString.length() != 0) {
+            try {
+                mimeType = MediaType.valueOf(mimeTypeString);
+            }
+            catch (Exception e) {
+                logger.error(e.getLocalizedMessage());
+            }
+        }
+
+        try {
+            return new OutRepresentation(
+                mimeType,
+                doOut(identifier, inputDocument, db, getCallMeta()));
+        }
+        catch (ArtifactDatabaseException adbe) {
+            Response response = getResponse();
+            response.setStatus(
+                Status.CLIENT_ERROR_NOT_FOUND, adbe.getMessage());
+            return new EmptyRepresentation();
+        }
+    }
+
+    /**
+     * Returns the identifier of the artifact or collection.
+     *
+     * @return the identifier.
+     */
+    protected abstract String getIdentifier();
+
+    /**
+     * This method is called to process the operation on artifacts or
+     * collections.
+     *
+     * @param identifier The identifier of the artifact or collection.
+     * @param input The input document of the request.
+     * @param db The artifact database.
+     * @param meta The CallMeta object.
+     *
+     * @return the result of the operation.
+     */
+    protected abstract ArtifactDatabase.DeferredOutput doOut(
+        String           identifier,
+        Document         input,
+        ArtifactDatabase db,
+        CallMeta         meta)
+    throws ArtifactDatabaseException;
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/CollectionOutResource.java	Wed Mar 02 16:02:47 2011 +0000
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2011 by Intevation GmbH
+ *
+ * This program is free software under the LGPL (>=v2.1)
+ * Read the file LGPL.txt coming with the software for details
+ * or visit http://www.gnu.org/licenses/ if it does not exist.
+ */
+package de.intevation.artifactdatabase.rest;
+
+import de.intevation.artifacts.ArtifactDatabase;
+import de.intevation.artifacts.ArtifactDatabaseException;
+import de.intevation.artifacts.CallMeta;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Request;
+
+import org.w3c.dom.Document;
+
+
+/**
+ * Resource to serve the out()-outputs of collections.
+ *
+ * @author <a href="mailto:ingo.weinzierl@intevation">Ingo Weinzierl</a>
+ */
+public class CollectionOutResource
+extends      BaseOutResource
+{
+    /** The logger used in this class.*/
+    private static Logger logger = Logger.getLogger(CollectionOutResource.class);
+
+    /** server URL where to find the resource.*/
+    public static final String PATH = "/collection/{uuid}/{type}";
+
+
+    /**
+     * Returns the identifier of the collection.
+     *
+     * @return the identifier of the collection.
+     */
+    protected String getIdentifier() {
+        Request request = getRequest();
+
+        return (String) request.getAttributes().get("uuid");
+    }
+
+
+    /**
+     * Call the ArtifactDatabase.outCollection method.
+     */
+    protected ArtifactDatabase.DeferredOutput doOut(
+        String           identifier,
+        Document         input,
+        ArtifactDatabase db,
+        CallMeta         meta)
+    throws ArtifactDatabaseException
+    {
+        logger.debug("CollectionOutResource.doOut");
+
+        return db.outCollection(identifier, input, meta);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java	Wed Mar 02 15:10:34 2011 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java	Wed Mar 02 16:02:47 2011 +0000
@@ -82,6 +82,8 @@
             ListCollectionsResource.PATH, ListCollectionsResource.class);
         router.attach(
             CollectionResource.PATH, CollectionResource.class);
+        router.attach(
+            CollectionOutResource.PATH, CollectionOutResource.class);
 
         return router;
     }

http://dive4elements.wald.intevation.org