Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java	(working copy)
@@ -22,20 +22,20 @@
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
-import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
 import org.apache.jackrabbit.core.nodetype.NodeDefId;
 import org.apache.jackrabbit.core.nodetype.PropDefId;
 import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager;
+import org.apache.jackrabbit.core.persistence.PMContext;
+import org.apache.jackrabbit.core.persistence.util.BLOBStore;
+import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
+import org.apache.jackrabbit.core.persistence.util.ResourceBasedBLOBStore;
+import org.apache.jackrabbit.core.persistence.util.CloseableBLOBStore;
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.NodeReferencesId;
 import org.apache.jackrabbit.core.state.NodeState;
-import org.apache.jackrabbit.core.persistence.PMContext;
 import org.apache.jackrabbit.core.state.PropertyState;
-import org.apache.jackrabbit.core.persistence.util.BLOBStore;
-import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
-import org.apache.jackrabbit.core.persistence.util.ResourceBasedBLOBStore;
 import org.apache.jackrabbit.core.util.DOMWalker;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
@@ -44,9 +44,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.PropertyType;
 import java.io.BufferedWriter;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -60,6 +58,8 @@
 import java.util.Iterator;
 import java.util.Set;
 
+import javax.jcr.PropertyType;
+
 /**
  * <code>XMLPersistenceManager</code> is a <code>FileSystem</code>-based
  * <code>PersistenceManager</code> that persists <code>ItemState</code>
@@ -116,8 +116,7 @@
 
     // file system where the item state is stored
     private FileSystem itemStateFS;
-    // file system where BLOB data is stored
-    private FileSystem blobFS;
+
     // BLOBStore that manages BLOB data in the file system
     private BLOBStore blobStore;
 
@@ -387,15 +386,13 @@
 
         itemStateFS = new BasedFileSystem(context.getFileSystem(), "/data");
 
-        /**
-         * store BLOB data in local file system in a sub directory
-         * of the workspace home directory
-         */
-        LocalFileSystem blobFS = new LocalFileSystem();
-        blobFS.setRoot(new File(context.getHomeDir(), "blobs"));
-        blobFS.init();
-        this.blobFS = blobFS;
-        blobStore = new FileSystemBLOBStore(blobFS);
+        if (context.getBlobStoreConfig() == null) {
+            // backward compatibility
+            blobStore = new FileSystemBLOBStore();
+        } else {
+            blobStore = (BLOBStore) context.getBlobStoreConfig().newInstance();
+        }
+        blobStore.init(context);
 
         initialized = true;
     }
@@ -409,10 +406,12 @@
         }
 
         try {
-            // close BLOB file system
-            blobFS.close();
-            blobFS = null;
+            // close BLOB store
+            if (blobStore instanceof CloseableBLOBStore) {
+                ((CloseableBLOBStore) blobStore).close();
+            }
             blobStore = null;
+
             /**
              * there's no need close the item state store because it
              * is based in the workspace's file system which is
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/PMContext.java	(working copy)
@@ -16,14 +16,15 @@
  */
 package org.apache.jackrabbit.core.persistence;
 
+import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.config.BlobStoreConfig;
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
-import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.core.persistence.PersistenceManager;
 
-import javax.jcr.NamespaceRegistry;
 import java.io.File;
 
+import javax.jcr.NamespaceRegistry;
+
 /**
  * A <code>PMContext</code> is used to provide context information for a
  * <code>PersistenceManager</code>.
@@ -58,6 +59,11 @@
     private final NodeId rootNodeId;
 
     /**
+     * the blobstore configuration
+     */
+    private final BlobStoreConfig blobStoreConfig;
+
+    /**
      * Creates a new <code>PMContext</code>.
      *
      * @param homeDir the physical home directory
@@ -65,17 +71,20 @@
      * @param rootNodeId id of the root node
      * @param nsReg        namespace registry
      * @param ntReg        node type registry
+     * @param blobStoreConfig the blobstore configuration
      */
     public PMContext(File homeDir,
                      FileSystem fs,
                      NodeId rootNodeId,
                      NamespaceRegistry nsReg,
-                     NodeTypeRegistry ntReg) {
+                     NodeTypeRegistry ntReg,
+                     BlobStoreConfig blobStoreConfig) {
         this.physicalHomeDir = homeDir;
         this.fs = fs;
         this.rootNodeId = rootNodeId;
         this.nsReg = nsReg;
         this.ntReg = ntReg;
+        this.blobStoreConfig = blobStoreConfig;
     }
 
 
@@ -120,4 +129,12 @@
     public NodeTypeRegistry getNodeTypeRegistry() {
         return ntReg;
     }
+
+    /**
+     * Returns the blobstore config.
+     * @return the blobstore config.
+     */
+    public BlobStoreConfig getBlobStoreConfig() {
+        return blobStoreConfig;
+    }
 }
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java	(working copy)
@@ -18,11 +18,10 @@
 
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.PropertyId;
-import org.apache.jackrabbit.core.fs.FileSystem;
-import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
 import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager;
 import org.apache.jackrabbit.core.persistence.PMContext;
 import org.apache.jackrabbit.core.persistence.util.BLOBStore;
