You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2016/05/11 16:01:17 UTC

svn commit: r1743391 - in /jackrabbit/oak/trunk/oak-auth-external/src: main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/ test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/

Author: angela
Date: Wed May 11 16:01:17 2016
New Revision: 1743391

URL: http://svn.apache.org/viewvc?rev=1743391&view=rev
Log:
OAK-4362 : SyncMBeanImpl.purgeOrphanedUsers swallows sync-error

Modified:
    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/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/jmx/SyncMBeanImplTest.java

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=1743391&r1=1743390&r2=1743391&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 May 11 16:01:17 2016
@@ -22,11 +22,15 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.security.auth.Subject;
 
+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;
@@ -239,27 +243,7 @@ final class Delegatee {
      */
     @Nonnull
     String[] listOrphanedUsers() {
-        List<String> list = new ArrayList<String>();
-        try {
-            Iterator<SyncedIdentity> iter = handler.listIdentities(userMgr);
-            while (iter.hasNext()) {
-                SyncedIdentity id = iter.next();
-                if (isMyIDP(id)) {
-                    try {
-                        ExternalIdentityRef ref = id.getExternalIdRef();
-                        ExternalIdentity extId = (ref == null) ? null : idp.getIdentity(ref);
-                        if (extId == null) {
-                            list.add(id.getId());
-                        }
-                    } catch (ExternalIdentityException e) {
-                        log.error("Error while fetching external identity {}", id, e);
-                    }
-                }
-            }
-        } catch (RepositoryException e) {
-            log.error("Error while listing orphaned users", e);
-        }
-        return list.toArray(new String[list.size()]);
+        return Iterators.toArray(internalListOrphanedIdentities(), String.class);
     }
 
     /**
@@ -269,11 +253,14 @@ final class Delegatee {
     String[] purgeOrphanedUsers() {
         context.setKeepMissing(false);
         List<String> list = new ArrayList<String>();
-        for (String userId : listOrphanedUsers()) {
+        Iterator<String> orphanedIdentities = internalListOrphanedIdentities();
+        while (orphanedIdentities.hasNext()) {
+            String userId = orphanedIdentities.next();
             try {
                 append(list, syncUser(userId));
             } catch (SyncException e) {
                 log.warn(ERROR_SYNC_USER, userId, e);
+                append(list, new DefaultSyncedIdentity(userId, new ExternalIdentityRef(userId, idp.getName()), false, -1), e);
             }
         }
         return list.toArray(new String[list.size()]);
@@ -310,6 +297,34 @@ final class Delegatee {
         }
     }
 
+    @Nonnull
+    private Iterator<String> internalListOrphanedIdentities() {
+        try {
+            Iterator<SyncedIdentity> iter = handler.listIdentities(userMgr);
+            return Iterators.filter(Iterators.transform(iter, new Function<SyncedIdentity, String>() {
+                @Nullable
+                @Override
+                public String apply(@Nullable SyncedIdentity syncedIdentity) {
+                    if (syncedIdentity != null && isMyIDP(syncedIdentity)) {
+                        ExternalIdentityRef ref = syncedIdentity.getExternalIdRef();
+                        try {
+                            ExternalIdentity extId = (ref == null) ? null : idp.getIdentity(ref);
+                            if (extId == null) {
+                                return syncedIdentity.getId();
+                            }
+                        } catch (ExternalIdentityException e) {
+                            log.error("Error while fetching external identity {}", syncedIdentity, e);
+                        }
+                    }
+                    return null;
+                }
+            }), Predicates.notNull());
+        } catch (RepositoryException e) {
+            log.error("Error while listing orphaned users", e);
+            return Iterators.emptyIterator();
+        }
+    }
+
     private static void append(@Nonnull List<String> list, @Nonnull SyncResult r) {
         SyncedIdentity syncedIdentity = r.getIdentity();
         String uid = JsonUtil.getJsonString((syncedIdentity == null ? null : syncedIdentity.getId()));

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=1743391&r1=1743390&r2=1743391&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 May 11 16:01:17 2016
@@ -61,7 +61,6 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -821,7 +820,6 @@ public class SyncMBeanImplTest {
     /**
      * @see <a href="https://issues.apache.org/jira/browse/OAK-4362">OAK-4362</a>
      */
-    @Ignore("OAK-4362")
     @Test
     public void testPurgeOrphanedUsersThrowingHandler2() throws Exception {
         sync(new TestIdentityProvider.TestUser("thirdUser", idp.getName()), idp);