Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AbstractPropagationTaskExecutor.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AbstractPropagationTaskExecutor.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AbstractPropagationTaskExecutor.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AbstractPropagationTaskExecutor.java Fri Jun 13 13:58:59 2014 @@ -42,7 +42,6 @@ import org.apache.syncope.core.persisten import org.apache.syncope.core.persistence.beans.TaskExec; import org.apache.syncope.core.persistence.dao.TaskDAO; import org.apache.syncope.core.propagation.ConnectorFactory; -import org.apache.syncope.core.propagation.DefaultPropagationActions; import org.apache.syncope.core.propagation.PropagationActions; import org.apache.syncope.core.propagation.PropagationReporter; import org.apache.syncope.core.propagation.PropagationTaskExecutor; @@ -116,24 +115,21 @@ public abstract class AbstractPropagatio return execute(task, null); } - protected PropagationActions getPropagationActions(final ExternalResource resource) { - PropagationActions result = null; + protected List<PropagationActions> getPropagationActions(final ExternalResource resource) { + List<PropagationActions> result = new ArrayList<PropagationActions>(); - if (StringUtils.isNotBlank(resource.getPropagationActionsClassName())) { - try { - Class<?> actionsClass = Class.forName(resource.getPropagationActionsClassName()); - result = (PropagationActions) ApplicationContextProvider.getBeanFactory(). - createBean(actionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true); - } catch (ClassNotFoundException e) { - LOG.error("Invalid PropagationAction class name '{}' for resource {}", - resource, resource.getPropagationActionsClassName(), e); + if (!resource.getPropagationActionsClassNames().isEmpty()) { + for (String className : resource.getPropagationActionsClassNames()) { + try { + Class<?> actionsClass = Class.forName(className); + result.add((PropagationActions) ApplicationContextProvider.getBeanFactory(). + createBean(actionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true)); + } catch (ClassNotFoundException e) { + LOG.error("Invalid PropagationAction class name '{}' for resource {}", resource, className, e); + } } } - if (result == null) { - result = new DefaultPropagationActions(); - } - return result; } @@ -327,7 +323,7 @@ public abstract class AbstractPropagatio @Override public TaskExec execute(final PropagationTask task, final PropagationReporter reporter) { - final PropagationActions actions = getPropagationActions(task.getResource()); + final List<PropagationActions> actions = getPropagationActions(task.getResource()); final Date startDate = new Date(); @@ -351,7 +347,9 @@ public abstract class AbstractPropagatio // Try to read remote object (user / group) BEFORE any actual operation beforeObj = getRemoteObject(task, connector, false); - actions.before(task, beforeObj); + for (PropagationActions action : actions) { + action.before(task, beforeObj); + } switch (task.getPropagationOperation()) { case CREATE: @@ -440,7 +438,9 @@ public abstract class AbstractPropagatio } } - actions.after(task, execution, afterObj); + for (PropagationActions action : actions) { + action.after(task, execution, afterObj); + } notificationManager.createTasks( AuditElements.EventCategoryType.PROPAGATION, @@ -531,7 +531,7 @@ public abstract class AbstractPropagatio new ObjectClass(task.getObjectClassName()), new Uid(accountId), connector.getOperationOptions(AttributableUtil.getInstance(task.getSubjectType()). - getMappingItems(task.getResource(), MappingPurpose.PROPAGATION))); + getMappingItems(task.getResource(), MappingPurpose.PROPAGATION))); } catch (TimeoutException toe) { LOG.debug("Request timeout", toe); throw toe;
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PriorityPropagationTaskExecutor.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PriorityPropagationTaskExecutor.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PriorityPropagationTaskExecutor.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PriorityPropagationTaskExecutor.java Fri Jun 13 13:58:59 2014 @@ -104,10 +104,10 @@ public class PriorityPropagationTaskExec public int compare(final PropagationTask task1, final PropagationTask task2) { int prop1 = task1.getResource().getPropagationPriority() == null ? Integer.MIN_VALUE - : task1.getResource().getPropagationPriority().intValue(); + : task1.getResource().getPropagationPriority(); int prop2 = task2.getResource().getPropagationPriority() == null ? Integer.MIN_VALUE - : task2.getResource().getPropagationPriority().intValue(); + : task2.getResource().getPropagationPriority(); return prop1 > prop2 ? 1 Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java Fri Jun 13 13:58:59 2014 @@ -141,7 +141,8 @@ public class ResourceDataBinder { resource.setRserializedSyncToken(null); } - resource.setPropagationActionsClassName(resourceTO.getPropagationActionsClassName()); + resource.getPropagationActionsClassNames().clear(); + resource.getPropagationActionsClassNames().addAll(resourceTO.getPropagationActionsClassNames()); return resource; } @@ -337,7 +338,7 @@ public class ResourceDataBinder { resourceTO.setUsyncToken(resource.getUserializedSyncToken()); resourceTO.setRsyncToken(resource.getRserializedSyncToken()); - resourceTO.setPropagationActionsClassName(resource.getPropagationActionsClassName()); + resourceTO.getPropagationActionsClassNames().addAll(resource.getPropagationActionsClassNames()); return resourceTO; } Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java Fri Jun 13 13:58:59 2014 @@ -68,7 +68,7 @@ public class TaskDataBinder { */ private static final Logger LOG = LoggerFactory.getLogger(TaskDataBinder.class); - private static final String[] IGNORE_TASK_PROPERTIES = { "executions", "resource", }; + private static final String[] IGNORE_TASK_PROPERTIES = { "executions", "resource" }; private static final String[] IGNORE_TASK_EXECUTION_PROPERTIES = { "id", "task" }; @@ -113,12 +113,14 @@ public class TaskDataBinder { if (syncTaskTO.getUserTemplate() != null) { UserTO template = syncTaskTO.getUserTemplate(); - if (StringUtils.isNotBlank(template.getUsername()) && !JexlUtil. - isExpressionValid(template.getUsername())) { + if (StringUtils.isNotBlank(template.getUsername()) + && !JexlUtil.isExpressionValid(template.getUsername())) { + sce.getElements().add("Invalid JEXL: " + template.getUsername()); } - if (StringUtils.isNotBlank(template.getPassword()) && !JexlUtil. - isExpressionValid(template.getPassword())) { + if (StringUtils.isNotBlank(template.getPassword()) + && !JexlUtil.isExpressionValid(template.getPassword())) { + sce.getElements().add("Invalid JEXL: " + template.getPassword()); } @@ -155,7 +157,8 @@ public class TaskDataBinder { task.setSyncStatus(taskTO.isSyncStatus()); task.setMatchigRule(taskTO.getMatchigRule()); task.setUnmatchigRule(taskTO.getUnmatchigRule()); - task.setActionsClassName(taskTO.getActionsClassName()); + task.getActionsClassNames().clear(); + task.getActionsClassNames().addAll(taskTO.getActionsClassNames()); } public SchedTask createSchedTask(final SchedTaskTO taskTO, final TaskUtil taskUtil) { @@ -192,7 +195,6 @@ public class TaskDataBinder { Class<? extends Task> taskClass = taskUtil.taskClass(); Class<? extends AbstractTaskTO> taskTOClass = taskUtil.taskTOClass(); - if (taskClass == null || !taskClass.equals(task.getClass())) { throw new ClassCastException( String.format("taskUtil is type %s but task is not: %s", taskClass, task.getClass())); @@ -297,6 +299,7 @@ public class TaskDataBinder { ((SyncTaskTO) taskTO).setDescription(((SyncTask) task).getDescription()); ((SyncTaskTO) taskTO).setResource(((SyncTask) task).getResource().getName()); break; + case PUSH: if (!(task instanceof PushTask)) { throw new ClassCastException("taskUtil is type Push but task is not PushTask: " Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java Fri Jun 13 13:58:59 2014 @@ -86,9 +86,9 @@ public abstract class AbstractSyncJob<T /** * SyncJob actions. */ - protected A actions; + protected List<A> actions; - public void setActions(final A actions) { + public void setActions(final List<A> actions) { this.actions = actions; } @@ -326,11 +326,13 @@ public abstract class AbstractSyncJob<T final UMapping uMapping = syncTask.getResource().getUmapping(); if (uMapping != null && uMapping.getAccountIdItem() == null) { - throw new JobExecutionException("Invalid user account id mapping for resource " + syncTask.getResource()); + throw new JobExecutionException( + "Invalid user account id mapping for resource " + syncTask.getResource()); } final RMapping rMapping = syncTask.getResource().getRmapping(); if (rMapping != null && rMapping.getAccountIdItem() == null) { - throw new JobExecutionException("Invalid role account id mapping for resource " + syncTask.getResource()); + throw new JobExecutionException( + "Invalid role account id mapping for resource " + syncTask.getResource()); } if (uMapping == null && rMapping == null) { return "No mapping configured for both users and roles: aborting..."; Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncopeResultHandler.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncopeResultHandler.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncopeResultHandler.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncopeResultHandler.java Fri Jun 13 13:58:59 2014 @@ -19,6 +19,7 @@ package org.apache.syncope.core.sync.impl; import java.util.Collection; +import java.util.List; import org.apache.syncope.common.types.ConflictResolutionAction; import org.apache.syncope.core.audit.AuditManager; import org.apache.syncope.core.connid.ConnObjectUtil; @@ -104,15 +105,15 @@ public abstract class AbstractSyncopeRes protected ConflictResolutionAction resAct; - protected A actions; + protected List<A> actions; protected T syncTask; - public A getActions() { + public List<A> getActions() { return actions; } - public void setActions(A actions) { + public void setActions(final List<A> actions) { this.actions = actions; } Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/DBPasswordSyncActions.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/DBPasswordSyncActions.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/DBPasswordSyncActions.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/DBPasswordSyncActions.java Fri Jun 13 13:58:59 2014 @@ -38,13 +38,15 @@ import org.springframework.beans.factory import org.springframework.transaction.annotation.Transactional; /** - * A SyncActions implementation which allows the ability to import passwords from a Database + * A SyncActions implementation which allows the ability to import passwords from a Database * backend, where the passwords are hashed according to the password cipher algorithm property * of the (DB) Connector and HEX-encoded. */ public class DBPasswordSyncActions extends DefaultSyncActions { - protected static final Logger LOG = LoggerFactory.getLogger(DBPasswordSyncActions.class); + private static final Logger LOG = LoggerFactory.getLogger(DBPasswordSyncActions.class); + + private static final String CLEARTEXT = "CLEARTEXT"; @Autowired private UserDAO userDAO; @@ -64,19 +66,21 @@ public class DBPasswordSyncActions exten String password = ((UserTO) subject).getPassword(); if (password != null) { Connector connector = handler.getConnector(); - ConnInstance connInstance = connector.getActiveConnInstance(); - Iterator<ConnConfProperty> propertyIterator = connInstance.getConfiguration().iterator(); - String cipherAlgorithm = "CLEARTEXT"; - while (propertyIterator.hasNext()) { + + String cipherAlgorithm = CLEARTEXT; + boolean found = false; + for (Iterator<ConnConfProperty> propertyIterator = connInstance.getConfiguration().iterator(); + propertyIterator.hasNext() && !found;) { + ConnConfProperty property = propertyIterator.next(); if ("cipherAlgorithm".equals(property.getSchema().getName()) && property.getValues() != null && !property.getValues().isEmpty()) { + cipherAlgorithm = (String) property.getValues().get(0); - break; } } - if (!"CLEARTEXT".equals(cipherAlgorithm)) { + if (!CLEARTEXT.equals(cipherAlgorithm)) { try { encodedPassword = password; cipher = CipherAlgorithm.valueOf(cipherAlgorithm); Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java Fri Jun 13 13:58:59 2014 @@ -91,14 +91,16 @@ public class PushJob extends AbstractSyn final SyncopePushResultHandler handler = (SyncopePushResultHandler) ((DefaultListableBeanFactory) ApplicationContextProvider. getApplicationContext().getBeanFactory()).createBean( - SyncopePushResultHandler.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); + SyncopePushResultHandler.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); handler.setConnector(connector); handler.setDryRun(dryRun); handler.setResults(results); handler.setSyncTask(pushTask); handler.setActions(actions); - actions.beforeAll(handler); + for (PushActions action : actions) { + action.beforeAll(handler); + } if (uMapping != null) { final int count = userDAO.count(authorizations); @@ -135,7 +137,9 @@ public class PushJob extends AbstractSyn } } - actions.afterAll(handler, results); + for (PushActions action : actions) { + action.afterAll(handler, results); + } final String result = createReport(results, pushTask.getResource().getSyncTraceLevel(), dryRun); Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncJob.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncJob.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncJob.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncJob.java Fri Jun 13 13:58:59 2014 @@ -99,7 +99,7 @@ public class SyncJob extends AbstractSyn final SyncopeSyncResultHandler handler = (SyncopeSyncResultHandler) ((DefaultListableBeanFactory) ApplicationContextProvider. getApplicationContext().getBeanFactory()).createBean( - SyncopeSyncResultHandler.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); + SyncopeSyncResultHandler.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); handler.setConnector(connector); handler.setActions(actions); handler.setDryRun(dryRun); @@ -107,7 +107,9 @@ public class SyncJob extends AbstractSyn handler.setResults(results); handler.setSyncTask(syncTask); - actions.beforeAll(handler); + for (SyncActions action : actions) { + action.beforeAll(handler); + } try { SyncToken latestUSyncToken = null; if (uMapping != null && !syncTask.isFullReconciliation()) { @@ -162,7 +164,9 @@ public class SyncJob extends AbstractSyn LOG.error("While setting role owners", e); } - actions.afterAll(handler, results); + for (SyncActions action : actions) { + action.afterAll(handler, results); + } final String result = createReport(results, syncTask.getResource().getSyncTraceLevel(), dryRun); Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopePushResultHandler.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopePushResultHandler.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopePushResultHandler.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopePushResultHandler.java Fri Jun 13 13:58:59 2014 @@ -139,21 +139,27 @@ public class SyncopePushResultHandler ex switch (getSyncTask().getUnmatchigRule()) { case ASSIGN: result.setOperation(ResourceOperation.CREATE); - actions.beforeAssign(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeAssign(this, values, toBeHandled); + } controller.assign( toBeHandled.getId(), Collections.singleton(getSyncTask().getResource().getName()), true, null); break; case PROVISION: result.setOperation(ResourceOperation.CREATE); - actions.beforeProvision(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeProvision(this, values, toBeHandled); + } controller.provision( toBeHandled.getId(), Collections.singleton(getSyncTask().getResource().getName()), true, null); break; case UNLINK: result.setOperation(ResourceOperation.NONE); - actions.beforeUnlink(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeUnlink(this, values, toBeHandled); + } controller.unlink( toBeHandled.getId(), Collections.singleton(getSyncTask().getResource().getName())); break; @@ -166,7 +172,9 @@ public class SyncopePushResultHandler ex switch (getSyncTask().getMatchigRule()) { case UPDATE: result.setOperation(ResourceOperation.UPDATE); - actions.beforeUpdate(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeUpdate(this, values, toBeHandled); + } AbstractPropagationTaskExecutor.createOrUpdate( oclass, @@ -181,13 +189,17 @@ public class SyncopePushResultHandler ex break; case DEPROVISION: result.setOperation(ResourceOperation.DELETE); - actions.beforeDeprovision(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeDeprovision(this, values, toBeHandled); + } controller.deprovision( toBeHandled.getId(), Collections.singleton(getSyncTask().getResource().getName())); break; case UNASSIGN: result.setOperation(ResourceOperation.DELETE); - actions.beforeUnassign(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeUnassign(this, values, toBeHandled); + } controller.unlink( toBeHandled.getId(), Collections.singleton(getSyncTask().getResource().getName())); controller.deprovision( @@ -195,13 +207,17 @@ public class SyncopePushResultHandler ex break; case LINK: result.setOperation(ResourceOperation.NONE); - actions.beforeLink(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeLink(this, values, toBeHandled); + } controller.link( toBeHandled.getId(), Collections.singleton(getSyncTask().getResource().getName())); break; case UNLINK: result.setOperation(ResourceOperation.NONE); - actions.beforeUnlink(this, values, toBeHandled); + for (PushActions action : actions) { + action.beforeUnlink(this, values, toBeHandled); + } controller.unlink( toBeHandled.getId(), Collections.singleton(getSyncTask().getResource().getName())); break; @@ -222,7 +238,9 @@ public class SyncopePushResultHandler ex LOG.warn("Error pushing {} towards {}", toBeHandled, getSyncTask().getResource(), e); throw new JobExecutionException(e); } finally { - actions.after(this, values, toBeHandled, result); + for (PushActions action : actions) { + action.after(this, values, toBeHandled, result); + } notificationManager.createTasks( AuditElements.EventCategoryType.PUSH, AttributableType.USER.name().toLowerCase(), Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopeSyncResultHandler.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopeSyncResultHandler.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopeSyncResultHandler.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopeSyncResultHandler.java Fri Jun 13 13:58:59 2014 @@ -350,7 +350,7 @@ public class SyncopeSyncResultHandler ex final List<ConnectorObject> found = connector.search(objectClass, new EqualsFilter(new Name(name)), connector.getOperationOptions( - attrUtil.getMappingItems(syncTask.getResource(), MappingPurpose.SYNCHRONIZATION))); + attrUtil.getMappingItems(syncTask.getResource(), MappingPurpose.SYNCHRONIZATION))); if (found.isEmpty()) { LOG.debug("No {} found on {} with __NAME__ {}", objectClass, syncTask.getResource(), name); @@ -397,7 +397,12 @@ public class SyncopeSyncResultHandler ex subjectTO.getResources().add(getSyncTask().getResource().getName()); - return create(subjectTO, actions.beforeAssign(this, delta, subjectTO), attrUtil, "assign", dryRun); + SyncDelta _delta = delta; + for (SyncActions action : actions) { + _delta = action.beforeAssign(this, _delta, subjectTO); + } + + return create(subjectTO, _delta, attrUtil, "assign", dryRun); } protected List<SyncResult> create( @@ -407,12 +412,17 @@ public class SyncopeSyncResultHandler ex final AbstractAttributableTO subjectTO = connObjectUtil.getAttributableTO(delta.getObject(), syncTask, attrUtil); - return create(subjectTO, actions.beforeCreate(this, delta, subjectTO), attrUtil, "provision", dryRun); + SyncDelta _delta = delta; + for (SyncActions action : actions) { + _delta = action.beforeCreate(this, _delta, subjectTO); + } + + return create(subjectTO, _delta, attrUtil, "provision", dryRun); } private List<SyncResult> create( final AbstractAttributableTO subjectTO, - SyncDelta delta, + final SyncDelta delta, final AttributableUtil attrUtil, final String operation, final boolean dryRun) @@ -517,7 +527,9 @@ public class SyncopeSyncResultHandler ex delta); } - actions.after(this, delta, actual, result); + for (SyncActions action : actions) { + action.after(this, delta, actual, result); + } return Collections.singletonList(result); } @@ -529,7 +541,9 @@ public class SyncopeSyncResultHandler ex UserMod userMod = connObjectUtil.getAttributableMod( id, delta.getObject(), before, syncTask, AttributableUtil.getInstance(AttributableType.USER)); - delta = actions.beforeUpdate(this, delta, before, userMod); + for (SyncActions action : actions) { + delta = action.beforeUpdate(this, delta, before, userMod); + } if (dryRun) { return new AbstractMap.SimpleEntry<UserTO, UserTO>(before, before); @@ -582,7 +596,9 @@ public class SyncopeSyncResultHandler ex taskExecutor.execute(tasks); final UserTO after = userDataBinder.getUserTO(updated.getResult().getKey().getId()); - actions.after(this, delta, after, result); + for (SyncActions action : actions) { + action.after(this, delta, after, result); + } return new AbstractMap.SimpleEntry<UserTO, UserTO>(before, after); } @@ -595,7 +611,9 @@ public class SyncopeSyncResultHandler ex RoleMod roleMod = connObjectUtil.getAttributableMod( id, delta.getObject(), before, syncTask, AttributableUtil.getInstance(AttributableType.ROLE)); - delta = actions.beforeUpdate(this, delta, before, roleMod); + for (SyncActions action : actions) { + delta = action.beforeUpdate(this, delta, before, roleMod); + } if (dryRun) { return new AbstractMap.SimpleEntry<RoleTO, RoleTO>(before, before); @@ -625,7 +643,9 @@ public class SyncopeSyncResultHandler ex final RoleTO after = roleDataBinder.getRoleTO(updated.getResult()); - actions.after(this, delta, after, result); + for (SyncActions action : actions) { + action.after(this, delta, after, result); + } return new AbstractMap.SimpleEntry<RoleTO, RoleTO>(before, after); } @@ -759,16 +779,22 @@ public class SyncopeSyncResultHandler ex try { if (!dryRun) { if (unlink) { - actions.beforeUnassign(this, delta, before); + for (SyncActions action : actions) { + action.beforeUnassign(this, delta, before); + } controller.unlink(id, Collections.<String>singleton(getSyncTask().getResource().getName())); } else { - actions.beforeDeprovision(this, delta, before); + for (SyncActions action : actions) { + action.beforeDeprovision(this, delta, before); + } } controller.deprovision(id, Collections.<String>singleton(getSyncTask().getResource().getName())); output = controller.read(id); - actions.after(this, delta, AbstractAttributableTO.class.cast(output), result); + for (SyncActions action : actions) { + action.after(this, delta, AbstractAttributableTO.class.cast(output), result); + } } else { output = before; } @@ -860,15 +886,21 @@ public class SyncopeSyncResultHandler ex try { if (!dryRun) { if (unlink) { - actions.beforeUnlink(this, delta, before); + for (SyncActions action : actions) { + action.beforeUnlink(this, delta, before); + } controller.unlink(id, Collections.<String>singleton(getSyncTask().getResource().getName())); } else { - actions.beforeLink(this, delta, before); + for (SyncActions action : actions) { + action.beforeLink(this, delta, before); + } controller.link(id, Collections.<String>singleton(getSyncTask().getResource().getName())); } output = controller.read(id); - actions.after(this, delta, AbstractAttributableTO.class.cast(output), result); + for (SyncActions action : actions) { + action.after(this, delta, AbstractAttributableTO.class.cast(output), result); + } } else { output = before; } @@ -941,7 +973,9 @@ public class SyncopeSyncResultHandler ex ? userDataBinder.getUserTO(id) : roleDataBinder.getRoleTO(id); - delta = actions.beforeDelete(this, delta, before); + for (SyncActions action : actions) { + delta = action.beforeDelete(this, delta, before); + } final SyncResult result = new SyncResult(); result.setId(id); @@ -986,7 +1020,9 @@ public class SyncopeSyncResultHandler ex } } - actions.after(this, delta, before, result); + for (SyncActions action : actions) { + action.after(this, delta, before, result); + } delResults.add(result); } catch (NotFoundException e) { Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java (original) +++ syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java Fri Jun 13 13:58:59 2014 @@ -321,7 +321,7 @@ public class TaskTestITCase extends Abst assertNotNull(task); // add custom SyncJob actions - task.setActionsClassName(TestSyncActions.class.getName()); + task.getActionsClassNames().add(TestSyncActions.class.getName()); // add user template UserTO template = new UserTO(); @@ -341,7 +341,7 @@ public class TaskTestITCase extends Abst SyncTaskTO actual = taskService.read(task.getId()); assertNotNull(actual); assertEquals(task.getId(), actual.getId()); - assertEquals(TestSyncActions.class.getName(), actual.getActionsClassName()); + assertEquals(TestSyncActions.class.getName(), actual.getActionsClassNames().get(0)); execSyncTask(SYNC_TASK_ID, 50, false); Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/SyncTaskTest.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/SyncTaskTest.java?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/SyncTaskTest.java (original) +++ syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/SyncTaskTest.java Fri Jun 13 13:58:59 2014 @@ -72,7 +72,7 @@ public class SyncTaskTest extends Abstra assertNotNull(exception); task.setResource(resource); - task.setActionsClassName(getClass().getName()); + task.getActionsClassNames().add(getClass().getName()); // this save() fails because jobActionsClassName does not implement // the right interface @@ -84,7 +84,8 @@ public class SyncTaskTest extends Abstra } assertNotNull(exception); - task.setActionsClassName(TestSyncActions.class.getName()); + task.getActionsClassNames().clear(); + task.getActionsClassNames().add(TestSyncActions.class.getName()); // this save() finally works task = taskDAO.save(task); assertNotNull(task); @@ -103,7 +104,7 @@ public class SyncTaskTest extends Abstra task.setResource(resource); task.setName("issueSYNCOPE144"); task.setDescription("issueSYNCOPE144 Description"); - task.setActionsClassName(TestSyncActions.class.getName()); + task.getActionsClassNames().add(TestSyncActions.class.getName()); task = taskDAO.save(task); assertNotNull(task); Modified: syncope/trunk/core/src/test/resources/content.xml URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/resources/content.xml?rev=1602430&r1=1602429&r2=1602430&view=diff ============================================================================== --- syncope/trunk/core/src/test/resources/content.xml (original) +++ syncope/trunk/core/src/test/resources/content.xml Fri Jun 13 13:58:59 2014 @@ -532,10 +532,11 @@ under the License. <ExternalResource name="resource-ldap" connector_id="105" randomPwdIfNotProvided="1" enforceMandatoryCondition="1" propagationMode="ONE_PHASE" propagationPriority="0" propagationPrimary="1" - propagationActionsClassName="org.apache.syncope.core.propagation.impl.LDAPMembershipPropagationActions" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" creator="admin" lastModifier="admin" creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/> + <ExternalResource_propagationActionsClassNames externalResource_name="resource-ldap" + element="org.apache.syncope.core.propagation.impl.LDAPMembershipPropagationActions"/> <ExternalResource name="ws-target-resource-nopropagation" connector_id="103" randomPwdIfNotProvided="0" enforceMandatoryCondition="1" propagationMode="TWO_PHASES" propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" @@ -844,8 +845,8 @@ under the License. jobClassName="org.apache.syncope.core.sync.impl.SyncJob"/> <Task DTYPE="SyncTask" id="11" name="LDAP Sync Task" resource_name="resource-ldap" fullReconciliation="1" performCreate="1" performDelete="1" performUpdate="1" syncStatus="0" - actionsClassName="org.apache.syncope.core.sync.impl.LDAPMembershipSyncActions" jobClassName="org.apache.syncope.core.sync.impl.SyncJob"/> + <SyncTask_actionsClassNames SyncTask_id="11" element="org.apache.syncope.core.sync.impl.LDAPMembershipSyncActions"/> <Task DTYPE="SyncTask" id="12" name="VirAttrCache test" resource_name="resource-csv" performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" fullReconciliation="1" jobClassName="org.apache.syncope.core.sync.impl.SyncJob"/>
