You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2004/10/28 16:15:55 UTC

svn commit: rev 55854 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: . fs state/obj state/xml

Author: stefan
Date: Thu Oct 28 07:15:55 2004
New Revision: 55854

Modified:
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BLOBFileValue.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/fs/FileSystemResource.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
Log:
Jira issue JCR-14: {XML|Object}PersistenceManager.destroy(*) may fail 

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BLOBFileValue.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BLOBFileValue.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BLOBFileValue.java	Thu Oct 28 07:15:55 2004
@@ -170,15 +170,33 @@
 
     /**
      * Deletes the file backing this <code>BLOBFileValue</code>.
+     * Same as <code>{@link #delete(false)}</code>.
      */
     public void delete() {
+        delete(false);
+    }
+
+    /**
+     * Deletes the file backing this <code>BLOBFileValue</code>.
+     *
+     * @param pruneEmptyParentDirs if <code>true</code>, empty parent directories will
+     *                             automatically be deleted
+     */
+    public void delete(boolean pruneEmptyParentDirs) {
         if (file != null) {
             // this instance is backed by a 'real' file
             file.delete();
+            if (pruneEmptyParentDirs) {
+                // prune empty parent directories
+                File parent = file.getParentFile();
+                while (parent != null && parent.delete()) {
+                    parent = parent.getParentFile();
+                }
+            }
         } else {
             // this instance is backed by a resource in the virtual file system
             try {
-                fsResource.delete();
+                fsResource.delete(pruneEmptyParentDirs);
             } catch (FileSystemException fse) {
                 // ignore
             }

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/fs/FileSystemResource.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/fs/FileSystemResource.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/fs/FileSystemResource.java	Thu Oct 28 07:15:55 2004
@@ -97,10 +97,34 @@
     }
 
     /**
+     * Deletes this resource.
+     * Same as <code>{@link #delete(false)}</code>.
+     *
      * @see FileSystem#deleteFile
      */
     public void delete() throws FileSystemException {
         fs.deleteFile(path);
+    }
+
+    /**
+     * Deletes this resource.
+     *
+     * @param pruneEmptyParentDirs if <code>true</code>, empty parent folders will
+     *                             automatically be deleted
+     * @see FileSystem#deleteFile
+     */
+    public void delete(boolean pruneEmptyParentDirs) throws FileSystemException {
+        fs.deleteFile(path);
+        if (pruneEmptyParentDirs) {
+            // prune empty parent folders
+            String parentDir = FileSystemPathUtil.getParentDir(path);
+            while (!parentDir.equals(FileSystem.SEPARATOR)
+                    && fs.exists(parentDir)
+                    && !fs.hasChildren(parentDir)) {
+                fs.deleteFolder(parentDir);
+                parentDir = FileSystemPathUtil.getParentDir(parentDir);
+            }
+        }
     }
 
     /**

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java	Thu Oct 28 07:15:55 2004
@@ -395,14 +395,8 @@
         if (!res.exists()) {
             return false;
         }
-        res.delete();
-        // prune empty folders
-        String parentDir = FileSystemPathUtil.getParentDir(blobId);
-        while (!parentDir.equals(FileSystem.SEPARATOR)
-                && !blobFS.hasChildren(parentDir)) {
-            blobFS.deleteFolder(parentDir);
-            parentDir = FileSystemPathUtil.getParentDir(parentDir);
-        }
+        // delete resource and prune empty parent folders
+        res.delete(true);
         return true;
     }
 
@@ -411,6 +405,10 @@
      * @see PersistenceManager#init
      */
     public void init(WorkspaceConfig wspConfig) throws Exception {
+        if (initialized) {
+            throw new IllegalStateException("already initialized");
+        }
+
         FileSystem wspFS = wspConfig.getFileSystem();
         itemStateFS = new BasedFileSystem(wspFS, "/data");
 
@@ -431,12 +429,13 @@
      */
     public synchronized void close() throws Exception {
         if (!initialized) {
-            return;
+            throw new IllegalStateException("not initialized");
         }
 
         try {
             // close blob store
             blobFS.close();
+            blobFS = null;
             /**
              * there's no need close the item state store because it
              * is based in the workspace's file system which is
@@ -456,15 +455,14 @@
             throw new IllegalStateException("not initialized");
         }
 
-        String uuid = state.getUUID();
-        String nodeFilePath = buildNodeFilePath(uuid);
+        String nodeFilePath = buildNodeFilePath(state.getUUID());
 
         try {
             if (!itemStateFS.isFile(nodeFilePath)) {
-                throw new NoSuchItemStateException(uuid);
+                throw new NoSuchItemStateException(state.getId().toString());
             }
         } catch (FileSystemException fse) {
-            String msg = "failed to read node state: " + uuid;
+            String msg = "failed to read node state: " + state.getId();
             log.error(msg, fse);
             throw new ItemStateException(msg, fse);
         }
@@ -476,14 +474,14 @@
                 deserialize(state, in);
                 return;
             } catch (Exception e) {
-                String msg = "failed to read node state: " + uuid;
+                String msg = "failed to read node state: " + state.getId();
                 log.error(msg, e);
                 throw new ItemStateException(msg, e);
             } finally {
                 in.close();
             }
         } catch (Exception e) {
-            String msg = "failed to read node state: " + uuid;
+            String msg = "failed to read node state: " + state.getId();
             log.error(msg, e);
             throw new ItemStateException(msg, e);
         }
@@ -498,16 +496,14 @@
             throw new IllegalStateException("not initialized");
         }
 
-        String parentUUID = state.getParentUUID();
-        QName propName = state.getName();
-        String propFilePath = buildPropFilePath(parentUUID, propName);
+        String propFilePath = buildPropFilePath(state.getParentUUID(), state.getName());
 
         try {
             if (!itemStateFS.isFile(propFilePath)) {
-                throw new NoSuchItemStateException(parentUUID + "/" + propName);
+                throw new NoSuchItemStateException(state.getId().toString());
             }
         } catch (FileSystemException fse) {
-            String msg = "failed to read property state: " + parentUUID + "/" + propName;
+            String msg = "failed to read property state: " + state.getId();
             log.error(msg, fse);
             throw new ItemStateException(msg, fse);
         }
@@ -522,7 +518,7 @@
                 in.close();
             }
         } catch (Exception e) {
-            String msg = "failed to read property state: " + parentUUID + "/" + propName;
+            String msg = "failed to read property state: " + state.getId();
             log.error(msg, e);
             throw new ItemStateException(msg, e);
         }
@@ -595,13 +591,9 @@
         String nodeFilePath = buildNodeFilePath(uuid);
         FileSystemResource nodeFile = new FileSystemResource(itemStateFS, nodeFilePath);
         try {
-            nodeFile.delete();
-            // prune empty folders
-            String parentDir = FileSystemPathUtil.getParentDir(nodeFilePath);
-            while (!parentDir.equals(FileSystem.SEPARATOR)
-                    && !itemStateFS.hasChildren(parentDir)) {
-                itemStateFS.deleteFolder(parentDir);
-                parentDir = FileSystemPathUtil.getParentDir(parentDir);
+            if (nodeFile.exists()) {
+                // delete resource and prune empty parent folders
+                nodeFile.delete(true);
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete node state: " + uuid;
@@ -626,7 +618,8 @@
                 if (val != null) {
                     if (val.getType() == PropertyType.BINARY) {
                         BLOBFileValue blobVal = (BLOBFileValue) val.internalValue();
-                        blobVal.delete();
+                        // delete blob file and prune empty parent folders
+                        blobVal.delete(true);
                     }
                 }
             }
@@ -635,13 +628,9 @@
         String propFilePath = buildPropFilePath(state.getParentUUID(), state.getName());
         FileSystemResource propFile = new FileSystemResource(itemStateFS, propFilePath);
         try {
-            propFile.delete();
-            // prune empty folders
-            String parentDir = FileSystemPathUtil.getParentDir(propFilePath);
-            while (!parentDir.equals(FileSystem.SEPARATOR)
-                    && !itemStateFS.hasChildren(parentDir)) {
-                itemStateFS.deleteFolder(parentDir);
-                parentDir = FileSystemPathUtil.getParentDir(parentDir);
+            if (propFile.exists()) {
+                // delete resource and prune empty parent folders
+                propFile.delete(true);
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete property state: " + state.getParentUUID() + "/" + state.getName();
@@ -659,15 +648,14 @@
             throw new IllegalStateException("not initialized");
         }
 
-        String uuid = refs.getTargetId().getUUID();
-        String refsFilePath = buildNodeReferencesFilePath(uuid);
+        String refsFilePath = buildNodeReferencesFilePath(refs.getTargetId().getUUID());
 
         try {
             if (!itemStateFS.isFile(refsFilePath)) {
-                throw new NoSuchItemStateException(uuid);
+                throw new NoSuchItemStateException(refs.getTargetId().toString());
             }
         } catch (FileSystemException fse) {
-            String msg = "failed to load references: " + uuid;
+            String msg = "failed to load references: " + refs.getTargetId();
             log.error(msg, fse);
             throw new ItemStateException(msg, fse);
         }
@@ -682,7 +670,7 @@
                 in.close();
             }
         } catch (Exception e) {
-            String msg = "failed to load references: " + uuid;
+            String msg = "failed to load references: " + refs.getTargetId();
             log.error(msg, e);
             throw new ItemStateException(msg, e);
         }
@@ -726,13 +714,9 @@
         String refsFilePath = buildNodeReferencesFilePath(uuid);
         FileSystemResource refsFile = new FileSystemResource(itemStateFS, refsFilePath);
         try {
-            refsFile.delete();
-            // prune empty folders
-            String parentDir = FileSystemPathUtil.getParentDir(refsFilePath);
-            while (!parentDir.equals(FileSystem.SEPARATOR)
-                    && !itemStateFS.hasChildren(parentDir)) {
-                itemStateFS.deleteFolder(parentDir);
-                parentDir = FileSystemPathUtil.getParentDir(parentDir);
+            if (refsFile.exists()) {
+                // delete resource and prune empty parent folders
+                refsFile.delete(true);
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete references: " + uuid;

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java	Thu Oct 28 07:15:55 2004
@@ -288,6 +288,10 @@
      * @see PersistenceManager#init
      */
     public void init(WorkspaceConfig wspConfig) throws Exception {
+        if (initialized) {
+            throw new IllegalStateException("already initialized");
+        }
+
         FileSystem wspFS = wspConfig.getFileSystem();
         itemStateStore = new BasedFileSystem(wspFS, "/data");
 
@@ -310,12 +314,13 @@
      */
     public synchronized void close() throws Exception {
         if (!initialized) {
-            return;
+            throw new IllegalStateException("not initialized");
         }
 
         try {
             // close blob store
             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
@@ -697,13 +702,9 @@
         String nodeFilePath = buildNodeFilePath(uuid);
         FileSystemResource nodeFile = new FileSystemResource(itemStateStore, nodeFilePath);
         try {
-            nodeFile.delete();
-            // prune empty folders
-            String parentDir = FileSystemPathUtil.getParentDir(nodeFilePath);
-            while (!parentDir.equals(FileSystem.SEPARATOR)
-                    && !itemStateStore.hasChildren(parentDir)) {
-                itemStateStore.deleteFolder(parentDir);
-                parentDir = FileSystemPathUtil.getParentDir(parentDir);
+            if (nodeFile.exists()) {
+                // delete resource and prune empty parent folders
+                nodeFile.delete(true);
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete node state: " + uuid;
@@ -728,7 +729,8 @@
                 if (val != null) {
                     if (val.getType() == PropertyType.BINARY) {
                         BLOBFileValue blobVal = (BLOBFileValue) val.internalValue();
-                        blobVal.delete();
+                        // delete blob file and prune empty parent folders
+                        blobVal.delete(true);
                     }
                 }
             }
@@ -737,13 +739,9 @@
         String propFilePath = buildPropFilePath(state.getParentUUID(), state.getName());
         FileSystemResource propFile = new FileSystemResource(itemStateStore, propFilePath);
         try {
-            propFile.delete();
-            // prune empty folders
-            String parentDir = FileSystemPathUtil.getParentDir(propFilePath);
-            while (!parentDir.equals(FileSystem.SEPARATOR)
-                    && !itemStateStore.hasChildren(parentDir)) {
-                itemStateStore.deleteFolder(parentDir);
-                parentDir = FileSystemPathUtil.getParentDir(parentDir);
+            if (propFile.exists()) {
+                // delete resource and prune empty parent folders
+                propFile.delete(true);
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete property state: " + state.getParentUUID() + "/" + state.getName();
@@ -863,13 +861,9 @@
         String refsFilePath = buildNodeReferencesFilePath(uuid);
         FileSystemResource refsFile = new FileSystemResource(itemStateStore, refsFilePath);
         try {
-            refsFile.delete();
-            // prune empty folders
-            String parentDir = FileSystemPathUtil.getParentDir(refsFilePath);
-            while (!parentDir.equals(FileSystem.SEPARATOR)
-                    && !itemStateStore.hasChildren(parentDir)) {
-                itemStateStore.deleteFolder(parentDir);
-                parentDir = FileSystemPathUtil.getParentDir(parentDir);
+            if (refsFile.exists()) {
+                // delete resource and prune empty parent folders
+                refsFile.delete(true);
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete references: " + uuid;