You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2012/08/29 15:58:45 UTC
svn commit: r1378562 -
/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java
Author: fmui
Date: Wed Aug 29 13:58:44 2012
New Revision: 1378562
URL: http://svn.apache.org/viewvc?rev=1378562&view=rev
Log:
Server: made streams resettable
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java?rev=1378562&r1=1378561&r2=1378562&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java Wed Aug 29 13:58:44 2012
@@ -24,7 +24,6 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
-import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -44,9 +43,9 @@ public class ThresholdOutputStream exten
private static final int MAX_GROW = 10 * 1024 * 1024; // 10 MiB
private static final int DEFAULT_THRESHOLD = 4 * 1024 * 1024; // 4 MiB
- private File tempDir;
- private int memoryThreshold;
- private long maxContentSize;
+ private final File tempDir;
+ private final int memoryThreshold;
+ private final long maxContentSize;
private byte[] buf = null;
private int bufSize = 0;
@@ -229,49 +228,81 @@ public class ThresholdOutputStream exten
/**
* Provides information about the input stream.
*/
- public interface ThresholdInputStream {
+ public abstract class ThresholdInputStream extends InputStream {
/**
- * Returns <code>true</code> if the data is in memory. Returns
- * <code>false</code> if the data resides in a temporary file.
+ * Returns if the data is stored in memory.
+ *
+ * @return <code>true</code> if the data is in memory and
+ * <code>false</code> if the data resides in a temporary file
*/
- boolean isInMemory();
+ public abstract boolean isInMemory();
/**
- * Returns the temporary file if the data stored in a file. Returns
- * <code>null</code> is the data is stored in memory.
+ * Gets the temporary file.
+ *
+ * @return the temporary file or <code>null</code> if the data is stored
+ * in memory
*/
- File getTemporaryFile();
+ public File getTemporaryFile() {
+ return null;
+ }
/**
- * Returns content as a byte array if the data is stored in memory.
- * Returns <code>null</code> is the data is stored in a file.
+ * Gets the byte buffer.
+ *
+ * @return the content in a byte array or <code>null</code> if the data
+ * is stored in a file
*/
- byte[] getBytes();
+ public byte[] getBytes() {
+ return null;
+ }
+
+ /**
+ * Returns the length of the stream.
+ *
+ * @return the length of the stream in bytes
+ */
+ public long length() {
+ return size;
+ }
}
/**
* InputStream for in-memory data.
*/
- private class InternalBufferInputStream extends InputStream implements ThresholdInputStream {
+ private class InternalBufferInputStream extends ThresholdInputStream {
private int pos = 0;
+ private int mark = -1;
public boolean isInMemory() {
return true;
}
- public File getTemporaryFile() {
- return null;
- }
-
public byte[] getBytes() {
return buf;
}
@Override
public boolean markSupported() {
- return false;
+ return true;
+ }
+
+ @Override
+ public synchronized void mark(int readlimit) {
+ if (buf != null) {
+ mark = pos;
+ }
+ }
+
+ @Override
+ public synchronized void reset() throws IOException {
+ if (mark < 0) {
+ throw new IOException("Reset not possible.");
+ }
+
+ pos = mark;
}
@Override
@@ -323,19 +354,21 @@ public class ThresholdOutputStream exten
@Override
public void close() throws IOException {
buf = null;
+ mark = -1;
}
}
/**
* InputStream for file data.
*/
- private class InternalTempFileInputStream extends FilterInputStream implements ThresholdInputStream {
+ private class InternalTempFileInputStream extends ThresholdInputStream {
+ private final BufferedInputStream stream;
private boolean isDeleted = false;
private boolean isClosed = false;
public InternalTempFileInputStream() throws FileNotFoundException {
- super(new BufferedInputStream(new FileInputStream(tempFile), memoryThreshold));
+ stream = new BufferedInputStream(new FileInputStream(tempFile), memoryThreshold);
}
public boolean isInMemory() {
@@ -346,13 +379,43 @@ public class ThresholdOutputStream exten
return tempFile;
}
- public byte[] getBytes() {
- return null;
+ @Override
+ public int available() throws IOException {
+ if (isClosed) {
+ throw new IOException("Stream is already closed!");
+ }
+
+ return stream.available();
}
@Override
public boolean markSupported() {
- return false;
+ return stream.markSupported();
+ }
+
+ @Override
+ public synchronized void mark(int readlimit) {
+ if (!isClosed) {
+ stream.mark(readlimit);
+ }
+ }
+
+ @Override
+ public synchronized void reset() throws IOException {
+ if (isClosed) {
+ throw new IOException("Stream is already closed!");
+ }
+
+ stream.reset();
+ }
+
+ @Override
+ public long skip(long n) throws IOException {
+ if (isClosed) {
+ throw new IOException("Stream is already closed!");
+ }
+
+ return stream.skip(n);
}
@Override
@@ -361,11 +424,11 @@ public class ThresholdOutputStream exten
return -1;
}
- int b = super.read();
+ int b = stream.read();
if (b == -1 && !isDeleted) {
try {
- super.close();
+ stream.close();
isClosed = true;
} catch (Exception e) {
}
@@ -390,7 +453,7 @@ public class ThresholdOutputStream exten
if (n == -1 && !isDeleted) {
try {
- super.close();
+ stream.close();
isClosed = true;
} catch (Exception e) {
}
@@ -404,7 +467,7 @@ public class ThresholdOutputStream exten
public void close() throws IOException {
if (!isClosed) {
try {
- super.close();
+ stream.close();
isClosed = true;
} catch (Exception e) {
}