+import org.apache.jackrabbit.core.persistence.util.CloseableBLOBStore;
 import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
 import org.apache.jackrabbit.core.persistence.util.Serializer;
 import org.apache.jackrabbit.core.state.ChangeLog;
@@ -39,12 +38,9 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -58,6 +54,9 @@
 import java.util.HashMap;
 import java.util.Iterator;
 
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+
 /**
  * Abstract base class for database persistence managers. This class
  * contains common functionality for database persistence manager subclasses
@@ -129,14 +128,7 @@
     protected String blobSelectExistSQL;
     protected String blobDeleteSQL;
 
-
-
     /**
-     * file system where BLOB data is stored
-     * (if <code>externalBLOBs==true</code>)
-     */
-    protected FileSystem blobFS;
-    /**
      * BLOBStore that manages BLOB data in the file system
      * (if <code>externalBLOBs==true</code>)
      */
@@ -207,22 +199,24 @@
         // prepare statements
         initPreparedStatements();
 
-        if (externalBLOBs) {
-            /**
-             * store BLOBs in local file system in a sub directory
-             * of the workspace home directory
-             */
-            LocalFileSystem blobFS = new LocalFileSystem();
-            blobFS.setRoot(new File(context.getHomeDir(), "blobs"));
-            blobFS.init();
-            this.blobFS = blobFS;
-            blobStore = new FileSystemBLOBStore(blobFS);
+        if (context.getBlobStoreConfig() == null) {
+            // backward compatibility
+            if (externalBLOBs) {
+                /*
+                 * store BLOBs in local file system in a sub directory
+                 * of the workspace home directory
+                 */
+                blobStore = new FileSystemBLOBStore();
+            } else {
+                /*
+                 * store BLOBs in db
+                 */
+                blobStore = new DbBLOBStore();
+            }
         } else {
-            /**
-             * store BLOBs in db
-             */
-            blobStore = new DbBLOBStore();
+            blobStore = (BLOBStore) context.getBlobStoreConfig().newInstance();
         }
+        blobStore.init(context);
 
         initialized = true;
     }
@@ -242,10 +236,8 @@
             }
             preparedStatements.clear();
 
