diff artifact-database/src/main/java/de/intevation/artifactdatabase/ArtifactDatabaseImpl.java @ 219:cabe4c02ab64

Refactored the CallContextImpl - there are two concrete classes for Artifacts and ArtifactCollections now. artifacts/trunk@1559 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 24 Mar 2011 16:16:51 +0000
parents b2115f484edb
children 98695dc6d94d
line wrap: on
line diff
--- a/artifact-database/src/main/java/de/intevation/artifactdatabase/ArtifactDatabaseImpl.java	Thu Mar 24 15:48:26 2011 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/ArtifactDatabaseImpl.java	Thu Mar 24 16:16:51 2011 +0000
@@ -88,21 +88,6 @@
         "No such artifact";
 
     /**
-     * Error message issued if one tries to remove a requested artifact
-     * from the list of artifacts running in background which is
-     * not in this list.
-     */
-    public static final String NOT_IN_BACKGROUND =
-        "Not in background";
-
-    /**
-     * Error message issued if an artifact wants to translate itself
-     * into a none valid persistent state.
-     */
-    public static final String INVALID_CALL_STATE =
-        "Invalid after call state";
-
-    /**
      * Error message issued if the creation of an artifact failed.
      */
     public static final String CREATION_FAILED =
@@ -231,120 +216,6 @@
 
 
     /**
-     * Inner class that implements the call context handed
-     * to the methods calls describe(), feed(), etc. of the artifact.
-     */
-    public class CallContextImpl
-    implements   CallContext
-    {
-        /**
-         * The persistence wrapper around the living artifact
-         */
-        protected PersistentArtifact artifact;
-        /**
-         * The action to be performed after the artifact calls
-         * desribe(), feed(), etc. return.
-         */
-        protected int                action;
-        /**
-         * The meta information of the concrete call
-         * (preferred languages et. al.)
-         */
-        protected CallMeta           callMeta;
-        /**
-         * Map to act like a clipboard when nesting calls
-         * like a proxy artifact.
-         */
-        protected HashMap            customValues;
-
-        /**
-         * Constructor to create a call context with a given
-         * persistent artifact, a default action and meta informations.
-         * @param artifact The persistent wrapper around a living artifact.
-         * @param action   The action to be performed after the concrete
-         * artifact call has returned.
-         * @param callMeta The meta information for this call context.
-         */
-        public CallContextImpl(
-            PersistentArtifact artifact,
-            int                action,
-            CallMeta           callMeta
-        ) {
-            this.artifact = artifact;
-            this.action   = action;
-            this.callMeta = callMeta;
-        }
-
-        public void afterCall(int action) {
-            this.action = action;
-            if (action == BACKGROUND) {
-                addIdToBackground(artifact.getId());
-            }
-        }
-
-        public void afterBackground(int action) {
-            if (this.action != BACKGROUND) {
-                throw new IllegalStateException(NOT_IN_BACKGROUND);
-            }
-            fromBackground(artifact, action);
-        }
-
-        public Object globalContext() {
-            return context;
-        }
-
-        public ArtifactDatabase getDatabase() {
-            return ArtifactDatabaseImpl.this;
-        }
-
-        public CallMeta getMeta() {
-            return callMeta;
-        }
-
-        public Long getTimeToLive() {
-            return artifact.getTTL();
-        }
-
-        /**
-         * Dispatches and executes the persistence action after
-         * the return of the concrete artifact call.
-         */
-        public void postCall() {
-            switch (action) {
-                case NOTHING:
-                    break;
-                case TOUCH:
-                    artifact.touch();
-                    break;
-                case STORE:
-                    artifact.store();
-                    break;
-                case BACKGROUND:
-                    logger.warn(
-                        "BACKGROUND processing is not fully implemented, yet!");
-                    artifact.store();
-                    break;
-                default:
-                    logger.error(INVALID_CALL_STATE + ": " + action);
-                    throw new IllegalStateException(INVALID_CALL_STATE);
-            }
-        }
-
-        public Object getContextValue(Object key) {
-            return customValues != null
-                ? customValues.get(key)
-                : null;
-        }
-
-        public Object putContextValue(Object key, Object value) {
-            if (customValues == null) {
-                customValues = new HashMap();
-            }
-            return customValues.put(key, value);
-        }
-    } // class CallContextImpl
-
-    /**
      * This inner class allows the deferral of writing the output
      * of the artifact's out() call.
      */
