Author: ozeigermann
Date: Sat Jul 28 14:51:02 2007
New Revision: 560629

URL: http://svn.apache.org/viewvc?view=rev&rev=560629
Log:
Completed first version of tx file resource manager

Modified:
    
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java

Modified: 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java?view=diff&rev=560629&r1=560628&r2=560629
==============================================================================
--- 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java
 (original)
+++ 
jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java
 Sat Jul 28 14:51:02 2007
@@ -18,6 +18,7 @@
 
 import java.io.Closeable;
 import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -30,7 +31,9 @@
 import org.apache.commons.transaction.ManageableResourceManager;
 import 
org.apache.commons.transaction.AbstractTransactionalResourceManager.AbstractTxContext;
 import org.apache.commons.transaction.file.FileResourceManager.FileResource;
-import org.apache.commons.transaction.locking.LockException;
+import org.apache.commons.transaction.locking.HierarchicalLockManager;
+import org.apache.commons.transaction.locking.HierarchicalRWLockManager;
+import org.apache.commons.transaction.locking.LockManager;
 import org.apache.commons.transaction.resource.ResourceException;
 import org.apache.commons.transaction.resource.ResourceManager;
 import org.apache.commons.transaction.resource.StreamableResource;
@@ -49,7 +52,10 @@
 
     protected FileResourceUndoManager undoManager;
 
-    public TxFileResourceManager(String rootPath) {
+    protected HierarchicalLockManager hlm;
+
+    public TxFileResourceManager(String name, String rootPath) {
+        super(name);
         this.rootPath = rootPath;
         wrapped = new FileResourceManager(rootPath);
     }
@@ -63,149 +69,190 @@
         return new FileTxContext();
     }
 