-            if (externalBLOBs) {
-                // close BLOB file system
-                blobFS.close();
-                blobFS = null;
+            if (blobStore instanceof CloseableBLOBStore) {
+                ((CloseableBLOBStore) blobStore).close();
             }
             blobStore = null;
 
@@ -1166,9 +1158,17 @@
     }
 
     class DbBLOBStore implements BLOBStore {
+
         /**
          * {@inheritDoc}
          */
+        public void init(PMContext context) throws Exception {
+            // nothing to do
+        }
+
+        /**
+         * {@inheritDoc}
+         */
         public String createId(PropertyId id, int index) {
             // the blobId is a simple string concatenation of id plus index
             StringBuffer sb = new StringBuffer();
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/obj/ObjectPersistenceManager.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/obj/ObjectPersistenceManager.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/obj/ObjectPersistenceManager.java	(working copy)
@@ -22,10 +22,10 @@
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
-import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
 import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager;
 import org.apache.jackrabbit.core.persistence.PMContext;
 import org.apache.jackrabbit.core.persistence.util.BLOBStore;
+import org.apache.jackrabbit.core.persistence.util.CloseableBLOBStore;
 import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
 import org.apache.jackrabbit.core.persistence.util.Serializer;
 import org.apache.jackrabbit.core.state.ItemStateException;
@@ -39,14 +39,14 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.PropertyType;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
-import java.io.File;
 import java.io.OutputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 
+import javax.jcr.PropertyType;
+
 /**
  * <code>ObjectPersistenceManager</code> is a <code>FileSystem</code>-based
  * <code>PersistenceManager</code> that persists <code>ItemState</code>
@@ -70,8 +70,7 @@
 
     // file system where the item state is stored
     private FileSystem itemStateFS;
-    // file system where BLOB data is stored
-    private FileSystem blobFS;
+
     // BLOBStore that manages BLOB data in the file system
     private BLOBStore blobStore;
 
@@ -142,15 +141,13 @@
         FileSystem wspFS = context.getFileSystem();
         itemStateFS = new BasedFileSystem(wspFS, "/data");
 
-        /**
-         * store BLOB data in local file system in a sub directory
-         * of the workspace home directory
-         */
-        LocalFileSystem blobFS = new LocalFileSystem();
-        blobFS.setRoot(new File(context.getHomeDir(), "blobs"));
-        blobFS.init();
-        this.blobFS = blobFS;
-        blobStore = new FileSystemBLOBStore(blobFS);
+        if (context.getBlobStoreConfig() == null) {
+            // backward compatibility
+            blobStore = new FileSystemBLOBStore();
+        } else {
+            blobStore = (BLOBStore) context.getBlobStoreConfig().newInstance();
+        }
+        blobStore.init(context);
 
         initialized = true;
     }
@@ -164,9 +161,10 @@
         }
 
         try {
-            // close BLOB file system
-            blobFS.close();
-            blobFS = null;
+            // close BLOB store
+            if (blobStore instanceof CloseableBLOBStore) {
+                ((CloseableBLOBStore) blobStore).close();
+            }
             blobStore = null;
             /**
              * there's no need close the item state store because it
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileSystemBLOBStore.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileSystemBLOBStore.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/FileSystemBLOBStore.java	(working copy)
@@ -17,34 +17,69 @@
 package org.apache.jackrabbit.core.persistence.util;
 
 import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.config.BlobStoreConfig;
+import org.apache.jackrabbit.core.config.FileSystemConfig;
 import org.apache.jackrabbit.core.fs.FileSystem;
+import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.FileSystemPathUtil;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
+import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
+import org.apache.jackrabbit.core.persistence.PMContext;
 
 import java.io.BufferedOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.File;
 
 /**
  * <code>FileSystemBLOBStore</code> is a <code>ResourceBasedBLOBStore</code>
  * implementation that stores BLOB data in a <code>FileSystem</code>.
  */
-public class FileSystemBLOBStore implements ResourceBasedBLOBStore {
+public class FileSystemBLOBStore implements ResourceBasedBLOBStore,
+        CloseableBLOBStore {
 
     /**
      * the file system where the BLOBs are stored
      */
-    private final FileSystem fs;
+    private FileSystem fs;
 
     /**
-     * Creates a new <code>FileSystemBLOBStore</code> instance.
-     *
-     * @param fs file system for storing the BLOB data
+     * {@inheritDoc}
      */
-    public FileSystemBLOBStore(FileSystem fs) {
-        this.fs = fs;
+    public void init(PMContext context) throws Exception{
+        BlobStoreConfig bsc = context.getBlobStoreConfig();
+        FileSystemConfig fsc = bsc == null
+                ? null
+                : context.getBlobStoreConfig().getFileSystemConfig();
+        if (fsc == null) {
+            fs = new LocalFileSystem();
+            ((LocalFileSystem) fs).setRoot(new File(context.getHomeDir(), "blobs"));
+            fs.init();
+        } else {
+            fs = fsc.createFileSystem();
+        }
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public void close(){
+        try {
+            fs.close();
+            fs = null;
+        } catch (FileSystemException e) {
+            // ignore
+        }
+    }
+
+    /**
+     * Returns the filesystem on which this blobstore is based on.
+     * @return the filesystem on which this blobstore is based on.
+     */
+    public FileSystem getFileSystem() {
+        return fs;
+    }
+
     //------------------------------------------------------------< BLOBStore >
     /**
      * {@inheritDoc}
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/CloseableBLOBStore.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/CloseableBLOBStore.java	(revision 0)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/CloseableBLOBStore.java	(revision 0)
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.persistence.util;
+
+/**
+ * Implements a marker interface for {@link BLOBStore}s that need to be
+ * closed after usage.
+ */
+public interface CloseableBLOBStore extends BLOBStore {
+
+    /**
+     * Closes the blobstore.
+     */
+    void close();
+}
\ No newline at end of file

Property changes on: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/CloseableBLOBStore.java
___________________________________________________________________
Name: svn:keywords
   + author date id revision url rev
Name: svn:eol-style
   + native

Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BLOBStore.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BLOBStore.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BLOBStore.java	(working copy)
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.core.persistence.util;
 
 import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.persistence.PMContext;
 
 import java.io.InputStream;
 
@@ -27,7 +28,16 @@
  * @see ResourceBasedBLOBStore
  */
 public interface BLOBStore {
+
     /**
+     * Initializes this BLOBStore.
+     * @param context the persistence manager context that contains various
+     *        information of how to use this blob store.
+     * @throws Exception if an error occured.
+     */
+    void init(PMContext context) throws Exception;
+
+    /**
      * Creates a unique identifier for the BLOB data associated with the given
      * property id and value subscript.
      *
@@ -69,4 +79,5 @@
      * @throws Exception if an error occured
      */
     boolean remove(String blobId) throws Exception;
+
 }
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/mem/InMemPersistenceManager.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/mem/InMemPersistenceManager.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/mem/InMemPersistenceManager.java	(working copy)
@@ -22,36 +22,36 @@
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.FileSystemPathUtil;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
-import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
 import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager;
 import org.apache.jackrabbit.core.persistence.PMContext;
 import org.apache.jackrabbit.core.persistence.util.BLOBStore;
+import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
+import org.apache.jackrabbit.core.persistence.util.Serializer;
+import org.apache.jackrabbit.core.persistence.util.CloseableBLOBStore;
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.NodeReferencesId;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
-import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
-import org.apache.jackrabbit.core.persistence.util.Serializer;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.name.QName;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.PropertyType;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
-import java.io.File;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
+import javax.jcr.PropertyType;
+
 /**
  * <code>InMemPersistenceManager</code> is a very simple <code>HashMap</code>-based
  * <code>PersistenceManager</code> for Jackrabbit that keeps all data in memory
@@ -86,8 +86,6 @@
     protected static final byte NODE_ENTRY = 0;
     protected static final byte PROP_ENTRY = 1;
 
-    // file system where BLOB data is stored
-    protected FileSystem blobFS;
     // BLOBStore that manages BLOB data in the file system
     protected BLOBStore blobStore;
 
@@ -298,15 +296,13 @@
 
         wspFS = context.getFileSystem();
 
-        /**
-         * store BLOB data in local file system in a sub directory
-         * of the workspace home directory
-         */
-        LocalFileSystem blobFS = new LocalFileSystem();
-        blobFS.setRoot(new File(context.getHomeDir(), "blobs"));
-        blobFS.init();
-        this.blobFS = blobFS;
-        blobStore = new FileSystemBLOBStore(blobFS);
+        if (context.getBlobStoreConfig() == null) {
+            // backward compatibility
+            blobStore = new FileSystemBLOBStore();
+        } else {
+            blobStore = (BLOBStore) context.getBlobStoreConfig().newInstance();
+        }
+        blobStore.init(context);
 
         if (persistent) {
             // deserialize contents of state and refs stores
@@ -330,23 +326,28 @@
                 storeContents();
             } else {
                 // clear out blob store
-                try {
-                    String[] folders = blobFS.listFolders("/");
-                    for (int i = 0; i < folders.length; i++) {
-                        blobFS.deleteFolder(folders[i]);
+                if (blobStore instanceof FileSystemBLOBStore) {
+                    FileSystem blobFS =
+                            ((FileSystemBLOBStore) blobStore).getFileSystem();
+                    try {
+                        String[] folders = blobFS.listFolders("/");
+                        for (int i = 0; i < folders.length; i++) {
+                            blobFS.deleteFolder(folders[i]);
+                        }
+                        String[] files = blobFS.listFiles("/");
+                        for (int i = 0; i < files.length; i++) {
+                            blobFS.deleteFile(files[i]);
+                        }
+                    } catch (Exception e) {
+                        // ignore
                     }
-                    String[] files = blobFS.listFiles("/");
-                    for (int i = 0; i < files.length; i++) {
-                        blobFS.deleteFile(files[i]);
-                    }
-                } catch (Exception e) {
-                    // ignore
                 }
             }
 
-            // close BLOB file system
-            blobFS.close();
-            blobFS = null;
+            // close BLOB store
+            if (blobStore instanceof CloseableBLOBStore) {
+                ((CloseableBLOBStore) blobStore).close();
+            }
             blobStore = null;
 
             stateStore.clear();
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PMContext.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PMContext.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PMContext.java	(working copy)
@@ -17,12 +17,14 @@
 package org.apache.jackrabbit.core.state;
 
 import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.config.BlobStoreConfig;
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 
-import javax.jcr.NamespaceRegistry;
 import java.io.File;
 
+import javax.jcr.NamespaceRegistry;
+
 /**
  * Legacy class kept for backward compatibility reasons.
  * @deprecated use {@link org.apache.jackrabbit.core.persistence.PMContext}
@@ -31,7 +33,8 @@
 public class PMContext extends org.apache.jackrabbit.core.persistence.PMContext {
 
     public PMContext(File homeDir, FileSystem fs, NodeId rootNodeId,
-                         NamespaceRegistry nsReg, NodeTypeRegistry ntReg) {
-        super(homeDir, fs, rootNodeId, nsReg, ntReg);
+                         NamespaceRegistry nsReg, NodeTypeRegistry ntReg,
+                         BlobStoreConfig bsc) {
+        super(homeDir, fs, rootNodeId, nsReg, ntReg, bsc);
     }
 }
\ No newline at end of file
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/util/FileSystemBLOBStore.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/util/FileSystemBLOBStore.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/util/FileSystemBLOBStore.java	(working copy)
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.core.state.util;
 
-import org.apache.jackrabbit.core.fs.FileSystem;
-
 /**
  * Legacy class kept for backward compatibility reasons.
  * @deprecated use {@link org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore}
@@ -25,7 +23,4 @@
  */
 public class FileSystemBLOBStore extends org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore {
 
-    public FileSystemBLOBStore(FileSystem fs) {
-        super(fs);
-    }
 }
\ No newline at end of file
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java	(working copy)
@@ -1161,7 +1161,8 @@
             throws RepositoryException {
         try {
             PersistenceManager pm = (PersistenceManager) pmConfig.newInstance();
-            pm.init(new PMContext(homeDir, fs, rootNodeId, nsReg, ntReg));
+            pm.init(new PMContext(homeDir, fs, rootNodeId, nsReg, ntReg,
+                    pmConfig.getBlobStoreConfig()));
             return pm;
         } catch (Exception e) {
             String msg = "Cannot instantiate persistence manager " + pmConfig.getClassName();
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/PersistenceManagerConfig.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/PersistenceManagerConfig.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/PersistenceManagerConfig.java	(working copy)
@@ -28,13 +28,27 @@
 public class PersistenceManagerConfig extends BeanConfig {
 
     /**
+     * BlobStore configuration
+     */
+    private final BlobStoreConfig bsc;
+
+    /**
      * Creates a persistence manager configuration object from the
      * given bean configuration.
      *
      * @param config bean configuration
+     * @param bsc the blobstore configuration
      */
-    public PersistenceManagerConfig(BeanConfig config) {
+    public PersistenceManagerConfig(BeanConfig config, BlobStoreConfig bsc) {
         super(config);
+        this.bsc = bsc;
     }
 
+    /**
+     * Retrusn the BlobStore configuration
+     * @return the BlobStore configuration
+     */
+    public BlobStoreConfig getBlobStoreConfig() {
+        return bsc;
+    }
 }
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/BlobStoreConfig.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/BlobStoreConfig.java	(revision 0)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/BlobStoreConfig.java	(revision 0)
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.config;
+
+/**
+ * BlobStore configuration. This bean configuration class
+ * is used to create configured BlobStore objects.
+ * <p>
+ * This class is currently only used to assign a static type to
+ * more generic bean configuration information.
+ *
+ * @see PersistenceManagerConfig#getBlobStoreConfig
+ */
+public class BlobStoreConfig extends BeanConfig {
+
+    /**
+     * Optional filesytem config.
+     */
+    private final FileSystemConfig fsc;
+
+    /**
+     * Creates a BlobStore configuration object from the
+     * given bean configuration.
+     *
+     * @param config bean configuration
+     * @param fsc the filesystem config.
+     */
+    public BlobStoreConfig(BeanConfig config, FileSystemConfig fsc) {
+        super(config);
+        this.fsc = fsc;
+    }
+
+    /**
+     * Returns the filesystem configuration or <code>null</code> if non configured.
+     * @return the filesystem configuration or <code>null</code> if non configured.
+     */
+    public FileSystemConfig getFileSystemConfig() {
+        return fsc;
+    }
+}
\ No newline at end of file

Property changes on: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/BlobStoreConfig.java
___________________________________________________________________
Name: svn:keywords
   + author date id revision url rev
Name: svn:eol-style
   + native

Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/RepositoryConfigurationParser.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/RepositoryConfigurationParser.java	(revision 486683)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/RepositoryConfigurationParser.java	(working copy)
@@ -16,14 +16,14 @@
  */
 package org.apache.jackrabbit.core.config;
 
-import java.io.File;
-import java.util.Properties;
-
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
+import java.io.File;
+import java.util.Properties;
+
 /**
  * Configuration parser. This class is used to parse the repository and
  * workspace configuration files.
@@ -83,6 +83,9 @@
     public static final String PERSISTENCE_MANAGER_ELEMENT =
         "PersistenceManager";
 
+    /** Name of the blobstore configuration element. */
+    public static final String BLOB_STORE_ELEMENT = "BlobStore";
+
     /** Name of the search index configuration element. */
     public static final String SEARCH_INDEX_ELEMENT = "SearchIndex";
 
@@ -513,11 +516,37 @@
      */
     protected PersistenceManagerConfig parsePersistenceManagerConfig(
             Element parent) throws ConfigurationException {
+        // get the persistence manager element
+        Element pmElem = getElement(parent, PERSISTENCE_MANAGER_ELEMENT);
+        BlobStoreConfig bsc = parseBlobStoreConfig(pmElem);
         return new PersistenceManagerConfig(
-                parseBeanConfig(parent, PERSISTENCE_MANAGER_ELEMENT));
+                parseBeanConfig(parent, PERSISTENCE_MANAGER_ELEMENT), bsc);
     }
 
     /**
+     * Parses the PersistenceManager config.
+     *
+     * @param parent parent of the <code>BlobStore</code> element
+     * @return blobstore configuration or <code>null</code> if none defined.
+     * @throws ConfigurationException if the configuration is broken
+     */
+    protected BlobStoreConfig parseBlobStoreConfig(Element parent)
+            throws ConfigurationException {
+        Element bsc = getElement(parent, BLOB_STORE_ELEMENT, false);
+        if (bsc != null) {
+            FileSystemConfig fsc = null;
+            if (getElement(bsc, FILE_SYSTEM_ELEMENT, false) != null) {
+                fsc = new FileSystemConfig(
+                        parseBeanConfig(bsc, FILE_SYSTEM_ELEMENT));
+            }
+            return new BlobStoreConfig(
+                    parseBeanConfig(parent, BLOB_STORE_ELEMENT), fsc);
+        } else {
+            return null;
+        }
+    }
+
+    /**
      * Creates a new instance of a configuration parser but with overlayed
      * variables.
      *
Index: src/site/resources/dtd/repository-1.2.dtd
===================================================================
--- src/site/resources/dtd/repository-1.2.dtd	(revision 486683)
+++ src/site/resources/dtd/repository-1.2.dtd	(working copy)
@@ -127,10 +127,20 @@
     to be used for the workspace; the class attribute specifies the
     FQN of the class implementing the PersistenceManager interface
 -->
-<!ELEMENT PersistenceManager (param*)>
+<!ELEMENT PersistenceManager (param*, BlobStore?)>
 <!ATTLIST PersistenceManager class CDATA #REQUIRED>
 
 <!--
+    the BlobStore element configures a blobstore to be used by the
+    persistence manager; the class attribute specifies the
+    FQN of the class implementing the BLOBStore interface. The nested
+    FileSystem element can be provided as hint for the blobstore, but not
+    all blobstore implementation might need it.
+-->
+<!ELEMENT BlobStore (param*, FileSystem?)>
+<!ATTLIST BlobStore class CDATA #REQUIRED>
+
+<!--
     the SearchIndex element specifies the locaction of the search index
     (used by the QueryHandler); the class attribute specifies the
     FQN of the class implementing the QueryHandler interface.
