You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2014/06/06 14:15:35 UTC

svn commit: r1600864 - in /syncope/trunk: common/src/main/java/org/apache/syncope/common/to/ common/src/main/java/org/apache/syncope/common/types/ core/src/main/java/org/apache/syncope/core/init/ core/src/main/java/org/apache/syncope/core/persistence/b...

Author: fmartelli
Date: Fri Jun  6 12:15:34 2014
New Revision: 1600864

URL: http://svn.apache.org/r1600864
Log:
Fix for SYNCOPE-472

Added:
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushPolicy.java
      - copied, changed from r1556257, syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncPolicy.java
Removed:
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncopeSyncResultHandler.java
Modified:
    syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/types/PolicyType.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/PolicyDAO.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/PolicyDAOImpl.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/TaskDataBinder.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/services/TaskServiceImpl.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultSyncActions.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/PushActions.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/SyncActions.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncopeResultHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/LDAPMembershipSyncActions.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncJob.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopePushResultHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopeSyncResultHandler.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/relationships/TaskTest.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/TestSyncActions.java

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java Fri Jun  6 12:15:34 2014
@@ -27,4 +27,23 @@ public class PushTaskTO extends Abstract
 
     private static final long serialVersionUID = -2143537546915809018L;
 
+    private String userFilter;
+
+    private String roleFilter;
+
+    public String getUserFilter() {
+        return userFilter;
+    }
+
+    public void setUserFilter(String filter) {
+        this.userFilter = filter;
+    }
+
+    public String getRoleFilter() {
+        return roleFilter;
+    }
+
+    public void setRoleFilter(String roleFilter) {
+        this.roleFilter = roleFilter;
+    }
 }

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/PolicyType.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/types/PolicyType.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/types/PolicyType.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/types/PolicyType.java Fri Jun  6 12:15:34 2014
@@ -29,18 +29,21 @@ public enum PolicyType {
      */
     ACCOUNT("Account Policy"),
     GLOBAL_ACCOUNT("Account Global Policy"),
-
     /**
      * Password policy regarding password syntax.
      */
     PASSWORD("Password Policy"),
     GLOBAL_PASSWORD("Password Global Policy"),
-
     /**
      * SYNC policy regarding account conflicts resolution.
      */
     SYNC("Synchronization Policy"),
-    GLOBAL_SYNC("Synchronization Global Policy");
+    GLOBAL_SYNC("Synchronization Global Policy"),
+    /**
+     * PUSH policy regarding account conflicts resolution.
+     */
+    PUSH("Push Policy"),
+    GLOBAL_PUSH("Push Global Policy");
 
     private String description;
 

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/init/JobInstanceLoader.java Fri Jun  6 12:15:34 2014
@@ -25,6 +25,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.core.notification.NotificationJob;
+import org.apache.syncope.core.persistence.beans.AbstractSyncTask;
 import org.apache.syncope.core.persistence.beans.PushTask;
 import org.apache.syncope.core.persistence.beans.Report;
 import org.apache.syncope.core.persistence.beans.SchedTask;
@@ -36,12 +37,10 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.dao.TaskDAO;
 import org.apache.syncope.core.quartz.TaskJob;
 import org.apache.syncope.core.report.ReportJob;
+import org.apache.syncope.core.sync.AbstractSyncActions;
 import org.apache.syncope.core.sync.DefaultPushActions;
 import org.apache.syncope.core.sync.DefaultSyncActions;
-import org.apache.syncope.core.sync.PushActions;
-import org.apache.syncope.core.sync.SyncActions;
-import org.apache.syncope.core.sync.impl.PushJob;
-import org.apache.syncope.core.sync.impl.SyncJob;
+import org.apache.syncope.core.sync.impl.AbstractSyncJob;
 import org.apache.syncope.core.util.ApplicationContextProvider;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
@@ -159,45 +158,48 @@ public class JobInstanceLoader {
         }
     }
 
