You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2007/02/28 15:56:09 UTC
svn commit: r512786 - in /jackrabbit/trunk/contrib/spi/commons/src:
main/java/org/apache/jackrabbit/value/QValueFactoryImpl.java
test/java/org/apache/jackrabbit/value/QValueTest.java
Author: mreutegg
Date: Wed Feb 28 06:56:09 2007
New Revision: 512786
URL: http://svn.apache.org/viewvc?view=rev&rev=512786
Log:
Implement Serializable for QValue classes. Added test case for binary QValue.
Modified:
jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/QValueFactoryImpl.java
jackrabbit/trunk/contrib/spi/commons/src/test/java/org/apache/jackrabbit/value/QValueTest.java
Modified: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/QValueFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/QValueFactoryImpl.java?view=diff&rev=512786&r1=512785&r2=512786
==============================================================================
--- jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/QValueFactoryImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/QValueFactoryImpl.java Wed Feb 28 06:56:09 2007
@@ -38,6 +38,9 @@
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.Serializable;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
/**
* <code>QValueFactoryImpl</code>...
@@ -150,7 +153,7 @@
* except for BINARY.
* @see QValueFactoryImpl.BinaryQValue
*/
- private static class QValueImpl implements QValue {
+ private static class QValueImpl implements QValue, Serializable {
/**
* the default encoding
*/
@@ -294,6 +297,9 @@
public int hashCode() {
return val.hashCode();
}
+
+ //---------------------------------------------------< Serializable >---
+
}
@@ -304,7 +310,7 @@
* state, i.e. the <code>getStream()</code> method always returns a fresh
* <code>InputStream</code> instance.
*/
- private static class BinaryQValue implements QValue {
+ private static class BinaryQValue implements QValue, Serializable {
/**
* empty array
*/
@@ -318,14 +324,14 @@
/**
* underlying file
*/
- private final File file;
+ private transient File file;
/**
* flag indicating if this instance represents a <i>temporary</i> value
* whose dynamically allocated resources can be explicitly freed on
* {@link #discard()}.
*/
- private final boolean temp;
+ private transient boolean temp;
/**
* Buffer for small-sized data
@@ -335,7 +341,7 @@
/**
* Converted text
*/
- private String text = null;
+ private transient String text = null;
/**
* Creates a new <code>BinaryQValue</code> instance from an
@@ -640,6 +646,55 @@
} catch (IOException ignore) {
}
}
+ }
+
+ //-----------------------------< Serializable >-------------------------
+
+ private void writeObject(ObjectOutputStream out)
+ throws IOException {
+ out.defaultWriteObject();
+ // write hasFile marker
+ out.writeBoolean(file != null);
+ // then write file if necessary
+ if (file != null) {
+ byte[] buffer = new byte[4096];
+ int bytes;
+ InputStream stream = new FileInputStream(file);
+ while ((bytes = stream.read(buffer)) >= 0) {
+ // Write a segment of the input stream
+ if (bytes > 0) {
+ // just to ensure that no 0 is written
+ out.writeInt(bytes);
+ out.write(buffer, 0, bytes);
+ }
+ }
+ // Write the end of stream marker
+ out.writeInt(0);
+ // close stream
+ stream.close();
+ }
+ }
+
+ private void readObject(ObjectInputStream in)
+ throws IOException, ClassNotFoundException {
+ in.defaultReadObject();
+ boolean hasFile = in.readBoolean();
+ if (hasFile) {
+ file = File.createTempFile("binary-qvalue", "bin");
+
+ OutputStream out = new FileOutputStream(file);
+ byte[] buffer = new byte[4096];
+ for (int bytes = in.readInt(); bytes > 0; bytes = in.readInt()) {
+ if (buffer.length < bytes) {
+ buffer = new byte[bytes];
+ }
+ in.readFully(buffer, 0, bytes);
+ out.write(buffer, 0, bytes);
+ }
+ out.close();
+ }
+ // deserialized value is always temp
+ temp = true;
}
}
}
Modified: jackrabbit/trunk/contrib/spi/commons/src/test/java/org/apache/jackrabbit/value/QValueTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/src/test/java/org/apache/jackrabbit/value/QValueTest.java?view=diff&rev=512786&r1=512785&r2=512786
==============================================================================
--- jackrabbit/trunk/contrib/spi/commons/src/test/java/org/apache/jackrabbit/value/QValueTest.java (original)
+++ jackrabbit/trunk/contrib/spi/commons/src/test/java/org/apache/jackrabbit/value/QValueTest.java Wed Feb 28 06:56:09 2007
@@ -21,9 +21,18 @@
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import java.util.Calendar;
+import java.util.Arrays;
import java.io.InputStream;
import java.io.IOException;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.FileInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInputStream;
+import java.io.BufferedInputStream;
import org.apache.jackrabbit.util.ISO8601;
import org.apache.jackrabbit.uuid.UUID;
@@ -190,5 +199,52 @@
public void testBinaryValueType() throws IOException {
QValue v = factory.create(new byte[] {'a', 'b', 'c'});
assertTrue(v.getType() == PropertyType.BINARY);
+ }
+
+ public void testBinarySerializable() throws Exception {
+ runBinarySerializableTest(1); // 1k
+ runBinarySerializableTest(10); // 10k
+ runBinarySerializableTest(100); // 100k
+ runBinarySerializableTest(1000); // 1M
+ }
+
+ /**
+ * Runs binary serializable test using a stream with a size of kBytes.
+ * @param size in kBytes.
+ */
+ private void runBinarySerializableTest(int size) throws Exception {
+ File tmp = File.createTempFile("test", "bin");
+ OutputStream out = new FileOutputStream(tmp);
+ byte[] stuff = new byte[1024];
+ Arrays.fill(stuff, (byte) 7);
+ for (int i = 0; i < size; i++) {
+ out.write(stuff);
+ }
+ out.close();
+ InputStream in = new FileInputStream(tmp);
+ QValue v = factory.create(in);
+ in.close();
+ tmp.delete();
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ ObjectOutputStream oout = new ObjectOutputStream(bout);
+ oout.writeObject(v);
+ oout.close();
+ ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+ ObjectInputStream oin = new ObjectInputStream(bin);
+ QValue serValue = (QValue) oin.readObject();
+ try {
+ InputStream in1 = new BufferedInputStream(v.getStream());
+ InputStream in2 = new BufferedInputStream(serValue.getStream());
+ int i;
+ while ((i = in1.read()) > -1) {
+ assertEquals(i, in2.read());
+ }
+ assertEquals(in2.read(), -1);
+ in1.close();
+ in2.close();
+ } finally {
+ v.discard();
+ serValue.discard();
+ }
}
}