You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by md...@apache.org on 2013/07/18 11:45:37 UTC

svn commit: r1504404 [1/2] - in /syncope/trunk: ./ core/src/main/java/org/apache/syncope/core/propagation/impl/ core/src/main/java/org/apache/syncope/core/rest/controller/ core/src/test/java/org/apache/syncope/core/rest/ core/src/test/resources/

Author: mdisabatino
Date: Thu Jul 18 09:45:36 2013
New Revision: 1504404

URL: http://svn.apache.org/r1504404
Log:
Merge from 1_1_X

Modified:
    syncope/trunk/   (props changed)
    syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/DefaultPropagationHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java
    syncope/trunk/core/src/test/resources/content.xml

Propchange: syncope/trunk/
------------------------------------------------------------------------------
  Merged /syncope/branches/1_1_X:r1503755-1504399

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/DefaultPropagationHandler.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/DefaultPropagationHandler.java?rev=1504404&r1=1504403&r2=1504404&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/DefaultPropagationHandler.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/DefaultPropagationHandler.java Thu Jul 18 09:45:36 2013
@@ -22,11 +22,16 @@ import java.util.List;
 import org.apache.syncope.common.to.PropagationStatusTO;
 import org.apache.syncope.common.types.PropagationTaskExecStatus;
 import org.apache.syncope.core.connid.ConnObjectUtil;
+import org.apache.syncope.core.persistence.beans.PropagationTask;
 import org.apache.syncope.core.propagation.PropagationHandler;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class DefaultPropagationHandler implements PropagationHandler {
 
+    protected static final Logger LOG = LoggerFactory.getLogger(DefaultPropagationHandler.class);
+
     private final ConnObjectUtil connObjectUtil;
 
     private final List<PropagationStatusTO> propagations;
@@ -57,4 +62,32 @@ public class DefaultPropagationHandler i
 
         propagations.add(propagation);
     }