+    @SuppressWarnings("unchecked")
     public void registerJob(final Task task, final String jobClassName, final String cronExpression)
             throws ClassNotFoundException, SchedulerException, ParseException {
 
-        Class<?> jobClass = Class.forName(jobClassName);
+        final Class<?> jobClass = Class.forName(jobClassName);
         Job jobInstance = (Job) ApplicationContextProvider.getBeanFactory().
                 createBean(jobClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
         if (jobInstance instanceof TaskJob) {
             ((TaskJob) jobInstance).setTaskId(task.getId());
         }
-        if (jobInstance instanceof SyncJob && task instanceof SyncTask) {
-            String jobActionsClassName = ((SyncTask) task).getActionsClassName();
-            Class<?> syncActionsClass = DefaultSyncActions.class;
-            if (StringUtils.isNotBlank(jobActionsClassName)) {
-                try {
-                    syncActionsClass = Class.forName(jobActionsClassName);
-                } catch (Exception e) {
-                    LOG.error("Class {} not found, reverting to {}", jobActionsClassName,
-                            syncActionsClass.getName(), e);
-                }
-            }
-            SyncActions syncActions = (SyncActions) ApplicationContextProvider.getBeanFactory().
-                    createBean(syncActionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
 
-            ((SyncJob) jobInstance).setActions(syncActions);
-        } else if (jobInstance instanceof PushJob && task instanceof PushTask) {
-            String jobActionsClassName = ((PushTask) task).getActionsClassName();
-            Class<?> syncActionsClass = DefaultPushActions.class;
-            if (StringUtils.isNotBlank(jobActionsClassName)) {
+        // In case of synchronization job/task retrieve and set synchronization actions:
+        // actions cannot be changed at runtime but connector and synchronization policies (reloaded at execution time).
+        if (jobInstance instanceof AbstractSyncJob && task instanceof AbstractSyncTask) {
+            final String jobActionsClassName = ((AbstractSyncTask) task).getActionsClassName();
+
+            try {
+
+                Class<?> syncActionsClass = Class.forName(jobActionsClassName);
+
+                final AbstractSyncActions<?> syncActions =
+                        (AbstractSyncActions<?>) ApplicationContextProvider.getBeanFactory().
+                        createBean(syncActionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
+
+                // Assume that syncActions object implements the right interface: 
+                // * SyncActions for a SyncJob; 
+                // * PushActions for a PushJob.
+                ((AbstractSyncJob) jobInstance).setActions(syncActions);
+
+            } catch (Exception e) {
+                final Class<? extends AbstractSyncActions<?>> defaultSyncActions =
+                        task instanceof SyncTask ? DefaultSyncActions.class : DefaultPushActions.class;
+
+                LOG.info("Class '{}' not found, reverting to {}", jobActionsClassName, defaultSyncActions.getName());
+
                 try {
-                    syncActionsClass = Class.forName(jobActionsClassName);
-                } catch (Exception e) {
-                    LOG.error("Class {} not found, reverting to {}", jobActionsClassName,
-                            syncActionsClass.getName(), e);
+                    ((AbstractSyncJob) jobInstance).setActions(defaultSyncActions.newInstance());
+                } catch (Exception ie) {
+                    // Shouldn't happen, BTW ...
+                    LOG.error("Default action class {} instantiation failed", defaultSyncActions.getName(), ie);
                 }
             }
-            PushActions pushActions = (PushActions) ApplicationContextProvider.getBeanFactory().
-                    createBean(syncActionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
-
-            ((PushJob) jobInstance).setActions(pushActions);
         }
 
         registerJob(getJobName(task), jobInstance, cronExpression);

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/ExternalResource.java Fri Jun  6 12:15:34 2014
@@ -141,6 +141,9 @@ public class ExternalResource extends Ab
     @ManyToOne(fetch = FetchType.EAGER, optional = true)
     private SyncPolicy syncPolicy;
 
+    @ManyToOne(fetch = FetchType.EAGER, optional = true)
+    private PushPolicy pushPolicy;
+
     /**
      * Configuration properties that are overridden from the connector instance.
      */
@@ -312,6 +315,14 @@ public class ExternalResource extends Ab
         this.syncPolicy = syncPolicy;
     }
 
+    public PushPolicy getPushPolicy() {
+        return pushPolicy;
+    }
+
+    public void setPushPolicy(PushPolicy pushPolicy) {
+        this.pushPolicy = pushPolicy;
+    }
+
     public Set<ConnConfProperty> getConnInstanceConfiguration() {
         Set<ConnConfProperty> result = null;
         if (StringUtils.isNotBlank(xmlConfiguration)) {

Copied: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushPolicy.java (from r1556257, syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncPolicy.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushPolicy.java?p2=syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushPolicy.java&p1=syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncPolicy.java&r1=1556257&r2=1600864&rev=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncPolicy.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushPolicy.java Fri Jun  6 12:15:34 2014
@@ -22,15 +22,15 @@ import javax.persistence.Entity;
 import org.apache.syncope.common.types.PolicyType;
 
 @Entity
-public class SyncPolicy extends Policy {
+public class PushPolicy extends Policy {
 
     private static final long serialVersionUID = -6090413855809521279L;
 
-    public SyncPolicy() {
+    public PushPolicy() {
         this(false);
     }
 
-    public SyncPolicy(boolean global) {
+    public PushPolicy(boolean global) {
         super();
 
         this.type = global

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java Fri Jun  6 12:15:34 2014
@@ -25,10 +25,30 @@ public class PushTask extends AbstractSy
 
     private static final long serialVersionUID = -4141057723006682564L;
 
+    private String userFilter;
+
+    private String roleFilter;
+
     /**
      * Default constructor.
      */
     public PushTask() {
         super("org.apache.syncope.core.sync.impl.PushJob");
     }
+
+    public String getUserFilter() {
+        return userFilter;
+    }
+
+    public void setUserFilter(final String filter) {
+        this.userFilter = filter;
+    }
+
+    public String getRoleFilter() {
+        return roleFilter;
+    }
+
+    public void setRoleFilter(String roleFilter) {
+        this.roleFilter = roleFilter;
+    }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/PolicyDAO.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/PolicyDAO.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/PolicyDAO.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/PolicyDAO.java Fri Jun  6 12:15:34 2014
@@ -24,6 +24,7 @@ import org.apache.syncope.common.types.P
 import org.apache.syncope.core.persistence.beans.AccountPolicy;
 import org.apache.syncope.core.persistence.beans.PasswordPolicy;
 import org.apache.syncope.core.persistence.beans.Policy;
+import org.apache.syncope.core.persistence.beans.PushPolicy;
 import org.apache.syncope.core.persistence.beans.SyncPolicy;
 
 public interface PolicyDAO extends DAO {
@@ -38,6 +39,8 @@ public interface PolicyDAO extends DAO {
 
     SyncPolicy getGlobalSyncPolicy();
 
+    PushPolicy getGlobalPushPolicy();
+
     List<Policy> findAll();
 
     <T extends Policy> T save(T policy);

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/PolicyDAOImpl.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/PolicyDAOImpl.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/PolicyDAOImpl.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/PolicyDAOImpl.java Fri Jun  6 12:15:34 2014
@@ -25,6 +25,7 @@ import org.apache.syncope.common.types.P
 import org.apache.syncope.core.persistence.beans.AccountPolicy;
 import org.apache.syncope.core.persistence.beans.PasswordPolicy;
 import org.apache.syncope.core.persistence.beans.Policy;
+import org.apache.syncope.core.persistence.beans.PushPolicy;
 import org.apache.syncope.core.persistence.beans.SyncPolicy;
 import org.apache.syncope.core.persistence.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.validation.entity.InvalidEntityException;
@@ -72,6 +73,14 @@ public class PolicyDAOImpl extends Abstr
     }
 
     @Override
+    public PushPolicy getGlobalPushPolicy() {
+        List<? extends Policy> policies = find(PolicyType.GLOBAL_PUSH);
+        return policies == null || policies.isEmpty()
+                ? null
+                : (PushPolicy) policies.get(0);
+    }
+
+    @Override
     public List<Policy> findAll() {
         TypedQuery<Policy> query = entityManager.createQuery("SELECT e FROM Policy e", Policy.class);
         return query.getResultList();

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -34,11 +34,13 @@ import org.apache.syncope.common.types.T
 import org.apache.syncope.common.util.BeanUtils;
 import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.common.to.AbstractSyncTaskTO;
+import org.apache.syncope.common.to.PushTaskTO;
 import org.apache.syncope.core.init.JobInstanceLoader;
 import org.apache.syncope.core.persistence.beans.AbstractSyncTask;
 import org.apache.syncope.core.persistence.beans.ExternalResource;
 import org.apache.syncope.core.persistence.beans.NotificationTask;
 import org.apache.syncope.core.persistence.beans.PropagationTask;
+import org.apache.syncope.core.persistence.beans.PushTask;
 import org.apache.syncope.core.persistence.beans.SchedTask;
 import org.apache.syncope.core.persistence.beans.SyncTask;
 import org.apache.syncope.core.persistence.beans.Task;
@@ -96,7 +98,13 @@ public class TaskDataBinder {
     private void fill(final AbstractSyncTask task, final AbstractSyncTaskTO taskTO) {
         SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSyncTask);
 
-        if (task instanceof SyncTask && taskTO instanceof SyncTaskTO) {
+        if (task instanceof PushTask && taskTO instanceof PushTaskTO) {
+            final PushTask pushTask = (PushTask) task;
+            final PushTaskTO pushTaskTO = (PushTaskTO) taskTO;
+
+            pushTask.setUserFilter(pushTaskTO.getUserFilter());
+
+        } else if (task instanceof SyncTask && taskTO instanceof SyncTaskTO) {
             final SyncTask syncTask = (SyncTask) task;
             final SyncTaskTO syncTaskTO = (SyncTaskTO) taskTO;
 
@@ -170,7 +178,7 @@ public class TaskDataBinder {
             if (resource == null) {
                 throw new NotFoundException("Resource " + syncTaskTO.getResource());
             }
-            ((SyncTask) task).setResource(resource);
+            ((AbstractSyncTask) task).setResource(resource);
 
             fill((AbstractSyncTask) task, syncTaskTO);
         }
@@ -287,6 +295,16 @@ 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: "
+                            + task.getClass().getName());
+                }
+                setExecTime((SchedTaskTO) taskTO, task);
+                ((PushTaskTO) taskTO).setName(((PushTask) task).getName());
+                ((PushTaskTO) taskTO).setDescription(((PushTask) task).getDescription());
+                ((PushTaskTO) taskTO).setResource(((PushTask) task).getResource().getName());
+                break;
 
             case NOTIFICATION:
                 if (((NotificationTask) task).isExecuted() && StringUtils.isBlank(taskTO.getLatestExecStatus())) {

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/services/TaskServiceImpl.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/services/TaskServiceImpl.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/services/TaskServiceImpl.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/services/TaskServiceImpl.java Fri Jun  6 12:15:34 2014
@@ -33,6 +33,7 @@ import org.apache.syncope.common.to.Sync
 import org.apache.syncope.common.to.TaskExecTO;
 import org.apache.syncope.common.to.AbstractTaskTO;
 import org.apache.syncope.common.reqres.PagedResult;
+import org.apache.syncope.common.to.PushTaskTO;
 import org.apache.syncope.common.types.RESTHeaders;
 import org.apache.syncope.common.types.PropagationTaskExecStatus;
 import org.apache.syncope.common.types.TaskType;
@@ -52,7 +53,7 @@ public class TaskServiceImpl extends Abs
     @Override
     public <T extends SchedTaskTO> Response create(final T taskTO) {
         T createdTask;
-        if (taskTO instanceof SyncTaskTO || taskTO instanceof SchedTaskTO) {
+        if (taskTO instanceof SyncTaskTO || taskTO instanceof PushTaskTO || taskTO instanceof SchedTaskTO) {
             createdTask = controller.createSchedTask(taskTO);
         } else {
             throw new BadRequestException();

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java Fri Jun  6 12:15:34 2014
@@ -33,36 +33,37 @@ import org.quartz.JobExecutionException;
 public class DefaultPushActions implements PushActions {
 
     @Override
-    public void beforeAll(final AbstractSyncopeResultHandler handler) throws JobExecutionException {
+    public void beforeAll(final AbstractSyncopeResultHandler<?, ?> handler) throws JobExecutionException {
     }
 
     @Override
     public <T extends AbstractAttributable> Map.Entry<String, Set<Attribute>> beforeCreate(
-            final AbstractSyncopeResultHandler handler,
-            final T subject,
-            final Map.Entry<String, Set<Attribute>> delta) throws JobExecutionException {
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final Map.Entry<String, Set<Attribute>> delta,
+            final T subject) throws JobExecutionException {
         return delta;
     }
 
     @Override
     public <T extends AbstractAttributable> Map.Entry<String, Set<Attribute>> beforeUpdate(
-            final AbstractSyncopeResultHandler handler,
-            final T subject,
-            final Map.Entry<String, Set<Attribute>> delta) throws JobExecutionException {
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final Map.Entry<String, Set<Attribute>> delta,
+            final T subject) throws JobExecutionException {
 
         return delta;
     }
 
     @Override
     public <T extends AbstractAttributable> void after(
-            final AbstractSyncopeResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final Map.Entry<String, Set<Attribute>> delta,
             final T subject,
-            final Map.Entry<String, Set<Attribute>> delta, SyncResult result) throws JobExecutionException {
+            SyncResult result) throws JobExecutionException {
     }
 
     @Override
     public void afterAll(
-            final AbstractSyncopeResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final List<SyncResult> results)
             throws JobExecutionException {
     }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultSyncActions.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultSyncActions.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultSyncActions.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultSyncActions.java Fri Jun  6 12:15:34 2014
@@ -22,7 +22,7 @@ import java.util.List;
 
 import org.apache.syncope.common.mod.AbstractAttributableMod;
 import org.apache.syncope.common.to.AbstractAttributableTO;
-import org.apache.syncope.core.sync.impl.AbstractSyncopeSyncResultHandler;
+import org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler;
 import org.identityconnectors.framework.common.objects.SyncDelta;
 import org.quartz.JobExecutionException;
 
@@ -32,12 +32,12 @@ import org.quartz.JobExecutionException;
 public class DefaultSyncActions implements SyncActions {
 
     @Override
-    public void beforeAll(final AbstractSyncopeSyncResultHandler handler) throws JobExecutionException {
+    public void beforeAll(final AbstractSyncopeResultHandler<?, ?> handler) throws JobExecutionException {
     }
 
     @Override
     public <T extends AbstractAttributableTO> SyncDelta beforeCreate(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject) throws JobExecutionException {
 
@@ -46,7 +46,7 @@ public class DefaultSyncActions implemen
 
     @Override
     public <T extends AbstractAttributableTO, K extends AbstractAttributableMod> SyncDelta beforeUpdate(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject,
             final K subjectMod)
@@ -57,7 +57,7 @@ public class DefaultSyncActions implemen
 
     @Override
     public <T extends AbstractAttributableTO> SyncDelta beforeDelete(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject) throws JobExecutionException {
 
@@ -66,7 +66,7 @@ public class DefaultSyncActions implemen
 
     @Override
     public <T extends AbstractAttributableTO> void after(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject,
             final SyncResult result) throws JobExecutionException {
@@ -74,7 +74,7 @@ public class DefaultSyncActions implemen
 
     @Override
     public void afterAll(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final List<SyncResult> results)
             throws JobExecutionException {
     }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/PushActions.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/PushActions.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/PushActions.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/PushActions.java Fri Jun  6 12:15:34 2014
@@ -28,48 +28,48 @@ import org.quartz.JobExecutionException;
 /**
  * Interface for actions to be performed during PushJob execution.
  */
-public interface PushActions extends AbstractSyncActions<AbstractSyncopeResultHandler> {
+public interface PushActions extends AbstractSyncActions<AbstractSyncopeResultHandler<?, ?>> {
 
     /**
      * Action to be executed before to create a synchronized user locally.
      *
      * @param handler synchronization handler being executed.
-     * @param subject user / role to be created
-     * @param delta info to be pushed out (accountId, attributes)
+     * @param delta info to be pushed out (accountId, attributes).
+     * @param subject user / role to be created.
      * @return info to be pushed out (accountId, attributes).
      * @throws JobExecutionException in case of generic failure
      */
     <T extends AbstractAttributable> Map.Entry<String, Set<Attribute>> beforeCreate(
-            final AbstractSyncopeResultHandler handler,
-            final T subject,
-            final Map.Entry<String, Set<Attribute>> delta) throws JobExecutionException;
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final Map.Entry<String, Set<Attribute>> delta,
+            final T subject) throws JobExecutionException;
 
     /**
      * Action to be executed before to update a synchronized user locally.
      *
      * @param handler synchronization handler being executed.
-     * @param subject user / role to be created
-     * @param delta info to be pushed out (accountId, attributes)
+     * @param delta info to be pushed out (accountId, attributes).
+     * @param subject user / role to be updated.
      * @return info to be pushed out (accountId, attributes).
      * @throws JobExecutionException in case of generic failure
      */
     <T extends AbstractAttributable> Map.Entry<String, Set<Attribute>> beforeUpdate(
-            final AbstractSyncopeResultHandler handler,
-            final T subject,
-            final Map.Entry<String, Set<Attribute>> delta) throws JobExecutionException;
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final Map.Entry<String, Set<Attribute>> delta,
+            final T subject) throws JobExecutionException;
 
     /**
      * Action to be executed after each local user synchronization.
      *
      * @param handler synchronization handler being executed.
-     * @param subject user / role to be created
      * @param delta info pushed out (accountId, attributes)
+     * @param subject synchronized user / role.
      * @param result operation result.
      * @throws JobExecutionException in case of generic failure
      */
     <T extends AbstractAttributable> void after(
-            final AbstractSyncopeResultHandler handler,
-            final T subject,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final Map.Entry<String, Set<Attribute>> delta,
+            final T subject,
             final SyncResult result) throws JobExecutionException;
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/SyncActions.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/SyncActions.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/SyncActions.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/SyncActions.java Fri Jun  6 12:15:34 2014
@@ -20,14 +20,14 @@ package org.apache.syncope.core.sync;
 
 import org.apache.syncope.common.mod.AbstractAttributableMod;
 import org.apache.syncope.common.to.AbstractAttributableTO;
-import org.apache.syncope.core.sync.impl.AbstractSyncopeSyncResultHandler;
+import org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler;
 import org.identityconnectors.framework.common.objects.SyncDelta;
 import org.quartz.JobExecutionException;
 
 /**
  * Interface for actions to be performed during SyncJob execution.
  */
-public interface SyncActions extends AbstractSyncActions<AbstractSyncopeSyncResultHandler> {
+public interface SyncActions extends AbstractSyncActions<AbstractSyncopeResultHandler<?, ?>> {
 
     /**
      * Action to be executed before to create a synchronized user locally.
@@ -39,7 +39,7 @@ public interface SyncActions extends Abs
      * @throws JobExecutionException in case of generic failure
      */
     <T extends AbstractAttributableTO> SyncDelta beforeCreate(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject) throws JobExecutionException;
 
@@ -54,7 +54,7 @@ public interface SyncActions extends Abs
      * @throws JobExecutionException in case of generic failure.
      */
     <T extends AbstractAttributableTO, K extends AbstractAttributableMod> SyncDelta beforeUpdate(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject,
             final K subjectMod)
@@ -65,12 +65,12 @@ public interface SyncActions extends Abs
      *
      * @param handler synchronization handler being executed.
      * @param delta retrieved synchronization information
-     * @param subject lcao user / role to be deleted
+     * @param subject local user / role to be deleted
      * @return synchronization information used for logging and to be passed to the 'after' method.
      * @throws JobExecutionException in case of generic failure
      */
     <T extends AbstractAttributableTO> SyncDelta beforeDelete(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject) throws JobExecutionException;
 
@@ -84,7 +84,8 @@ public interface SyncActions extends Abs
      * @throws JobExecutionException in case of generic failure
      */
     <T extends AbstractAttributableTO> void after(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
-            final T subject, final SyncResult result) throws JobExecutionException;
+            final T subject,
+            final SyncResult result) throws JobExecutionException;
 }

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -18,16 +18,24 @@
  */
 package org.apache.syncope.core.sync.impl;
 
+import java.lang.reflect.ParameterizedType;
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.syncope.common.types.SyncPolicySpec;
 import org.apache.syncope.common.types.TraceLevel;
 import org.apache.syncope.core.persistence.beans.AbstractSyncTask;
 import org.apache.syncope.core.persistence.beans.Entitlement;
+import org.apache.syncope.core.persistence.beans.PushPolicy;
 import org.apache.syncope.core.persistence.beans.PushTask;
+import org.apache.syncope.core.persistence.beans.SyncPolicy;
 import org.apache.syncope.core.persistence.beans.SyncTask;
 import org.apache.syncope.core.persistence.beans.TaskExec;
+import org.apache.syncope.core.persistence.beans.role.RMapping;
+import org.apache.syncope.core.persistence.beans.user.UMapping;
 import org.apache.syncope.core.persistence.dao.EntitlementDAO;
+import org.apache.syncope.core.persistence.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.dao.ResourceDAO;
+import org.apache.syncope.core.propagation.Connector;
 import org.apache.syncope.core.propagation.ConnectorFactory;
 import org.apache.syncope.core.quartz.AbstractTaskJob;
 import org.apache.syncope.core.sync.AbstractSyncActions;
@@ -48,7 +56,7 @@ import org.springframework.security.core
  * @see SyncTask
  * @see PushTask
  */
-public abstract class AbstractSyncJob<H extends AbstractSyncopeResultHandler, A extends AbstractSyncActions<?>>
+public abstract class AbstractSyncJob<T extends AbstractSyncTask, A extends AbstractSyncActions<?>>
         extends AbstractTaskJob {
 
     /**
@@ -70,6 +78,12 @@ public abstract class AbstractSyncJob<H 
     protected EntitlementDAO entitlementDAO;
 
     /**
+     * Policy DAO.
+     */
+    @Autowired
+    protected PolicyDAO policyDAO;
+
+    /**
      * SyncJob actions.
      */
     protected A actions;
@@ -292,14 +306,57 @@ public abstract class AbstractSyncJob<H 
                 new UsernamePasswordAuthenticationToken(userDetails, "FAKE_PASSWORD", authorities));
 
         try {
-            return executeWithSecurityContext(dryRun);
+            final Class<T> clazz = getTaskClassReference();
+            if (!clazz.isAssignableFrom(task.getClass())) {
+                throw new JobExecutionException("Task " + taskId + " isn't a SyncTask");
+            }
+
+            final T syncTask = clazz.cast(this.task);
+
+            final Connector connector;
+            try {
+                connector = connFactory.getConnector(syncTask.getResource());
+            } catch (Exception e) {
+                final String msg = String.
+                        format("Connector instance bean for resource %s and connInstance %s not found",
+                        syncTask.getResource(), syncTask.getResource().getConnector());
+
+                throw new JobExecutionException(msg, e);
+            }
+
+            final UMapping uMapping = syncTask.getResource().getUmapping();
+            if (uMapping != null && uMapping.getAccountIdItem() == null) {
+                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());
+            }
+            if (uMapping == null && rMapping == null) {
+                return "No mapping configured for both users and roles: aborting...";
+            }
+
+            return executeWithSecurityContext(
+                    syncTask,
+                    getSyncPolicySpec(syncTask),
+                    connector,
+                    uMapping,
+                    rMapping,
+                    dryRun);
+
         } finally {
             // POST: clean up the SecurityContextHolder
             SecurityContextHolder.clearContext();
         }
     }
 
-    protected abstract String executeWithSecurityContext(final boolean dryRun) throws JobExecutionException;
+    protected abstract String executeWithSecurityContext(
+            final T task,
+            final SyncPolicySpec syncPolicySpec,
+            final Connector connector,
+            final UMapping uMapping,
+            final RMapping rMapping,
+            final boolean dryRun) throws JobExecutionException;
 
     @Override
     protected boolean hasToBeRegistered(final TaskExec execution) {
@@ -310,4 +367,32 @@ public abstract class AbstractSyncJob<H 
                 && syncTask.getResource().getSyncTraceLevel().ordinal() >= TraceLevel.FAILURES.ordinal())
                 || syncTask.getResource().getSyncTraceLevel().ordinal() >= TraceLevel.SUMMARY.ordinal();
     }
+
+    private SyncPolicySpec getSyncPolicySpec(final AbstractSyncTask syncTask) {
+        SyncPolicySpec syncPolicySpec;
+
+        if (syncTask instanceof SyncTask) {
+            final SyncPolicy syncPolicy = syncTask.getResource().getSyncPolicy() == null
+                    ? policyDAO.getGlobalSyncPolicy()
+                    : syncTask.getResource().getSyncPolicy();
+
+            syncPolicySpec = syncPolicy == null ? null : (SyncPolicySpec) syncPolicy.getSpecification();
+        } else if (syncTask instanceof PushTask) {
+            final PushPolicy pushPolicy = syncTask.getResource().getPushPolicy() == null
+                    ? policyDAO.getGlobalPushPolicy()
+                    : syncTask.getResource().getPushPolicy();
+
+            syncPolicySpec = pushPolicy == null ? null : (SyncPolicySpec) pushPolicy.getSpecification();
+        } else {
+            syncPolicySpec = null;
+        }
+
+        // step required because the call <policy>.getSpecification() could return a null value
+        return syncPolicySpec == null ? new SyncPolicySpec() : syncPolicySpec;
+    }
+
+    @SuppressWarnings("unchecked")
+    private Class<T> getTaskClassReference() {
+        return (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
+    }
 }

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -20,12 +20,20 @@ package org.apache.syncope.core.sync.imp
 
 import java.util.Collection;
 import org.apache.syncope.common.types.ConflictResolutionAction;
+import org.apache.syncope.core.audit.AuditManager;
+import org.apache.syncope.core.connid.ConnObjectUtil;
+import org.apache.syncope.core.notification.NotificationManager;
+import org.apache.syncope.core.persistence.beans.AbstractSyncTask;
 import org.apache.syncope.core.propagation.Connector;
+import org.apache.syncope.core.rest.data.RoleDataBinder;
+import org.apache.syncope.core.rest.data.UserDataBinder;
+import org.apache.syncope.core.sync.AbstractSyncActions;
 import org.apache.syncope.core.sync.SyncResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 
-public abstract class AbstractSyncopeResultHandler {
+public abstract class AbstractSyncopeResultHandler<T extends AbstractSyncTask, A extends AbstractSyncActions<?>> {
 
     /**
      * Logger.
@@ -33,6 +41,36 @@ public abstract class AbstractSyncopeRes
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractSyncopeResultHandler.class);
 
     /**
+     * User data binder.
+     */
+    @Autowired
+    protected UserDataBinder userDataBinder;
+
+    /**
+     * Role data binder.
+     */
+    @Autowired
+    protected RoleDataBinder roleDataBinder;
+
+    /**
+     * ConnectorObject util.
+     */
+    @Autowired
+    protected ConnObjectUtil connObjectUtil;
+
+    /**
+     * Notification Manager.
+     */
+    @Autowired
+    protected NotificationManager notificationManager;
+
+    /**
+     * Audit Manager.
+     */
+    @Autowired
+    protected AuditManager auditManager;
+
+    /**
      * Syncing connector.
      */
     protected Connector connector;
@@ -43,6 +81,26 @@ public abstract class AbstractSyncopeRes
 
     protected ConflictResolutionAction resAct;
 
+    protected A actions;
+
+    protected T syncTask;
+
+    public A getActions() {
+        return actions;
+    }
+
+    public void setActions(A actions) {
+        this.actions = actions;
+    }
+
+    public T getSyncTask() {
+        return syncTask;
+    }
+
+    public void setSyncTask(T syncTask) {
+        this.syncTask = syncTask;
+    }
+
     public Connector getConnector() {
         return connector;
     }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/LDAPMembershipSyncActions.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/LDAPMembershipSyncActions.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/LDAPMembershipSyncActions.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/LDAPMembershipSyncActions.java Fri Jun  6 12:15:34 2014
@@ -121,8 +121,10 @@ public class LDAPMembershipSyncActions e
     @Transactional(readOnly = true)
     @Override
     public <T extends AbstractAttributableTO, K extends AbstractAttributableMod> SyncDelta beforeUpdate(
-            final AbstractSyncopeSyncResultHandler handler, final SyncDelta delta, final T subject, final K subjectMod)
-            throws JobExecutionException {
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final SyncDelta delta,
+            final T subject,
+            final K subjectMod) throws JobExecutionException {
 
         if (subject instanceof RoleTO) {
             // search for all users assigned to given role
@@ -283,7 +285,7 @@ public class LDAPMembershipSyncActions e
      */
     @Override
     public <T extends AbstractAttributableTO> void after(
-            final AbstractSyncopeSyncResultHandler handler,
+            final AbstractSyncopeResultHandler<?, ?> handler,
             final SyncDelta delta,
             final T subject,
             final SyncResult result) throws JobExecutionException {

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -19,19 +19,27 @@
 package org.apache.syncope.core.sync.impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import org.apache.commons.lang.StringUtils;
+import org.apache.syncope.common.types.AttributableType;
+import org.apache.syncope.common.types.SyncPolicySpec;
 import org.apache.syncope.core.persistence.beans.PushTask;
 import org.apache.syncope.core.persistence.beans.role.RMapping;
 import org.apache.syncope.core.persistence.beans.role.SyncopeRole;
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
 import org.apache.syncope.core.persistence.beans.user.UMapping;
+import org.apache.syncope.core.persistence.dao.AttributableSearchDAO;
 import org.apache.syncope.core.persistence.dao.RoleDAO;
 import org.apache.syncope.core.persistence.dao.UserDAO;
+import org.apache.syncope.core.persistence.dao.search.OrderByClause;
 import org.apache.syncope.core.propagation.Connector;
+import org.apache.syncope.core.rest.data.SearchCondConverter;
 import org.apache.syncope.core.sync.PushActions;
 import org.apache.syncope.core.sync.SyncResult;
 import org.apache.syncope.core.util.ApplicationContextProvider;
+import org.apache.syncope.core.util.AttributableUtil;
 import org.apache.syncope.core.util.EntitlementUtil;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,7 +52,7 @@ import org.springframework.beans.factory
  * @see AbstractSyncJob
  * @see PushTask
  */
-public class PushJob extends AbstractSyncJob<AbstractSyncopeResultHandler, PushActions> {
+public class PushJob extends AbstractSyncJob<PushTask, PushActions> {
 
     /**
      * User DAO.
@@ -53,6 +61,12 @@ public class PushJob extends AbstractSyn
     private UserDAO userDAO;
 
     /**
+     * Search DAO.
+     */
+    @Autowired
+    private AttributableSearchDAO searchDAO;
+
+    /**
      * Role DAO.
      */
     @Autowired
@@ -61,42 +75,19 @@ public class PushJob extends AbstractSyn
     private final int PAGE_SIZE = 1000;
 
     @Override
-    protected String executeWithSecurityContext(final boolean dryRun) throws JobExecutionException {
-        if (!(task instanceof PushTask)) {
-            throw new JobExecutionException("Task " + taskId + " isn't a PushTask");
-        }
-
-        final PushTask pushTask = (PushTask) this.task;
-
-        Connector connector;
-        try {
-            connector = connFactory.getConnector(pushTask.getResource());
-        } catch (Exception e) {
-            final String msg = String.format("Connector instance bean for resource %s and connInstance %s not found",
-                    pushTask.getResource(), pushTask.getResource().getConnector());
-
-            throw new JobExecutionException(msg, e);
-        }
-
-        UMapping uMapping = pushTask.getResource().getUmapping();
-        if (uMapping != null && uMapping.getAccountIdItem() == null) {
-            throw new JobExecutionException("Invalid user account id mapping for resource " + pushTask.getResource());
-        }
-        RMapping rMapping = pushTask.getResource().getRmapping();
-        if (rMapping != null && rMapping.getAccountIdItem() == null) {
-            throw new JobExecutionException("Invalid role account id mapping for resource " + pushTask.getResource());
-        }
-        if (uMapping == null && rMapping == null) {
-            return "No mapping configured for both users and roles: aborting...";
-        }
-
+    protected String executeWithSecurityContext(
+            final PushTask pushTask,
+            final SyncPolicySpec syncPolicySpec,
+            final Connector connector,
+            final UMapping uMapping,
+            final RMapping rMapping,
+            final boolean dryRun) throws JobExecutionException {
         LOG.debug("Execute synchronization (push) with resource {}", pushTask.getResource());
 
         final List<SyncResult> results = new ArrayList<SyncResult>();
 
         final Set<Long> authorizations = EntitlementUtil.getRoleIds(entitlementDAO.findAll());
 
-        // Prepare handler for SyncDelta objects
         final SyncopePushResultHandler handler =
                 (SyncopePushResultHandler) ((DefaultListableBeanFactory) ApplicationContextProvider.
                 getApplicationContext().getBeanFactory()).createBean(
@@ -112,7 +103,7 @@ public class PushJob extends AbstractSyn
         if (uMapping != null) {
             final int count = userDAO.count(authorizations);
             for (int page = 1; page <= (count / PAGE_SIZE) + 1; page++) {
-                final List<SyncopeUser> localUsers = userDAO.findAll(authorizations, page, PAGE_SIZE);
+                final List<SyncopeUser> localUsers = getUsers(authorizations, pushTask, page);
 
                 for (SyncopeUser localUser : localUsers) {
                     try {
@@ -129,7 +120,7 @@ public class PushJob extends AbstractSyn
         }
 
         if (rMapping != null) {
-            final List<SyncopeRole> localRoles = roleDAO.findAll();
+            final List<SyncopeRole> localRoles = getRoles(authorizations, pushTask, PAGE_SIZE);
 
             for (SyncopeRole localRole : localRoles) {
                 try {
@@ -156,4 +147,26 @@ public class PushJob extends AbstractSyn
     protected boolean continueOnError() {
         return true;
     }
+
+    private List<SyncopeUser> getUsers(final Set<Long> authorizations, final PushTask pushTask, final int page) {
+        final String filter = pushTask.getUserFilter();
+        if (StringUtils.isBlank(filter)) {
+            return userDAO.findAll(authorizations, page, PAGE_SIZE);
+        } else {
+            return searchDAO.<SyncopeUser>search(
+                    authorizations, SearchCondConverter.convert(filter),
+                    Collections.<OrderByClause>emptyList(), AttributableUtil.getInstance(AttributableType.USER));
+        }
+    }
+
+    private List<SyncopeRole> getRoles(final Set<Long> authorizations, final PushTask pushTask, final int page) {
+        final String filter = pushTask.getRoleFilter();
+        if (StringUtils.isBlank(filter)) {
+            return roleDAO.findAll();
+        } else {
+            return searchDAO.<SyncopeRole>search(
+                    authorizations, SearchCondConverter.convert(filter),
+                    Collections.<OrderByClause>emptyList(), AttributableUtil.getInstance(AttributableType.ROLE));
+        }
+    }
 }

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -24,10 +24,8 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.mod.ReferenceMod;
 import org.apache.syncope.common.mod.RoleMod;
-import org.apache.syncope.common.types.ConflictResolutionAction;
 import org.apache.syncope.common.types.SyncPolicySpec;
 import org.apache.syncope.core.persistence.beans.ExternalResource;
-import org.apache.syncope.core.persistence.beans.SyncPolicy;
 import org.apache.syncope.core.persistence.beans.SyncTask;
 import org.apache.syncope.core.persistence.beans.role.RMapping;
 import org.apache.syncope.core.persistence.beans.user.UMapping;
@@ -51,7 +49,7 @@ import org.springframework.beans.factory
  * @see AbstractSyncJob
  * @see SyncTask
  */
-public class SyncJob extends AbstractSyncJob<AbstractSyncopeSyncResultHandler, SyncActions> {
+public class SyncJob extends AbstractSyncJob<SyncTask, SyncActions> {
 
     /**
      * Role workflow adapter.
@@ -86,43 +84,17 @@ public class SyncJob extends AbstractSyn
     }
 
     @Override
-    protected String executeWithSecurityContext(final boolean dryRun) throws JobExecutionException {
-        if (!(task instanceof SyncTask)) {
-            throw new JobExecutionException("Task " + taskId + " isn't a SyncTask");
-        }
-        final SyncTask syncTask = (SyncTask) this.task;
-
-        Connector connector;
-        try {
-            connector = connFactory.getConnector(syncTask.getResource());
-        } catch (Exception e) {
-            final String msg = String.format("Connector instance bean for resource %s and connInstance %s not found",
-                    syncTask.getResource(), syncTask.getResource().getConnector());
-
-            throw new JobExecutionException(msg, e);
-        }
-
-        UMapping uMapping = syncTask.getResource().getUmapping();
-        if (uMapping != null && uMapping.getAccountIdItem() == null) {
-            throw new JobExecutionException("Invalid user account id mapping for resource " + syncTask.getResource());
-        }
-        RMapping rMapping = syncTask.getResource().getRmapping();
-        if (rMapping != null && rMapping.getAccountIdItem() == null) {
-            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...";
-        }
-
+    protected String executeWithSecurityContext(
+            final SyncTask syncTask,
+            final SyncPolicySpec syncPolicySpec,
+            final Connector connector,
+            final UMapping uMapping,
+            final RMapping rMapping,
+            final boolean dryRun) throws JobExecutionException {
         LOG.debug("Execute synchronization with token {}", syncTask.getResource().getUsyncToken());
 
         final List<SyncResult> results = new ArrayList<SyncResult>();
 
-        final SyncPolicy syncPolicy = syncTask.getResource().getSyncPolicy();
-        final ConflictResolutionAction resAct = syncPolicy == null || syncPolicy.getSpecification() == null
-                ? ConflictResolutionAction.IGNORE
-                : ((SyncPolicySpec) syncPolicy.getSpecification()).getConflictResolutionAction();
-
         // Prepare handler for SyncDelta objects
         final SyncopeSyncResultHandler handler =
                 (SyncopeSyncResultHandler) ((DefaultListableBeanFactory) ApplicationContextProvider.
@@ -131,7 +103,7 @@ public class SyncJob extends AbstractSyn
         handler.setConnector(connector);
         handler.setActions(actions);
         handler.setDryRun(dryRun);
-        handler.setResAct(resAct);
+        handler.setResAct(syncPolicySpec.getConflictResolutionAction());
         handler.setResults(results);
         handler.setSyncTask(syncTask);
 

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -28,9 +28,6 @@ import org.apache.syncope.common.types.A
 import org.apache.syncope.common.types.AuditElements;
 import org.apache.syncope.common.types.AuditElements.Result;
 import org.apache.syncope.common.types.ResourceOperation;
-import org.apache.syncope.core.audit.AuditManager;
-import org.apache.syncope.core.connid.ConnObjectUtil;
-import org.apache.syncope.core.notification.NotificationManager;
 import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractMappingItem;
 import org.apache.syncope.core.persistence.beans.PushTask;
@@ -38,8 +35,6 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
 import org.apache.syncope.core.propagation.TimeoutException;
 import org.apache.syncope.core.propagation.impl.AbstractPropagationTaskExecutor;
-import org.apache.syncope.core.rest.data.RoleDataBinder;
-import org.apache.syncope.core.rest.data.UserDataBinder;
 import org.apache.syncope.core.sync.PushActions;
 import org.apache.syncope.core.sync.SyncResult;
 import org.apache.syncope.core.util.AttributableUtil;
@@ -49,66 +44,12 @@ import org.identityconnectors.framework.
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.Uid;
 import org.quartz.JobExecutionException;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-public class SyncopePushResultHandler extends AbstractSyncopeResultHandler {
-
-    /**
-     * User data binder.
-     */
-    @Autowired
-    protected UserDataBinder userDataBinder;
-
-    /**
-     * Role data binder.
-     */
-    @Autowired
-    protected RoleDataBinder roleDataBinder;
-
-    /**
-     * ConnectorObject util.
-     */
-    @Autowired
-    protected ConnObjectUtil connObjectUtil;
-
-    /**
-     * Notification Manager.
-     */
-    @Autowired
-    protected NotificationManager notificationManager;
-
-    /**
-     * Audit Manager.
-     */
-    @Autowired
-    protected AuditManager auditManager;
+public class SyncopePushResultHandler extends AbstractSyncopeResultHandler<PushTask, PushActions> {
 
     protected Map<Long, String> roleOwnerMap = new HashMap<Long, String>();
 
-    /**
-     * SyncJob actions.
-     */
-    protected PushActions actions;
-
-    protected PushTask syncTask;
-
-    public PushActions getActions() {
-        return actions;
-    }
-
-    public void setActions(final PushActions actions) {
-        this.actions = actions;
-    }
-
-    public PushTask getSyncTask() {
-        return syncTask;
-    }
-
-    public void setSyncTask(final PushTask syncTask) {
-        this.syncTask = syncTask;
-    }
-
     public Map<Long, String> getRoleOwnerMap() {
         return roleOwnerMap;
     }
@@ -187,10 +128,10 @@ public class SyncopePushResultHandler ex
 
             if (beforeObj == null) {
                 result.setOperation(ResourceOperation.CREATE);
-                actions.beforeCreate(this, toBeHandled, values);
+                actions.beforeCreate(this, values, toBeHandled);
             } else {
                 result.setOperation(ResourceOperation.UPDATE);
-                actions.beforeUpdate(this, toBeHandled, values);
+                actions.beforeUpdate(this, values, toBeHandled);
             }
 
             AbstractPropagationTaskExecutor.createOrUpdate(
@@ -216,7 +157,7 @@ public class SyncopePushResultHandler ex
             throw new JobExecutionException(e);
         } finally {
 
-            actions.after(this, toBeHandled, values, result);
+            actions.after(this, values, toBeHandled, result);
 
             notificationManager.createTasks(
                     AuditElements.EventCategoryType.PUSH,

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -42,15 +42,13 @@ import org.apache.syncope.common.types.A
 import org.apache.syncope.common.types.MappingPurpose;
 import org.apache.syncope.common.types.ResourceOperation;
 import org.apache.syncope.common.types.SyncPolicySpec;
-import org.apache.syncope.core.audit.AuditManager;
-import org.apache.syncope.core.connid.ConnObjectUtil;
-import org.apache.syncope.core.notification.NotificationManager;
 import org.apache.syncope.core.persistence.beans.AbstractAttrValue;
 import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractMappingItem;
 import org.apache.syncope.core.persistence.beans.AbstractNormalSchema;
 import org.apache.syncope.core.persistence.beans.PropagationTask;
 import org.apache.syncope.core.persistence.beans.SyncPolicy;
+import org.apache.syncope.core.persistence.beans.SyncTask;
 import org.apache.syncope.core.persistence.beans.role.SyncopeRole;
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
 import org.apache.syncope.core.persistence.dao.AttributableSearchDAO;
@@ -68,8 +66,7 @@ import org.apache.syncope.core.propagati
 import org.apache.syncope.core.propagation.impl.PropagationManager;
 import org.apache.syncope.core.rest.controller.UnauthorizedRoleException;
 import org.apache.syncope.core.rest.data.AttributableTransformer;
-import org.apache.syncope.core.rest.data.RoleDataBinder;
-import org.apache.syncope.core.rest.data.UserDataBinder;
+import org.apache.syncope.core.sync.SyncActions;
 import org.apache.syncope.core.sync.SyncResult;
 import org.apache.syncope.core.sync.SyncCorrelationRule;
 import org.apache.syncope.core.util.AttributableUtil;
@@ -85,11 +82,13 @@ import org.identityconnectors.framework.
 import org.identityconnectors.framework.common.objects.OperationalAttributes;
 import org.identityconnectors.framework.common.objects.SyncDelta;
 import org.identityconnectors.framework.common.objects.SyncDeltaType;
+import org.identityconnectors.framework.common.objects.SyncResultsHandler;
 import org.identityconnectors.framework.common.objects.filter.EqualsFilter;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class SyncopeSyncResultHandler extends AbstractSyncopeSyncResultHandler {
+public class SyncopeSyncResultHandler extends AbstractSyncopeResultHandler<SyncTask, SyncActions>
+        implements SyncResultsHandler {
 
     /**
      * Policy DAO.
@@ -128,12 +127,6 @@ public class SyncopeSyncResultHandler ex
     protected AttributableSearchDAO searchDAO;
 
     /**
-     * ConnectorObject util.
-     */
-    @Autowired
-    protected ConnObjectUtil connObjectUtil;
-
-    /**
      * User workflow adapter.
      */
     @Autowired
@@ -157,30 +150,6 @@ public class SyncopeSyncResultHandler ex
     @Autowired
     protected PropagationTaskExecutor taskExecutor;
 
-    /**
-     * User data binder.
-     */
-    @Autowired
-    protected UserDataBinder userDataBinder;
-
-    /**
-     * Role data binder.
-     */
-    @Autowired
-    protected RoleDataBinder roleDataBinder;
-
-    /**
-     * Notification Manager.
-     */
-    @Autowired
-    protected NotificationManager notificationManager;
-
-    /**
-     * Audit Manager.
-     */
-    @Autowired
-    protected AuditManager auditManager;
-
     @Autowired
     protected AttributableTransformer attrTransformer;
 

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java Fri Jun  6 12:15:34 2014
@@ -31,7 +31,9 @@ import org.apache.syncope.common.types.A
 import org.apache.syncope.common.types.PropagationMode;
 import org.apache.syncope.common.types.ResourceOperation;
 import org.apache.syncope.core.persistence.beans.ExternalResource;
+import org.apache.syncope.core.persistence.beans.NotificationTask;
 import org.apache.syncope.core.persistence.beans.PropagationTask;
+import org.apache.syncope.core.persistence.beans.PushTask;
 import org.apache.syncope.core.persistence.beans.SchedTask;
 import org.apache.syncope.core.persistence.beans.SyncTask;
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
@@ -62,14 +64,11 @@ public class TaskTest extends AbstractDA
 
     @Test
     public void findAll() {
-        List<PropagationTask> plist = taskDAO.findAll(PropagationTask.class);
-        assertEquals(4, plist.size());
-
-        List<SchedTask> sclist = taskDAO.findAll(SchedTask.class);
-        assertEquals(1, sclist.size());
-
-        List<SyncTask> sylist = taskDAO.findAll(SyncTask.class);
-        assertEquals(6, sylist.size());
+        assertEquals(4, taskDAO.findAll(PropagationTask.class).size());
+        assertEquals(1, taskDAO.findAll(NotificationTask.class).size());
+        assertEquals(1, taskDAO.findAll(SchedTask.class).size());
+        assertEquals(6, taskDAO.findAll(SyncTask.class).size());
+        assertEquals(1, taskDAO.findAll(PushTask.class).size());
     }
 
     @Test

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/relationships/TaskTest.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/relationships/TaskTest.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/relationships/TaskTest.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/relationships/TaskTest.java Fri Jun  6 12:15:34 2014
@@ -34,6 +34,7 @@ import org.apache.syncope.common.types.P
 import org.apache.syncope.common.types.ResourceOperation;
 import org.apache.syncope.core.persistence.beans.ExternalResource;
 import org.apache.syncope.core.persistence.beans.PropagationTask;
+import org.apache.syncope.core.persistence.beans.PushTask;
 import org.apache.syncope.core.persistence.beans.SyncTask;
 import org.apache.syncope.core.persistence.beans.TaskExec;
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
@@ -152,6 +153,29 @@ public class TaskTest extends AbstractDA
     }
 
     @Test
+    public void addPushTaskExecution() {
+        PushTask task = taskDAO.find(13L);
+        assertNotNull(task);
+
+        int executionNumber = task.getExecs().size();
+
+        TaskExec execution = new TaskExec();
+        execution.setStatus("Text-free status");
+        execution.setTask(task);
+        task.addExec(execution);
+        execution.setMessage("A message");
+
+        task = taskDAO.save(task);
+
+        taskDAO.flush();
+
+        task = taskDAO.find(13L);
+        assertNotNull(task);
+
+        assertEquals(executionNumber + 1, task.getExecs().size());
+    }
+
+    @Test
     public void deleteTask() {
         taskDAO.delete(1L);
 

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=1600864&r1=1600863&r2=1600864&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  6 12:15:34 2014
@@ -55,6 +55,7 @@ import org.apache.syncope.common.types.T
 import org.apache.syncope.common.types.TraceLevel;
 import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.common.to.PushTaskTO;
+import org.apache.syncope.common.wrap.PushActionClass;
 import org.apache.syncope.core.sync.TestSyncActions;
 import org.apache.syncope.core.sync.TestSyncRule;
 import org.apache.syncope.core.sync.impl.SyncJob;
@@ -102,7 +103,14 @@ public class TaskTestITCase extends Abst
     }
 
     @Test
-    public void create() {
+    public void getPushActionsClasses() {
+        List<PushActionClass> actions = taskService.getPushActionsClasses();
+        assertNotNull(actions);
+        assertFalse(actions.isEmpty());
+    }
+
+    @Test
+    public void createSyncTask() {
         SyncTaskTO task = new SyncTaskTO();
         task.setName("Test create Sync");
         task.setResource(RESOURCE_NAME_WS2);
@@ -132,11 +140,33 @@ public class TaskTestITCase extends Abst
     }
 
     @Test
+    public void createPushTask() {
+        PushTaskTO task = new PushTaskTO();
+        task.setName("Test create Push");
+        task.setResource(RESOURCE_NAME_WS2);
+        task.setUserFilter(
+                SyncopeClient.getUserSearchConditionBuilder().hasNotResources(RESOURCE_NAME_TESTDB2).query());
+        task.setRoleFilter(
+                SyncopeClient.getRoleSearchConditionBuilder().isNotNull("cool").query());
+
+        final Response response = taskService.create(task);
+        final PushTaskTO actual = getObject(response.getLocation(), TaskService.class, PushTaskTO.class);
+        assertNotNull(actual);
+
+        task = taskService.read(actual.getId());
+        assertNotNull(task);
+        assertEquals(task.getId(), actual.getId());
+        assertEquals(task.getJobClassName(), actual.getJobClassName());
+        assertEquals(task.getUserFilter(), actual.getUserFilter());
+        assertEquals(task.getRoleFilter(), actual.getRoleFilter());
+    }
+
+    @Test
     public void update() {
         SchedTaskTO task = taskService.read(SCHED_TASK_ID);
         assertNotNull(task);
 
-        SchedTaskTO taskMod = new SchedTaskTO();
+        final SchedTaskTO taskMod = new SchedTaskTO();
         taskMod.setId(5);
         taskMod.setCronExpression(null);
 
@@ -148,13 +178,35 @@ public class TaskTestITCase extends Abst
     }
 
     @Test
-    public void list() {
-        PagedResult<PropagationTaskTO> tasks = taskService.list(TaskType.PROPAGATION);
+    public void listSchedTask() {
+        final PagedResult<SchedTaskTO> tasks = taskService.list(TaskType.SCHEDULED);
+        assertFalse(tasks.getResult().isEmpty());
+        for (AbstractTaskTO task : tasks.getResult()) {
+            if (!(task instanceof SchedTaskTO) || task instanceof SyncTaskTO || task instanceof PushTaskTO) {
+                fail();
+            }
+        }
+    }
 
-        assertNotNull(tasks);
+    @Test
+    public void listSyncTask() {
+        final PagedResult<SyncTaskTO> tasks = taskService.list(TaskType.SYNCHRONIZATION);
         assertFalse(tasks.getResult().isEmpty());
         for (AbstractTaskTO task : tasks.getResult()) {
-            assertNotNull(task);
+            if (!(task instanceof SyncTaskTO)) {
+                fail();
+            }
+        }
+    }
+
+    @Test
+    public void list() {
+        final PagedResult<PushTaskTO> tasks = taskService.list(TaskType.PUSH);
+        assertFalse(tasks.getResult().isEmpty());
+        for (AbstractTaskTO task : tasks.getResult()) {
+            if (!(task instanceof PushTaskTO)) {
+                fail();
+            }
         }
     }
 
@@ -917,14 +969,39 @@ public class TaskTestITCase extends Abst
         // Read sync task
         PushTaskTO task = taskService.<PushTaskTO>read(13L);
         assertNotNull(task);
+        
+        assertEquals("Vivaldi", userService.read(3L).getAttrMap().get("surname").getValues().get(0));
+        
+        task.setUserFilter(SyncopeClient.getUserSearchConditionBuilder().is("surname").equalTo("Vivaldi").query());
+        taskService.update(13L, task);
+        assertEquals(task.getUserFilter(), taskService.<PushTaskTO>read(13L).getUserFilter());
 
         execSyncTask(task.getId(), 50, false);
 
         final JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
+        assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID<>'vivaldi'").size());
+        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='bellini'").size());
+        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='rossini'").size());
+        assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='puccini'").size());
+        
+        assertEquals("vivaldi",
+                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "vivaldi"));
+        
+        jdbcTemplate.execute("DELETE FROM test2 WHERE ID='vivaldi'");
+
+        task.setUserFilter(null);
+        taskService.update(13L, task);
+        assertNull(taskService.<PushTaskTO>read(13L).getUserFilter());
+
+        execSyncTask(task.getId(), 50, false);
 
-        assertEquals("vivaldi", jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "vivaldi"));
-        assertEquals("bellini", jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "bellini"));
-        assertEquals("rossini", jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "rossini"));
-        assertEquals("puccini", jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "puccini"));
+        assertEquals("vivaldi",
+                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "vivaldi"));
+        assertEquals("bellini",
+                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "bellini"));
+        assertEquals("rossini",
+                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "rossini"));
+        assertEquals("puccini",
+                jdbcTemplate.queryForObject("SELECT ID FROM test2 WHERE ID=?", String.class, "puccini"));
     }
 }

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/TestSyncActions.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/TestSyncActions.java?rev=1600864&r1=1600863&r2=1600864&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/TestSyncActions.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/sync/TestSyncActions.java Fri Jun  6 12:15:34 2014
@@ -22,7 +22,7 @@ import org.apache.syncope.common.mod.Abs
 import org.apache.syncope.common.mod.AttributeMod;
 import org.apache.syncope.common.to.AbstractAttributableTO;
 import org.apache.syncope.common.to.AttributeTO;
-import org.apache.syncope.core.sync.impl.AbstractSyncopeSyncResultHandler;
+import org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler;
 import org.identityconnectors.framework.common.objects.SyncDelta;
 import org.quartz.JobExecutionException;
 
@@ -31,8 +31,10 @@ public class TestSyncActions extends Def
     private int counter = 0;
 
     @Override
-    public <T extends AbstractAttributableTO> SyncDelta beforeCreate(final AbstractSyncopeSyncResultHandler handler,
-            final SyncDelta delta, final T subject) throws JobExecutionException {
+    public <T extends AbstractAttributableTO> SyncDelta beforeCreate(
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final SyncDelta delta,
+            final T subject) throws JobExecutionException {
 
         AttributeTO attrTO = null;
         for (int i = 0; i < subject.getAttrs().size(); i++) {
@@ -53,8 +55,10 @@ public class TestSyncActions extends Def
 
     @Override
     public <T extends AbstractAttributableTO, K extends AbstractAttributableMod> SyncDelta beforeUpdate(
-            final AbstractSyncopeSyncResultHandler handler, final SyncDelta delta, final T subject, final K subjectMod)
-            throws JobExecutionException {
+            final AbstractSyncopeResultHandler<?, ?> handler,
+            final SyncDelta delta,
+            final T subject,
+            final K subjectMod) throws JobExecutionException {
 
         subjectMod.getAttrsToRemove().add("fullname");