Author: angela
Date: Wed Jun 15 16:07:25 2016
New Revision: 1748603

URL: http://svn.apache.org/viewvc?rev=1748603&view=rev
Log:
OAK-4218 : Base SyncMBeanImpl on Oak API

Added:
    
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SynMBeanImplOSGiTest.java
Modified:
    jackrabbit/oak/trunk/oak-auth-external/pom.xml
    
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
    
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/Delegatee.java
    
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImpl.java
    
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
    
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/AbstractJmxTest.java
    
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/DelegateeTest.java
    
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java

Modified: jackrabbit/oak/trunk/oak-auth-external/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/pom.xml?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-auth-external/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-auth-external/pom.xml Wed Jun 15 16:07:25 2016
@@ -100,12 +100,7 @@
             <artifactId>guava</artifactId>
         </dependency>
 
-        <!-- JCR and Jackrabbit dependencies -->
-        <dependency>
-            <groupId>javax.jcr</groupId>
-            <artifactId>jcr</artifactId>
-            <version>2.0</version>
-        </dependency>
+        <!-- Jackrabbit dependencies -->
         <dependency>
             <groupId>org.apache.jackrabbit</groupId>
             <artifactId>jackrabbit-api</artifactId>

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModuleFactory.java
 Wed Jun 15 16:07:25 2016
@@ -17,7 +17,6 @@
 package org.apache.jackrabbit.oak.spi.security.authentication.external.impl;
 
 import java.util.Hashtable;
-import javax.jcr.Repository;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.security.auth.spi.LoginModule;
@@ -30,15 +29,20 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.api.ContentRepository;
 import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProviderManager;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncManager;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx.SyncMBeanImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx.SynchronizationMBean;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -99,19 +103,24 @@ public class ExternalLoginModuleFactory
     )
     public static final String PARAM_SYNC_HANDLER_NAME = 
SyncHandlerMapping.PARAM_SYNC_HANDLER_NAME;
 
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = 
ReferencePolicy.DYNAMIC)
+    private SecurityProvider securityProvider;
+
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = 
ReferencePolicy.DYNAMIC)
+    private ContentRepository contentRepository;
+
     @Reference
     private SyncManager syncManager;
 
     @Reference
     private ExternalIdentityProviderManager idpManager;
 
-    @Reference
-    private Repository repository;
-
     /**
      * default configuration for the login modules
      */
-    private ConfigurationParameters osgiConfig;
+    private ConfigurationParameters osgiConfig = ConfigurationParameters.EMPTY;
+
+    private BundleContext bundleContext;
 
     /**
      * whiteboard registration handle of the manager mbean
@@ -128,32 +137,89 @@ public class ExternalLoginModuleFactory
     private void activate(ComponentContext context) {
         //noinspection unchecked
         osgiConfig = ConfigurationParameters.of(context.getProperties());
-        String idpName = osgiConfig.getConfigValue(PARAM_IDP_NAME, "");
-        String sncName = osgiConfig.getConfigValue(PARAM_SYNC_HANDLER_NAME, 
"");
+        bundleContext = context.getBundleContext();
+
+        mayRegisterSyncMBean();
+    }
+
+    @SuppressWarnings("UnusedDeclaration")
+    @Deactivate
+    private void deactivate() {
+        unregisterSyncMBean();
+    }
+
+    @SuppressWarnings("UnusedDeclaration")
+    public void bindContentRepository(ContentRepository contentRepository) {
+        this.contentRepository = contentRepository;
+        mayRegisterSyncMBean();
+    }
+
+    @SuppressWarnings("UnusedDeclaration")
+    public void unbindContentRepository(ContentRepository contentRepository) {
+        this.contentRepository = null;
+        unregisterSyncMBean();
+    }
 
-        Whiteboard whiteboard = new OsgiWhiteboard(context.getBundleContext());
+    @SuppressWarnings("UnusedDeclaration")
+    public void bindSecurityProvider(SecurityProvider securityProvider) {
+        this.securityProvider = securityProvider;
+        mayRegisterSyncMBean();
+    }
+
+    @SuppressWarnings("UnusedDeclaration")
+    public void unbindSecurityProvider(SecurityProvider securityProvider)  {
+        this.securityProvider = null;
+        unregisterSyncMBean();
+    }
+
+    private void mayRegisterSyncMBean() {
+        log.debug("Trying to register SynchronizationMBean");
+
+        if (mbeanRegistration != null) {
+            log.debug("SynchronizationMBean already registered");
+            return;
+        }
+        if (bundleContext == null) {
+            log.debug("Cannot register SynchronizationMBean; not yet 
activated.");
+            return;
+        }
+        if (contentRepository == null || securityProvider == null) {
+            log.debug("Cannot register SynchronizationMBean; waiting for 
references to ContentRepository|SecurityProvider.");
+            return;
+        }
+
+        Whiteboard whiteboard = new OsgiWhiteboard(bundleContext);
         try {
-            SyncMBeanImpl bean = new SyncMBeanImpl(repository, syncManager, 
sncName, idpManager, idpName);
-            Hashtable<String, String> table = new Hashtable<String, String>();
+            log.debug("Registering SynchronizationMBean");
+
+            String idpName = osgiConfig.getConfigValue(PARAM_IDP_NAME, "");
+            String sncName = 
osgiConfig.getConfigValue(PARAM_SYNC_HANDLER_NAME, "");
+
+            SyncMBeanImpl bean = new SyncMBeanImpl(contentRepository, 
securityProvider, syncManager, sncName, idpManager, idpName);
+            Hashtable<String, String> table = new Hashtable();
             table.put("type", "UserManagement");
             table.put("name", "External Identity Synchronization Management");
             table.put("handler", ObjectName.quote(sncName));
             table.put("idp", ObjectName.quote(idpName));
             mbeanRegistration = 
whiteboard.register(SynchronizationMBean.class, bean, ImmutableMap.of(
-                    "jmx.objectname",
-                    new ObjectName("org.apache.jackrabbit.oak", table))
+                            "jmx.objectname",
+                            new ObjectName("org.apache.jackrabbit.oak", table))
             );
+            log.debug("Registration of SynchronizationMBean completed");
         } catch (MalformedObjectNameException e) {
-            log.error("Unable to register SynchronizationMBean.", e);
+            log.error("Unable to register SynchronizationMBean", e);
         }
     }
 
-    @SuppressWarnings("UnusedDeclaration")
-    @Deactivate
-    private void deactivate() {
+    private void unregisterSyncMBean() {
         if (mbeanRegistration != null) {
+            log.debug("Unregistering SynchronizationMBean");
+
             mbeanRegistration.unregister();
             mbeanRegistration = null;
+            log.debug("Unregister SynchronizationMBean: completed");
+        } else {
+            log.debug("Unable to unregister SynchronizationMBean; missing 
registration.");
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/Delegatee.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/Delegatee.java?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/Delegatee.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/Delegatee.java
 Wed Jun 15 16:07:25 2016
@@ -16,6 +16,7 @@
  */
 package 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx;
 