+
+    public void completeWhenPrimaryResourceErrored(
+            final List<PropagationStatusTO> propagations, final List<PropagationTask> tasks) {
+
+        final String failedResource = propagations.get(propagations.size() - 1).getResource();
+
+        LOG.debug("Propagation error: {} primary resource failed to propagate", failedResource);
+
+        for (PropagationTask propagationTask : tasks) {
+            if (!containsPropagationStatusTO(propagationTask.getResource().getName(), propagations)) {
+                final PropagationStatusTO propagationStatusTO = new PropagationStatusTO();
+                propagationStatusTO.setResource(propagationTask.getResource().getName());
+                propagationStatusTO.setStatus(PropagationTaskExecStatus.FAILURE);
+                propagationStatusTO.setExecutionMessage(
+                        "Propagation error: " + failedResource + " primary resource failed to propagate.");
+                propagations.add(propagationStatusTO);
+            }
+        }
+    }
+
+    private boolean containsPropagationStatusTO(final String resource, final List<PropagationStatusTO> propagations) {
+        for (PropagationStatusTO status : propagations) {
+            if (resource.equals(status.getResource())) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java?rev=1504404&r1=1504403&r2=1504404&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java Thu Jul 18 09:45:36 2013
@@ -42,6 +42,7 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.dao.NotFoundException;
 import org.apache.syncope.core.persistence.dao.RoleDAO;
 import org.apache.syncope.core.persistence.dao.UserDAO;
+import org.apache.syncope.core.propagation.PropagationException;
 import org.apache.syncope.core.propagation.PropagationTaskExecutor;
 import org.apache.syncope.core.propagation.impl.DefaultPropagationHandler;
 import org.apache.syncope.core.propagation.impl.PropagationManager;
@@ -281,7 +282,13 @@ public class RoleController {
         List<PropagationTask> tasks = propagationManager.getRoleCreateTaskIds(created, roleTO.getVirtualAttributes());
 
         final List<PropagationStatusTO> propagations = new ArrayList<PropagationStatusTO>();
-        taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        final DefaultPropagationHandler propHanlder = new DefaultPropagationHandler(connObjectUtil, propagations);
+        try {
+            taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        } catch (PropagationException e) {
+            LOG.error("Error propagation primary resource", e);
+            propHanlder.completeWhenPrimaryResourceErrored(propagations, tasks);
+        }
 
         final RoleTO savedTO = binder.getRoleTO(created.getResult());
         savedTO.setPropagationStatusTOs(propagations);
@@ -308,8 +315,13 @@ public class RoleController {
                 roleMod.getVirtualAttributesToBeRemoved(), roleMod.getVirtualAttributesToBeUpdated());
 
         final List<PropagationStatusTO> propagations = new ArrayList<PropagationStatusTO>();
-        taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
-
+        final DefaultPropagationHandler propHanlder = new DefaultPropagationHandler(connObjectUtil, propagations);
+        try {
+            taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        } catch (PropagationException e) {
+            LOG.error("Error propagation primary resource", e);
+            propHanlder.completeWhenPrimaryResourceErrored(propagations, tasks);
+        }
         final RoleTO updatedTO = binder.getRoleTO(updated.getResult());
         updatedTO.setPropagationStatusTOs(propagations);
 
@@ -340,7 +352,13 @@ public class RoleController {
         roleTO.setId(roleId);
 
         final List<PropagationStatusTO> propagations = new ArrayList<PropagationStatusTO>();
-        taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        final DefaultPropagationHandler propHanlder = new DefaultPropagationHandler(connObjectUtil, propagations);
+        try {
+            taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        } catch (PropagationException e) {
+            LOG.error("Error propagation primary resource", e);
+            propHanlder.completeWhenPrimaryResourceErrored(propagations, tasks);
+        }
         roleTO.setPropagationStatusTOs(propagations);
 
         rwfAdapter.delete(roleId);

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java?rev=1504404&r1=1504403&r2=1504404&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java Thu Jul 18 09:45:36 2013
@@ -50,6 +50,7 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.dao.AttributableSearchDAO;
 import org.apache.syncope.core.persistence.dao.UserDAO;
 import org.apache.syncope.core.propagation.PropagationByResource;
+import org.apache.syncope.core.propagation.PropagationException;
 import org.apache.syncope.core.propagation.PropagationTaskExecutor;
 import org.apache.syncope.core.propagation.impl.DefaultPropagationHandler;
 import org.apache.syncope.core.propagation.impl.PropagationManager;
@@ -300,7 +301,13 @@ public class UserController {
                 created, userTO.getPassword(), userTO.getVirtualAttributes());
 
         final List<PropagationStatusTO> propagations = new ArrayList<PropagationStatusTO>();
-        taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        final DefaultPropagationHandler propHanlder = new DefaultPropagationHandler(connObjectUtil, propagations);
+        try {
+            taskExecutor.execute(tasks, propHanlder);
+        } catch (PropagationException e) {
+            LOG.error("Error propagation primary resource", e);
+            propHanlder.completeWhenPrimaryResourceErrored(propagations, tasks);
+        }
 
         notificationManager.createTasks(created.getResult().getKey(), created.getPerformedTasks());
 
@@ -354,8 +361,8 @@ public class UserController {
                 tasks.addAll(propagationManager.getUserUpdateTaskIds(
                         updated,
                         changedPwd,
-                        userMod.getVirtualAttributesToBeRemoved(), 
-                        userMod.getVirtualAttributesToBeUpdated(), 
+                        userMod.getVirtualAttributesToBeRemoved(),
+                        userMod.getVirtualAttributesToBeUpdated(),
                         toBeExcluded));
             }
 
@@ -367,10 +374,10 @@ public class UserController {
 
             if (!nonPwdPropByRes.isEmpty()) {
                 tasks.addAll(propagationManager.getUserUpdateTaskIds(
-                        updated, 
+                        updated,
                         null,
-                        userMod.getVirtualAttributesToBeRemoved(), 
-                        userMod.getVirtualAttributesToBeUpdated(), 
+                        userMod.getVirtualAttributesToBeRemoved(),
+                        userMod.getVirtualAttributesToBeUpdated(),
                         pwdResourceNames));
             }
 
@@ -378,7 +385,13 @@ public class UserController {
         }
 
         final List<PropagationStatusTO> propagations = new ArrayList<PropagationStatusTO>();
-        taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        final DefaultPropagationHandler propHanlder = new DefaultPropagationHandler(connObjectUtil, propagations);
+        try {
+            taskExecutor.execute(tasks, propHanlder);
+        } catch (PropagationException e) {
+            LOG.error("Error propagation primary resource", e);
+            propHanlder.completeWhenPrimaryResourceErrored(propagations, tasks);
+        }
 
         // 3. create notification tasks
         notificationManager.createTasks(updated.getResult().getKey(), updated.getPerformedTasks());
@@ -699,7 +712,14 @@ public class UserController {
         userTO.setId(userId);
 
         final List<PropagationStatusTO> propagations = new ArrayList<PropagationStatusTO>();
-        taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        final DefaultPropagationHandler propHanlder = new DefaultPropagationHandler(connObjectUtil, propagations);
+        try {
+            taskExecutor.execute(tasks, new DefaultPropagationHandler(connObjectUtil, propagations));
+        } catch (PropagationException e) {
+            LOG.error("Error propagation primary resource", e);
+            propHanlder.completeWhenPrimaryResourceErrored(propagations, tasks);
+        }
+
         userTO.setPropagationStatusTOs(propagations);
 
         uwfAdapter.delete(userId);

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java?rev=1504404&r1=1504403&r2=1504404&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java Thu Jul 18 09:45:36 2013
@@ -241,13 +241,8 @@ public class UserTestITCase extends Abst
         userMod.setPassword("newPassword");
         userMod.addResourceToBeAdded("ws-target-resource-1");
 
-        sce = null;
-        try {
-            userTO = userService.update(userMod.getId(), userMod);
-        } catch (SyncopeClientCompositeErrorException scce) {
-            sce = scce.getException(SyncopeClientExceptionType.Propagation);
-        }
-        assertNotNull(sce);
+        userTO = userService.update(userMod.getId(), userMod);
+        assertNotNull(userTO.getPropagationStatusTOs().get(0).getExecutionMessage());
 
         // 4. update assigning a resource NOT forcing mandatory constraints
         // BUT not primary: must succeed
@@ -1815,12 +1810,15 @@ public class UserTestITCase extends Abst
         assertNotNull(userTO);
     }
 
-    @Test(expected = SyncopeClientCompositeErrorException.class)
+    @Test
     public void issueSYNCOPE279() {
         UserTO userTO = getUniqueSampleTO("syncope279@apache.org");
         userTO.getResources().clear();
         userTO.addResource("ws-target-resource-timeout");
-        createUser(userTO);
+        userTO = createUser(userTO);
+        assertEquals("ws-target-resource-timeout", userTO.getPropagationStatusTOs().get(0).getResource());
+        assertNotNull(userTO.getPropagationStatusTOs().get(0).getExecutionMessage());
+        assertEquals(PropagationTaskExecStatus.UNSUBMITTED, userTO.getPropagationStatusTOs().get(0).getStatus());
     }
 
     @Test
@@ -1906,39 +1904,35 @@ public class UserTestITCase extends Abst
         pwdCipherAlgo.setValue("AES");
         configurationService.update(pwdCipherAlgo.getKey(), pwdCipherAlgo);
 
-        try {
-            // 3. create user with no resources
-            UserTO userTO = getUniqueSampleTO("syncope136_AES@apache.org");
-            userTO.getResources().clear();
+        // 3. create user with no resources
+        UserTO userTO = getUniqueSampleTO("syncope136_AES@apache.org");
+        userTO.getResources().clear();
 
-            userTO = userService.create(userTO).readEntity(UserTO.class);
-            assertNotNull(userTO);
+        userTO = userService.create(userTO).readEntity(UserTO.class);
+        assertNotNull(userTO);
 
-            // 4. update user, assign a propagation primary resource but don't provide any password
-            UserMod userMod = new UserMod();
-            userMod.setId(userTO.getId());
-            userMod.addResourceToBeAdded("ws-target-resource-1");
+        // 4. update user, assign a propagation primary resource but don't provide any password
+        UserMod userMod = new UserMod();
+        userMod.setId(userTO.getId());
+        userMod.addResourceToBeAdded("ws-target-resource-1");
 
-            userTO = userService.update(userMod.getId(), userMod);
-            assertNotNull(userTO);
+        userTO = userService.update(userMod.getId(), userMod);
+        assertNotNull(userTO);
 
-            // 5. verify that propagation was successful
-            List<PropagationStatusTO> props = userTO.getPropagationStatusTOs();
-            assertNotNull(props);
-            assertEquals(1, props.size());
-            PropagationStatusTO prop = props.iterator().next();
-            assertNotNull(prop);
-            assertEquals("ws-target-resource-1", prop.getResource());
-            assertEquals(PropagationTaskExecStatus.SUCCESS, prop.getStatus());
-        } catch (Exception e) {
-            LOG.error("Unexpected exception", e);
-        } finally {
-            // 6. restore initial cipher algorithm
-            pwdCipherAlgo.setValue(origpwdCipherAlgo);
-            configurationService.update(pwdCipherAlgo.getKey(), pwdCipherAlgo);
-        }
+        // 5. verify that propagation was successful
+        List<PropagationStatusTO> props = userTO.getPropagationStatusTOs();
+        assertNotNull(props);
+        assertEquals(1, props.size());
+        PropagationStatusTO prop = props.iterator().next();
+        assertNotNull(prop);
+        assertEquals("ws-target-resource-1", prop.getResource());
+        assertEquals(PropagationTaskExecStatus.SUBMITTED, prop.getStatus());
+        
+        // 6. restore initial cipher algorithm
+        pwdCipherAlgo.setValue(origpwdCipherAlgo);
+        configurationService.update(pwdCipherAlgo.getKey(), pwdCipherAlgo);
     }
-
+    
     @Test
     public void isseSYNCOPE136Random() {
         // 1. create user with no resources
@@ -2306,6 +2300,35 @@ public class UserTestITCase extends Abst
         assertEquals(2, toBeUpdated.getPropagationStatusTOs().size());
     }
 
+    @Test
+    public void issueSYNCOPE402() {
+        // 1. create an user with strict mandatory attributes only
+        UserTO userTO = new UserTO();
+        String userId = getUUIDString() + "syncope402@syncope.apache.org";
+        userTO.setUsername(userId);
+        userTO.setPassword("password");
+
+        userTO.addAttribute(attributeTO("userId", userId));
+        userTO.addAttribute(attributeTO("fullname", userId));
+        userTO.addAttribute(attributeTO("surname", userId));
+
+        userTO = createUser(userTO);
+        assertNotNull(userTO);
+        assertTrue(userTO.getResources().isEmpty());
+
+        //2. update assigning a resource NOT forcing mandatory constraints
+        // AND primary: must fail with PropagationException
+        UserMod userMod = new UserMod();
+        userMod.setId(userTO.getId());
+        userMod.setPassword("newPassword");
+        userMod.addResourceToBeAdded("ws-target-resource-1");
+        userMod.addResourceToBeAdded("resource-testdb");
+        userTO = userService.update(userMod.getId(), userMod);
+        assertEquals("ws-target-resource-1", userTO.getPropagationStatusTOs().get(1).getResource());
+        assertNotNull(userTO.getPropagationStatusTOs().get(1).getExecutionMessage());
+        assertEquals(PropagationTaskExecStatus.UNSUBMITTED, userTO.getPropagationStatusTOs().get(1).getStatus());
+    }
+
     private boolean getBooleanAttribute(ConnObjectTO connObjectTO, String attrName) {
         return Boolean.parseBoolean(getStringAttribute(connObjectTO, attrName));
     }