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));
}