+import java.io.IOException;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
@@ -24,18 +25,23 @@ import java.util.List;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import javax.jcr.Repository;
+import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.RepositoryException;
-import javax.jcr.Session;
 import javax.security.auth.Subject;
+import javax.security.auth.login.LoginException;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Iterators;
-import org.apache.jackrabbit.api.JackrabbitRepository;
-import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.commons.json.JsonUtil;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.api.ContentSession;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.value.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentity;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityException;
@@ -49,6 +55,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncedIdentity;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncResultImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncedIdentity;
+import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,75 +72,73 @@ final class Delegatee {
     private final SyncHandler handler;
     private final ExternalIdentityProvider idp;
     private final UserManager userMgr;
-    private final Session systemSession;
+
+    private final ContentSession systemSession;
+    private final Root root;
 
     private final int batchSize;
 
     private SyncContext context;
 
     private Delegatee(@Nonnull SyncHandler handler, @Nonnull 
ExternalIdentityProvider idp,
-                      @Nonnull JackrabbitSession systemSession, int batchSize) 
throws SyncException, RepositoryException {
+                      @Nonnull ContentSession systemSession, @Nonnull 
SecurityProvider securityProvider, int batchSize) throws SyncException {
         this.handler = handler;
         this.idp = idp;
 
         this.systemSession = systemSession;
-        this.userMgr = systemSession.getUserManager();
-        this.context = handler.createContext(idp, userMgr, 
systemSession.getValueFactory());
         this.batchSize = batchSize;
 
-        log.info("Created delegatee for SyncMBean with session: {} {}", 
systemSession, systemSession.getUserID());
+        root = systemSession.getLatestRoot();
+        userMgr = 
securityProvider.getConfiguration(UserConfiguration.class).getUserManager(root, 
NamePathMapper.DEFAULT);
+        context = handler.createContext(idp, userMgr, new 
ValueFactoryImpl(root, NamePathMapper.DEFAULT));
+
+        log.info("Created delegatee for SyncMBean with session: {} {}", 
systemSession, systemSession.getAuthInfo().getUserID());
     }
 
-    static Delegatee createInstance(@Nonnull final Repository repository,
-                                    @Nonnull SyncHandler handler,
-                                    @Nonnull ExternalIdentityProvider idp) {
-        return createInstance(repository, handler, idp, DEFAULT_BATCH_SIZE);
+    static Delegatee createInstance(@Nonnull ContentRepository repository, 
@Nonnull SecurityProvider securityProvider,
+                                    @Nonnull SyncHandler handler, @Nonnull 
ExternalIdentityProvider idp) {
+        return createInstance(repository, securityProvider, handler, idp, 
DEFAULT_BATCH_SIZE);
     }
 
-    static Delegatee createInstance(@Nonnull final Repository repository,
+    static Delegatee createInstance(@Nonnull final ContentRepository 
repository,
+                                    @Nonnull SecurityProvider securityProvider,
                                     @Nonnull SyncHandler handler,
                                     @Nonnull ExternalIdentityProvider idp,
                                     int batchSize) {
-        Session systemSession;
+        ContentSession systemSession;
         try {
-            systemSession = Subject.doAs(SystemSubject.INSTANCE, new 
PrivilegedExceptionAction<Session>() {
+            systemSession = Subject.doAs(SystemSubject.INSTANCE, new 
PrivilegedExceptionAction<ContentSession>() {
                 @Override
-                public Session run() throws RepositoryException {
-                    if (repository instanceof JackrabbitRepository) {
-                        // this is to bypass GuestCredentials injection in the 
"AbstractSlingRepository2"
-                        return ((JackrabbitRepository) repository).login(null, 
null, null);
-                    } else {
-                        return repository.login(null, null);
-                    }
+                public ContentSession run() throws NoSuchWorkspaceException, 
LoginException {
+                    return repository.login(null, null);
                 }
             });
         } catch (PrivilegedActionException e) {
             throw new SyncRuntimeException(ERROR_CREATE_DELEGATEE, e);
         }
 
-        if (!(systemSession instanceof JackrabbitSession)) {
-            systemSession.logout();
-            throw new SyncRuntimeException("Unable to create SyncContext: 
JackrabbitSession required.");
-        }
         try {
-            return new Delegatee(handler, idp, (JackrabbitSession) 
systemSession, batchSize);
-        } catch (RepositoryException e) {
-            systemSession.logout();
-            throw new SyncRuntimeException(ERROR_CREATE_DELEGATEE, e);
+            return new Delegatee(handler, idp, systemSession, 
securityProvider, batchSize);
         } catch (SyncException e) {
-            systemSession.logout();
+            close(systemSession);
             throw new SyncRuntimeException(ERROR_CREATE_DELEGATEE, e);
         }
     }
 
+    private static void close(@Nonnull ContentSession systemSession) {
+        try {
+            systemSession.close();
+        } catch (IOException e) {
+            log.error("Error while closing ContentSession {}", systemSession);
+        }
+    }
+
     void close() {
         if (context != null) {
             context.close();
             context = null;
         }
-        if (systemSession.isLive()) {
-            systemSession.logout();
-        }
+        close(systemSession);
     }
 
     /**
@@ -306,17 +311,13 @@ final class Delegatee {
             return resultList;
         } else {
             try {
-                systemSession.save();
+                root.commit();
                 append(list, resultList);
-            } catch (RepositoryException e) {
+            } catch (CommitFailedException e) {
                 append(list, resultList, e);
             } finally {
                 // make sure there are not pending changes that would fail the 
next batches
-                try {
-                    systemSession.refresh(false);
-                } catch (RepositoryException e) {
-                    log.warn(e.getMessage());
-                }
+                root.refresh();
             }
             return new ArrayList<SyncResult>(size);
         }

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImpl.java?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImpl.java
 Wed Jun 15 16:07:25 2016
@@ -17,8 +17,9 @@
 package 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx;
 
 import javax.annotation.Nonnull;
-import javax.jcr.Repository;
 
+import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProviderManager;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncHandler;
@@ -33,7 +34,9 @@ public class SyncMBeanImpl implements Sy
 
     private static final Logger log = 
LoggerFactory.getLogger(SyncMBeanImpl.class);
 
-    private final Repository repository;
+    private final ContentRepository repository;
+
+    private final SecurityProvider securityProvider;
 
     private final SyncManager syncManager;
 
@@ -43,9 +46,11 @@ public class SyncMBeanImpl implements Sy
 
     private final String idpName;
 
-    public SyncMBeanImpl(Repository repository, SyncManager syncManager, 
String syncName,
-                         ExternalIdentityProviderManager idpManager, String 
idpName) {
+    public SyncMBeanImpl(@Nonnull ContentRepository repository, @Nonnull 
SecurityProvider securityProvider,
+                         @Nonnull SyncManager syncManager, @Nonnull String 
syncName,
+                         @Nonnull ExternalIdentityProviderManager idpManager, 
@Nonnull String idpName) {
         this.repository = repository;
+        this.securityProvider = securityProvider;
         this.syncManager = syncManager;
         this.syncName = syncName;
         this.idpManager = idpManager;
@@ -64,7 +69,7 @@ public class SyncMBeanImpl implements Sy
             log.error("No idp available for name", idpName);
             throw new IllegalArgumentException("No idp manager available for 
name " + idpName);
         }
-        return Delegatee.createInstance(repository, handler, idp);
+        return Delegatee.createInstance(repository, securityProvider, handler, 
idp);
     }
 
     //-----------------------------------------------< SynchronizationMBean 
>---

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/ExternalLoginModuleTestBase.java
 Wed Jun 15 16:07:25 2016
@@ -28,6 +28,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalIDPManagerImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModule;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.SyncManagerImpl;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx.SyncMBeanImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx.SynchronizationMBean;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
@@ -91,11 +92,7 @@ public abstract class ExternalLoginModul
     }
 
     protected SynchronizationMBean createMBean() {
-        // todo: how to retrieve JCR repository here? maybe we should base the 
sync mbean on oak directly (=> OAK-4218).
-        // JackrabbitRepository repository =  null;
-        // return new SyncMBeanImpl(repository, syncManager, "default", 
idpManager, idp.getName());
-
-        throw new UnsupportedOperationException("creating the mbean is not 
supported yet.");
+        return new SyncMBeanImpl(getContentRepository(), 
getSecurityProvider(), syncManager, syncConfig.getName(), idpManager, 
idp.getName());
     }
 
     protected void setSyncConfig(DefaultSyncConfig cfg) {

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/AbstractJmxTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/AbstractJmxTest.java?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/AbstractJmxTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/AbstractJmxTest.java
 Wed Jun 15 16:07:25 2016
@@ -16,27 +16,15 @@
  */
 package 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx;
 
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Set;
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.Sets;
-import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.api.security.user.UserManager;
-import org.apache.jackrabbit.oak.jcr.Jcr;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.AbstractExternalAuthTest;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentity;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityRef;
@@ -44,90 +32,24 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncContext;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncResult;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.TestIdentityProvider;
-import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncConfig;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncContext;
-import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-public abstract class AbstractJmxTest {
+public abstract class AbstractJmxTest extends AbstractExternalAuthTest {
 
-    static Repository REPOSITORY;
-
-    Session session;
-    UserManager userManager;
-
-    DefaultSyncConfig syncConfig;
-
-    ExternalIdentityProvider idp;
     ExternalIdentityProvider foreignIDP;
 
-    private Set<String> ids;
-
-    @BeforeClass
-    public static void beforeClass() {
-        REPOSITORY = new Jcr().createRepository();
-    }
-
     @Before
     public void before() throws Exception {
-        session = REPOSITORY.login(new SimpleCredentials("admin", 
"admin".toCharArray()));
-        if (!(session instanceof JackrabbitSession)) {
-            throw new IllegalStateException();
-        } else {
-            userManager = ((JackrabbitSession) session).getUserManager();
-        }
-        ids = Sets.newHashSet(getAllAuthorizableIds(userManager));
+        super.before();
 
-        syncConfig = new DefaultSyncConfig();
-        syncConfig.user().setMembershipNestingDepth(1);
-
-        idp = new TestIdentityProvider();
         foreignIDP = new TestIdentityProvider("anotherIDP");
     }
 
-    @After
-    public void after() throws Exception {
-        try {
-            session.refresh(false);
-            Iterator<String> iter = getAllAuthorizableIds(userManager);
-            while (iter.hasNext()) {
-                String id = iter.next();
-                if (!ids.remove(id)) {
-                    Authorizable a = userManager.getAuthorizable(id);
-                    if (a != null) {
-                        a.remove();
-                    }
-                }
-            }
-            session.save();
-        } finally {
-            session.logout();
-        }
-    }
-
-    private static Iterator<String> getAllAuthorizableIds(@Nonnull UserManager 
userManager) throws Exception {
-        Iterator<Authorizable> it = 
userManager.findAuthorizables("jcr:primaryType", null);
-        return Iterators.filter(Iterators.transform(it, new 
Function<Authorizable, String>() {
-            @Nullable
-            @Override
-            public String apply(Authorizable input) {
-                try {
-                    if (input != null) {
-                        return input.getID();
-                    }
-                } catch (RepositoryException e) {
-                    // failed to retrieve ID
-                }
-                return null;
-            }
-        }), Predicates.notNull());
-    }
-
     static void assertResultMessages(@Nonnull String[] resultMessages, String 
uid, @Nonnull String expectedOperation) {
         assertResultMessages(resultMessages, ImmutableMap.of(uid, 
expectedOperation));
     }
@@ -163,9 +85,14 @@ public abstract class AbstractJmxTest {
     }
 
     SyncResult sync(@Nonnull ExternalIdentity externalIdentity, @Nonnull 
ExternalIdentityProvider idp) throws Exception {
-        SyncContext ctx = new DefaultSyncContext(syncConfig, idp, userManager, 
session.getValueFactory());
+        SyncContext ctx = new DefaultSyncContext(syncConfig, idp, 
getUserManager(root), getValueFactory(root));
         SyncResult res = ctx.sync(externalIdentity);
-        session.save();
+        root.commit();
         return res;
     }
+
+    UserManager getUserManager() {
+        root.refresh();
+        return getUserManager(root);
+    }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/DelegateeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/DelegateeTest.java?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/DelegateeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/DelegateeTest.java
 Wed Jun 15 16:07:25 2016
@@ -18,29 +18,21 @@ package org.apache.jackrabbit.oak.spi.se
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.lang.reflect.Field;
-import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
-import javax.jcr.Credentials;
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.ValueFactory;
-import javax.jcr.Workspace;
-import javax.jcr.retention.RetentionManager;
-import javax.jcr.security.AccessControlManager;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.jackrabbit.api.JackrabbitSession;
-import org.apache.jackrabbit.api.security.principal.PrincipalManager;
-import org.apache.jackrabbit.api.security.user.UserManager;
+import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.ContentSession;
+import org.apache.jackrabbit.oak.api.QueryEngine;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.api.Tree;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityException;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityRef;
@@ -49,8 +41,6 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler;
 import org.junit.Before;
 import org.junit.Test;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
 
 import static org.junit.Assert.assertFalse;
 
@@ -86,17 +76,17 @@ public class DelegateeTest extends Abstr
     }
 
     private Delegatee createDelegatee(@Nonnull ExternalIdentityProvider idp) {
-        return Delegatee.createInstance(REPOSITORY, new 
DefaultSyncHandler(syncConfig), idp, getBatchSize());
+        return Delegatee.createInstance(getContentRepository(), 
getSecurityProvider(), new DefaultSyncHandler(syncConfig), idp, getBatchSize());
     }
 
-    private static Session preventSessionSave(@Nonnull Delegatee delegatee) 
throws Exception {
-        Field sessionField = Delegatee.class.getDeclaredField("systemSession");
-        sessionField.setAccessible(true);
+    private static Root preventRootCommit(@Nonnull Delegatee delegatee) throws 
Exception {
+        Field rootField = Delegatee.class.getDeclaredField("root");
+        rootField.setAccessible(true);
 
-        JackrabbitSession s = (JackrabbitSession) sessionField.get(delegatee);
-        s.refresh(false);
-        sessionField.set(delegatee, new ThrowingSession(s));
-        return s;
+        Root r = (Root) rootField.get(delegatee);
+        r.refresh();
+        rootField.set(delegatee, new ThrowingRoot(r));
+        return r;
     }
 
     @Test
@@ -107,14 +97,14 @@ public class DelegateeTest extends Abstr
 
     @Test
     public void testSyncUsersBeforeSaveError() throws Exception {
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         String[] result = delegatee.syncUsers(TEST_IDS, false);
         assertResultMessages(result, ImmutableMap.of(
                 TestIdentityProvider.ID_TEST_USER, "nsa",
                 TestIdentityProvider.ID_SECOND_USER, "nsa",
                 TestIdentityProvider.ID_WILDCARD_USER, "nsa"));
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
@@ -123,7 +113,7 @@ public class DelegateeTest extends Abstr
         sync(foreignIDP, TestIdentityProvider.ID_SECOND_USER, false);
         // don't sync ID_WILDCARD_USER
 
-        Session s = preventSessionSave(delegatee);
+        Root r = preventRootCommit(delegatee);
 
         String[] result = delegatee.syncUsers(new String[] {
                 TestIdentityProvider.ID_TEST_USER,
@@ -133,16 +123,16 @@ public class DelegateeTest extends Abstr
                 TestIdentityProvider.ID_TEST_USER, "ERR",
                 TestIdentityProvider.ID_SECOND_USER, "for",
                 TestIdentityProvider.ID_WILDCARD_USER, "nsa"));
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
     public void testSyncAllUsersBeforeSaveError() throws Exception {
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         String[] result = delegatee.syncAllUsers(false);
         assertResultMessages(result, ImmutableMap.<String,String>of());
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
@@ -152,7 +142,7 @@ public class DelegateeTest extends Abstr
         sync(new TestIdentityProvider.TestUser("third", idp.getName()), idp);
         sync(foreignIDP, TestIdentityProvider.ID_WILDCARD_USER, false);
 
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         ImmutableMap<String, String> expected = ImmutableMap.<String, 
String>builder()
                 .put(TestIdentityProvider.ID_TEST_USER, "ERR")
@@ -166,7 +156,7 @@ public class DelegateeTest extends Abstr
         String[] result = delegatee.syncAllUsers(false);
         assertResultMessages(result, expected);
         // NOTE: foreign user is not included in the results
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
@@ -176,7 +166,7 @@ public class DelegateeTest extends Abstr
         sync(new TestIdentityProvider.TestUser("third", idp.getName()), idp);
         sync(foreignIDP, TestIdentityProvider.ID_WILDCARD_USER, false);
 
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         ImmutableMap<String, String> expected = ImmutableMap.<String, 
String>builder()
                 .put(TestIdentityProvider.ID_TEST_USER, "ERR")
@@ -190,39 +180,39 @@ public class DelegateeTest extends Abstr
         String[] result = delegatee.syncAllUsers(true);
         assertResultMessages(result, expected);
         // NOTE: foreign user is not included in the results
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
     public void testSyncNonExistingExternalUserSaveError() throws Exception {
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         String[] result = delegatee.syncExternalUsers(new String[] {new 
ExternalIdentityRef("nonExisting", idp.getName()).getString()});
         assertResultMessages(result, "", "nsi");
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
     public void testSyncForeignExternalUserSaveError() throws Exception {
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         String[] result = delegatee.syncExternalUsers(new String[] {new 
ExternalIdentityRef(TestIdentityProvider.ID_TEST_USER, 
foreignIDP.getName()).getString()});
         assertResultMessages(result, TestIdentityProvider.ID_TEST_USER, "for");
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
     public void testSyncThrowingExternalUserSaveError() throws Exception {
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         String[] result = delegatee.syncExternalUsers(new String[] {new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()});
         assertResultMessages(result, TestIdentityProvider.ID_EXCEPTION, "ERR");
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
     public void testSyncExternalUsersSaveError() throws Exception {
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         List<String> externalIds = new ArrayList();
         for (String id : TEST_IDS) {
@@ -233,19 +223,19 @@ public class DelegateeTest extends Abstr
                 TestIdentityProvider.ID_TEST_USER, "ERR",
                 TestIdentityProvider.ID_SECOND_USER, "ERR",
                 TestIdentityProvider.ID_WILDCARD_USER, "ERR"));
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
     @Test
     public void testSyncAllExternalUsersSaveError() throws Exception {
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         String[] result = delegatee.syncAllExternalUsers();
         assertResultMessages(result, ImmutableMap.of(
                 TestIdentityProvider.ID_TEST_USER, "ERR",
                 TestIdentityProvider.ID_SECOND_USER, "ERR",
                 TestIdentityProvider.ID_WILDCARD_USER, "ERR"));
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
 
@@ -269,256 +259,81 @@ public class DelegateeTest extends Abstr
         sync(new TestIdentityProvider.TestUser("forth", idp.getName()), idp);
         sync(idp, TestIdentityProvider.ID_TEST_USER, false);
 
-        Session s = preventSessionSave(delegatee);;
+        Root r = preventRootCommit(delegatee);;
 
         String[] result = delegatee.purgeOrphanedUsers();
         assertResultMessages(result, ImmutableMap.of(
                 "third", "ERR",
                 "forth", "ERR"));
-        assertFalse(s.hasPendingChanges());
+        assertFalse(r.hasPendingChanges());
     }
 
-    private static final class ThrowingSession implements JackrabbitSession {
+    private static final class ThrowingRoot implements Root {
 
-        private JackrabbitSession base;
+        private Root base;
 
-        private ThrowingSession(@Nonnull JackrabbitSession session) {
-            this.base = session;
-        }
-        @Override
-        public boolean hasPermission(@Nonnull String s, @Nonnull String... 
strings) throws RepositoryException {
-            return base.hasPermission(s, strings);
-        }
-
-        @Override
-        public PrincipalManager getPrincipalManager() throws 
RepositoryException {
-            return base.getPrincipalManager();
-        }
-
-        @Override
-        public UserManager getUserManager() throws RepositoryException {
-            return base.getUserManager();
-        }
-
-        @Override
-        public Item getItemOrNull(String s) throws RepositoryException {
-            return base.getItemOrNull(s);
-        }
-
-        @Override
-        public Property getPropertyOrNull(String s) throws RepositoryException 
{
-            return base.getPropertyOrNull(s);
-        }
-
-        @Override
-        public Node getNodeOrNull(String s) throws RepositoryException {
-            return getNodeOrNull(s);
-        }
-
-        @Override
-        public Repository getRepository() {
-            return base.getRepository();
-        }
-
-        @Override
-        public String getUserID() {
-            return base.getUserID();
-        }
-
-        @Override
-        public String[] getAttributeNames() {
-            return base.getAttributeNames();
-        }
-
-        @Override
-        public Object getAttribute(String name) {
-            return base.getAttribute(name);
-        }
-
-        @Override
-        public Workspace getWorkspace() {
-            return base.getWorkspace();
-        }
-
-        @Override
-        public Node getRootNode() throws RepositoryException {
-            return base.getRootNode();
-        }
-
-        @Override
-        public Session impersonate(Credentials credentials) throws 
RepositoryException {
-            return base.impersonate(credentials);
-        }
-
-        @Override
-        public Node getNodeByUUID(String uuid) throws RepositoryException {
-            return base.getNodeByUUID(uuid);
-        }
-
-        @Override
-        public Node getNodeByIdentifier(String id) throws RepositoryException {
-            return base.getNodeByIdentifier(id);
-        }
-
-        @Override
-        public Item getItem(String absPath) throws RepositoryException {
-            return base.getItem(absPath);
-        }
-
-        @Override
-        public Node getNode(String absPath) throws RepositoryException {
-            return base.getNode(absPath);
-        }
-
-        @Override
-        public Property getProperty(String absPath) throws RepositoryException 
{
-            return base.getProperty(absPath);
-        }
-
-        @Override
-        public boolean itemExists(String absPath) throws RepositoryException {
-            return base.itemExists(absPath);
+        private ThrowingRoot(@Nonnull Root base) {
+            this.base = base;
         }
 
         @Override
-        public boolean nodeExists(String absPath) throws RepositoryException {
-            return base.nodeExists(absPath);
+        public boolean move(String srcAbsPath, String destAbsPath) {
+            return base.move(srcAbsPath, destAbsPath);
         }
 
+        @Nonnull
         @Override
-        public boolean propertyExists(String absPath) throws 
RepositoryException {
-            return base.propertyExists(absPath);
+        public Tree getTree(@Nonnull String path) {
+            return base.getTree(path);
         }
 
         @Override
-        public void move(String srcAbsPath, String destAbsPath) throws 
RepositoryException {
-            base.move(srcAbsPath, destAbsPath);
+        public void rebase() {
+            base.rebase();
         }
 
         @Override
-        public void removeItem(String absPath) throws RepositoryException {
-            base.removeItem(absPath);
+        public void refresh() {
+            base.refresh();
         }
 
         @Override
-        public void save() throws RepositoryException {
-            throw new RepositoryException();
-
+        public void commit() throws CommitFailedException {
+            commit(ImmutableMap.<String, Object>of());
         }
 
         @Override
-        public void refresh(boolean keepChanges) throws RepositoryException {
-            base.refresh(keepChanges);
+        public void commit(@Nonnull Map<String, Object> info) throws 
CommitFailedException {
+            throw new CommitFailedException(CommitFailedException.OAK, 0, 
"failed");
         }
 
         @Override
-        public boolean hasPendingChanges() throws RepositoryException {
+        public boolean hasPendingChanges() {
             return base.hasPendingChanges();
         }
 
+        @Nonnull
         @Override
-        public ValueFactory getValueFactory() throws RepositoryException {
-            return base.getValueFactory();
-        }
-
-        @Override
-        public boolean hasPermission(String absPath, String actions) throws 
RepositoryException {
-            return base.hasPermission(absPath, actions);
-        }
-
-        @Override
-        public void checkPermission(String absPath, String actions) throws 
AccessControlException, RepositoryException {
-            base.checkPermission(absPath, actions);
-        }
-
-        @Override
-        public boolean hasCapability(String methodName, Object target, 
Object[] arguments) throws RepositoryException {
-            return base.hasCapability(methodName, target, arguments);
-        }
-
-        @Override
-        public ContentHandler getImportContentHandler(String parentAbsPath, 
int uuidBehavior) throws RepositoryException {
-            return base.getImportContentHandler(parentAbsPath, uuidBehavior);
-        }
-
-        @Override
-        public void importXML(String parentAbsPath, InputStream in, int 
uuidBehavior) throws IOException, RepositoryException {
-            base.importXML(parentAbsPath, in, uuidBehavior);
-        }
-
-        @Override
-        public void exportSystemView(String absPath, ContentHandler 
contentHandler, boolean skipBinary, boolean noRecurse) throws SAXException, 
RepositoryException {
-            base.exportSystemView(absPath, contentHandler, skipBinary, 
noRecurse);
-        }
-
-        @Override
-        public void exportSystemView(String absPath, OutputStream out, boolean 
skipBinary, boolean noRecurse) throws IOException, RepositoryException {
-            base.exportSystemView(absPath, out, skipBinary, noRecurse);
-        }
-
-        @Override
-        public void exportDocumentView(String absPath, ContentHandler 
contentHandler, boolean skipBinary, boolean noRecurse) throws SAXException, 
RepositoryException {
-            base.exportDocumentView(absPath, contentHandler, skipBinary, 
noRecurse);
-        }
-
-        @Override
-        public void exportDocumentView(String absPath, OutputStream out, 
boolean skipBinary, boolean noRecurse) throws IOException, RepositoryException {
-            base.exportDocumentView(absPath, out, skipBinary, noRecurse);
-        }
-
-        @Override
-        public void setNamespacePrefix(String prefix, String uri) throws 
RepositoryException {
-            base.setNamespacePrefix(prefix, uri);
-        }
-
-        @Override
-        public String[] getNamespacePrefixes() throws RepositoryException {
-            return base.getNamespacePrefixes();
-        }
-
-        @Override
-        public String getNamespaceURI(String prefix) throws 
RepositoryException {
-            return base.getNamespaceURI(prefix);
-        }
-
-        @Override
-        public String getNamespacePrefix(String uri) throws 
RepositoryException {
-            return base.getNamespacePrefix(uri);
-        }
-
-        @Override
-        public void logout() {
-            base.logout();
-        }
-
-        @Override
-        public boolean isLive() {
-            return base.isLive();
-        }
-
-        @Override
-        public void addLockToken(String lt) {
-            base.addLockToken(lt);
-        }
-
-        @Override
-        public String[] getLockTokens() {
-            return base.getLockTokens();
+        public QueryEngine getQueryEngine() {
+            return base.getQueryEngine();
         }
 
+        @Nonnull
         @Override
-        public void removeLockToken(String lt) {
-            base.removeLockToken(lt);
+        public Blob createBlob(@Nonnull InputStream stream) throws IOException 
{
+            return base.createBlob(stream);
         }
 
+        @CheckForNull
         @Override
-        public AccessControlManager getAccessControlManager() throws 
RepositoryException {
-            return base.getAccessControlManager();
+        public Blob getBlob(@Nonnull String reference) {
+            return base.getBlob(reference);
         }
 
+        @Nonnull
         @Override
-        public RetentionManager getRetentionManager() throws 
RepositoryException {
-            return base.getRetentionManager();
+        public ContentSession getContentSession() {
+            return base.getContentSession();
         }
     }
 }
\ No newline at end of file

Added: 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SynMBeanImplOSGiTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SynMBeanImplOSGiTest.java?rev=1748603&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SynMBeanImplOSGiTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SynMBeanImplOSGiTest.java
 Wed Jun 15 16:07:25 2016
@@ -0,0 +1,145 @@
+/*
+ * 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.spi.security.authentication.external.impl.jmx;
+
+import java.lang.reflect.Field;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+
+import org.apache.felix.jaas.boot.ProxyLoginModule;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProviderManager;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalLoginModuleTestBase;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncManager;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalIDPManagerImpl;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.SyncManagerImpl;
+import org.apache.sling.testing.mock.osgi.MockOsgi;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
+import org.junit.Rule;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+public class SynMBeanImplOSGiTest extends ExternalLoginModuleTestBase {
+
+    @Rule
+    public final OsgiContext context = new OsgiContext();
+
+    private ExternalLoginModuleFactory externalLoginModuleFactory;
+
+    @Override
+    public void before() throws Exception {
+        super.before();
+
+        context.registerService(SyncManager.class, new 
SyncManagerImpl(whiteboard));
+        context.registerService(ExternalIdentityProviderManager.class, new 
ExternalIDPManagerImpl(whiteboard));
+
+        externalLoginModuleFactory = new ExternalLoginModuleFactory();
+
+        context.registerInjectActivateService(externalLoginModuleFactory);
+        assertSyncBeanRegistration(externalLoginModuleFactory, false);
+    }
+
+    @Override
+    protected Oak withEditors(Oak oak) {
+        super.withEditors(oak);
+        //Just grab the whiteboard but do not register any manager here
+        //This would ensure that LoginModule would only work if the required 
managers
+        //are preset
+        whiteboard = oak.getWhiteboard();
+        return oak;
+    }
+
+    protected Configuration getConfiguration() {
+        return new Configuration() {
+            @Override
+            public AppConfigurationEntry[] getAppConfigurationEntry(String s) {
+                AppConfigurationEntry entry = new AppConfigurationEntry(
+                        //Use ProxyLoginModule so that factory mode can be used
+                        ProxyLoginModule.class.getName(),
+                        AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
+                        options);
+                return new AppConfigurationEntry[]{entry};
+            }
+        };
+    }
+
+    @Test
+    public void testRegisterContentRepository() throws Exception {
+        context.registerService(ContentRepository.class, 
getContentRepository());
+        assertSyncBeanRegistration(externalLoginModuleFactory, false);
+    }
+
+    @Test
+    public void testRegisterSecurityProvider() throws Exception {
+        context.registerService(SecurityProvider.class, getSecurityProvider());
+        assertSyncBeanRegistration(externalLoginModuleFactory, false);
+    }
+
+    @Test
+    public void testContentRepositoryAndSecurityProviderServices() throws 
Exception {
+        context.registerService(ContentRepository.class, 
getContentRepository());
+        context.registerService(SecurityProvider.class, getSecurityProvider());
+        assertSyncBeanRegistration(externalLoginModuleFactory, true);
+    }
+
+    @Test
+    public void testBind() throws Exception {
+        externalLoginModuleFactory.bindSecurityProvider(getSecurityProvider());
+        assertSyncBeanRegistration(externalLoginModuleFactory, false);
+
+        
externalLoginModuleFactory.bindContentRepository(getContentRepository());
+        assertSyncBeanRegistration(externalLoginModuleFactory, true);
+    }
+
+    @Test
+    public void testUnbind() throws Exception {
+        externalLoginModuleFactory.bindSecurityProvider(getSecurityProvider());
+        
externalLoginModuleFactory.bindContentRepository(getContentRepository());
+
+        
externalLoginModuleFactory.unbindContentRepository(getContentRepository());
+        assertSyncBeanRegistration(externalLoginModuleFactory, false);
+
+        
externalLoginModuleFactory.unbindSecurityProvider(getSecurityProvider());
+        assertSyncBeanRegistration(externalLoginModuleFactory, false);
+    }
+
+    @Test
+    public void testDeactivateFactory() throws Exception {
+        context.registerService(ContentRepository.class, 
getContentRepository());
+        context.registerService(SecurityProvider.class, getSecurityProvider());
+
+        MockOsgi.deactivate(externalLoginModuleFactory);
+        assertSyncBeanRegistration(externalLoginModuleFactory, false);
+    }
+
+    private static void assertSyncBeanRegistration(ExternalLoginModuleFactory 
externalLoginModuleFactory, boolean exists) throws Exception {
+        Field f = 
ExternalLoginModuleFactory.class.getDeclaredField("mbeanRegistration");
+        f.setAccessible(true);
+
+        Object mbeanRegistration = f.get(externalLoginModuleFactory);
+        if (exists) {
+            assertNotNull(mbeanRegistration);
+        } else {
+            assertNull(mbeanRegistration);
+        }
+    }
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java?rev=1748603&r1=1748602&r2=1748603&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java
 Wed Jun 15 16:07:25 2016
@@ -95,7 +95,8 @@ public class SyncMBeanImplTest extends A
                 }
             }
         };
-        syncMBean = new SyncMBeanImpl(REPOSITORY, syncMgr, SYNC_NAME, idpMgr, 
idp.getName());
+
+        syncMBean = createSyncMBeanImpl(SYNC_NAME, idp.getName());
     }
 
     private Map<String, String> getExpectedUserResult(String expectedOp, 
boolean includeGroups) throws ExternalIdentityException {
@@ -113,9 +114,13 @@ public class SyncMBeanImplTest extends A
         return expected;
     }
 
+    private SyncMBeanImpl createSyncMBeanImpl(@Nonnull String syncHandlerName, 
@Nonnull String idpName) {
+        return new SyncMBeanImpl(getContentRepository(), 
getSecurityProvider(), syncMgr, syncHandlerName, idpMgr, idpName);
+    }
+
     private SyncMBeanImpl createThrowingSyncMBean(boolean allowListIdentities) 
{
         String name = (allowListIdentities) ? 
ThrowingSyncHandler.NAME_ALLOWS_IDENTITY_LISTING : ThrowingSyncHandler.NAME;
-        return new SyncMBeanImpl(REPOSITORY, syncMgr, name, idpMgr, 
idp.getName());
+        return new SyncMBeanImpl(getContentRepository(), 
getSecurityProvider(), syncMgr, name, idpMgr, idp.getName());
     }
 
     @Test
@@ -125,7 +130,7 @@ public class SyncMBeanImplTest extends A
 
     @Test
     public void testInvalidSyncHandlerName() {
-        SyncMBeanImpl syncMBean = new SyncMBeanImpl(REPOSITORY, syncMgr, 
"invalid", idpMgr, idp.getName());
+        SyncMBeanImpl syncMBean = createSyncMBeanImpl("invalid", 
idp.getName());
         assertEquals("invalid", syncMBean.getSyncHandlerName());
 
         // calling any sync-operation must fail due to the invalid 
configuration
@@ -144,7 +149,7 @@ public class SyncMBeanImplTest extends A
 
     @Test
     public void testInvalidIDPName() {
-        SyncMBeanImpl syncMBean = new SyncMBeanImpl(REPOSITORY, syncMgr, 
SYNC_NAME, idpMgr, "invalid");
+        SyncMBeanImpl syncMBean = createSyncMBeanImpl(SYNC_NAME, "invalid");
         assertEquals("invalid", syncMBean.getIDPName());
 
         // calling any sync-operation must fail due to the invalid 
configuration
@@ -210,6 +215,7 @@ public class SyncMBeanImplTest extends A
         sync(new TestIdentityProvider.TestUser("thirdUser", idp.getName()), 
idp);
         sync(new TestIdentityProvider.TestGroup("gr", idp.getName()), idp);
 
+        UserManager userManager = getUserManager();
         Authorizable[] authorizables = new Authorizable[] {
                 userManager.getAuthorizable("thirdUser"),
                 userManager.getAuthorizable("gr")
@@ -223,7 +229,7 @@ public class SyncMBeanImplTest extends A
 
             result = syncMBean.syncUsers(ids, true);
             assertResultMessages(result, a.getID(), "del");
-            assertNull(userManager.getAuthorizable(a.getID()));
+            assertNull(getUserManager().getAuthorizable(a.getID()));
         }
     }
 
@@ -244,43 +250,43 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.syncUsers(new String[] 
{UserConstants.DEFAULT_ANONYMOUS_ID}, true);
         assertResultMessages(result, UserConstants.DEFAULT_ANONYMOUS_ID, 
"for");
 
-        
assertNotNull(userManager.getAuthorizable(UserConstants.DEFAULT_ANONYMOUS_ID));
+        
assertNotNull(getUserManager().getAuthorizable(UserConstants.DEFAULT_ANONYMOUS_ID));
     }
 
     @Test
     public void testSyncUsersForeign() throws Exception {
         // sync user from foreign IDP into the repository
         SyncResult res = sync(foreignIDP, TestIdentityProvider.ID_TEST_USER, 
false);
-        
assertNotNull(userManager.getAuthorizable(TestIdentityProvider.ID_TEST_USER));
+        
assertNotNull(getUserManager().getAuthorizable(TestIdentityProvider.ID_TEST_USER));
         
assertEquals(foreignIDP.getUser(TestIdentityProvider.ID_TEST_USER).getExternalId(),
 res.getIdentity().getExternalIdRef());
 
         // syncUsers with testIDP must detect the foreign status
         String[] result = syncMBean.syncUsers(new 
String[]{TestIdentityProvider.ID_TEST_USER}, false);
         assertResultMessages(result, TestIdentityProvider.ID_TEST_USER, "for");
-        
assertNotNull(userManager.getAuthorizable(TestIdentityProvider.ID_TEST_USER));
+        
assertNotNull(getUserManager().getAuthorizable(TestIdentityProvider.ID_TEST_USER));
 
         // same expected with 'purge' set to true
         result = syncMBean.syncUsers(new String[] 
{TestIdentityProvider.ID_TEST_USER}, true);
         assertResultMessages(result, TestIdentityProvider.ID_TEST_USER, "for");
-        
assertNotNull(userManager.getAuthorizable(TestIdentityProvider.ID_TEST_USER));
+        
assertNotNull(getUserManager().getAuthorizable(TestIdentityProvider.ID_TEST_USER));
     }
 
     @Test
     public void testSyncGroupsForeign() throws Exception {
         // sync user from foreign IDP into the repository
         SyncResult res = sync(foreignIDP, "a", true);
-        assertNotNull(userManager.getAuthorizable("a"));
+        assertNotNull(getUserManager().getAuthorizable("a"));
         assertEquals(foreignIDP.getGroup("a").getExternalId(), 
res.getIdentity().getExternalIdRef());
 
         // syncUsers with testIDP must detect the foreign status
         String[] result = syncMBean.syncUsers(new String[]{"a"}, false);
         assertResultMessages(result, "a", "for");
-        assertNotNull(userManager.getAuthorizable("a"));
+        assertNotNull(getUserManager().getAuthorizable("a"));
 
         // same expected with 'purge' set to true
         result = syncMBean.syncUsers(new String[] {"a"}, true);
         assertResultMessages(result, "a", "for");
-        assertNotNull(userManager.getAuthorizable("a"));
+        assertNotNull(getUserManager().getAuthorizable("a"));
     }
 
     /**
@@ -288,9 +294,9 @@ public class SyncMBeanImplTest extends A
      */
     @Test
     public void testSyncUserException() throws Exception {
-        User u = userManager.createUser(TestIdentityProvider.ID_EXCEPTION, 
null);
-        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
session.getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
-        session.save();
+        User u = 
getUserManager().createUser(TestIdentityProvider.ID_EXCEPTION, null);
+        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
+        root.commit();
 
         String[] result = syncMBean.syncUsers(new 
String[]{TestIdentityProvider.ID_EXCEPTION}, false);
         assertResultMessages(result, TestIdentityProvider.ID_EXCEPTION, "ERR");
@@ -312,6 +318,7 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.syncExternalUsers(externalId);
         assertResultMessages(result, TestIdentityProvider.ID_TEST_USER, "add");
 
+        UserManager userManager = getUserManager();
         User testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
         assertNotNull(testUser);
 
@@ -330,6 +337,7 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.syncExternalUsers(externalId);
         assertResultMessages(result, TestIdentityProvider.ID_TEST_USER, "add");
 
+        UserManager userManager = getUserManager();
         User testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
         assertNotNull(testUser);
 
@@ -344,6 +352,7 @@ public class SyncMBeanImplTest extends A
         String[] externalId = new 
String[]{externalUser.getExternalId().getString()};
 
         syncMBean.syncExternalUsers(externalId);
+        UserManager userManager = getUserManager();
         User testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
 
         long lastSynced = 
testUser.getProperty(DefaultSyncContext.REP_LAST_SYNCED)[0].getLong();
@@ -360,6 +369,7 @@ public class SyncMBeanImplTest extends A
 
         // default value for forceGroup sync is defined to be 'true' => verify 
result
         syncMBean.syncExternalUsers(externalId);
+        userManager = getUserManager();
         testUser = userManager.getAuthorizable(externalUser.getId(), 
User.class);
         long lastSynced2 = 
testUser.getProperty(DefaultSyncContext.REP_LAST_SYNCED)[0].getLong();
 
@@ -380,6 +390,7 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.syncExternalUsers(externalId);
         assertResultMessages(result, "a", "add");
 
+        UserManager userManager = getUserManager();
         Group aGroup = userManager.getAuthorizable(externalGroup.getId(), 
Group.class);
         assertNotNull(aGroup);
 
@@ -455,6 +466,8 @@ public class SyncMBeanImplTest extends A
 
         Map<String, String> expected = getExpectedUserResult("upd", true);
         assertResultMessages(result, expected);
+
+        UserManager userManager = getUserManager();
         for (String id : expected.keySet()) {
             ExternalIdentity ei = idp.getUser(id);
             if (ei == null) {
@@ -479,6 +492,7 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.syncAllUsers(false);
         assertResultMessages(result, expected);
 
+        UserManager userManager = getUserManager();
         for (String id : expected.keySet()) {
             ExternalIdentity ei = idp.getGroup(id);
             assertSync(ei, userManager);
@@ -495,6 +509,7 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.syncAllUsers(false);
         assertResultMessages(result, ImmutableMap.of("thirdUser", "mis", "g", 
"mis"));
 
+        UserManager userManager = getUserManager();
         assertNotNull(userManager.getAuthorizable("thirdUser"));
         assertNotNull(userManager.getAuthorizable("g"));
     }
@@ -509,6 +524,7 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.syncAllUsers(true);
         assertResultMessages(result, ImmutableMap.of("thirdUser", "del", "g", 
"del"));
 
+        UserManager userManager = getUserManager();
         assertNull(userManager.getAuthorizable("thirdUser"));
         assertNull(userManager.getAuthorizable("g"));
     }
@@ -534,6 +550,7 @@ public class SyncMBeanImplTest extends A
                 idp.getGroup("a"),
                 foreignIDP.getGroup("aa")
         };
+        UserManager userManager = getUserManager();
         for (ExternalIdentity externalIdentity : expectedIds) {
             assertSync(externalIdentity, userManager);
         }
@@ -541,9 +558,9 @@ public class SyncMBeanImplTest extends A
 
     @Test
     public void testSyncAllUsersException() throws Exception {
-        User u = userManager.createUser(TestIdentityProvider.ID_EXCEPTION, 
null);
-        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
session.getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
-        session.save();
+        User u = 
getUserManager().createUser(TestIdentityProvider.ID_EXCEPTION, null);
+        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
+        root.commit();
 
         String[] result = syncMBean.syncAllUsers(false);
         assertResultMessages(result, TestIdentityProvider.ID_EXCEPTION, "ERR");
@@ -574,6 +591,7 @@ public class SyncMBeanImplTest extends A
         Map<String, String> expected = getExpectedUserResult("add", false);
         assertResultMessages(result, expected);
 
+        UserManager userManager = getUserManager();
         for (String id : expected.keySet()) {
             ExternalIdentity ei = idp.getUser(id);
             if (ei == null) {
@@ -594,6 +612,7 @@ public class SyncMBeanImplTest extends A
         Map<String, String> expected = getExpectedUserResult("upd", false);
         assertResultMessages(result, expected);
 
+        UserManager userManager = getUserManager();
         for (String id : expected.keySet()) {
             ExternalIdentity ei = idp.getUser(id);
             if (ei == null) {
@@ -637,9 +656,9 @@ public class SyncMBeanImplTest extends A
 
     @Test
     public void testListOrphanedUsersException () throws Exception {
-        User u = userManager.createUser(TestIdentityProvider.ID_EXCEPTION, 
null);
-        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
session.getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
-        session.save();
+        User u = 
getUserManager().createUser(TestIdentityProvider.ID_EXCEPTION, null);
+        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
+        root.commit();
 
         String[] result = syncMBean.listOrphanedUsers();
         assertEquals(0, result.length);
@@ -676,6 +695,7 @@ public class SyncMBeanImplTest extends A
         String[] result = syncMBean.purgeOrphanedUsers();
         assertResultMessages(result, ImmutableMap.of("thirdUser", "del", "g", 
"del"));
 
+        UserManager userManager = getUserManager();
         assertNull(userManager.getAuthorizable("thirdUser"));
         assertNull(userManager.getAuthorizable("g"));
     }
@@ -691,9 +711,9 @@ public class SyncMBeanImplTest extends A
 
     @Test
     public void testPurgeOrphanedUsersException() throws Exception {
-        User u = userManager.createUser(TestIdentityProvider.ID_EXCEPTION, 
null);
-        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
session.getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
-        session.save();
+        User u = 
getUserManager().createUser(TestIdentityProvider.ID_EXCEPTION, null);
+        u.setProperty(DefaultSyncContext.REP_EXTERNAL_ID, 
getValueFactory().createValue(new 
ExternalIdentityRef(TestIdentityProvider.ID_EXCEPTION, 
idp.getName()).getString()));
+        root.commit();
 
         String[] result = syncMBean.purgeOrphanedUsers();
         assertEquals(0, result.length);
@@ -706,6 +726,8 @@ public class SyncMBeanImplTest extends A
 
         String[] result = createThrowingSyncMBean(false).purgeOrphanedUsers();
         assertEquals(0, result.length);
+
+        UserManager userManager = getUserManager();
         assertNotNull(userManager.getAuthorizable("thirdUser"));
         assertNotNull(userManager.getAuthorizable("g"));
     }
@@ -720,6 +742,8 @@ public class SyncMBeanImplTest extends A
 
         String[] result = createThrowingSyncMBean(true).purgeOrphanedUsers();
         assertResultMessages(result, ImmutableMap.of("thirdUser", "ERR", "g", 
"ERR"));
+
+        UserManager userManager = getUserManager();
         assertNotNull(userManager.getAuthorizable("thirdUser"));
         assertNotNull(userManager.getAuthorizable("g"));
     }


Reply via email to