You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by vh...@apache.org on 2020/09/17 10:03:56 UTC

svn commit: r1881788 - in /jackrabbit/oak/branches/1.22/oak-core/src: main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java test/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImplTest.java

Author: vholani
Date: Thu Sep 17 10:03:56 2020
New Revision: 1881788

URL: http://svn.apache.org/viewvc?rev=1881788&view=rev
Log:
OAK-9200 - Oak BlobAccessProvider reference in UserConfigurationImpl fails and leads to performance issue as it goes every time to  get the service object. (backported from trunk commit 1881787)

Modified:
    jackrabbit/oak/branches/1.22/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java
    jackrabbit/oak/branches/1.22/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImplTest.java

Modified: jackrabbit/oak/branches/1.22/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.22/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java?rev=1881788&r1=1881787&r2=1881788&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.22/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java (original)
+++ jackrabbit/oak/branches/1.22/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImpl.java Thu Sep 17 10:03:56 2020
@@ -54,6 +54,7 @@ import org.osgi.service.component.annota
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@@ -191,8 +192,17 @@ public class UserConfigurationImpl exten
         setParameters(ConfigurationParameters.of(properties));
     }
 
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL)
     private BlobAccessProvider blobAccessProvider;
+    
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL,
+            policy = ReferencePolicy.DYNAMIC)
+    void bindBlobAccessProvider(BlobAccessProvider bap) {
+        blobAccessProvider = bap;
+    }
+
+    void unbindBlobAccessProvider(BlobAccessProvider bap) {
+        blobAccessProvider = DEFAULT_BLOB_ACCESS_PROVIDER;
+    }
 
     //----------------------------------------------< SecurityConfiguration >---
     @NotNull
@@ -262,9 +272,7 @@ public class UserConfigurationImpl exten
     public PrincipalProvider getUserPrincipalProvider(@NotNull Root root, @NotNull NamePathMapper namePathMapper) {
         return new UserPrincipalProvider(root, this, namePathMapper);
     }
-
-    //-----------------------------------------------------------< internal >---
-
+    
     @NotNull
     private BlobAccessProvider getBlobAccessProvider() {
         BlobAccessProvider provider = blobAccessProvider;
@@ -279,8 +287,8 @@ public class UserConfigurationImpl exten
         }
         if (provider == null) {
             provider = DEFAULT_BLOB_ACCESS_PROVIDER;
-            blobAccessProvider = provider;
         }
+        blobAccessProvider = provider;
         return provider;
     }
 }

Modified: jackrabbit/oak/branches/1.22/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.22/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImplTest.java?rev=1881788&r1=1881787&r2=1881788&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.22/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImplTest.java (original)
+++ jackrabbit/oak/branches/1.22/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserConfigurationImplTest.java Thu Sep 17 10:03:56 2020
@@ -20,6 +20,7 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.Lists;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.api.blob.BlobAccessProvider;
 import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.commit.MoveTracker;
 import org.apache.jackrabbit.oak.spi.commit.ThreeWayConflictHandler;
@@ -35,11 +36,13 @@ import org.apache.jackrabbit.oak.spi.xml
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.junit.Rule;
 import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
 
 import java.lang.reflect.Field;
 import java.security.Principal;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 
 import static org.apache.jackrabbit.oak.spi.security.user.UserConstants.PARAM_DEFAULT_DEPTH;
@@ -139,6 +142,29 @@ public class UserConfigurationImplTest e
         f.setAccessible(true);
         assertSame(PartialValueFactory.DEFAULT_BLOB_ACCESS_PROVIDER, f.get(vf));
     }
+    
+    @Test
+    public void testBindBlobAccessProvider() throws Exception {
+        UserConfigurationImpl uc = new UserConfigurationImpl(getSecurityProvider());
+        context.registerInjectActivateService(uc, ImmutableMap.of(PARAM_DEFAULT_DEPTH, "8"));
+
+        BlobAccessProvider bap = mock(BlobAccessProvider.class);
+        uc.getUserManager(root, getNamePathMapper());
+        Field f = UserConfigurationImpl.class.getDeclaredField("blobAccessProvider");
+        f.setAccessible(true);
+        //Validate default service
+        assertSame(PartialValueFactory.DEFAULT_BLOB_ACCESS_PROVIDER, f.get(uc));
+
+        ServiceRegistration reg = context.bundleContext().registerService(
+                BlobAccessProvider.class.getName(),
+                bap, new Hashtable<String, Object>());
+        //Validate newly registered service
+        assertSame(bap, f.get(uc));
+
+        reg.unregister();
+        //Validate default service after unregistering newly registered service
+        assertSame(PartialValueFactory.DEFAULT_BLOB_ACCESS_PROVIDER, f.get(uc));
+    }
 
     @Test
     public void testUserConfigurationWithConstructor() {