-    // TODO resource manager needs to forward requests to this context, locking
-    // will happen here
-    // FIXME
-    // needs
-    // - custom commit / rollback
-    // - proper resource tracking
+    protected HierarchicalLockManager getHLM() {
+        return hlm;
+    }
+
+    @Override
+    public void setLm(LockManager<Object, Object> lm) {
+        super.setLm(lm);
+        hlm = new HierarchicalRWLockManager(rootPath, lm);
+    }
+
     public class FileTxContext extends AbstractTxContext implements
             ResourceManager<StreamableResource> {
 
         // list of streams participating in this tx
         private Collection<Closeable> openStreams = new ArrayList<Closeable>();
 
-        public FileTxContext() {
-        }
-
         protected void registerStream(Closeable stream) {
             openStreams.add(stream);
         }
 
-        public StreamableResource getResource(String path) throws 
ResourceException {
+        protected void closeAllStreams() {
+            for (Closeable stream : openStreams) {
+                try {
+                    stream.close();
+                } catch (IOException e) {
+                    logger.warn("Could not close stream during cleaning", e);
+                }
+            }
+        }
+
+        @Override
+        public TxFileResource getResource(String path) throws 
ResourceException {
             return new TxFileResource(path);
         }
 
+        @Override
         public String getRootPath() {
             return TxFileResourceManager.this.getRootPath();
         }
 
-        // FIXME needs custom implementations
-        // Details:
-        // - Hierarchical locking
-        // - Calls to configured undo manager
+        @Override
+        public void dispose() {
+            closeAllStreams();
+            getUndoManager().forgetRecord();
+            super.dispose();
+        }
+
+        @Override
+        public void commit() {
+            super.commit();
+        }
+
+        @Override
+        public void rollback() {
+            getUndoManager().undoRecord();
+            super.rollback();
+        }
+
         protected class TxFileResource extends FileResource {
 
-            public TxFileResource(File file) {
+            public TxFileResource(File file) throws ResourceException {
                 super(file);
             }
 
-            public TxFileResource(String path) {
+            public TxFileResource(String path) throws ResourceException {
                 super(path);
             }
 
-            public void copy(String destinationpath) throws ResourceException {
-                super.copy(destinationpath);
-            }
-
             public void createAsDirectory() throws ResourceException {
+                writeLock();
+                getUndoManager().recordCreateAsDirectory(getFile());
                 super.createAsDirectory();
             }
 
             public void createAsFile() throws ResourceException {
+                writeLock();
+                getUndoManager().recordCreateAsFile(getFile());
                 super.createAsFile();
             }
 
             public void delete() throws ResourceException {
+                writeLock();
+                getUndoManager().recordDelete(getFile());
                 super.delete();
             }
 
             public boolean exists() {
+                readLock();
                 return super.exists();
             }
 
-            public List<StreamableResource> getChildren() throws 
ResourceException {
-                return super.getChildren();
+            public List<? extends TxFileResource> getChildren() throws 
ResourceException {
+                readLock();
+
+                List<FileResource> children = (List<FileResource>) 
super.getChildren();
+                List<TxFileResource> txChildren = new 
ArrayList<TxFileResource>();
+                // if we have a list of chidren we do not want them to suddenly
+                // vanish
+                for (FileResource resource : children) {
+                    TxFileResource txFileResource = new 
TxFileResource(resource.getFile());
+                    txFileResource.readLock();
+                    txChildren.add(txFileResource);
+                }
+                return txChildren;
             }
 
-            public StreamableResource getParent() throws ResourceException {
-                return super.getParent();
+            public TxFileResource getParent() throws ResourceException {
+                readLock();
+                FileResource parent = super.getParent();
+                TxFileResource txFileParent = new 
TxFileResource(parent.getFile());
+                // if we acquire the parent, we want to be sure it really exist
+                txFileParent.readLock();
+                return txFileParent;
             }
 
-            public String getPath() throws ResourceException {
+            public String getPath() {
                 return super.getPath();
             }
 
             public Object getProperty(String name) {
+                readLock();
                 return super.getProperty(name);
             }
 
             public boolean isDirectory() {
+                readLock();
                 return super.isDirectory();
             }
 
             public boolean isFile() {
+                readLock();
                 return super.isFile();
             }
 
-            public void move(String destinationpath) throws ResourceException {
-                super.move(destinationpath);
+            public void copy(FileResource destination) throws 
ResourceException {
+                super.moveorCopySaneCheck(destination);
+                readLock();
+                new TxFileResource(destination.getFile()).writeLock();
+                getUndoManager().recordCopy(getFile(), 
getFileForResource(destination));
+                super.copy(destination);
+            }
+
+            public void move(FileResource destination) throws 
ResourceException {
+                super.moveorCopySaneCheck(destination);
+                writeLock();
+                new TxFileResource(destination.getFile()).writeLock();
+                getUndoManager().recordMove(getFile(), 
getFileForResource(destination));
+                super.move(destination);
             }
 
             public InputStream readStream() throws ResourceException {
-                return super.readStream();
+                readLock();
+                InputStream is = super.readStream();
+                registerStream(is);
+                return is;
+            }
+
+            public OutputStream writeStream(boolean append) throws 
ResourceException {
+                writeLock();
+                getUndoManager().recordChangeContent(getFile());
+                OutputStream os = super.writeStream(append);
+                registerStream(os);
+                return os;
             }
 
             public void removeProperty(String name) {
+                // no need to handle, as we do not support this
                 super.removeProperty(name);
             }
 
             public void setProperty(String name, Object newValue) {
+                // no need to handle, as we do not support this
                 super.setProperty(name, newValue);
             }
 
-            public boolean tryReadLock() {
-                try {
-                    return getLm().tryLock(getName(), getPath(), false);
-                } catch (ResourceException e) {
-                    // FIXME: ouch!
-                    throw new LockException(e);
-                }
-            }
-
-            public boolean tryWriteLock() {
-                try {
-                    return getLm().tryLock(getName(), getPath(), true);
-                } catch (ResourceException e) {
-                    // FIXME: ouch!
-                    throw new LockException(e);
-                }
-            }
-
             public void readLock() {
-                try {
-                    getLm().lock(getName(), getPath(), false);
-                } catch (ResourceException e) {
-                    // FIXME: ouch!
-                    throw new LockException(e);
-                }
+                getHLM().lockInHierarchy(getName(), getPath(), false);
                 super.readLock();
             }
 
             public void writeLock() {
-                try {
-                    getLm().lock(getName(), getPath(), true);
-                } catch (ResourceException e) {
-                    // FIXME: ouch!
-                    throw new LockException(e);
-                }
+                getHLM().lockInHierarchy(getName(), getPath(), true);
                 super.writeLock();
             }
-
-            public OutputStream writeStream(boolean append) throws 
ResourceException {
-                return super.writeStream(append);
-            }
-
         }
     }
 
@@ -214,7 +261,7 @@
         return false;
     }
 
-    public StreamableResource getResource(String path) throws 
ResourceException {
+    public FileResource getResource(String path) throws ResourceException {
         FileTxContext context = getActiveTx();
         if (context != null) {
             return context.getResource(path);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to