Author: ozeigermann Date: Sat Jul 28 17:10:37 2007 New Revision: 560650 URL: http://svn.apache.org/viewvc?view=rev&rev=560650 Log: Recursive bulk operations (copy, move, delete) are now properly logged in undo and lock manager.
Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceManager.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/ResourceException.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/StreamableResource.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml?view=diff&rev=560650&r1=560649&r2=560650 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml Sat Jul 28 17:10:37 2007 @@ -136,6 +136,18 @@ <name>John Rousseau</name> <email>[EMAIL PROTECTED]</email> </contributor> + <contributor> + <name>Peter Fassev</name> + <email>fassev at gmx dot de</email> + </contributor> + <contributor> + <name>Dennis Thrysøe</name> + <email>dth at conscius dot com</email> + </contributor> + <contributor> + <name>Holger Hoffstätte</name> + <email>holger dot hoffstaette at googlemail dot com</email> + </contributor> </contributors> Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceManager.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceManager.java?view=diff&rev=560650&r1=560649&r2=560650 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceManager.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceManager.java Sat Jul 28 17:10:37 2007 @@ -55,6 +55,8 @@ private final File file; private final String canonicalPath; + + private final String name; protected static File getFileForResource(StreamableResource resource) throws ResourceException { @@ -67,12 +69,7 @@ } public FileResource(String path) throws ResourceException { - this.file = new File(path.trim()); - try { - this.canonicalPath = file.getCanonicalPath(); - } catch (IOException e) { - throw new ResourceException(e); - } + this(new File(path.trim())); } public FileResource(File file) throws ResourceException { @@ -82,10 +79,11 @@ } catch (IOException e) { throw new ResourceException(e); } + this.name = file.getName(); } public void createAsDirectory() throws ResourceException { - if (!file.mkdirs()) { + if (!file.exists() && !file.mkdirs()) { throw new ResourceException(ResourceException.Code.COULD_NOT_CREATE, "Could not create directory"); } @@ -123,7 +121,7 @@ List<FileResource> result = new ArrayList<FileResource>(); File[] files = file.listFiles(); for (File file : files) { - result.add(new FileResource(file)); + result.add(create(file)); } return result; } @@ -135,7 +133,8 @@ * if (getPath().equals(getRootPath())) return null; */ File parent = file.getParentFile(); - return new FileResource(parent); + if (parent == null) return null; + return create(parent); } public String getPath() { @@ -151,7 +150,8 @@ } public void move(StreamableResource destination) throws ResourceException { - moveorCopySaneCheck(destination); + if (!prepareMoveorCopy(destination)) + moveOrCopySaneCheck(destination); try { if (isFile()) { FileHelper.move(file, getFileForResource(destination)); @@ -164,7 +164,8 @@ } public void copy(StreamableResource destination) throws ResourceException { - moveorCopySaneCheck(destination); + if (!prepareMoveorCopy(destination)) + moveOrCopySaneCheck(destination); try { if (isFile()) { FileHelper.copy(file, getFileForResource(destination)); @@ -189,9 +190,7 @@ return false; } - protected void moveorCopySaneCheck(StreamableResource destination) throws ResourceException { - if (prepareMoveorCopy(destination)) - return; + protected void moveOrCopySaneCheck(StreamableResource destination) throws ResourceException { File from = getFile(); File to = getFileForResource(destination); @@ -257,6 +256,19 @@ protected File getFile() { return file; + } + + protected FileResource create(File file) throws ResourceException { + return new FileResource(file); + } + + public FileResource getChild(String name) throws ResourceException { + File child = new File(file, name); + return create(child); + } + + public String getName() { + return name; } } Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java?view=diff&rev=560650&r1=560649&r2=560650 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java Sat Jul 28 17:10:37 2007 @@ -5,7 +5,7 @@ public interface FileResourceUndoManager { public enum Code { - CREATED_DIRECTORY, CREATED_FILE, DELETED_DIRECTORY, MOVED, COPIED, CONTENT_CHANGED, PROPERTY_CHANGED + DELETED_DIRECTORY, CONTENT_CHANGED, CREATED_DIRECTORY, CREATED_FILE } public void startRecord(); @@ -14,17 +14,10 @@ public void forgetRecord(); - public void recordCopy(File from, File to); - public void recordCreateAsDirectory(File directory); - public void recordCreateAsFile(File file); public void recordDelete(File file); - - public void recordMove(File from, File to); - - public void recordChangeProperty(File file, String name, Object oldValue); public void recordChangeContent(File file); Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java?view=diff&rev=560650&r1=560649&r2=560650 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java Sat Jul 28 17:10:37 2007 @@ -32,17 +32,6 @@ storeRecord(record); } - public void recordCopy(File from, File to) { - if (to.exists()) { - recordChangeContent(to); - } - UndoRecord record = new UndoRecord(); - record.code = Code.COPIED; - record.file = from; - record.to = to; - storeRecord(record); - } - public void recordCreateAsDirectory(File directory) { UndoRecord record = new UndoRecord(); record.code = Code.CREATED_DIRECTORY; @@ -68,26 +57,6 @@ } } - public void recordMove(File from, File to) { - if (to.exists()) { - recordChangeContent(to); - } - UndoRecord record = new UndoRecord(); - record.code = Code.MOVED; - record.file = from; - record.to = to; - storeRecord(record); - } - - public void recordChangeProperty(File file, String name, Object oldValue) { - UndoRecord record = new UndoRecord(); - record.code = Code.PROPERTY_CHANGED; - record.file = file; - record.propertyName = name; - record.oldValue = oldValue; - storeRecord(record); - } - public void startRecord() { localRecords.set(new ArrayList<UndoRecord>()); } @@ -115,10 +84,6 @@ File file; File to; - - String propertyName; - - Object oldValue; InputStream oldConent; 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=560650&r1=560649&r2=560650 ============================================================================== --- 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 17:10:37 2007 @@ -37,6 +37,7 @@ import org.apache.commons.transaction.resource.ResourceException; import org.apache.commons.transaction.resource.ResourceManager; import org.apache.commons.transaction.resource.StreamableResource; +import org.apache.commons.transaction.util.FileHelper; public class TxFileResourceManager extends AbstractTransactionalResourceManager<TxFileResourceManager.FileTxContext> implements @@ -149,10 +150,99 @@ super.createAsFile(); } - public void delete() throws ResourceException { + protected TxFileResource create(File file) throws ResourceException { + return new TxFileResource(file); + } + + protected void mkdirs() throws ResourceException { + if (exists()) + return; + TxFileResource parent = getParent(); + if (parent != null) { + parent.mkdirs(); + } + createAsDirectory(); + } + + protected void moveOrcopyRecursive(TxFileResource target, boolean move) + throws ResourceException { + moveOrCopySaneCheck(target); + + if (isDirectory()) { + target.mkdirs(); + for (TxFileResource child : getChildren()) { + TxFileResource targetChild = target.getChild(child.getName()); + if (child.isDirectory()) { + targetChild.mkdirs(); + child.moveOrcopyRecursive(targetChild, move); + targetChild.createAsDirectory(); + } else { + if (targetChild.exists()) { + targetChild.removeNonRecursive(); + } + moveOrcopyRecursive(targetChild, move); + } + } + } else { + // isFile()! + if (!target.exists()) { + target.getParent().mkdirs(); + target.createAsFile(); + } + if (!move) { + copyNonRecursive(target); + } else { + moveNonRecursive(target); + } + } + } + + // recursively delete, depth first + protected void removeRecursive() throws ResourceException { + if (exists()) { + if (isDirectory()) { + List<? extends TxFileResource> children = getChildren(); + for (TxFileResource resource : children) { + resource.delete(); + } + } + removeNonRecursive(); + } + } + + protected void copyNonRecursive(TxFileResource target) throws ResourceException { + readLock(); + target.writeLock(); + getUndoManager().recordCreateAsFile(target.getFile()); + try { + FileHelper.copy(getFile(), target.getFile()); + } catch (IOException e) { + throw new ResourceException(ResourceException.Code.CANT_MOVE_OR_COPY, e); + } + } + + protected void moveNonRecursive(TxFileResource target) throws ResourceException { writeLock(); + target.writeLock(); getUndoManager().recordDelete(getFile()); - super.delete(); + getUndoManager().recordCreateAsFile(target.getFile()); + try { + FileHelper.move(getFile(), target.getFile()); + } catch (IOException e) { + throw new ResourceException(ResourceException.Code.CANT_MOVE_OR_COPY, e); + } + } + + protected void removeNonRecursive() throws ResourceException { + writeLock(); + getUndoManager().recordDelete(getFile()); + if (!getFile().delete()) { + throw new ResourceException(ResourceException.Code.COULD_NOT_DELETE); + } + } + + public void delete() throws ResourceException { + removeRecursive(); } public boolean exists() { @@ -160,6 +250,12 @@ return super.exists(); } + public TxFileResource getChild(String name) throws ResourceException { + readLock(); + File child = new File(getFile(), name); + return create(child); + } + public List<? extends TxFileResource> getChildren() throws ResourceException { readLock(); @@ -178,6 +274,8 @@ public TxFileResource getParent() throws ResourceException { readLock(); FileResource parent = super.getParent(); + if (parent == null) + return null; TxFileResource txFileParent = new TxFileResource(parent.getFile()); // if we acquire the parent, we want to be sure it really exist txFileParent.readLock(); @@ -203,20 +301,12 @@ return super.isFile(); } - 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 copy(TxFileResource destination) throws ResourceException { + moveOrcopyRecursive(destination, false); } - 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 void move(TxFileResource destination) throws ResourceException { + moveOrcopyRecursive(destination, true); } public InputStream readStream() throws ResourceException { Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/ResourceException.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/ResourceException.java?view=diff&rev=560650&r1=560649&r2=560650 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/ResourceException.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/ResourceException.java Sat Jul 28 17:10:37 2007 @@ -16,6 +16,7 @@ */ package org.apache.commons.transaction.resource; +import java.io.IOException; public class ResourceException extends Exception { @@ -44,6 +45,15 @@ public ResourceException(Code code, String message) { super(message); + this.code = code; + } + + public ResourceException(Code code) { + this.code = code; + } + + public ResourceException(Code code, Throwable cause) { + super(cause); this.code = code; } Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/StreamableResource.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/StreamableResource.java?view=diff&rev=560650&r1=560649&r2=560650 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/StreamableResource.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/resource/StreamableResource.java Sat Jul 28 17:10:37 2007 @@ -22,6 +22,7 @@ public interface StreamableResource { String getPath(); + String getName(); boolean isDirectory(); @@ -30,6 +31,7 @@ List<? extends StreamableResource> getChildren() throws ResourceException; StreamableResource getParent() throws ResourceException; + StreamableResource getChild(String name) throws ResourceException; InputStream readStream() throws ResourceException; Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java?view=diff&rev=560650&r1=560649&r2=560650 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java Sat Jul 28 17:10:37 2007 @@ -31,6 +31,18 @@ */ public final class FileHelper { + public static File makeBackup(File file, File backupDirectory, boolean moveAllowed) throws IOException { + File copy = File.createTempFile("ctx2", ".backup", backupDirectory); + boolean success = false; + if (moveAllowed) { + success = file.renameTo(copy); + } + if (!success) { + copy(file, copy); + } + return copy; + } + public static byte[] readInto(File file) throws IOException { long length = file.length(); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]