You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2013/03/21 15:23:22 UTC

svn commit: r1459328 - in /sling/whiteboard/fmeschbe/deprecate_login_administrative: ./ api/src/main/java/org/apache/sling/api/resource/ jcr/api/ jcr/api/src/main/java/org/apache/sling/jcr/api/ jcr/base/ jcr/base/src/main/java/org/apache/sling/jcr/base...

Author: fmeschbe
Date: Thu Mar 21 14:23:22 2013
New Revision: 1459328

URL: http://svn.apache.org/r1459328
Log:
Implement support for service based ResourceResolver and Session access

Added:
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/SlingRepositoryProxy.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/
      - copied from r1458700, sling/trunk/bundles/jcr/resource/
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/RepositoryHolder.java
Modified:
    sling/whiteboard/fmeschbe/deprecate_login_administrative/   (props changed)
    sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceProviderFactory.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/pom.xml
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/src/main/java/org/apache/sling/jcr/api/SlingRepository.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/pom.xml
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/AbstractSlingRepository.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/pom.xml
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/pom.xml
    sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
    sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java

Propchange: sling/whiteboard/fmeschbe/deprecate_login_administrative/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu Mar 21 14:23:22 2013
@@ -0,0 +1,3 @@
+.project
+.settings
+target

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceProviderFactory.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceProviderFactory.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceProviderFactory.java Thu Mar 21 14:23:22 2013
@@ -44,6 +44,10 @@ public interface ResourceProviderFactory
      */
     String PROPERTY_REQUIRED = "required";
 
+    String SERVICE_BUNDLE = "sling.service.bundle";
+
+    String SERVICE_INFO = "sling.service.info";
+
     /**
      * Returns a new {@link ResourceProvider} instance with further
      * configuration taken from the given <code>authenticationInfo</code> map.

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/api/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java Thu Mar 21 14:23:22 2013
@@ -104,8 +104,12 @@ public interface ResourceResolverFactory
      * <b><i>NOTE: This method is intended for use by infrastructure bundles to
      * access the repository and provide general services. This method MUST not
      * be used to handle client requests of whatever kinds. To handle client
-     * requests a regular authenticated resource resolver retrieved
-     * through {@link #getResourceResolver(Map)} must be used.</i></b>
+     * requests a regular authenticated resource resolver retrieved through
+     * {@link #getResourceResolver(Map)} must be used.</i></b>
+     * <p>
+     * This method is deprecated. Services running in the Sling system should
+     * use the {@link #getServiceResourceResolver(String serviceInfo)} method
+     * instead.
      *
      * @param authenticationInfo A map of further credential information which
      *            may be used by the implementation to parametrize how the
@@ -116,7 +120,29 @@ public interface ResourceResolverFactory
      * @throws LoginException If an error occurrs creating the new
      *             <code>ResourceResolver</code> with the provided credential
      *             data.
+     * @deprecated as of 2.4 (bundle version 2.4.0) because of inherent security
+     *             issues. Services requiring specific permissions should use
+     *             the {@link #getServiceResourceResolver(String)} instead.
      */
+    @Deprecated
     ResourceResolver getAdministrativeResourceResolver(
             Map<String, Object> authenticationInfo) throws LoginException;
