Author: ozeigermann Date: Thu Jul 12 04:14:42 2007 New Revision: 555581 URL: http://svn.apache.org/viewvc?view=rev&rev=555581 Log: More cleanup and addition of input stream multicaster
Added: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/ - copied from r555573, jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/transaction/file/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/ComboInputStreamMulticaster.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/InputStreamMulticaster.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/ - copied from r555573, jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/transaction/locking/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/ComboInputStreamMulticasterTest.java Removed: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/conf/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/transaction/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java1.4/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/FileResourceManagerTest.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/locking/ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/memory/ Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/GenericLockManager.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/NativeLockManager.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=555581&r1=555580&r2=555581 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/project.xml Thu Jul 12 04:14:42 2007 @@ -148,7 +148,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>junit-4.3.1</version> <properties> <scope>test</scope> </properties> @@ -196,12 +196,7 @@ <aspectSourceDirectory/> <unitTest> <includes> - <include>org/apache/commons/transaction/file/FileResourceManagerTest.java</include> - <include>org/apache/commons/transaction/memory/MapWrapperTest.java</include> - <include>org/apache/commons/transaction/memory/OptimisticMapWrapperTest.java</include> - <include>org/apache/commons/transaction/memory/PessimisticMapWrapperTest.java</include> - <include>org/apache/commons/transaction/locking/GenericLockTest.java</include> - <include>org/apache/commons/transaction/locking/LockTestRepeatableReads.java</include> + <include>org/apache/commons/transaction/file/ComboInputStreamMulticasterTest.java</include> </includes> </unitTest> <resources> Added: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/ComboInputStreamMulticaster.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/ComboInputStreamMulticaster.java?view=auto&rev=555581 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/ComboInputStreamMulticaster.java (added) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/ComboInputStreamMulticaster.java Thu Jul 12 04:14:42 2007 @@ -0,0 +1,148 @@ +package org.apache.commons.transaction.file; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class ComboInputStreamMulticaster implements InputStreamMulticaster { + + private int memoryBufferSize = 8192; + + private Log log = LogFactory.getLog(getClass()); + + protected List<InputStream> spawned; + + protected byte buf[]; + + protected File bufferFile; + + protected boolean isOpen = false; + + public synchronized void close() { + if (!isOpen) { + throw new IllegalStateException("You can not close: Stream multicaster is not open!"); + } + isOpen = false; + } + + public synchronized void open(InputStream backingInputStream) throws IOException { + if (isOpen) { + throw new IllegalStateException( + "You can not open a new stream: Stream multicaster is already open!"); + } + if (backingInputStream == null) { + throw new IllegalStateException("You can not open a null stream!"); + } + + buf = new byte[memoryBufferSize]; + spawned = new ArrayList<InputStream>(); + + try { + int len = backingInputStream.read(buf); + // which means the memory buffer hasn't been large enough + if (len == buf.length) { + // if so, we buffer in a file + this.bufferFile = File.createTempFile("muticast", null); + OutputStream os = null; + try { + os = new BufferedOutputStream(new FileOutputStream(bufferFile)); + os.write(buf); + int read; + while ((read = backingInputStream.read(buf)) != -1) { + os.write(buf, 0, read); + } + } finally { + buf = null; + if (os != null) + os.close(); + } + } + } finally { + backingInputStream.close(); + } + isOpen = true; + } + + public synchronized InputStream spawn() throws IOException { + if (!isOpen) { + throw new IllegalStateException( + "You can not spwan new streams: Stream multicaster has already been closed!"); + } + InputStream sis = null; + if (buf != null) { + sis = new ByteArrayInputStream(buf) { + @Override + public void close() throws IOException { + closeSpawned(this); + super.close(); + } + }; + } else { + try { + sis = new BufferedInputStream(new FileInputStream(bufferFile)) { + @Override + public void close() throws IOException { + closeSpawned(this); + super.close(); + } + }; + } catch (FileNotFoundException e) { + // fatal as this really should have been created + log.fatal("Internal error: Buffer file has not been created", e); + } + } + spawned.add(sis); + return sis; + } + + public int getMemoryBufferSize() { + return memoryBufferSize; + } + + public void setMemoryBufferSize(int memoryBufferSize) { + this.memoryBufferSize = memoryBufferSize; + } + + public synchronized void forceShutdown() { + isOpen = false; + if (spawned != null) { + for (InputStream is : spawned) { + try { + is.close(); + } catch (IOException e) { + log.warn("Could not close spawned input stream on forced shutdown", e); + } + } + } + cleanUp(); + } + + protected void closeSpawned(InputStream is) { + spawned.remove(this); + if (!isOpen && spawned.isEmpty()) { + cleanUp(); + } + } + + protected void cleanUp() { + if (bufferFile != null) { + bufferFile.delete(); + bufferFile = null; + } + buf = null; + spawned = null; + } + +} Added: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/InputStreamMulticaster.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/InputStreamMulticaster.java?view=auto&rev=555581 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/InputStreamMulticaster.java (added) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/file/InputStreamMulticaster.java Thu Jul 12 04:14:42 2007 @@ -0,0 +1,9 @@ +package org.apache.commons.transaction.file; +import java.io.IOException; +import java.io.InputStream; + +public interface InputStreamMulticaster { + void open(InputStream backingInputStream) throws IOException; + InputStream spawn() throws IOException; + void close() throws IOException; +} Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/GenericLockManager.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/GenericLockManager.java?view=diff&rev=555581&r1=555573&r2=555581 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/GenericLockManager.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/GenericLockManager.java Thu Jul 12 04:14:42 2007 @@ -1,4 +1,4 @@ -package org.apache.transaction.locking; +package org.apache.commons.transaction.locking; import java.util.concurrent.ConcurrentHashMap; Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java?view=diff&rev=555581&r1=555573&r2=555581 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/LockManager.java Thu Jul 12 04:14:42 2007 @@ -1,4 +1,4 @@ -package org.apache.transaction.locking; +package org.apache.commons.transaction.locking; public interface LockManager<K, L> { public L getLock(K key); Modified: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/NativeLockManager.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/NativeLockManager.java?view=diff&rev=555581&r1=555573&r2=555581 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/NativeLockManager.java (original) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/java/org/apache/commons/transaction/locking/NativeLockManager.java Thu Jul 12 04:14:42 2007 @@ -1,4 +1,4 @@ -package org.apache.transaction.locking; +package org.apache.commons.transaction.locking; public class NativeLockManager extends GenericLockManager<Object, Object> implements LockManager<Object, Object> { Added: jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/ComboInputStreamMulticasterTest.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/ComboInputStreamMulticasterTest.java?view=auto&rev=555581 ============================================================================== --- jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/ComboInputStreamMulticasterTest.java (added) +++ jakarta/commons/proper/transaction/branches/TRANSACTION_2/src/test/org/apache/commons/transaction/file/ComboInputStreamMulticasterTest.java Thu Jul 12 04:14:42 2007 @@ -0,0 +1,122 @@ +package org.apache.commons.transaction.file; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import junit.framework.JUnit4TestAdapter; + +import org.apache.commons.transaction.file.ComboInputStreamMulticaster; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ComboInputStreamMulticasterTest { + ComboInputStreamMulticaster ism1; + + ComboInputStreamMulticaster ism2; + + ComboInputStreamMulticaster ism3; + + public static junit.framework.Test suite() { + return new JUnit4TestAdapter(ComboInputStreamMulticasterTest.class); + } + + static InputStream fakeStream(int length) { + return new ByteArrayInputStream(init(new byte[length])) { + boolean isClosed = false; + + @Override + public void close() throws IOException { + if (isClosed) + throw new IOException("Already closed!"); + isClosed = true; + } + }; + } + + static InputStream fakeStream() { + return fakeStream(1); + } + + static byte[] init(byte[] bytes) { + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) i; + } + return bytes; + } + + @Before + public void createMulticasters() { + ism1 = new ComboInputStreamMulticaster(); + ism2 = new ComboInputStreamMulticaster(); + ism3 = new ComboInputStreamMulticaster(); + } + + @After + public void destroyMulticasters() { + ism1.forceShutdown(); + ism1 = null; + ism2.forceShutdown(); + ism2 = null; + ism3.forceShutdown(); + ism3 = null; + } + + @Test(expected = IllegalStateException.class) + public void closeWithoutOpen() throws IOException { + ism1.close(); + } + + @Test(expected = IllegalStateException.class) + public void openWhileOpen() throws IOException { + ism1.open(fakeStream()); + ism1.open(fakeStream()); + } + + @Test(expected = IOException.class) + public void backinStreamMemClosed() throws IOException { + InputStream backingStream = fakeStream(ism1.getMemoryBufferSize() - 1); + ism1.open(backingStream); + backingStream.close(); + } + + @Test(expected = IOException.class) + public void backinStreamFileClosed() throws IOException { + InputStream backingStream = fakeStream(ism1.getMemoryBufferSize() + 1); + ism1.open(backingStream); + backingStream.close(); + } + + @Test(expected = IllegalStateException.class) + public void spwanWithoutOpen() throws IOException { + ism1.spawn(); + } + + @Test + public void bufferMemory() throws IOException { + ism1.open(fakeStream(1000)); + + InputStream is11 = ism1.spawn(); + InputStream is12 = ism1.spawn(); + InputStream is13 = ism1.spawn(); + + is11.close(); + ism1.close(); + + } + + @Test + public void bufferFile() throws IOException { + ism1.open(fakeStream(1000)); + + InputStream is11 = ism1.spawn(); + InputStream is12 = ism1.spawn(); + InputStream is13 = ism1.spawn(); + + is11.close(); + ism1.close(); + + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]