Author: mreutegg Date: Thu Apr 24 11:47:11 2014 New Revision: 1589680 URL: http://svn.apache.org/r1589680 Log: OAK-1761: DocumentNodeStore does not make use of References while serializing Blob
Modified: jackrabbit/oak/branches/1.0/ (props changed) jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java Propchange: jackrabbit/oak/branches/1.0/ ------------------------------------------------------------------------------ Merged /jackrabbit/oak/trunk:r1589661 Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java?rev=1589680&r1=1589679&r2=1589680&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java Thu Apr 24 11:47:11 2014 @@ -280,7 +280,17 @@ public final class DocumentNodeStore if (blob instanceof BlobStoreBlob) { return ((BlobStoreBlob) blob).getBlobId(); } + String id; + + String reference = blob.getReference(); + if(reference != null){ + id = blobStore.getBlobId(reference); + if(id != null){ + return id; + } + } + try { id = createBlob(blob.getNewStream()).getBlobId(); } catch (IOException e) { Modified: jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java?rev=1589680&r1=1589679&r2=1589680&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java (original) +++ jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobTest.java Thu Apr 24 11:47:11 2014 @@ -18,9 +18,17 @@ package org.apache.jackrabbit.oak.plugin import static org.junit.Assert.assertEquals; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Random; +import org.apache.jackrabbit.oak.api.Blob; +import org.apache.jackrabbit.oak.kernel.BlobSerializer; +import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob; +import org.apache.jackrabbit.oak.plugins.memory.ArrayBasedBlob; +import org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,8 +79,58 @@ public class BlobTest { mk.dispose(); } + @Test + public void testBlobSerialization() throws Exception{ + TestBlobStore blobStore = new TestBlobStore(); + DocumentMK mk = new DocumentMK.Builder().setBlobStore(blobStore).open(); + BlobSerializer blobSerializer = mk.getNodeStore().getBlobSerializer(); + + Blob blob = new BlobStoreBlob(blobStore, "foo"); + assertEquals("foo", blobSerializer.serialize(blob)); + assertEquals(0, blobStore.writeCount); + + blob = new ArrayBasedBlob("foo".getBytes()); + blobSerializer.serialize(blob); + assertEquals(1, blobStore.writeCount); + + byte[] bytes = "foo".getBytes(); + String blobId = blobStore.writeBlob(new ByteArrayInputStream(bytes)); + String reference = blobStore.getReference(blobId); + blob = new ReferencedBlob("foo".getBytes(), reference); + + blobStore.writeCount = 0; + blobSerializer.serialize(blob); + + //Using reference so no reference should be written + assertEquals(0, blobStore.writeCount); + } + private static void log(String s) { LOG.info(s); } + + private static class TestBlobStore extends MemoryBlobStore { + int writeCount; + + @Override + public String writeBlob(InputStream in) throws IOException { + writeCount++; + return super.writeBlob(in); + } + } + + private static class ReferencedBlob extends ArrayBasedBlob { + private final String reference; + + public ReferencedBlob(byte[] value, String reference) { + super(value); + this.reference = reference; + } + + @Override + public String getReference() { + return reference; + } + } }