@@ -390,8 +261,12 @@
 
         public void write(OutputStream output) throws IOException {
 
-            CallContextImpl cc = new CallContextImpl(
-                artifact, CallContext.TOUCH, callMeta);
+            ArtifactCallContext cc = new ArtifactCallContext(
+                ArtifactDatabaseImpl.this,
+                CallContext.TOUCH,
+                callMeta,
+                context,
+                artifact);
 
             try {
                 artifact.getArtifact().out(format, output, cc);
@@ -697,8 +572,12 @@
             throw new ArtifactDatabaseException(CREATION_FAILED);
         }
 
-        CallContextImpl cc = new CallContextImpl(
-            persistentArtifact, CallContext.NOTHING, callMeta);
+        ArtifactCallContext cc = new ArtifactCallContext(
+            ArtifactDatabaseImpl.this,
+            CallContext.NOTHING,
+            callMeta,
+            context,
+            persistentArtifact);
 
         try {
             return artifact.describe(null, cc);
@@ -722,8 +601,12 @@
             throw new ArtifactDatabaseException(NO_SUCH_ARTIFACT);
         }
 
-        CallContextImpl cc = new CallContextImpl(
-            artifact, CallContext.TOUCH, callMeta);
+        ArtifactCallContext cc = new ArtifactCallContext(
+            ArtifactDatabaseImpl.this,
+            CallContext.TOUCH,
+            callMeta,
+            context,
+            artifact);
 
         try {
             return artifact.getArtifact().describe(data, cc);
@@ -747,8 +630,12 @@
             throw new ArtifactDatabaseException(NO_SUCH_ARTIFACT);
         }
 
-        CallContextImpl cc = new CallContextImpl(
-            artifact, CallContext.STORE, callMeta);
+        ArtifactCallContext cc = new ArtifactCallContext(
+            ArtifactDatabaseImpl.this,
+            CallContext.STORE,
+            callMeta,
+            context,
+            artifact);
 
         try {
             return artifact.getArtifact().advance(target, cc);
@@ -768,8 +655,12 @@
             throw new ArtifactDatabaseException(NO_SUCH_ARTIFACT);
         }
 
-        CallContextImpl cc = new CallContextImpl(
-            artifact, CallContext.STORE, callMeta);
+        ArtifactCallContext cc = new ArtifactCallContext(
+            ArtifactDatabaseImpl.this,
+            CallContext.STORE,
+            callMeta,
+            context,
+            artifact);
 
         try {
             return artifact.getArtifact().feed(data, cc);
@@ -969,8 +860,12 @@
             throw new ArtifactDatabaseException(CREATION_FAILED);
         }
 
-        CallContextImpl cc = new CallContextImpl(
-            persistentArtifact, CallContext.NOTHING, callMeta);
+        ArtifactCallContext cc = new ArtifactCallContext(
+            ArtifactDatabaseImpl.this,
+            CallContext.NOTHING,
+            callMeta,
+            context,
+            persistentArtifact);
 
         try {
             return artifact.describe(input, cc);
@@ -1263,8 +1158,32 @@
         throws ArtifactDatabaseException
     {
         logger.debug("Describe collection: " + collectionId);
+        ArtifactCollectionFactory acf = getArtifactCollectionFactory();
 
-        throw new ArtifactDatabaseException("Not implemented yet.");
+        if (acf == null) {
+            throw new ArtifactDatabaseException(NO_SUCH_FACTORY);
+        }
+
+        UserFactory uf = getUserFactory();
+        if (uf == null) {
+            throw new ArtifactDatabaseException(NO_SUCH_FACTORY);
+        }
+
+        ArtifactCollection c = backend.getCollection(
+            collectionId, acf, uf, context);
+
+        if (c == null) {
+            logger.warn("No collection found with identifier: " + collectionId);
+        }
+
+        CallContext cc = new CollectionCallContext(
+            ArtifactDatabaseImpl.this,
+            CallContext.NOTHING,
+            callMeta,
+            context,
+            c);
+
+        return c.describe(cc);
     }
 
     public Document getCollectionAttribute(String collectionId, String artifactId,

http://dive4elements.wald.intevation.org