+
+    /**
+     * Returns a new {@link ResourceResolver} instance with privileges assigned
+     * to the service provided by the calling bundle. The {@code serviceInfo}
+     * argument can be used to further specialize on the service account to be
+     * used.
+     *
+     * @param serviceInfo Optional service information to specialize account
+     *            selection for the service. This may be {@code null}.
+     * @return A {@link ResourceResolver} with appropriate permissions to
+     *         execute the service.
+     * @throws LoginException If an error occurrs creating the new
+     *             <code>ResourceResolver</code> for the service represented by
+     *             the calling bundle.
+     * @since 2.4 (bundle version 2.4.0) to replace
+     *        {@link #getAdministrativeResourceResolver(Map)}
+     */
+    ResourceResolver getServiceResourceResolver(String serviceInfo) throws LoginException;
 }

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/pom.xml?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/pom.xml (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/pom.xml Thu Mar 21 14:23:22 2013
@@ -57,7 +57,7 @@
                         </Bundle-Category>
                         <Export-Package>
                             <!-- Export provider API selectively -->
-                            org.apache.sling.jcr.api;version=2.1.0
+                            org.apache.sling.jcr.api;version=2.2
                         </Export-Package>
                     </instructions>
                 </configuration>

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/src/main/java/org/apache/sling/jcr/api/SlingRepository.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/src/main/java/org/apache/sling/jcr/api/SlingRepository.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/src/main/java/org/apache/sling/jcr/api/SlingRepository.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/api/src/main/java/org/apache/sling/jcr/api/SlingRepository.java Thu Mar 21 14:23:22 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.jcr.api;
 
+import javax.jcr.LoginException;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -39,7 +40,6 @@ import javax.jcr.Session;
  * implementations of the {@link NamespaceMapper} interface <b>before</b>
  * returning <b>any</b> {@link Session} to callers. This includes the methods
  * defined in the {@link Repository} interface.
- *
  */
 public interface SlingRepository extends Repository {
 
@@ -51,19 +51,41 @@ public interface SlingRepository extends
     String getDefaultWorkspace();
 
     /**
-     * Returns a session to the default workspace which has administrative
-     * powers.
+     * Returns a session to the given workspace which has administrative powers.
      * <p>
      * <b><i>NOTE: This method is intended for use by infrastructure bundles to
      * access the repository and provide general services. This method MUST not
      * be used to handle client requests of whatever kinds. To handle client
-     * requests a regular authenticated session retrieved
-     * through {@link #login(javax.jcr.Credentials, String)} or
+     * requests a regular authenticated session retrieved through
+     * {@link #login(javax.jcr.Credentials, String)} or
      * {@link Session#impersonate(javax.jcr.Credentials)} must be used.</i></b>
      *
      * @param workspace The name of the workspace to which to get an
      *            administrative session. If <code>null</code> the
      *            {@link #getDefaultWorkspace()} default workspace is assumed.
+     *
+     * @deprecated as of 2.2 (bundle version 2.2.0) because of inherent security
+     *             issues. Services requiring specific permissions should use
+     *             the {@link #loginService(String, String)} instead.
      */
     Session loginAdministrative(String workspace) throws RepositoryException;
+
+    /**
+     * Returns a sessionto the given workspace with privileges assigned to the
+     * service provided by the calling bundle. The {@code serviceInfo} argument
+     * can be used to further specialize on the service account to be used.
+     *
+     * @param serviceInfo Optional service information to specialize account
+     *            selection for the service. This may be {@code null}.
+     * @param workspace The name of the workspace to which to get an
+     *            administrative session. If <code>null</code> the
+     *            {@link #getDefaultWorkspace()} default workspace is assumed.
+     * @return A Session with appropriate permissions to execute the service.
+     * @throws LoginException If there is no service account defined for the
+     *             calling bundle or the defined service account does not exist.
+     * @throws RepositoryException if an error occurrs.
+     * @since 2.2 (bundle version 2.2.0) to replace
+     *        {@link #loginAdministrative(String)}
+     */
+    Session loginService(String serviceInfo, String workspace) throws LoginException, RepositoryException;
 }

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/pom.xml?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/pom.xml (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/pom.xml Thu Mar 21 14:23:22 2013
@@ -58,7 +58,7 @@
                             sling,jcr,jackrabbit
                         </Bundle-Category>
                         <Export-Package>
-                            org.apache.sling.jcr.base;
+                            org.apache.sling.jcr.base;version=1.0,
                             org.apache.sling.jcr.base.util;version=2.1.0
                         </Export-Package>
                         <Private-Package>
@@ -91,7 +91,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.jcr.api</artifactId>
-            <version>2.1.0</version>
+            <version>2.1.1-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -117,6 +117,13 @@
             <version>2.0.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.serviceusermapper</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        
         <!-- OSGi Libraries -->
         <dependency>
             <groupId>org.osgi</groupId>

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/AbstractSlingRepository.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/AbstractSlingRepository.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/AbstractSlingRepository.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/AbstractSlingRepository.java Thu Mar 21 14:23:22 2013
@@ -35,6 +35,10 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.jcr.base.util.RepositoryAccessor;
+import org.apache.sling.serviceusermapping.ServiceUserMapper;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.log.LogService;
@@ -100,6 +104,9 @@ public abstract class AbstractSlingRepos
     @Reference
     private LogService log;
 
+    @Reference(referenceInterface = ServiceUserMapper.class)
+    private ServiceReference serviceUserMapper;
+
     private ComponentContext componentContext;
 
     private Repository repository;
@@ -171,6 +178,12 @@ public abstract class AbstractSlingRepos
         return this.login(sc, workspace);
     }
 
+    public final Session loginService(String serviceInfo, String workspace) throws LoginException, RepositoryException {
+        log(LogService.LOG_ERROR,
+            "loginService: Cannot get using Bundle because this SlingRepository service is not a ServiceFactory");
+        throw new LoginException();
+    }
+
     public Session login(Credentials credentials) throws LoginException,
             RepositoryException {
         return this.login(credentials, null);
@@ -438,14 +451,34 @@ public abstract class AbstractSlingRepos
      * @return The OSGi <code>ServiceRegistration</code> object representing
      *         the registered service.
      */
-    protected ServiceRegistration registerService() {
+    protected final ServiceRegistration registerService() {
         @SuppressWarnings("unchecked")
-        Dictionary<String, Object> props = componentContext.getProperties();
-        String[] interfaces = new String[] { SlingRepository.class.getName(),
-            Repository.class.getName() };
+        Dictionary<String, Object> props = getServiceRegistrationProperties();
+        String[] interfaces = getServiceRegistrationInterfaces();
+
+        return componentContext.getBundleContext().registerService(interfaces, new ServiceFactory() {
+            public Object getService(Bundle bundle, ServiceRegistration registration) {
+                final ServiceUserMapper sum = (ServiceUserMapper) bundle.getBundleContext().getService(
+                    AbstractSlingRepository.this.serviceUserMapper);
+                return new SlingRepositoryProxy(AbstractSlingRepository.this, sum);
+            }
+
+            public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+                bundle.getBundleContext().ungetService(AbstractSlingRepository.this.serviceUserMapper);
+            }
+        }, // was: this
+        props);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected Dictionary<String, Object> getServiceRegistrationProperties() {
+        return componentContext.getProperties();
+    }
 
-        return componentContext.getBundleContext().registerService(interfaces,
-            this, props);
+    protected String[] getServiceRegistrationInterfaces() {
+        return new String[] {
+            SlingRepository.class.getName(), Repository.class.getName()
+        };
     }
 
     /**

Added: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/SlingRepositoryProxy.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/SlingRepositoryProxy.java?rev=1459328&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/SlingRepositoryProxy.java (added)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/base/src/main/java/org/apache/sling/jcr/base/SlingRepositoryProxy.java Thu Mar 21 14:23:22 2013
@@ -0,0 +1,109 @@
+/*
+ * 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.sling.jcr.base;
+
+import javax.jcr.Credentials;
+import javax.jcr.LoginException;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.Value;
+
+import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.serviceusermapping.ServiceUserMapper;
+
+public class SlingRepositoryProxy implements SlingRepository {
+
+    private final SlingRepository delegatee;
+
+    private final ServiceUserMapper serviceUserMapper;
+
+    public SlingRepositoryProxy(final SlingRepository delegatee, final ServiceUserMapper serviceUserMapper) {
+        this.delegatee = delegatee;
+        this.serviceUserMapper = serviceUserMapper;
+    }
+
+    public final Session loginService(String serviceInfo, String workspace) throws LoginException, RepositoryException {
+        final String userName = this.serviceUserMapper.getUserForService(serviceInfo);
+        final SimpleCredentials creds = new SimpleCredentials(userName, new char[0]);
+
+        Session admin = null;
+        try {
+            admin = this.delegatee.loginAdministrative(workspace);
+            return admin.impersonate(creds);
+        } finally {
+            if (admin != null) {
+                admin.logout();
+            }
+        }
+    }
+
+    // ---------- pure delegation
+
+    public String getDefaultWorkspace() {
+        return delegatee.getDefaultWorkspace();
+    }
+
+    public Session loginAdministrative(String workspace) throws RepositoryException {
+        return delegatee.loginAdministrative(workspace);
+    }
+
+    public String[] getDescriptorKeys() {
+        return delegatee.getDescriptorKeys();
+    }
+
+    public boolean isStandardDescriptor(String key) {
+        return delegatee.isStandardDescriptor(key);
+    }
+
+    public boolean isSingleValueDescriptor(String key) {
+        return delegatee.isSingleValueDescriptor(key);
+    }
+
+    public Value getDescriptorValue(String key) {
+        return delegatee.getDescriptorValue(key);
+    }
+
+    public Value[] getDescriptorValues(String key) {
+        return delegatee.getDescriptorValues(key);
+    }
+
+    public String getDescriptor(String key) {
+        return delegatee.getDescriptor(key);
+    }
+
+    public Session login(Credentials credentials, String workspaceName) throws LoginException,
+            NoSuchWorkspaceException, RepositoryException {
+        return delegatee.login(credentials, workspaceName);
+    }
+
+    public Session login(Credentials credentials) throws LoginException, RepositoryException {
+        return delegatee.login(credentials);
+    }
+
+    public Session login(String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException {
+        return delegatee.login(workspaceName);
+    }
+
+    public Session login() throws LoginException, RepositoryException {
+        return delegatee.login();
+    }
+
+}

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/pom.xml?rev=1459328&r1=1458700&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/pom.xml (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/pom.xml Thu Mar 21 14:23:22 2013
@@ -158,7 +158,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.jcr.api</artifactId>
-            <version>2.0.6</version>
+            <version>2.1.1-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java?rev=1459328&r1=1458700&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java Thu Mar 21 14:23:22 2013
@@ -106,6 +106,13 @@ public class JcrResourceResolverFactoryI
     }
 
     /**
+     * @see org.apache.sling.api.resource.ResourceResolverFactory#getServiceResourceResolver(String)
+     */
+    public ResourceResolver getServiceResourceResolver(String serviceInfo) throws LoginException {
+        return delegatee.getServiceResourceResolver(serviceInfo);
+    }
+
+    /**
      * @see org.apache.sling.api.resource.ResourceResolverFactory#getAdministrativeResourceResolver(java.util.Map)
      */
     public ResourceResolver getAdministrativeResourceResolver(

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java?rev=1459328&r1=1458700&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java Thu Mar 21 14:23:22 2013
@@ -89,14 +89,14 @@ public class JcrResourceProvider
 
     private final Session session;
     private final ClassLoader dynamicClassLoader;
-    private final boolean closeSession;
+    private final RepositoryHolder repositoryHolder;
 
     public JcrResourceProvider(final Session session,
                                final ClassLoader dynamicClassLoader,
-                               final boolean closeSession) {
+                               final RepositoryHolder repositoryHolder) {
         this.session = session;
         this.dynamicClassLoader = dynamicClassLoader;
-        this.closeSession = closeSession;
+        this.repositoryHolder = repositoryHolder;
     }
 
     // ---------- ResourceProvider interface ----------------------------------
@@ -224,9 +224,7 @@ public class JcrResourceProvider
      * @see org.apache.sling.api.resource.DynamicResourceProvider#close()
      */
     public void close() {
-        if ( this.closeSession && !closed) {
-            session.logout();
-        }
+        this.repositoryHolder.release();
         this.closed = true;
     }
 

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java?rev=1459328&r1=1458700&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderFactory.java Thu Mar 21 14:23:22 2013
@@ -47,8 +47,13 @@ import org.apache.sling.commons.osgi.Pro
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.jcr.resource.JcrResourceConstants;
 import org.apache.sling.jcr.resource.internal.JcrResourceListener;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The <code>JcrResourceProviderFactory</code> creates
@@ -65,20 +70,39 @@ import org.osgi.service.component.Compon
 })
 public class JcrResourceProviderFactory implements ResourceProviderFactory {
 
+    /** default log */
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String REPOSITORY_REFERNENCE_NAME = "ref.repository";
+
     /** The dynamic class loader */
     @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC)
     private DynamicClassLoaderManager dynamicClassLoaderManager;
 
-    @Reference
+    @Reference(name = REPOSITORY_REFERNENCE_NAME, referenceInterface = SlingRepository.class)
+    private ServiceReference repositoryReference;
+
     private SlingRepository repository;
 
     /** The jcr resource listner. */
     private JcrResourceListener listener;
 
     @Activate
-    protected void activate(final ComponentContext context)
-    throws RepositoryException {
+    protected void activate(final ComponentContext context) throws RepositoryException {
+
+        SlingRepository repository = (SlingRepository) context.locateService(REPOSITORY_REFERNENCE_NAME,
+            this.repositoryReference);
+        if (repository == null) {
+            // concurrent unregistration of SlingRepository service
+            // don't care, this component is going to be deactivated
+            // so we just stop working
+            log.warn("activate: Activation failed because SlingRepository may have been unregistered concurrently");
+            return;
+        }
+
         final String root = PropertiesUtil.toString(context.getProperties().get(ResourceProvider.ROOTS), "/");
+
+        this.repository = repository;
         this.listener = new JcrResourceListener(root, null, this.repository, context.getBundleContext());
     }
 
@@ -126,12 +150,14 @@ public class JcrResourceProviderFactory 
         // by default any session used by the resource resolver returned is
         // closed when the resource resolver is closed
         boolean logoutSession = true;
+        RepositoryHolder holder = new RepositoryHolder();
 
         // derive the session to be used
         Session session;
         try {
             final String workspace = getWorkspace(authenticationInfo);
             if (isAdmin) {
+
                 // requested admin session to any workspace (or default)
                 session = repository.loginAdministrative(workspace);
 
@@ -139,11 +165,49 @@ public class JcrResourceProviderFactory 
 
                 session = getSession(authenticationInfo);
                 if (session == null) {
-                    // requested non-admin session to any workspace (or default)
-                    final Credentials credentials = getCredentials(authenticationInfo);
-                    session = repository.login(credentials, workspace);
+
+                    final Object serviceBundleObject = authenticationInfo.get(SERVICE_BUNDLE);
+                    if (serviceBundleObject instanceof Bundle) {
+
+                        final String serviceInfo = (authenticationInfo.get(SERVICE_INFO) instanceof String)
+                                ? (String) authenticationInfo.get(SERVICE_INFO)
+                                : null;
+
+                                final BundleContext bc = ((Bundle) serviceBundleObject).getBundleContext();
+
+                        final SlingRepository repo = (SlingRepository) bc.getService(repositoryReference);
+                        if (repo == null) {
+                            log.warn(
+                                "getResourceProviderInternal: Cannot login service because cannot get SlingRepository on behalf of bundle {} ({})",
+                                bc.getBundle().getSymbolicName(), bc.getBundle().getBundleId());
+                            throw new LoginException(); // TODO: correct ??
+                        }
+
+                        try {
+                            session = repo.loginService(serviceInfo, workspace);
+                            holder.setRepositoryReference(bc, repositoryReference);
+                            holder.setSession(session);
+                        } finally {
+                            // unget the repository if the service cannot
+                            // login to it, otherwise the repository service
+                            // is let go off when the resource resolver is
+                            // closed and the session logged out
+                            if (session == null) {
+                                bc.ungetService(repositoryReference);
+                            }
+                        }
+
+                    } else {
+
+                        // requested non-admin session to any workspace (or
+                        // default)
+                        final Credentials credentials = getCredentials(authenticationInfo);
+                        session = repository.login(credentials, workspace);
+
+                    }
 
                 } else if (workspace != null) {
+
                     // session provided by map; but requested a different
                     // workspace impersonate can only change the user not switch
                     // the workspace as a workaround we login to the requested
@@ -166,6 +230,7 @@ public class JcrResourceProviderFactory 
                     }
 
                 } else {
+
                     // session provided; no special workspace; just make sure
                     // the session is not logged out when the resolver is closed
                     logoutSession = false;
@@ -177,7 +242,11 @@ public class JcrResourceProviderFactory 
 
         session = handleImpersonation(session, authenticationInfo, logoutSession);
 
-        return new JcrResourceProvider(session, this.getDynamicClassLoader(), logoutSession);
+        if (logoutSession) {
+            holder.setSession(session);
+        }
+
+        return new JcrResourceProvider(session, this.getDynamicClassLoader(), holder);
     }
 
     /**

Added: sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/RepositoryHolder.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/RepositoryHolder.java?rev=1459328&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/RepositoryHolder.java (added)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/RepositoryHolder.java Thu Mar 21 14:23:22 2013
@@ -0,0 +1,56 @@
+/*
+ * 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.sling.jcr.resource.internal.helper.jcr;
+
+import javax.jcr.Session;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+class RepositoryHolder {
+
+    private Session session;
+
+    private BundleContext bundleContext;
+
+    private ServiceReference repositoryReference;
+
+    RepositoryHolder() {
+    }
+
+    public void setSession(final Session session) {
+        this.session = session;
+    }
+
+    public void setRepositoryReference(final BundleContext bundleContext, final ServiceReference repositoryReference) {
+        this.bundleContext = bundleContext;
+        this.repositoryReference = repositoryReference;
+    }
+
+    void release() {
+        if (this.session != null) {
+            this.session.logout();
+            this.session = null;
+        }
+
+        if (this.repositoryReference != null) {
+            this.bundleContext.ungetService(this.repositoryReference);
+        }
+    }
+}

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/pom.xml?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/pom.xml (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/pom.xml Thu Mar 21 14:23:22 2013
@@ -119,6 +119,11 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.serviceusermapper</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java Thu Mar 21 14:23:22 2013
@@ -45,8 +45,12 @@ import org.apache.sling.resourceresolver
 import org.apache.sling.resourceresolver.impl.mapping.MapEntries;
 import org.apache.sling.resourceresolver.impl.mapping.Mapping;
 import org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry;
+import org.apache.sling.serviceusermapping.ServiceUserMapper;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.event.EventAdmin;
@@ -76,10 +80,6 @@ import org.osgi.service.event.EventAdmin
 public class ResourceResolverFactoryActivator {
 
     private static final class FactoryRegistration {
-
-        /** Registered resource resolver factory. */
-        public volatile ResourceResolverFactoryImpl factory;
-
         /** Registration .*/
         public volatile ServiceRegistration factoryRegistration;
     }
@@ -159,6 +159,10 @@ public class ResourceResolverFactoryActi
     @Reference
     EventAdmin eventAdmin;
 
+    /** Service User Mapper */
+    @Reference(referenceInterface = ServiceUserMapper.class)
+    private ServiceReference serviceUserMapper;
+
     /** ComponentContext */
     private volatile ComponentContext componentContext;
 
@@ -324,9 +328,6 @@ public class ResourceResolverFactoryActi
             if ( local.factoryRegistration != null ) {
                 local.factoryRegistration.unregister();
             }
-            if ( local.factory != null ) {
-                local.factory.deactivate();
-            }
         }
     }
 
@@ -334,23 +335,40 @@ public class ResourceResolverFactoryActi
      * Try to register the factory.
      */
     private void registerFactory(final ComponentContext localContext) {
-        FactoryRegistration local = null;
-        synchronized ( this ) {
-            if ( this.factoryRegistration == null ) {
+        final FactoryRegistration local;
+        synchronized (this) {
+            if (this.factoryRegistration == null) {
                 this.factoryRegistration = new FactoryRegistration();
                 local = this.factoryRegistration;
+            } else {
+                local = null;
             }
         }
+
         if ( local != null ) {
             // activate and register factory
-            local.factory = new ResourceResolverFactoryImpl(this);
-            local.factory.activate(localContext.getBundleContext());
+
             final Dictionary<String, Object> serviceProps = new Hashtable<String, Object>();
             serviceProps.put(Constants.SERVICE_VENDOR, localContext.getProperties().get(Constants.SERVICE_VENDOR));
             serviceProps.put(Constants.SERVICE_DESCRIPTION, localContext.getProperties().get(Constants.SERVICE_DESCRIPTION));
 
-            local.factoryRegistration = localContext.getBundleContext().registerService(ResourceResolverFactory.class.getName(),
-                    local.factory, serviceProps);
+            local.factoryRegistration = localContext.getBundleContext().registerService(
+                ResourceResolverFactory.class.getName(), new ServiceFactory() {
+                    public Object getService(Bundle bundle, ServiceRegistration registration) {
+                        final ServiceUserMapper sum = (ServiceUserMapper) bundle.getBundleContext().getService(
+                            ResourceResolverFactoryActivator.this.serviceUserMapper);
+                        final ResourceResolverFactoryImpl r = new ResourceResolverFactoryImpl(
+                            ResourceResolverFactoryActivator.this, bundle, sum);
+                        r.activate(localContext.getBundleContext());
+                        return r;
+                    }
+
+                    public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+                        ((ResourceResolverFactoryImpl) service).deactivate();
+                        bundle.getBundleContext().ungetService(ResourceResolverFactoryActivator.this.serviceUserMapper);
+                    }
+                }, serviceProps);
+
             // check if an unregister happened in between
             boolean doUnregister = false;
             synchronized ( this ) {

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java Thu Mar 21 14:23:22 2013
@@ -18,10 +18,12 @@
  */
 package org.apache.sling.resourceresolver.impl;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.commons.collections.BidiMap;
 import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceProviderFactory;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.resourceresolver.impl.console.ResourceResolverWebConsolePlugin;
@@ -31,6 +33,8 @@ import org.apache.sling.resourceresolver
 import org.apache.sling.resourceresolver.impl.mapping.MapEntries;
 import org.apache.sling.resourceresolver.impl.mapping.Mapping;
 import org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry;
+import org.apache.sling.serviceusermapping.ServiceUserMapper;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -56,16 +60,49 @@ public class ResourceResolverFactoryImpl
     /** The activator */
     private final ResourceResolverFactoryActivator activator;
 
-    public ResourceResolverFactoryImpl(final ResourceResolverFactoryActivator activator) {
+    private final ServiceUserMapper serviceUserMapper;
+
+    private final Bundle usingBundle;
+
+    public ResourceResolverFactoryImpl(final ResourceResolverFactoryActivator activator, final Bundle usingBundle,
+            final ServiceUserMapper serviceUserMapper) {
         this.activator = activator;
+        this.serviceUserMapper = serviceUserMapper;
+        this.usingBundle = usingBundle;
     }
 
     // ---------- Resource Resolver Factory ------------------------------------
 
+    public ResourceResolver getServiceResourceResolver(String serviceInfo) throws LoginException {
+        final String userName = this.serviceUserMapper.getUserForService(serviceInfo);
+
+        // TODO: What to do if userName is null ????
+        if (userName == null) {
+            throw new LoginException("Cannot derive user name for service "
+                + this.serviceUserMapper.getServiceName(serviceInfo));
+        }
+
+        HashMap<String, Object> props = new HashMap<String, Object>();
+        props.put(ResourceResolverFactory.USER, userName);
+        props.put(ResourceProviderFactory.SERVICE_BUNDLE, this.usingBundle);
+        if (serviceInfo != null) {
+            props.put(ResourceProviderFactory.SERVICE_INFO, serviceInfo);
+        }
+
+        return getResourceResolverInternal(props, false);
+    }
+
     /**
      * @see org.apache.sling.api.resource.ResourceResolverFactory#getAdministrativeResourceResolver(java.util.Map)
      */
     public ResourceResolver getAdministrativeResourceResolver(final Map<String, Object> authenticationInfo) throws LoginException {
+
+        // make sure there is no leaking of service bundle and info props
+        if (authenticationInfo != null) {
+            authenticationInfo.remove(ResourceProviderFactory.SERVICE_BUNDLE);
+            authenticationInfo.remove(ResourceProviderFactory.SERVICE_INFO);
+        }
+
         return getResourceResolverInternal(authenticationInfo, true);
     }
 
@@ -73,6 +110,13 @@ public class ResourceResolverFactoryImpl
      * @see org.apache.sling.api.resource.ResourceResolverFactory#getResourceResolver(java.util.Map)
      */
     public ResourceResolver getResourceResolver(final Map<String, Object> authenticationInfo) throws LoginException {
+
+        // make sure there is no leaking of service bundle and info props
+        if (authenticationInfo != null) {
+            authenticationInfo.remove(ResourceProviderFactory.SERVICE_BUNDLE);
+            authenticationInfo.remove(ResourceProviderFactory.SERVICE_INFO);
+        }
+
         return getResourceResolverInternal(authenticationInfo, false);
     }
 

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java Thu Mar 21 14:23:22 2013
@@ -44,8 +44,10 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceFactory;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.event.EventAdmin;
 
@@ -73,6 +75,12 @@ public class MockedResourceResolverImplT
     @Mock
     private BundleContext bundleContext;
 
+    @Mock
+    private Bundle usingBundle;
+
+    @Mock
+    private BundleContext usingBundleContext;
+
     private Map<String, Object> services = new HashMap<String, Object>();
 
     private Map<String, Object> serviceProperties = new HashMap<String, Object>();
@@ -122,15 +130,15 @@ public class MockedResourceResolverImplT
         activator.eventAdmin = eventAdmin;
 
         activator.bindResourceProvider(resourceProvider,
-            buildResourceProviderProperties("org.apache.sling.resourceresolver.impl.DummyTestProvider", 
-                10L, 
+            buildResourceProviderProperties("org.apache.sling.resourceresolver.impl.DummyTestProvider",
+                10L,
                 new String[] { "/single" }));
-        
+
         // setup mapping resources at /etc/map to exercise vanity etc.
         // hmm, can't provide the resolver since its not up and ready.
         // mapping almost certainly work properly until this can be setup correctly.
         Resource etcMapResource = buildMappingResource("/etc/map", mappingResourceProvider, null);
-        
+
         activator.bindResourceProvider(mappingResourceProvider,
             buildResourceProviderProperties("org.apache.sling.resourceresolver.impl.MapProvider",
                 11L,
@@ -148,7 +156,7 @@ public class MockedResourceResolverImplT
         Mockito.when(
             resourceProviderFactory.getAdministrativeResourceProvider(Mockito.anyMap())).thenReturn(
             factoryAdministrativeResourceProvider);
-        
+
         activator.bindResourceProviderFactory(resourceProviderFactory,
             buildResourceProviderProperties("org.apache.sling.resourceresolver.impl.DummyTestProviderFactory",
                 12L,
@@ -162,6 +170,10 @@ public class MockedResourceResolverImplT
         // activate the components.
         activator.activate(componentContext);
 
+        // configure using Bundle
+        Mockito.when(usingBundle.getBundleContext()).thenReturn(usingBundleContext);
+        Mockito.when(usingBundleContext.getBundle()).thenReturn(usingBundle);
+
         // extract any services that were registered into a map.
         ArgumentCaptor<String> classesCaptor = ArgumentCaptor.forClass(String.class);
         ArgumentCaptor<Object> serviceCaptor = ArgumentCaptor.forClass(Object.class);
@@ -182,24 +194,27 @@ public class MockedResourceResolverImplT
         }
         // verify that a ResourceResolverFactoryImpl was created and registered.
         Assert.assertNotNull(services.get(ResourceResolverFactory.class.getName()));
-        ResourceResolverFactory rrf = (ResourceResolverFactory) services.get(ResourceResolverFactory.class.getName());
+        Object rrf = services.get(ResourceResolverFactory.class.getName());
+        if (rrf instanceof ServiceFactory) {
+            rrf = ((ServiceFactory) rrf).getService(usingBundle, null);
+        }
         Assert.assertTrue(rrf instanceof ResourceResolverFactoryImpl);
         resourceResolverFactory = (ResourceResolverFactoryImpl) rrf;
     }
-    
+
     private Resource buildMappingResource(String path,
             ResourceProvider provider, ResourceResolver resourceResolver) {
         List<Resource> localHostAnyList = new ArrayList<Resource>();
         localHostAnyList.add(buildResource(path+"/http/example.com.80/cgi-bin", EMPTY_RESOURCE_LIST, resourceResolver, provider, "sling:internalRedirect", "/scripts" ));
         localHostAnyList.add(buildResource(path+"/http/example.com.80/gateway", EMPTY_RESOURCE_LIST, resourceResolver, provider,"sling:internalRedirect", "http://gbiv.com"));
         localHostAnyList.add(buildResource(path+"/http/example.com.80/stories", EMPTY_RESOURCE_LIST, resourceResolver, provider,"sling:internalRedirect", "/anecdotes/$1"));
-        
+
         List<Resource> mappingChildren = new ArrayList<Resource>();
         mappingChildren.add(buildResource(path+"/http/example.com.80", EMPTY_RESOURCE_LIST, resourceResolver, provider,"sling:redirect", "http://www.example.com/"));
         mappingChildren.add(buildResource(path+"/http/www.example.com.80", EMPTY_RESOURCE_LIST, resourceResolver, provider,"sling:internalRedirect", "/example"));
         mappingChildren.add(buildResource(path+"/http/any_example.com.80", EMPTY_RESOURCE_LIST, resourceResolver, provider,"sling:match", ".+\\.example\\.com\\.80", "sling:redirect", "http://www.example.com/"));
         mappingChildren.add(buildResource(path+"/http/localhost_any", localHostAnyList, resourceResolver, provider,"sling:match", "localhost\\.\\d*", "sling:internalRedirect", "/content"));
-        
+
         Resource etcMapResource = buildResource(path+"/http", mappingChildren);
         Mockito.when(provider.getResource(Mockito.any(ResourceResolver.class), Mockito.eq(path))).thenReturn(etcMapResource);
         return etcMapResource;
@@ -265,10 +280,10 @@ public class MockedResourceResolverImplT
             Mockito.when(provider.listChildren(resource)).thenReturn(children.iterator());
             if ( resourceResolver != null) {
                 Mockito.when(provider.getResource(Mockito.eq(resourceResolver), Mockito.eq(fullpath))).thenReturn(resource);
-                Mockito.when(provider.getResource(Mockito.eq(resourceResolver), Mockito.any(HttpServletRequest.class), Mockito.eq(fullpath))).thenReturn(resource);                
+                Mockito.when(provider.getResource(Mockito.eq(resourceResolver), Mockito.any(HttpServletRequest.class), Mockito.eq(fullpath))).thenReturn(resource);
             } else {
                 Mockito.when(provider.getResource(Mockito.any(ResourceResolver.class), Mockito.eq(fullpath))).thenReturn(resource);
-                Mockito.when(provider.getResource(Mockito.any(ResourceResolver.class), Mockito.any(HttpServletRequest.class), Mockito.eq(fullpath))).thenReturn(resource);                
+                Mockito.when(provider.getResource(Mockito.any(ResourceResolver.class), Mockito.any(HttpServletRequest.class), Mockito.eq(fullpath))).thenReturn(resource);
             }
         }
         if ( properties != null ) {
@@ -279,10 +294,10 @@ public class MockedResourceResolverImplT
             }
             Mockito.when(resource.adaptTo(Mockito.eq(ValueMap.class))).thenReturn(vm);
         }
-        
+
         return resource;
     }
-        
+
 
     /**
      * extract the name from a path.
@@ -408,7 +423,7 @@ public class MockedResourceResolverImplT
         Resource resource = resourceResolver.getResource("/single/test.with/extra.dots/inthepath");
         Assert.assertEquals(singleResource, resource);
     }
-    
+
 
     /**
      * Test search paths
@@ -439,7 +454,7 @@ public class MockedResourceResolverImplT
         Resource resource = resourceResolver.getResource("/factory/test");
         Assert.assertEquals(factoryResource, resource);
     }
-    
+
 
     /**
      * Basic test of mapping functionality, at the moment needs more

Modified: sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java?rev=1459328&r1=1459327&r2=1459328&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java (original)
+++ sling/whiteboard/fmeschbe/deprecate_login_administrative/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java Thu Mar 21 14:23:22 2013
@@ -53,7 +53,7 @@ public class ResourceResolverImplTest {
     private ResourceResolverFactoryImpl resFac;
 
     @Before public void setup() {
-        resFac = new ResourceResolverFactoryImpl(new ResourceResolverFactoryActivator());
+        resFac = new ResourceResolverFactoryImpl(new ResourceResolverFactoryActivator(), /* TODO: using Bundle */ null, null);
         resResolver = new ResourceResolverImpl(resFac, new ResourceResolverContext(false, null));
     }
 
@@ -345,7 +345,7 @@ public class ResourceResolverImplTest {
         // the resource resolver
         final List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
         final PathBasedResourceResolverImpl resolver = new PathBasedResourceResolverImpl(
-                new ResourceResolverFactoryImpl(new ResourceResolverFactoryActivator()) {
+                new ResourceResolverFactoryImpl(new ResourceResolverFactoryActivator(), /* TODO: using Bundle */ null, null) {
 
                     @Override
                     public ResourceResolver getAdministrativeResourceResolver(
@@ -381,7 +381,7 @@ public class ResourceResolverImplTest {
 
         final List<ResourceResolver> resolvers = new ArrayList<ResourceResolver>();
         final PathBasedResourceResolverImpl resolver = new PathBasedResourceResolverImpl(
-                new ResourceResolverFactoryImpl(new ResourceResolverFactoryActivator()) {
+                new ResourceResolverFactoryImpl(new ResourceResolverFactoryActivator(), /* TODO: using Bundle */ null, null) {
 
                     @Override
                     public ResourceResolver getAdministrativeResourceResolver(