Author: mreutegg
Date: Tue Aug  7 14:32:49 2018
New Revision: 1837601

URL: http://svn.apache.org/viewvc?rev=1837601&view=rev
Log:
OAK-7688: Replace usage of static ValueFactoryImpl

Added:
    
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/PartialValueFactory.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeEditor.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/QueryUtilTest.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFactory.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java
    
jackrabbit/oak/trunk/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACE.java
    
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
    
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueFactoryImpl.java
    
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueImpl.java
    
jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStatesTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
 Tue Aug  7 14:32:49 2018
@@ -37,7 +37,7 @@ import javax.jcr.nodetype.PropertyDefini
 
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.nodetype.EffectiveNodeType;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
@@ -61,10 +61,13 @@ class EffectiveNodeTypeImpl implements E
 
     private final ReadOnlyNodeTypeManager ntMgr;
 
+    private final PartialValueFactory valueFactory;
+
     EffectiveNodeTypeImpl(
             NodeTypeImpl primary, NodeTypeImpl[] mixins,
             ReadOnlyNodeTypeManager ntMgr) {
         this.ntMgr = ntMgr;
+        this.valueFactory = new PartialValueFactory(ntMgr.getNamePathMapper());
 
         addNodeType(checkNotNull(primary));
         for (NodeTypeImpl mixin : checkNotNull(mixins)) {
@@ -286,12 +289,12 @@ class EffectiveNodeTypeImpl implements E
 
         NodeType nt = definition.getDeclaringNodeType();
         if (definition.isMultiple()) {
-            List<Value> values = ValueFactoryImpl.createValues(property, 
ntMgr.getNamePathMapper());
+            List<Value> values = valueFactory.createValues(property);
             if (!nt.canSetProperty(property.getName(), values.toArray(new 
Value[values.size()]))) {
                 throw new ConstraintViolationException("Cannot set property '" 
+ property.getName() + "' to '" + values + '\'');
             }
         } else {
-            Value v = ValueFactoryImpl.createValue(property, 
ntMgr.getNamePathMapper());
+            Value v = valueFactory.createValue(property);
             if (!nt.canSetProperty(property.getName(), v)) {
                 throw new ConstraintViolationException("Cannot set property '" 
+ property.getName() + "' to '" + v + '\'');
             }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java
 Tue Aug  7 14:32:49 2018
@@ -30,7 +30,7 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 
 /**
@@ -106,10 +106,10 @@ class PropertyDefinitionImpl extends Ite
         if (property == null) {
             return null;
         } else if (property.isArray()) {
-            List<Value> values = ValueFactoryImpl.createValues(property, 
mapper);
+            List<Value> values = new 
PartialValueFactory(mapper).createValues(property);
             return values.toArray(NO_VALUES);
         } else {
-            Value value = ValueFactoryImpl.createValue(property, mapper);
+            Value value = new 
PartialValueFactory(mapper).createValue(property);
             return new Value[] { value };
         }
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeEditor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeEditor.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeEditor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeEditor.java
 Tue Aug  7 14:32:49 2018
@@ -51,7 +51,7 @@ import org.apache.jackrabbit.oak.api.Com
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.commit.DefaultEditor;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -146,6 +146,8 @@ public class TypeEditor extends DefaultE
 
     private static final Logger log = 
LoggerFactory.getLogger(TypeEditor.class);
 
+    private final PartialValueFactory valueFactory;
+
     private final Set<String> typesToCheck;
 
     private boolean checkThisNode;
@@ -168,6 +170,7 @@ public class TypeEditor extends DefaultE
             ConstraintViolationCallback callback, Set<String> typesToCheck, 
NodeState types,
             String primary, Iterable<String> mixins, NodeBuilder builder)
             throws CommitFailedException {
+        this.valueFactory = new PartialValueFactory(NamePathMapper.DEFAULT);
         this.callback = checkNotNull(callback);
         this.typesToCheck = typesToCheck;
         this.checkThisNode =
@@ -187,7 +190,8 @@ public class TypeEditor extends DefaultE
             @Nullable String primary, @NotNull Iterable<String> mixins, 
@NotNull NodeBuilder builder,
             boolean validate)
             throws CommitFailedException {
-        this.callback= parent.callback;
+        this.valueFactory = parent.valueFactory;
+        this.callback = parent.callback;
         this.typesToCheck = parent.typesToCheck;
         this.checkThisNode =
                 typesToCheck == null
@@ -205,6 +209,7 @@ public class TypeEditor extends DefaultE
      * Test constructor.
      */
     TypeEditor(EffectiveType effective) {
+        this.valueFactory = new PartialValueFactory(NamePathMapper.DEFAULT);
         this.callback = TypeEditor.THROW_ON_CONSTRAINT_VIOLATION;
         this.typesToCheck = null;
         this.checkThisNode = true;
@@ -421,7 +426,7 @@ public class TypeEditor extends DefaultE
 
         for (String constraint : constraints.getValue(STRINGS)) {
             Predicate<Value> predicate = valueConstraint(requiredType, 
constraint);
-            for (Value v : ValueFactoryImpl.createValues(property, 
NamePathMapper.DEFAULT)) {
+            for (Value v : valueFactory.createValues(property)) {
                 if (predicate.apply(v)) {
                     return;
                 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java
 Tue Aug  7 14:32:49 2018
@@ -34,7 +34,7 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.util.Text;
 import org.jetbrains.annotations.NotNull;
@@ -102,10 +102,10 @@ class AuthorizablePropertiesImpl impleme
         PropertyState property = getAuthorizableProperty(tree, 
getLocation(tree, oakPath), true);
         if (property != null) {
             if (property.isArray()) {
-                List<Value> vs = ValueFactoryImpl.createValues(property, 
namePathMapper);
+                List<Value> vs = new 
PartialValueFactory(namePathMapper).createValues(property);
                 values = vs.toArray(new Value[vs.size()]);
             } else {
-                values = new Value[]{ValueFactoryImpl.createValue(property, 
namePathMapper)};
+                values = new Value[]{new 
PartialValueFactory(namePathMapper).createValue(property)};
             }
         }
         return values;

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/QueryUtilTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/QueryUtilTest.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/QueryUtilTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/query/QueryUtilTest.java
 Tue Aug  7 14:32:49 2018
@@ -16,9 +16,11 @@
  */
 package org.apache.jackrabbit.oak.security.user.query;
 
+import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
 import javax.jcr.NamespaceRegistry;
+import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 
@@ -30,8 +32,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.namepath.impl.LocalNameMapper;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.namepath.impl.NamePathMapperImpl;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyValues;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.query.QueryConstants;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.user.AuthorizableType;
@@ -44,6 +45,8 @@ import static org.junit.Assert.assertSam
 
 public class QueryUtilTest {
 
+    private PartialValueFactory valueFactory = new 
PartialValueFactory(NamePathMapper.DEFAULT);
+
     private static void assertSearchRoot(@NotNull Map<AuthorizableType, 
String> mapping, @NotNull ConfigurationParameters params) {
         for (AuthorizableType type : mapping.keySet()) {
             String expected = QueryConstants.SEARCH_ROOT_PATH + 
mapping.get(type);
@@ -149,36 +152,37 @@ public class QueryUtilTest {
     @Test
     public void testFormatString() throws Exception {
         String value = "'string\\value";
-        assertEquals("'"+QueryUtils.escapeForQuery(value)+"'", 
QueryUtil.format(ValueFactoryImpl.createValue(PropertyValues.newString(value), 
NamePathMapper.DEFAULT)));
+        assertEquals("'"+QueryUtils.escapeForQuery(value)+"'", 
QueryUtil.format(valueFactory.createValue(value)));
     }
 
     @Test
     public void testFormatBoolean() throws Exception {
-        assertEquals("'"+Boolean.TRUE.toString()+"'", 
QueryUtil.format(ValueFactoryImpl.createValue(PropertyValues.newBoolean(true), 
NamePathMapper.DEFAULT)));
+        assertEquals("'"+Boolean.TRUE.toString()+"'", 
QueryUtil.format(valueFactory.createValue(true)));
 
     }
 
     @Test
     public void testFormatLong() throws Exception {
-        Value longV = 
ValueFactoryImpl.createValue(PropertyValues.newLong(Long.MAX_VALUE), 
NamePathMapper.DEFAULT);
+        Value longV = valueFactory.createValue(Long.MAX_VALUE);
         assertEquals(String.valueOf(Long.MAX_VALUE), QueryUtil.format(longV));
     }
 
     @Test
     public void testFormatDouble() throws Exception {
-        Value doubleV = 
ValueFactoryImpl.createValue(PropertyValues.newDouble(Double.valueOf(2.3)), 
NamePathMapper.DEFAULT);
+        Value doubleV = valueFactory.createValue(2.3);
         assertEquals(String.valueOf(2.3), QueryUtil.format(doubleV));
     }
 
     @Test
     public void testFormatDate() throws Exception {
-        Value dateV = 
ValueFactoryImpl.createValue(PropertyValues.newDate("dateString"), 
NamePathMapper.DEFAULT);
-        assertEquals("xs:dateTime('dateString')", QueryUtil.format(dateV));
+        Value dateV = valueFactory.createValue(Calendar.getInstance());
+        String dateString = dateV.getString();
+        assertEquals("xs:dateTime('" + dateString + "')", 
QueryUtil.format(dateV));
     }
 
     @Test(expected = RepositoryException.class)
     public void testFormatOtherTypes() throws Exception {
-        Value nameValue = 
ValueFactoryImpl.createValue(PropertyValues.newName(JcrConstants.JCR_CREATED), 
NamePathMapper.DEFAULT);
+        Value nameValue = valueFactory.createValue(JcrConstants.JCR_CREATED, 
PropertyType.NAME);
         QueryUtil.format(nameValue);
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFactory.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFactory.java
 Tue Aug  7 14:32:49 2018
@@ -37,7 +37,7 @@ import org.apache.jackrabbit.api.observa
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 
 /**
@@ -54,6 +54,8 @@ public class EventFactory {
 
     private final NamePathMapper mapper;
 
+    private final PartialValueFactory valueFactory;
+
     private final String userID;
 
     private final String userData;
@@ -64,6 +66,7 @@ public class EventFactory {
 
     EventFactory(NamePathMapper mapper, CommitInfo commitInfo) {
         this.mapper = mapper;
+        this.valueFactory = new PartialValueFactory(mapper);
         if (!commitInfo.isExternal()) {
             this.userID = commitInfo.getUserId();
             Object userData = commitInfo.getInfo().get(USER_DATA);
@@ -136,10 +139,10 @@ public class EventFactory {
 
     private Object createValue(PropertyState property) {
         if (property.isArray()) {
-            List<Value> values = ValueFactoryImpl.createValues(property, 
mapper);
+            List<Value> values = valueFactory.createValues(property);
             return values.toArray(new Value[values.size()]);
         } else {
-            return ValueFactoryImpl.createValue(property, mapper);
+            return valueFactory.createValue(property);
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
 Tue Aug  7 14:32:49 2018
@@ -30,6 +30,7 @@ import javax.jcr.query.RowIterator;
 
 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 import org.apache.jackrabbit.commons.iterator.RowIteratorAdapter;
+import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Result;
 import org.apache.jackrabbit.oak.api.ResultRow;
@@ -39,7 +40,8 @@ import org.apache.jackrabbit.oak.jcr.ses
 import org.apache.jackrabbit.oak.jcr.session.SessionContext;
 import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate;
 import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyValues;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,10 +59,13 @@ public class QueryResultImpl implements
 
     private final SessionDelegate sessionDelegate;
 
+    private final PartialValueFactory valueFactory;
+
     public QueryResultImpl(SessionContext sessionContext, Result result) {
         this.sessionContext = sessionContext;
         this.sessionDelegate = sessionContext.getSessionDelegate();
         this.result = result;
+        this.valueFactory = new PartialValueFactory(sessionContext);
     }
 
     @Override
@@ -234,7 +239,11 @@ public class QueryResultImpl implements
         if (value == null) {
             return null;
         }
-        return ValueFactoryImpl.createValue(value, sessionContext);
+        PropertyState state = PropertyValues.create(value);
+        if (state == null) {
+            throw new IllegalArgumentException("Failed to convert the 
specified property value to a property state.");
+        }
+        return valueFactory.createValue(state);
     }
 
 }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
 Tue Aug  7 14:32:49 2018
@@ -44,7 +44,7 @@ import org.apache.jackrabbit.oak.api.Typ
 import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate;
 import org.apache.jackrabbit.oak.jcr.delegate.PropertyDelegate;
 import org.apache.jackrabbit.oak.jcr.session.operation.PropertyOperation;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
@@ -249,8 +249,8 @@ public class PropertyImpl extends ItemIm
             @NotNull
             @Override
             public Value perform() throws RepositoryException {
-                return ValueFactoryImpl.createValue(
-                        property.getSingleState(), sessionContext);
+                return new PartialValueFactory(sessionContext)
+                        .createValue(property.getSingleState());
             }
         });
     }
@@ -262,8 +262,8 @@ public class PropertyImpl extends ItemIm
             @NotNull
             @Override
             public List<Value> perform() throws RepositoryException {
-                return ValueFactoryImpl.createValues(
-                        property.getMultiState(), sessionContext);
+                return new PartialValueFactory(sessionContext)
+                        .createValues(property.getMultiState());
             }
         }).toArray(NO_VALUES);
     }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java
 Tue Aug  7 14:32:49 2018
@@ -40,7 +40,8 @@ import org.apache.jackrabbit.oak.jcr.del
 import org.apache.jackrabbit.oak.jcr.delegate.VersionHistoryDelegate;
 import org.apache.jackrabbit.oak.jcr.delegate.VersionManagerDelegate;
 import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.Conversions;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.version.VersionConstants;
 import org.jetbrains.annotations.NotNull;
 
@@ -70,7 +71,7 @@ public class VersionImpl extends NodeImp
             @Override
             public Calendar perform() throws RepositoryException {
                 PropertyDelegate dlg = 
getPropertyOrThrow(JcrConstants.JCR_CREATED);
-                return ValueFactoryImpl.createValue(dlg.getSingleState(), 
sessionContext).getDate();
+                return Conversions.convert(dlg.getDate()).toCalendar();
             }
         });
     }
@@ -114,7 +115,7 @@ public class VersionImpl extends NodeImp
     }
 
     private List<Value> getValues(PropertyDelegate p) throws 
InvalidItemStateException, ValueFormatException {
-        return ValueFactoryImpl.createValues(p.getMultiState(), 
sessionContext);
+        return new 
PartialValueFactory(sessionContext).createValues(p.getMultiState());
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACE.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACE.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACE.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACE.java
 Tue Aug  7 14:32:49 2018
@@ -31,7 +31,7 @@ import com.google.common.collect.Collect
 import com.google.common.collect.ImmutableSet;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.Restriction;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
 import org.jetbrains.annotations.NotNull;
@@ -49,6 +49,7 @@ public abstract class ACE implements Jac
     private final boolean isAllow;
     private final Set<Restriction> restrictions;
     private final NamePathMapper namePathMapper;
+    private final PartialValueFactory valueFactory;
 
     private int hashCode;
 
@@ -63,6 +64,7 @@ public abstract class ACE implements Jac
         this.isAllow = isAllow;
         this.restrictions = (restrictions == null) ? 
Collections.<Restriction>emptySet() : ImmutableSet.copyOf(restrictions);
         this.namePathMapper = namePathMapper;
+        this.valueFactory = new PartialValueFactory(namePathMapper);
     }
 
     
//--------------------------------------------------------------------------
@@ -107,13 +109,13 @@ public abstract class ACE implements Jac
             String jcrName = getJcrName(restriction);
             if (jcrName.equals(restrictionName)) {
                 if (restriction.getDefinition().getRequiredType().isArray()) {
-                    List<Value> values = 
ValueFactoryImpl.createValues(restriction.getProperty(), namePathMapper);
+                    List<Value> values = 
valueFactory.createValues(restriction.getProperty());
                     switch (values.size()) {
                         case 1: return values.get(0);
                         default : throw new ValueFormatException("Attempt to 
retrieve single value from multivalued property");
                     }
                 } else {
-                    return 
ValueFactoryImpl.createValue(restriction.getProperty(), namePathMapper);
+                    return valueFactory.createValue(restriction.getProperty());
                 }
             }
         }
@@ -126,7 +128,7 @@ public abstract class ACE implements Jac
         for (Restriction restriction : restrictions) {
             String jcrName = getJcrName(restriction);
             if (jcrName.equals(restrictionName)) {
-                List<Value> values = 
ValueFactoryImpl.createValues(restriction.getProperty(), namePathMapper);
+                List<Value> values = 
valueFactory.createValues(restriction.getProperty());
                 return values.toArray(new Value[values.size()]);
             }
         }

Modified: 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java
 Tue Aug  7 14:32:49 2018
@@ -22,18 +22,16 @@ import java.util.Map;
 import java.util.Set;
 import javax.jcr.PropertyType;
 import javax.jcr.Value;
-import javax.jcr.ValueFactory;
 import javax.jcr.security.AccessControlException;
 
 import com.google.common.collect.ImmutableMap;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -59,13 +57,13 @@ public class AbstractRestrictionProvider
     private Value nameValue;
 
     private final NamePathMapper namePathMapper = NamePathMapper.DEFAULT;
-    private ValueFactory valueFactory;
+    private PartialValueFactory valueFactory;
     private Map<String, ? extends RestrictionDefinition> supported;
     private AbstractRestrictionProvider restrictionProvider;
 
     @Before
     public void before() throws Exception {
-        valueFactory = new ValueFactoryImpl(Mockito.mock(Root.class), 
namePathMapper);
+        valueFactory = new PartialValueFactory(namePathMapper);
         globValue = valueFactory.createValue("*");
         nameValue = valueFactory.createValue("nt:file", PropertyType.NAME);
         nameValues = new Value[] {
@@ -223,7 +221,7 @@ public class AbstractRestrictionProvider
         assertTrue(ps.isArray());
         assertEquals(Type.NAMES, ps.getType());
 
-        List<Value> vs = ValueFactoryImpl.createValues(ps, namePathMapper);
+        List<Value> vs = valueFactory.createValues(ps);
         assertArrayEquals(nameValues, vs.toArray(new Value[vs.size()]));
     }
 
@@ -238,7 +236,7 @@ public class AbstractRestrictionProvider
         assertTrue(ps.isArray());
         assertEquals(Type.NAMES, ps.getType());
 
-        List<Value> vs = ValueFactoryImpl.createValues(ps, namePathMapper);
+        List<Value> vs = valueFactory.createValues(ps);
         assertArrayEquals(nameValues, vs.toArray(new Value[vs.size()]));
     }
 
@@ -252,7 +250,7 @@ public class AbstractRestrictionProvider
         assertTrue(r.getProperty().isArray());
         assertEquals(Type.NAMES, r.getProperty().getType());
 
-        List<Value> vs = ValueFactoryImpl.createValues(r.getProperty(), 
namePathMapper);
+        List<Value> vs = valueFactory.createValues(r.getProperty());
         assertArrayEquals(new Value[] {nameValue}, vs.toArray(new 
Value[vs.size()]));
     }
 
@@ -266,7 +264,7 @@ public class AbstractRestrictionProvider
         assertTrue(r.getProperty().isArray());
         assertEquals(Type.NAMES, r.getProperty().getType());
 
-        List<Value> vs = ValueFactoryImpl.createValues(r.getProperty(), 
namePathMapper);
+        List<Value> vs = valueFactory.createValues(r.getProperty());
         assertNotNull(vs);
         assertEquals(0, vs.size());
     }
@@ -281,7 +279,7 @@ public class AbstractRestrictionProvider
         assertTrue(r.getProperty().isArray());
         assertEquals(Type.NAMES, r.getProperty().getType());
 
-        List<Value> vs = ValueFactoryImpl.createValues(r.getProperty(), 
namePathMapper);
+        List<Value> vs = valueFactory.createValues(r.getProperty());
         assertNotNull(vs);
         assertEquals(0, vs.size());
     }

Added: 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/PartialValueFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/PartialValueFactory.java?rev=1837601&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/PartialValueFactory.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/PartialValueFactory.java
 Tue Aug  7 14:32:49 2018
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.value.jcr;
+
+import java.math.BigDecimal;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Calendar;
+import java.util.List;
+
+import javax.jcr.Binary;
+import javax.jcr.Node;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.ValueFormatException;
+import javax.jcr.nodetype.NodeType;
+
+import com.google.common.collect.Lists;
+
+import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.blob.BlobAccessProvider;
+import org.apache.jackrabbit.oak.api.blob.BlobDownloadOptions;
+import org.apache.jackrabbit.oak.api.blob.BlobUpload;
+import org.apache.jackrabbit.oak.commons.UUIDUtils;
+import org.apache.jackrabbit.oak.namepath.JcrNameParser;
+import org.apache.jackrabbit.oak.namepath.JcrPathParser;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.memory.BinaryPropertyState;
+import org.apache.jackrabbit.oak.plugins.memory.BooleanPropertyState;
+import org.apache.jackrabbit.oak.plugins.memory.DecimalPropertyState;
+import org.apache.jackrabbit.oak.plugins.memory.DoublePropertyState;
+import org.apache.jackrabbit.oak.plugins.memory.GenericPropertyState;
+import org.apache.jackrabbit.oak.plugins.memory.LongPropertyState;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.plugins.memory.StringPropertyState;
+import org.apache.jackrabbit.oak.plugins.value.Conversions;
+import org.apache.jackrabbit.util.ISO8601;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.jackrabbit.oak.plugins.value.jcr.ValueImpl.newValue;
+
+/**
+ * A partial value factory implementation that only deals with in-memory values
+ * and can wrap a {@link Value} around a {@link PropertyState}.
+ */
+public class PartialValueFactory {
+
+    /**
+     * This default blob access provider is a no-op implementation.
+     */
+    public static final BlobAccessProvider DEFAULT_BLOB_ACCESS_PROVIDER = new 
DefaultBlobAccessProvider();
+
+    @NotNull
+    protected final NamePathMapper namePathMapper;
+
+    @NotNull
+    private final BlobAccessProvider blobAccessProvider;
+
+    /**
+     * Creates a new value factory stub using the given {@link NamePathMapper}.
+     * The factory instance created with this constructor does not have a
+     * {@link BlobAccessProvider} and any {@link Binary} retrieved from a
+     * {@link Value} returned by this factory instance will not provide a
+     * download URI.
+     *
+     * @param namePathMapper the name path mapper.
+     */
+    public PartialValueFactory(@NotNull NamePathMapper namePathMapper) {
+        this(namePathMapper, DEFAULT_BLOB_ACCESS_PROVIDER);
+    }
+
+    /**
+     * Creates a new value factory stub using the given {@link NamePathMapper}
+     * and {@link BlobAccessProvider}.
+     *
+     * @param namePathMapper the name path mapper.
+     * @param blobAccessProvider the blob access provider.
+     */
+    public PartialValueFactory(@NotNull NamePathMapper namePathMapper,
+                               @NotNull BlobAccessProvider blobAccessProvider) 
{
+        this.namePathMapper = checkNotNull(namePathMapper);
+        this.blobAccessProvider = checkNotNull(blobAccessProvider);
+    }
+
+    @NotNull
+    public BlobAccessProvider getBlobAccessProvider() {
+        return blobAccessProvider;
+    }
+
+    /**
+     * Utility method for creating a {@code Value} based on a
+     * {@code PropertyState}.
+     *
+     * @param property The property state
+     * @return New {@code Value} instance
+     * @throws IllegalArgumentException if {@code property.isArray()} is
+     *         {@code true}.
+     */
+    public Value createValue(@NotNull PropertyState property) {
+        return newValue(property, namePathMapper, blobAccessProvider);
+    }
+
+    /**
+     * Utility method for creating {@code Value}s based on a
+     * {@code PropertyState}.
+     *
+     * @param property The property state
+     * @return A list of new {@code Value} instances
+     */
+    public List<Value> createValues(@NotNull PropertyState property) {
+        List<Value> values = Lists.newArrayList();
+        for (int i = 0; i < property.count(); i++) {
+            values.add(newValue(property, i, namePathMapper, 
getBlobAccessProvider()));
+        }
+        return values;
+    }
+
+    //-------------------------------------------------------< ValueFactory 
>---
+
+    public Value createValue(String value) {
+        return newValue(StringPropertyState.stringProperty("", value), 
namePathMapper, getBlobAccessProvider());
+    }
+
+    public Value createValue(long value) {
+        return newValue(LongPropertyState.createLongProperty("", value), 
namePathMapper, getBlobAccessProvider());
+    }
+
+    public Value createValue(double value) {
+        return newValue(DoublePropertyState.doubleProperty("", value), 
namePathMapper, getBlobAccessProvider());
+    }
+
+    public Value createValue(Calendar value) {
+        return newValue(PropertyStates.createProperty("", value), 
namePathMapper, getBlobAccessProvider());
+    }
+
+    public Value createValue(boolean value) {
+        return newValue(BooleanPropertyState.booleanProperty("", value), 
namePathMapper, getBlobAccessProvider());
+    }
+
+    public Value createValue(Node value) throws RepositoryException {
+        return createValue(value, false);
+    }
+
+    public Value createValue(Node value, boolean weak) throws 
RepositoryException {
+        if (!value.isNodeType(NodeType.MIX_REFERENCEABLE)) {
+            throw new ValueFormatException(
+                    "Node is not referenceable: " + value.getPath());
+        }
+        return weak
+                ? newValue(GenericPropertyState.weakreferenceProperty("", 
value.getUUID()), namePathMapper, getBlobAccessProvider())
+                : newValue(GenericPropertyState.referenceProperty("", 
value.getUUID()), namePathMapper, getBlobAccessProvider());
+    }
+
+    public Value createValue(BigDecimal value) {
+        return newValue(DecimalPropertyState.decimalProperty("", value), 
namePathMapper, getBlobAccessProvider());
+    }
+
+    public Value createValue(String value, int type) throws 
ValueFormatException {
+        if (value == null) {
+            throw new ValueFormatException("null");
+        }
+
+        try {
+            switch (type) {
+                case PropertyType.STRING:
+                    return createValue(value);
+                case PropertyType.BINARY:
+                    return newValue(BinaryPropertyState.binaryProperty("", 
value), namePathMapper, getBlobAccessProvider());
+                case PropertyType.LONG:
+                    return createValue(Conversions.convert(value).toLong());
+                case PropertyType.DOUBLE:
+                    return createValue(Conversions.convert(value).toDouble());
+                case PropertyType.DATE:
+                    if (ISO8601.parse(value) == null) {
+                        throw new ValueFormatException("Invalid date " + 
value);
+                    }
+                    return newValue(GenericPropertyState.dateProperty("", 
value), namePathMapper, getBlobAccessProvider());
+                case PropertyType.BOOLEAN:
+                    return createValue(Conversions.convert(value).toBoolean());
+                case PropertyType.NAME:
+                    String oakName = namePathMapper.getOakNameOrNull(value);
+                    if (oakName == null || !JcrNameParser.validate(oakName)) {
+                        throw new ValueFormatException("Invalid name: " + 
value);
+                    }
+                    return newValue(GenericPropertyState.nameProperty("", 
oakName), namePathMapper, getBlobAccessProvider());
+                case PropertyType.PATH:
+                    String oakValue = value;
+                    if (value.startsWith("[") && value.endsWith("]")) {
+                        // identifier path; do no change
+                    } else {
+                        oakValue = namePathMapper.getOakPath(value);
+                        if (oakValue == null || 
!JcrPathParser.validate(oakValue)) {
+                            throw new ValueFormatException("Invalid path: " + 
value);
+                        }
+                    }
+                    return newValue(GenericPropertyState.pathProperty("", 
oakValue), namePathMapper, getBlobAccessProvider());
+                case PropertyType.REFERENCE:
+                    if (!UUIDUtils.isValidUUID(value)) {
+                        throw new ValueFormatException("Invalid reference 
value " + value);
+                    }
+                    return newValue(GenericPropertyState.referenceProperty("", 
value), namePathMapper, getBlobAccessProvider());
+                case PropertyType.WEAKREFERENCE:
+                    if (!UUIDUtils.isValidUUID(value)) {
+                        throw new ValueFormatException("Invalid weak reference 
value " + value);
+                    }
+                    return 
newValue(GenericPropertyState.weakreferenceProperty("", value), namePathMapper, 
getBlobAccessProvider());
+                case PropertyType.URI:
+                    new URI(value);
+                    return newValue(GenericPropertyState.uriProperty("", 
value), namePathMapper, getBlobAccessProvider());
+                case PropertyType.DECIMAL:
+                    return createValue(Conversions.convert(value).toDecimal());
+                default:
+                    throw new ValueFormatException("Invalid type: " + type);
+            }
+        } catch (NumberFormatException | URISyntaxException e) {
+            throw new ValueFormatException("Invalid value " + value + " for 
type " + PropertyType.nameFromValue(type), e);
+        }
+    }
+
+    /**
+     * A {@link BlobAccessProvider} implementation that does not support direct
+     * binary up- or download.
+     */
+    private static class DefaultBlobAccessProvider
+            implements BlobAccessProvider {
+
+        @Nullable
+        @Override
+        public BlobUpload initiateBlobUpload(long maxUploadSizeInBytes,
+                                             int maxNumberOfURIs) {
+            return null;
+        }
+
+        @Nullable
+        @Override
+        public Blob completeBlobUpload(@NotNull String uploadToken) {
+            return null;
+        }
+
+        @Nullable
+        @Override
+        public URI getDownloadURI(@NotNull Blob blob,
+                                  @NotNull BlobDownloadOptions 
downloadOptions) { return null; }
+    }
+}

Propchange: 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/PartialValueFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueFactoryImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueFactoryImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueFactoryImpl.java
 Tue Aug  7 14:32:49 2018
@@ -16,137 +16,136 @@
  */
 package org.apache.jackrabbit.oak.plugins.value.jcr;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.io.IOException;
 import java.io.InputStream;
-import java.math.BigDecimal;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Calendar;
 import java.util.List;
+
 import javax.jcr.Binary;
-import javax.jcr.Node;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.ValueFactory;
-import javax.jcr.ValueFormatException;
-import javax.jcr.nodetype.NodeType;
 
-import com.google.common.collect.Lists;
 import org.apache.jackrabbit.api.ReferenceBinary;
 import org.apache.jackrabbit.oak.api.Blob;
 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.commons.UUIDUtils;
+import org.apache.jackrabbit.oak.api.blob.BlobAccessProvider;
 import org.apache.jackrabbit.oak.commons.PerfLogger;
-import org.apache.jackrabbit.oak.namepath.JcrNameParser;
-import org.apache.jackrabbit.oak.namepath.JcrPathParser;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.memory.BinaryPropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.BooleanPropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.DecimalPropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.DoublePropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.GenericPropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.LongPropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyValues;
-import org.apache.jackrabbit.oak.plugins.memory.StringPropertyState;
-import org.apache.jackrabbit.oak.plugins.value.Conversions;
 import org.apache.jackrabbit.oak.plugins.value.ErrorValue;
-import org.apache.jackrabbit.util.ISO8601;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.LoggerFactory;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.jackrabbit.oak.plugins.value.jcr.ValueImpl.newValue;
-
 /**
  * Implementation of {@link ValueFactory} interface.
  */
-public class ValueFactoryImpl implements ValueFactory {
+public class ValueFactoryImpl extends PartialValueFactory implements 
ValueFactory {
+
     private static final PerfLogger binOpsLogger = new PerfLogger(
             
LoggerFactory.getLogger("org.apache.jackrabbit.oak.jcr.operations.binary.perf"));
     private final Root root;
-    private final NamePathMapper namePathMapper;
 
     /**
      * Creates a new instance of {@code ValueFactory}.
      *
      * @param root the root instance for creating binary values
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
+     * @param blobAccessProvider The blob access provider
      * the internal representation.
      */
-    public ValueFactoryImpl(@NotNull Root root, @NotNull NamePathMapper 
namePathMapper) {
+    public ValueFactoryImpl(@NotNull Root root,
+                            @NotNull NamePathMapper namePathMapper,
+                            @NotNull BlobAccessProvider blobAccessProvider) {
+        super(namePathMapper, blobAccessProvider);
         this.root = checkNotNull(root);
-        this.namePathMapper = checkNotNull(namePathMapper);
     }
 
     /**
-     * Utility method for creating a {@code Value} based on a {@code 
PropertyState}.
-     * @param property  The property state
+     * Creates a new instance of {@code ValueFactory}. The {@link Value}s
+     * created by this value factory instance will not be backed by a blob
+     * access provider and never return a download URI for a binary value.
+     *
+     * @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(@NotNull Root root, @NotNull NamePathMapper 
namePathMapper) {
+        this(root, namePathMapper, DEFAULT_BLOB_ACCESS_PROVIDER);
+    }
+
+    /**
+     * Utility method for creating a {@code Value} based on a
+     * {@code PropertyState}. The {@link Value} instance created by this 
factory
+     * method will not be backed with a {@link BlobAccessProvider} and the
+     * {@link Binary} retrieved from the {@link Value} does not provide a
+     * download URI, even if the underlying blob store supports it.
+     *
+     * @param property  The property state
+     * @param namePathMapper The name/path mapping used for converting JCR
+     *          names/paths to the internal representation.
      * @return  New {@code Value} instance
      * @throws IllegalArgumentException if {@code property.isArray()} is 
{@code true}.
+     * @deprecated use {@link PartialValueFactory#createValue(PropertyState)} 
instead.
      */
-    public static Value createValue(PropertyState property, NamePathMapper 
namePathMapper) {
-        return newValue(property, namePathMapper);
+    @Deprecated
+    public static Value createValue(@NotNull PropertyState property,
+                                    @NotNull NamePathMapper namePathMapper) {
+        return new PartialValueFactory(namePathMapper).createValue(property);
     }
 
     /**
+     * Utility method for creating a {@code Value} based on a
+     * {@code PropertyValue}. The {@link Value} instance created by this 
factory
+     * method will not be backed with a {@link BlobAccessProvider} and the
+     * {@link Binary} retrieved from the {@link Value} does not provide a
+     * download URI, even if the underlying blob store supports it.
+     *
      * Utility method for creating a {@code Value} based on a {@code 
PropertyValue}.
      * @param property  The property value
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
      * the internal representation.
      * @return  New {@code Value} instance
      * @throws IllegalArgumentException if {@code property.isArray()} is 
{@code true}.
+     * @deprecated use {@link PartialValueFactory#createValue(PropertyState)} 
instead.
      */
+    @Deprecated
     @NotNull
-    public static Value createValue(@NotNull PropertyValue property, @NotNull 
NamePathMapper namePathMapper) {
+    public static Value createValue(@NotNull PropertyValue property,
+                                    @NotNull NamePathMapper namePathMapper) {
         PropertyState ps = PropertyValues.create(property);
         if (ps == null) {
             throw new IllegalArgumentException("Failed to convert the 
specified property value to a property state.");
         }
-        return newValue(ps, namePathMapper);
+        return new PartialValueFactory(namePathMapper).createValue(ps);
     }
 
     /**
-     * Utility method for creating {@code Value}s based on a {@code 
PropertyState}.
+     * Utility method for creating {@code Value}s based on a
+     * {@code PropertyState}. The {@link Value} instances created by this 
factory
+     * method will not be backed with a {@link BlobAccessProvider} and the
+     * {@link Binary} retrieved from the {@link Value} does not provide a
+     * download URI, even if the underlying blob store supports it.
+     *
      * @param property  The property state
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
      * the internal representation.
      * @return  A list of new {@code Value} instances
+     * @deprecated use {@link PartialValueFactory#createValues(PropertyState)} 
instead.
      */
+    @Deprecated
     public static List<Value> createValues(PropertyState property, 
NamePathMapper namePathMapper) {
-        List<Value> values = Lists.newArrayList();
-        for (int i = 0; i < property.count(); i++) {
-            values.add(newValue(property, i, namePathMapper));
-        }
-        return values;
-    }
-
-    /**
-     * Utility method for creating {@code Value}s based on a {@code 
PropertyState}.
-     * @param property  The property state
-     * @return  A list of new {@code Value} instances
-     */
-    public List<Value> createValues(PropertyState property) {
-        List<Value> values = Lists.newArrayList();
-        for (int i = 0; i < property.count(); i++) {
-            values.add(newValue(property, i, namePathMapper));
-        }
-        return values;
+        return new PartialValueFactory(namePathMapper).createValues(property);
     }
 
     //-------------------------------------------------------< ValueFactory 
>---
 
     @Override
-    public Value createValue(String value) {
-        return newValue(StringPropertyState.stringProperty("", value), 
namePathMapper);
-    }
-
-    @Override
     public Value createValue(InputStream value) {
         try {
             return createBinaryValue(value);
@@ -179,110 +178,6 @@ public class ValueFactoryImpl implements
     }
 
     @Override
-    public Value createValue(long value) {
-        return newValue(LongPropertyState.createLongProperty("", value), 
namePathMapper);
-    }
-
-    @Override
-    public Value createValue(double value) {
-        return newValue(DoublePropertyState.doubleProperty("", value), 
namePathMapper);
-    }
-
-    @Override
-    public Value createValue(Calendar value) {
-        return newValue(PropertyStates.createProperty("", value), 
namePathMapper);
-    }
-
-    @Override
-    public Value createValue(boolean value) {
-        return newValue(BooleanPropertyState.booleanProperty("", value), 
namePathMapper);
-    }
-
-    @Override
-    public Value createValue(Node value) throws RepositoryException {
-        return createValue(value, false);
-    }
-
-    @Override @SuppressWarnings("deprecation")
-    public Value createValue(Node value, boolean weak) throws 
RepositoryException {
-        if (!value.isNodeType(NodeType.MIX_REFERENCEABLE)) {
-            throw new ValueFormatException(
-                    "Node is not referenceable: " + value.getPath());
-        }
-        return weak
-            ? newValue(GenericPropertyState.weakreferenceProperty("", 
value.getUUID()), namePathMapper)
-            : newValue(GenericPropertyState.referenceProperty("", 
value.getUUID()), namePathMapper);
-    }
-
-    @Override
-    public Value createValue(BigDecimal value) {
-        return newValue(DecimalPropertyState.decimalProperty("", value), 
namePathMapper);
-    }
-
-    @Override
-    public Value createValue(String value, int type) throws 
ValueFormatException {
-        if (value == null) {
-            throw new ValueFormatException("null");
-        }
-
-        try {
-            switch (type) {
-                case PropertyType.STRING:
-                    return createValue(value);
-                case PropertyType.BINARY:
-                    return newValue(BinaryPropertyState.binaryProperty("", 
value), namePathMapper);
-                case PropertyType.LONG:
-                    return createValue(Conversions.convert(value).toLong());
-                case PropertyType.DOUBLE:
-                    return createValue(Conversions.convert(value).toDouble());
-                case PropertyType.DATE:
-                    if (ISO8601.parse(value) == null) {
-                        throw new ValueFormatException("Invalid date " + 
value);
-                    }
-                    return newValue(GenericPropertyState.dateProperty("", 
value), namePathMapper);
-                case PropertyType.BOOLEAN:
-                    return createValue(Conversions.convert(value).toBoolean());
-                case PropertyType.NAME:
-                    String oakName = namePathMapper.getOakNameOrNull(value);
-                    if (oakName == null || !JcrNameParser.validate(oakName)) {
-                        throw new ValueFormatException("Invalid name: " + 
value);
-                    }
-                    return newValue(GenericPropertyState.nameProperty("", 
oakName), namePathMapper);
-                case PropertyType.PATH:
-                    String oakValue = value;
-                    if (value.startsWith("[") && value.endsWith("]")) {
-                        // identifier path; do no change
-                    } else {
-                        oakValue = namePathMapper.getOakPath(value);
-                        if (oakValue == null || 
!JcrPathParser.validate(oakValue)) {
-                            throw new ValueFormatException("Invalid path: " + 
value);
-                        }
-                    }
-                    return newValue(GenericPropertyState.pathProperty("", 
oakValue), namePathMapper);
-                case PropertyType.REFERENCE:
-                    if (!UUIDUtils.isValidUUID(value)) {
-                        throw new ValueFormatException("Invalid reference 
value " + value);
-                    }
-                    return newValue(GenericPropertyState.referenceProperty("", 
value), namePathMapper);
-                case PropertyType.WEAKREFERENCE:
-                    if (!UUIDUtils.isValidUUID(value)) {
-                        throw new ValueFormatException("Invalid weak reference 
value " + value);
-                    }
-                    return 
newValue(GenericPropertyState.weakreferenceProperty("", value), namePathMapper);
-                case PropertyType.URI:
-                    new URI(value);
-                    return newValue(GenericPropertyState.uriProperty("", 
value), namePathMapper);
-                case PropertyType.DECIMAL:
-                    return createValue(Conversions.convert(value).toDecimal());
-                default:
-                    throw new ValueFormatException("Invalid type: " + type);
-            }
-        } catch (NumberFormatException | URISyntaxException e) {
-            throw new ValueFormatException("Invalid value " + value + " for 
type " + PropertyType.nameFromValue(type), e);
-        }
-    }
-
-    @Override
     public Binary createBinary(InputStream stream) throws RepositoryException {
         try {
             return new BinaryImpl(createBinaryValue(stream));
@@ -299,9 +194,6 @@ public class ValueFactoryImpl implements
     }
 
     private ValueImpl createBinaryValue(Blob blob) throws RepositoryException {
-        return new ValueImpl(BinaryPropertyState.binaryProperty("", blob), 
namePathMapper);
+        return new ValueImpl(BinaryPropertyState.binaryProperty("", blob), 
namePathMapper, getBlobAccessProvider());
     }
-
-    //------------------------------------------------------------< ErrorValue 
>---
-
 }

Modified: 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueImpl.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/value/jcr/ValueImpl.java
 Tue Aug  7 14:32:49 2018
@@ -36,6 +36,7 @@ import org.apache.jackrabbit.oak.api.Blo
 import org.apache.jackrabbit.oak.api.IllegalRepositoryStateException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.api.blob.BlobAccessProvider;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.value.Conversions;
 import org.apache.jackrabbit.oak.plugins.value.ErrorValue;
@@ -54,6 +55,7 @@ class ValueImpl implements JackrabbitVal
     private final Type<?> type;
     private final int index;
     private final NamePathMapper namePathMapper;
+    private final BlobAccessProvider blobAccessProvider;
 
     private InputStream stream = null;
 
@@ -63,16 +65,20 @@ class ValueImpl implements JackrabbitVal
      * @param index  The index
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
      * the internal representation.
+     * @param blobAccessProvider The blob access provider
      * @throws IllegalArgumentException if {@code index < 
propertyState.count()}
      * @throws RepositoryException if the underlying node state cannot be 
accessed
      */
-    ValueImpl(@NotNull PropertyState property, int index, @NotNull 
NamePathMapper namePathMapper)
+    private ValueImpl(@NotNull PropertyState property, int index,
+                      @NotNull NamePathMapper namePathMapper,
+                      @NotNull BlobAccessProvider blobAccessProvider)
             throws RepositoryException {
         checkArgument(index < property.count());
         this.propertyState = checkNotNull(property);
         this.type = getType(property);
         this.index = index;
         this.namePathMapper = checkNotNull(namePathMapper);
+        this.blobAccessProvider = checkNotNull(blobAccessProvider);
     }
 
     /**
@@ -80,12 +86,15 @@ class ValueImpl implements JackrabbitVal
      * @param property  The property state this instance is based on
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
      * the internal representation.
+     * @param blobAccessProvider The blob access provider
      * @throws IllegalArgumentException if {@code property.isArray()} is 
{@code true}.
      * @throws RepositoryException if the underlying node state cannot be 
accessed
      */
-    ValueImpl(@NotNull PropertyState property, @NotNull NamePathMapper 
namePathMapper)
+    ValueImpl(@NotNull PropertyState property,
+              @NotNull NamePathMapper namePathMapper,
+              @NotNull BlobAccessProvider blobAccessProvider)
             throws RepositoryException {
-        this(checkSingleValued(property), 0, namePathMapper);
+        this(checkSingleValued(property), 0, namePathMapper, 
checkNotNull(blobAccessProvider));
     }
 
     private static PropertyState checkSingleValued(PropertyState property) {
@@ -99,12 +108,15 @@ class ValueImpl implements JackrabbitVal
      * @param index  The index
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
      * the internal representation.
+     * @param blobAccessProvider The blob access provider
      * @throws IllegalArgumentException if {@code index < 
propertyState.count()}
      */
     @NotNull
-    static Value newValue(@NotNull PropertyState property, int index, @NotNull 
NamePathMapper namePathMapper) {
+    static Value newValue(@NotNull PropertyState property, int index,
+                          @NotNull NamePathMapper namePathMapper,
+                          @NotNull BlobAccessProvider blobAccessProvider) {
         try {
-            return new ValueImpl(property, index, namePathMapper);
+            return new ValueImpl(property, index, namePathMapper, 
blobAccessProvider);
         } catch (RepositoryException e) {
             return new ErrorValue(e);
         }
@@ -115,12 +127,15 @@ class ValueImpl implements JackrabbitVal
      * @param property  The property state this instance is based on
      * @param namePathMapper The name/path mapping used for converting JCR 
names/paths to
      * the internal representation.
+     * @param blobAccessProvider The blob access provider
      * @throws IllegalArgumentException if {@code property.isArray()} is 
{@code true}.
      */
     @NotNull
-    static Value newValue(@NotNull PropertyState property, @NotNull 
NamePathMapper namePathMapper) {
+    static Value newValue(@NotNull PropertyState property,
+                          @NotNull NamePathMapper namePathMapper,
+                          @NotNull BlobAccessProvider blobAccessProvider) {
         try {
-            return new ValueImpl(property, 0, namePathMapper);
+            return new ValueImpl(property, 0, namePathMapper, 
blobAccessProvider);
         } catch (RepositoryException e) {
             return new ErrorValue(e);
         }
@@ -352,7 +367,7 @@ class ValueImpl implements JackrabbitVal
     public int hashCode() {
         try {
             if (getType() == PropertyType.BINARY) {
-                    return getValue(Type.BINARY, index).hashCode();
+                return getValue(Type.BINARY, index).hashCode();
             } else {
                 return getValue(Type.STRING, index).hashCode();
             }
@@ -381,9 +396,9 @@ class ValueImpl implements JackrabbitVal
         }
     }
 
-    private Type<?> getType(PropertyState property) throws RepositoryException 
{
+    private static Type<?> getType(PropertyState property) throws 
RepositoryException {
         try {
-            return propertyState.getType();
+            return property.getType();
         } catch (IllegalRepositoryStateException e) {
             throw new RepositoryException(e);
         }

Modified: 
jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStatesTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStatesTest.java?rev=1837601&r1=1837600&r2=1837601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStatesTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-spi/src/test/java/org/apache/jackrabbit/oak/plugins/memory/PropertyStatesTest.java
 Tue Aug  7 14:32:49 2018
@@ -27,7 +27,7 @@ import javax.jcr.Value;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.util.ISO8601;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -37,11 +37,12 @@ import static org.junit.Assert.assertEqu
 public class PropertyStatesTest {
 
     private final NamePathMapper namePathMapper = 
Mockito.mock(NamePathMapper.class);
+    private final PartialValueFactory valueFactory = new 
PartialValueFactory(namePathMapper);
 
     @Test
     public void namePropertyFromNameValue() throws RepositoryException {
         PropertyState nameProperty = PropertyStates.createProperty("name", 
"oak-prefix:value", PropertyType.NAME);
-        Value nameValue = ValueFactoryImpl.createValue(nameProperty, 
namePathMapper);
+        Value nameValue = valueFactory.createValue(nameProperty);
         PropertyState namePropertyFromValue = 
PropertyStates.createProperty("name", nameValue);
         assertEquals(nameProperty, namePropertyFromValue);
     }
@@ -49,7 +50,7 @@ public class PropertyStatesTest {
     @Test
     public void pathPropertyFromPathValue() throws RepositoryException {
         PropertyState pathProperty = PropertyStates.createProperty("path", 
"oak-prefix:a/oak-prefix:b", PropertyType.PATH);
-        Value nameValue = ValueFactoryImpl.createValue(pathProperty, 
namePathMapper);
+        Value nameValue = valueFactory.createValue(pathProperty);
         PropertyState namePropertyFromValue = 
PropertyStates.createProperty("path", nameValue);
         assertEquals(pathProperty, namePropertyFromValue);
     }


Reply via email to