You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oz...@apache.org on 2007/07/29 19:23:49 UTC
svn commit: r560766 - in
/commons/proper/transaction/branches/TRANSACTION_2/src:
java/org/apache/commons/transaction/file/
java/org/apache/commons/transaction/util/
test/org/apache/commons/transaction/file/
Author: ozeigermann
Date: Sun Jul 29 10:23:48 2007
New Revision: 560766
URL: http://svn.apache.org/viewvc?view=rev&rev=560766
Log:
First complete version of tx file manager including test and undomanager (yet untested)
Added:
commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/TxFileResourceManagerTest.java
Modified:
commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java
commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java
commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java
commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java
Modified: commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java
URL: http://svn.apache.org/viewvc/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java?view=diff&rev=560766&r1=560765&r2=560766
==============================================================================
--- commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java (original)
+++ commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/FileResourceUndoManager.java Sun Jul 29 10:23:48 2007
@@ -5,7 +5,7 @@
public interface FileResourceUndoManager {
public enum Code {
- DELETED_DIRECTORY, CONTENT_CHANGED, CREATED_DIRECTORY, CREATED_FILE
+ DELETED_DIRECTORY, UPDATED_CONTENT, CREATED
}
public void startRecord();
@@ -14,11 +14,10 @@
public void forgetRecord();
- public void recordCreateAsDirectory(File directory);
- public void recordCreateAsFile(File file);
+ public void recordCreate(File file);
public void recordDelete(File file);
- public void recordChangeContent(File file);
+ public void recordUpdate(File file);
}
Modified: commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java
URL: http://svn.apache.org/viewvc/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java?view=diff&rev=560766&r1=560765&r2=560766
==============================================================================
--- commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java (original)
+++ commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/MemoryUndoManager.java Sun Jul 29 10:23:48 2007
@@ -1,9 +1,7 @@
package org.apache.commons.transaction.file;
-import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -16,45 +14,15 @@
public class MemoryUndoManager implements FileResourceUndoManager {
private Log logger = LogFactory.getLog(getClass());
+
protected ThreadLocal<List<UndoRecord>> localRecords = new ThreadLocal<List<UndoRecord>>();
- public void recordChangeContent(File file) {
- UndoRecord record = new UndoRecord();
- record.code = Code.CONTENT_CHANGED;
- record.file = file;
- try {
- record.oldConent = new ByteArrayInputStream(FileHelper.readInto(file));
- } catch (IOException e) {
- logger.fatal("Could not store changed content for "+file);
- // FIXME: This really should cause an error
- }
- storeRecord(record);
- }
+ private final File logDirectory;
- public void recordCreateAsDirectory(File directory) {
- UndoRecord record = new UndoRecord();
- record.code = Code.CREATED_DIRECTORY;
- record.file = directory;
- storeRecord(record);
- }
-
- public void recordCreateAsFile(File file) {
- UndoRecord record = new UndoRecord();
- record.code = Code.CREATED_FILE;
- record.file = file;
- storeRecord(record);
- }
-
- public void recordDelete(File file) {
- if (file.isFile()) {
- recordChangeContent(file);
- } else {
- UndoRecord record = new UndoRecord();
- record.code = Code.DELETED_DIRECTORY;
- record.file = file;
- storeRecord(record);
- }
+ public MemoryUndoManager(String logDir) throws IOException {
+ logDirectory = new File(logDir);
+ logDirectory.mkdirs();
}
public void startRecord() {
@@ -78,23 +46,71 @@
records.add(record);
}
- protected static class UndoRecord {
+ public void recordUpdate(File file) {
+ recordUpdate(file, false);
+ }
+
+ protected void recordUpdate(File file, boolean moveAllowed) {
+ try {
+ new UndoRecord(Code.UPDATED_CONTENT, file, FileHelper.makeBackup(file, logDirectory,
+ moveAllowed));
+ } catch (IOException e) {
+ // FIXME: This really is fatal: How to signal?
+ logger.fatal("Can not record content update", e);
+ }
+ }
+
+ public void recordCreate(File file) {
+ new UndoRecord(Code.CREATED, file);
+ }
+
+ public void recordDelete(File file) {
+ if (file.isFile()) {
+ recordUpdate(file, true);
+ } else {
+ new UndoRecord(Code.DELETED_DIRECTORY, file);
+ }
+ }
+
+ protected class UndoRecord {
Code code;
File file;
- File to;
+ File updatedFile;
+
+ public UndoRecord(Code code, File file) {
+ this(code, file, null);
+ }
+
+ public UndoRecord(Code code, File file, File updatedFile) {
+ this.code = code;
+ this.file = file;
+ this.updatedFile = updatedFile;
+ save();
+ }
- InputStream oldConent;
+ protected void save() {
+ }
- // FIXME: Needs implementation (not that hard)
- // ugly c-style - who cares?
public void undo() {
- // TODO
switch (code) {
-
+ case DELETED_DIRECTORY:
+ file.mkdirs();
+ break;
+ case CREATED:
+ file.delete();
+ break;
+ case UPDATED_CONTENT:
+ try {
+ FileHelper.move(updatedFile, file);
+ } catch (IOException e) {
+ // FIXME: This really is fatal: How to signal?
+ logger.fatal("Can not undo content update", e);
+ }
+ break;
}
-
+
}
}
Modified: commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java
URL: http://svn.apache.org/viewvc/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java?view=diff&rev=560766&r1=560765&r2=560766
==============================================================================
--- commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java (original)
+++ commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/TxFileResourceManager.java Sun Jul 29 10:23:48 2007
@@ -45,8 +45,6 @@
private Log logger = LogFactory.getLog(getClass());
- protected String contextFileName = "transaction.log";
-
protected String rootPath;
protected FileResourceManager wrapped;
@@ -61,10 +59,6 @@
wrapped = new FileResourceManager(rootPath);
}
- public void setContextFileName(String contextFile) {
- this.contextFileName = contextFile;
- }
-
@Override
protected FileTxContext createContext() {
return new FileTxContext();
@@ -140,13 +134,13 @@
public void createAsDirectory() throws ResourceException {
writeLock();
- getUndoManager().recordCreateAsDirectory(getFile());
+ getUndoManager().recordCreate(getFile());
super.createAsDirectory();
}
public void createAsFile() throws ResourceException {
writeLock();
- getUndoManager().recordCreateAsFile(getFile());
+ getUndoManager().recordCreate(getFile());
super.createAsFile();
}
@@ -213,7 +207,7 @@
protected void copyNonRecursive(TxFileResource target) throws ResourceException {
readLock();
target.writeLock();
- getUndoManager().recordCreateAsFile(target.getFile());
+ getUndoManager().recordCreate(target.getFile());
try {
FileHelper.copy(getFile(), target.getFile());
} catch (IOException e) {
@@ -225,7 +219,7 @@
writeLock();
target.writeLock();
getUndoManager().recordDelete(getFile());
- getUndoManager().recordCreateAsFile(target.getFile());
+ getUndoManager().recordCreate(target.getFile());
try {
FileHelper.move(getFile(), target.getFile());
} catch (IOException e) {
@@ -318,7 +312,7 @@
public OutputStream writeStream(boolean append) throws ResourceException {
writeLock();
- getUndoManager().recordChangeContent(getFile());
+ getUndoManager().recordUpdate(getFile());
OutputStream os = super.writeStream(append);
registerStream(os);
return os;
@@ -365,7 +359,7 @@
return rootPath;
}
- public FileResourceUndoManager getUndoManager() {
+ protected FileResourceUndoManager getUndoManager() {
return undoManager;
}
Modified: commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java
URL: http://svn.apache.org/viewvc/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java?view=diff&rev=560766&r1=560765&r2=560766
==============================================================================
--- commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java (original)
+++ commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/util/FileHelper.java Sun Jul 29 10:23:48 2007
@@ -32,7 +32,7 @@
public final class FileHelper {
public static File makeBackup(File file, File backupDirectory, boolean moveAllowed) throws IOException {
- File copy = File.createTempFile("ctx2", ".backup", backupDirectory);
+ File copy = File.createTempFile(file.getName(), ".backup", backupDirectory);
boolean success = false;
if (moveAllowed) {
success = file.renameTo(copy);
Added: commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/TxFileResourceManagerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/TxFileResourceManagerTest.java?view=auto&rev=560766
==============================================================================
--- commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/TxFileResourceManagerTest.java (added)
+++ commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/TxFileResourceManagerTest.java Sun Jul 29 10:23:48 2007
@@ -0,0 +1,60 @@
+/*
+ * 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.commons.transaction.file;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.JUnit4TestAdapter;
+
+import org.apache.commons.transaction.file.FileResourceManager.FileResource;
+import org.apache.commons.transaction.locking.LockManager;
+import org.apache.commons.transaction.locking.RWLockManager;
+import org.junit.Test;
+
+public class TxFileResourceManagerTest {
+ public static junit.framework.Test suite() {
+ return new JUnit4TestAdapter(TxFileResourceManagerTest.class);
+ }
+
+ @Test
+ public void basic() {
+ TxFileResourceManager manager = new TxFileResourceManager("TxFileManager", "d:/tmp/content");
+ LockManager lm = new RWLockManager<String, String>();
+ FileResourceUndoManager um;
+ try {
+ um = new MemoryUndoManager("d:/tmp/txlogs");
+ manager.setLm(lm);
+ manager.setUndoManager(um);
+ manager.startTransaction(60, TimeUnit.SECONDS);
+ FileResource file = manager.getResource("d:/tmp/content/aha");
+ file.createAsFile();
+ OutputStream os = file.writeStream(false);
+ PrintStream ps = new PrintStream(os);
+ ps.print("Huhu");
+ manager.commitTransaction();
+ } catch (Throwable throwable) {
+ manager.rollbackTransaction();
+ }
+
+ }
+
+ public static void main(String[] args) {
+ new TxFileResourceManagerTest().basic();
+ }
+}