Author: jukka
Date: Wed Nov 13 15:47:47 2013
New Revision: 1541563

URL: http://svn.apache.org/r1541563
Log:
OAK-392: Review ContentSession#createBlob

Drop the separate BlobFactory and move the createBlob() method to Root.
Document a more detailed contract for blob lifecycles.

Removed:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/BlobFactory.java
Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Root.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/DefaultSyncHandler.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/ImmutableRootTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManagerTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACETest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Root.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Root.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Root.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Root.java
 Wed Nov 13 15:47:47 2013
@@ -18,6 +18,9 @@
  */
 package org.apache.jackrabbit.oak.api;
 
+import java.io.IOException;
+import java.io.InputStream;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -153,13 +156,23 @@ public interface Root {
     QueryEngine getQueryEngine();
 
     /**
-     * Returns the blob factory (TODO: review if that really belongs to the 
OAK-API. see also todos on BlobFactory)
-     *
-     * @return the blob factory.
+     * Reads (and closes) the given stream and returns a {@link Blob} that
+     * contains that binary. The returned blob will remain valid at least
+     * until the {@link ContentSession} of this root is closed, or longer
+     * if it has been committed as a part of a content update.
+     * <p>
+     * The implementation may decide to persist the blob at any point
+     * during or between this method method call and a {@link #commit()}
+     * that includes the blob, but the blob will become visible to other
+     * sessions only after such a commit.
+     *
+     * @param stream the stream for reading the binary
+     * @return the blob that was created
+     * @throws IOException if the stream could not be read
      */
     @Nonnull
-    BlobFactory getBlobFactory();
-    
+    Blob createBlob(@Nonnull InputStream stream) throws IOException;
+
     /**
      * Get the {@code ContentSession} from which this root was acquired
      * 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
 Wed Nov 13 15:47:47 2013
@@ -35,7 +35,6 @@ import javax.annotation.Nullable;
 import javax.security.auth.Subject;
 
 import org.apache.jackrabbit.oak.api.Blob;
-import org.apache.jackrabbit.oak.api.BlobFactory;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.QueryEngine;
@@ -338,18 +337,10 @@ public abstract class AbstractRoot imple
         };
     }
 
-    @Nonnull
-    @Override
-    public BlobFactory getBlobFactory() {
+    @Override @Nonnull
+    public Blob createBlob(@Nonnull InputStream inputStream) throws 
IOException {
         checkLive();
-
-        return new BlobFactory() {
-            @Override
-            public Blob createBlob(InputStream inputStream) throws IOException 
{
-                checkLive();
-                return store.createBlob(inputStream);
-            }
-        };
+        return store.createBlob(checkNotNull(inputStream));
     }
 
     //-----------------------------------------------------------< internal 
>---

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
 Wed Nov 13 15:47:47 2013
@@ -21,9 +21,11 @@ package org.apache.jackrabbit.oak.core;
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
 
+import java.io.InputStream;
+
 import javax.annotation.Nonnull;
 
-import org.apache.jackrabbit.oak.api.BlobFactory;
+import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.QueryEngine;
 import org.apache.jackrabbit.oak.api.Root;
@@ -117,9 +119,8 @@ public final class ImmutableRoot impleme
         };
     }
 
-    @Nonnull
-    @Override
-    public BlobFactory getBlobFactory() {
+    @Override @Nonnull
+    public Blob createBlob(@Nonnull InputStream stream) {
         throw new UnsupportedOperationException();
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java
 Wed Nov 13 15:47:47 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.value;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
@@ -24,6 +26,7 @@ import java.net.URISyntaxException;
 import java.util.Calendar;
 import java.util.List;
 
+import javax.annotation.Nonnull;
 import javax.jcr.Binary;
 import javax.jcr.Node;
 import javax.jcr.PropertyType;
@@ -36,9 +39,9 @@ import javax.jcr.nodetype.NodeType;
 import com.google.common.collect.Lists;
 
 import org.apache.jackrabbit.oak.api.Blob;
-import org.apache.jackrabbit.oak.api.BlobFactory;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.PropertyValue;
+import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.namepath.JcrNameParser;
 import org.apache.jackrabbit.oak.namepath.JcrPathParser;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
@@ -59,19 +62,20 @@ import org.apache.jackrabbit.util.ISO860
  */
 public class ValueFactoryImpl implements ValueFactory {
 
-    private final BlobFactory blobFactory;
+    private final Root root;
     private final NamePathMapper namePathMapper;
 
     /**
      * Creates a new instance of {@code ValueFactory}.
      *
-     * @param blobFactory The factory for creation of binary values
+     * @param root the root instance for creating binary values
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
      * the internal representation.
      */
-    public ValueFactoryImpl(BlobFactory blobFactory, NamePathMapper 
namePathMapper) {
-        this.blobFactory = blobFactory;
-        this.namePathMapper = namePathMapper;
+    public ValueFactoryImpl(
+            @Nonnull Root root, @Nonnull NamePathMapper namePathMapper) {
+        this.root = checkNotNull(root);
+        this.namePathMapper = checkNotNull(namePathMapper);
     }
 
     /**
@@ -274,7 +278,7 @@ public class ValueFactoryImpl implements
     }
 
     private ValueImpl createBinaryValue(InputStream value) throws IOException {
-        Blob blob = blobFactory.createBlob(value);
+        Blob blob = root.createBlob(value);
         return new ValueImpl(BinaryPropertyState.binaryProperty("", blob), 
namePathMapper);
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/DefaultSyncHandler.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/DefaultSyncHandler.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/DefaultSyncHandler.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/DefaultSyncHandler.java
 Wed Nov 13 15:47:47 2013
@@ -68,7 +68,7 @@ public class DefaultSyncHandler implemen
         this.mode = mode;
         this.options = (options == null) ? ConfigurationParameters.EMPTY : 
options;
 
-        valueFactory = new ValueFactoryImpl(root.getBlobFactory(), 
NamePathMapper.DEFAULT);
+        valueFactory = new ValueFactoryImpl(root, NamePathMapper.DEFAULT);
         initialized = true;
         return true;
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractSecurityTest.java
 Wed Nov 13 15:47:47 2013
@@ -184,7 +184,7 @@ public abstract class AbstractSecurityTe
     }
 
     protected ValueFactory getValueFactory() {
-        return new ValueFactoryImpl(root.getBlobFactory(), 
getNamePathMapper());
+        return new ValueFactoryImpl(root, getNamePathMapper());
     }
 
     protected User getTestUser() throws Exception {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/ImmutableRootTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/ImmutableRootTest.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/ImmutableRootTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/ImmutableRootTest.java
 Wed Nov 13 15:47:47 2013
@@ -19,6 +19,8 @@ package org.apache.jackrabbit.oak.core;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.fail;
 
+import java.io.ByteArrayInputStream;
+
 import org.apache.jackrabbit.oak.NodeStoreFixture;
 import org.apache.jackrabbit.oak.OakBaseTest;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -84,7 +86,7 @@ public class ImmutableRootTest extends O
         }
 
         try {
-            root.getBlobFactory();
+            root.createBlob(new ByteArrayInputStream(new byte[0]));
             fail();
         } catch (UnsupportedOperationException e) {
             // success

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
 Wed Nov 13 15:47:47 2013
@@ -113,7 +113,7 @@ public class AccessControlManagerImplTes
         npMapper = new NamePathMapperImpl(nameMapper);
 
         acMgr = getAccessControlManager(npMapper);
-        valueFactory = new ValueFactoryImpl(root.getBlobFactory(), npMapper);
+        valueFactory = new ValueFactoryImpl(root, npMapper);
 
         NodeUtil rootNode = new NodeUtil(root.getTree("/"), npMapper);
         rootNode.addChild(testName, JcrConstants.NT_UNSTRUCTURED);

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManagerTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManagerTest.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManagerTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManagerTest.java
 Wed Nov 13 15:47:47 2013
@@ -53,7 +53,7 @@ public class UserQueryManagerTest extend
         user = getTestUser();
         queryMgr = new UserQueryManager(userMgr, namePathMapper, 
getUserConfiguration().getParameters(), root);
 
-        valueFactory = new ValueFactoryImpl(root.getBlobFactory(), 
namePathMapper);
+        valueFactory = new ValueFactoryImpl(root, namePathMapper);
         propertyName = "testProperty";
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACETest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACETest.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACETest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACETest.java
 Wed Nov 13 15:47:47 2013
@@ -77,7 +77,7 @@ public class ACETest extends AbstractAcc
                 return "TestPrincipal";
             }
         };
-        ValueFactory valueFactory = new 
ValueFactoryImpl(root.getBlobFactory(), namePathMapper);
+        ValueFactory valueFactory = new ValueFactoryImpl(root, namePathMapper);
         globValue = valueFactory.createValue("*");
         nameValue = valueFactory.createValue("nt:file", PropertyType.NAME);
         nameValues = new Value[] {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
 Wed Nov 13 15:47:47 2013
@@ -63,7 +63,7 @@ public class AbstractRestrictionProvider
     public void before() throws Exception {
         super.before();
 
-        valueFactory = new ValueFactoryImpl(root.getBlobFactory(), 
namePathMapper);
+        valueFactory = new ValueFactoryImpl(root, namePathMapper);
         globValue = valueFactory.createValue("*");
         nameValue = valueFactory.createValue("nt:file", PropertyType.NAME);
         nameValues = new Value[] {

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java?rev=1541563&r1=1541562&r2=1541563&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 Wed Nov 13 15:47:47 2013
@@ -130,7 +130,7 @@ public class SessionContext implements N
         this.namePathMapper = new NamePathMapperImpl(
                 nameMapper, delegate.getIdManager());
         this.valueFactory = new ValueFactoryImpl(
-                delegate.getRoot().getBlobFactory(), namePathMapper);
+                delegate.getRoot(), namePathMapper);
     }
 
     public final Map<String, Object> getAttributes() {


Reply via email to