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/01/07 15:33:45 UTC

svn commit: r1556227 [1/3] - in /syncope/trunk: common/src/main/java/org/apache/syncope/common/services/ common/src/main/java/org/apache/syncope/common/to/ common/src/main/java/org/apache/syncope/common/types/ common/src/main/java/org/apache/syncope/co...

Author: fmartelli
Date: Tue Jan  7 14:33:44 2014
New Revision: 1556227

URL: http://svn.apache.org/r1556227
Log:
Introduces push task about SYNCOPE-392; currently missing correlation rules management and matching rules management

Added:
    syncope/trunk/common/src/main/java/org/apache/syncope/common/to/AbstractSyncTaskTO.java
      - copied, changed from r1555091, syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java
      - copied, changed from r1555091, syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/PushActionClass.java
      - copied, changed from r1555091, syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/SyncActionClass.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractSyncTask.java
      - copied, changed from r1554763, syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java
      - copied, changed from r1554763, syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/AbstractSyncActions.java
      - copied, changed from r1554763, syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/SyncActions.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java
      - copied, changed from r1554763, 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
      - copied, changed from r1554763, 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
      - copied, changed from r1554763, 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/AbstractSyncopeResultHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncopeSyncResultHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java
      - copied, changed from r1554763, 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
      - copied, changed from r1554763, syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/impl/SyncopeSyncResultHandler.java
Modified:
    syncope/trunk/common/src/main/java/org/apache/syncope/common/services/TaskService.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/types/TaskType.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/util/LoggerEventUtils.java
    syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/EventSelectionPanel.java
    syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/TaskRestClient.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ImplementationClassNamesLoader.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/SyncTask.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/TaskDAOImpl.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/validation/entity/SyncTaskValidator.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AbstractPropagationTaskExecutor.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/quartz/AbstractTaskJob.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/TaskController.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/DefaultSyncActions.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/LDAPMembershipSyncActions.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/SyncopeSyncResultHandler.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/util/MappingUtil.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/util/TaskUtil.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
    syncope/trunk/core/src/test/resources/content.xml

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/services/TaskService.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/services/TaskService.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/services/TaskService.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/services/TaskService.java Tue Jan  7 14:33:44 2014
@@ -46,6 +46,7 @@ import org.apache.syncope.common.to.Abst
 import org.apache.syncope.common.to.SchedTaskTO;
 import org.apache.syncope.common.types.TaskType;
 import org.apache.syncope.common.wrap.JobClass;
+import org.apache.syncope.common.wrap.PushActionClass;
 import org.apache.syncope.common.wrap.SyncActionClass;
 
 /**
@@ -75,6 +76,16 @@ public interface TaskService extends JAX
     List<SyncActionClass> getSyncActionsClasses();
 
     /**
+     * Returns a list of classes to be used as push actions.
+     *
+     * @return list of classes to be used as push actions
+     */
+    @GET
+    @Path("pushActionsClasses")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    List<PushActionClass> getPushActionsClasses();
+
+    /**
      * Returns the task matching the given id.
      *
      * @param taskId id of task to be read

Copied: syncope/trunk/common/src/main/java/org/apache/syncope/common/to/AbstractSyncTaskTO.java (from r1555091, syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/to/AbstractSyncTaskTO.java?p2=syncope/trunk/common/src/main/java/org/apache/syncope/common/to/AbstractSyncTaskTO.java&p1=syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java&r1=1555091&r2=1556227&rev=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/to/AbstractSyncTaskTO.java Tue Jan  7 14:33:44 2014
@@ -18,21 +18,12 @@
  */
 package org.apache.syncope.common.to;
 
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(name = "syncTask")
-@XmlType
-public class SyncTaskTO extends SchedTaskTO {
+public class AbstractSyncTaskTO extends SchedTaskTO {
 
     private static final long serialVersionUID = -2143537546915809016L;
 
     private String resource;
 
-    private UserTO userTemplate;
-
-    private RoleTO roleTemplate;
-
     private boolean performCreate;
 
     private boolean performUpdate;
@@ -41,26 +32,8 @@ public class SyncTaskTO extends SchedTas
 
     private boolean syncStatus;
 
-    private boolean fullReconciliation;
-
     private String actionsClassName;
 
-    public UserTO getUserTemplate() {
-        return userTemplate;
-    }
-
-    public void setUserTemplate(UserTO userTemplate) {
-        this.userTemplate = userTemplate;
-    }
-
-    public RoleTO getRoleTemplate() {
-        return roleTemplate;
-    }
-
-    public void setRoleTemplate(RoleTO roleTemplate) {
-        this.roleTemplate = roleTemplate;
-    }
-
     public String getResource() {
         return resource;
     }
@@ -101,14 +74,6 @@ public class SyncTaskTO extends SchedTas
         this.syncStatus = syncStatus;
     }
 
-    public boolean isFullReconciliation() {
-        return fullReconciliation;
-    }
-
-    public void setFullReconciliation(boolean fullReconciliation) {
-        this.fullReconciliation = fullReconciliation;
-    }
-
     public String getActionsClassName() {
         return actionsClassName;
     }

Copied: syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java (from r1555091, syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java?p2=syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java&p1=syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java&r1=1555091&r2=1556227&rev=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/to/PushTaskTO.java Tue Jan  7 14:33:44 2014
@@ -21,99 +21,10 @@ package org.apache.syncope.common.to;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "syncTask")
+@XmlRootElement(name = "pushTask")
 @XmlType
-public class SyncTaskTO extends SchedTaskTO {
+public class PushTaskTO extends AbstractSyncTaskTO {
 
-    private static final long serialVersionUID = -2143537546915809016L;
+    private static final long serialVersionUID = -2143537546915809018L;
 
-    private String resource;
-
-    private UserTO userTemplate;
-
-    private RoleTO roleTemplate;
-
-    private boolean performCreate;
-
-    private boolean performUpdate;
-
-    private boolean performDelete;
-
-    private boolean syncStatus;
-
-    private boolean fullReconciliation;
-
-    private String actionsClassName;
-
-    public UserTO getUserTemplate() {
-        return userTemplate;
-    }
-
-    public void setUserTemplate(UserTO userTemplate) {
-        this.userTemplate = userTemplate;
-    }
-
-    public RoleTO getRoleTemplate() {
-        return roleTemplate;
-    }
-
-    public void setRoleTemplate(RoleTO roleTemplate) {
-        this.roleTemplate = roleTemplate;
-    }
-
-    public String getResource() {
-        return resource;
-    }
-
-    public void setResource(String resource) {
-        this.resource = resource;
-    }
-
-    public boolean isPerformCreate() {
-        return performCreate;
-    }
-
-    public void setPerformCreate(boolean performCreate) {
-        this.performCreate = performCreate;
-    }
-
-    public boolean isPerformUpdate() {
-        return performUpdate;
-    }
-
-    public void setPerformUpdate(boolean performUpdate) {
-        this.performUpdate = performUpdate;
-    }
-
-    public boolean isPerformDelete() {
-        return performDelete;
-    }
-
-    public void setPerformDelete(boolean performDelete) {
-        this.performDelete = performDelete;
-    }
-
-    public boolean isSyncStatus() {
-        return syncStatus;
-    }
-
-    public void setSyncStatus(boolean syncStatus) {
-        this.syncStatus = syncStatus;
-    }
-
-    public boolean isFullReconciliation() {
-        return fullReconciliation;
-    }
-
-    public void setFullReconciliation(boolean fullReconciliation) {
-        this.fullReconciliation = fullReconciliation;
-    }
-
-    public String getActionsClassName() {
-        return actionsClassName;
-    }
-
-    public void setActionsClassName(String actionsClassName) {
-        this.actionsClassName = actionsClassName;
-    }
 }

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/to/SyncTaskTO.java Tue Jan  7 14:33:44 2014
@@ -23,28 +23,16 @@ import javax.xml.bind.annotation.XmlType
 
 @XmlRootElement(name = "syncTask")
 @XmlType
-public class SyncTaskTO extends SchedTaskTO {
+public class SyncTaskTO extends AbstractSyncTaskTO {
 
-    private static final long serialVersionUID = -2143537546915809016L;
-
-    private String resource;
+    private static final long serialVersionUID = -2143537546915809017L;
 
     private UserTO userTemplate;
 
     private RoleTO roleTemplate;
 
-    private boolean performCreate;
-
-    private boolean performUpdate;
-
-    private boolean performDelete;
-
-    private boolean syncStatus;
-
     private boolean fullReconciliation;
 
-    private String actionsClassName;
-
     public UserTO getUserTemplate() {
         return userTemplate;
     }
@@ -61,46 +49,6 @@ public class SyncTaskTO extends SchedTas
         this.roleTemplate = roleTemplate;
     }
 
-    public String getResource() {
-        return resource;
-    }
-
-    public void setResource(String resource) {
-        this.resource = resource;
-    }
-
-    public boolean isPerformCreate() {
-        return performCreate;
-    }
-
-    public void setPerformCreate(boolean performCreate) {
-        this.performCreate = performCreate;
-    }
-
-    public boolean isPerformUpdate() {
-        return performUpdate;
-    }
-
-    public void setPerformUpdate(boolean performUpdate) {
-        this.performUpdate = performUpdate;
-    }
-
-    public boolean isPerformDelete() {
-        return performDelete;
-    }
-
-    public void setPerformDelete(boolean performDelete) {
-        this.performDelete = performDelete;
-    }
-
-    public boolean isSyncStatus() {
-        return syncStatus;
-    }
-
-    public void setSyncStatus(boolean syncStatus) {
-        this.syncStatus = syncStatus;
-    }
-
     public boolean isFullReconciliation() {
         return fullReconciliation;
     }
@@ -108,12 +56,4 @@ public class SyncTaskTO extends SchedTas
     public void setFullReconciliation(boolean fullReconciliation) {
         this.fullReconciliation = fullReconciliation;
     }
-
-    public String getActionsClassName() {
-        return actionsClassName;
-    }
-
-    public void setActionsClassName(String actionsClassName) {
-        this.actionsClassName = actionsClassName;
-    }
 }

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java Tue Jan  7 14:33:44 2014
@@ -36,6 +36,7 @@ public final class AuditElements impleme
         TASK(StringUtils.EMPTY),
         PROPAGATION("PropagationTask"),
         SYNCHRONIZATION("SyncTask"),
+        PUSH("PushTask"),
         CUSTOM(StringUtils.EMPTY);
 
         private final String value;

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/TaskType.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/types/TaskType.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/types/TaskType.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/types/TaskType.java Tue Jan  7 14:33:44 2014
@@ -26,7 +26,8 @@ public enum TaskType {
     PROPAGATION("propagation"),
     NOTIFICATION("notification"),
     SCHEDULED("sched"),
-    SYNCHRONIZATION("sync");
+    SYNCHRONIZATION("sync"),
+    PUSH("push");
 
     private String name;
 
@@ -47,6 +48,7 @@ public enum TaskType {
                 }
             }
         }
-        return TaskType.valueOf(name.toUpperCase());
+
+        return null;
     }
 }

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/util/LoggerEventUtils.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/util/LoggerEventUtils.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/util/LoggerEventUtils.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/util/LoggerEventUtils.java Tue Jan  7 14:33:44 2014
@@ -47,6 +47,8 @@ public class LoggerEventUtils {
                     type = EventCategoryType.PROPAGATION;
                 } else if (EventCategoryType.SYNCHRONIZATION.toString().equals(elements[0])) {
                     type = EventCategoryType.SYNCHRONIZATION;
+                } else if (EventCategoryType.PUSH.toString().equals(elements[0])) {
+                    type = EventCategoryType.PUSH;
                 } else {
                     try {
                         type = EventCategoryType.valueOf(elements[0]);

Copied: syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/PushActionClass.java (from r1555091, syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/SyncActionClass.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/PushActionClass.java?p2=syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/PushActionClass.java&p1=syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/SyncActionClass.java&r1=1555091&r2=1556227&rev=1556227&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/SyncActionClass.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/wrap/PushActionClass.java Tue Jan  7 14:33:44 2014
@@ -21,10 +21,10 @@ package org.apache.syncope.common.wrap;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-@XmlRootElement(name = "syncActionClass")
+@XmlRootElement(name = "pushActionClass")
 @XmlType
-public class SyncActionClass extends AbstractWrappable<String> {
+public class PushActionClass extends AbstractWrappable<String> {
 
-    private static final long serialVersionUID = 1669581609310071905L;
+    private static final long serialVersionUID = 1669581609310071906L;
 
 }

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/EventSelectionPanel.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/EventSelectionPanel.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/EventSelectionPanel.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/EventSelectionPanel.java Tue Jan  7 14:33:44 2014
@@ -214,7 +214,8 @@ public abstract class EventSelectionPane
 
         if (res.isEmpty()) {
             if ((AuditElements.EventCategoryType.PROPAGATION == eventCategoryTO.getType()
-                    || AuditElements.EventCategoryType.SYNCHRONIZATION == eventCategoryTO.getType())
+                    || AuditElements.EventCategoryType.SYNCHRONIZATION == eventCategoryTO.getType()
+                    || AuditElements.EventCategoryType.PUSH == eventCategoryTO.getType())
                     && StringUtils.isEmpty(eventCategoryTO.getCategory())) {
                 res.add(eventCategoryTO.getType().toString());
             } else if (AuditElements.EventCategoryType.TASK == eventCategoryTO.getType()

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/TaskRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/TaskRestClient.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/TaskRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/TaskRestClient.java Tue Jan  7 14:33:44 2014
@@ -33,6 +33,7 @@ import org.apache.syncope.common.to.Abst
 import org.apache.syncope.common.types.TaskType;
 import org.apache.syncope.common.util.CollectionWrapper;
 import org.apache.syncope.common.SyncopeClientException;
+import org.apache.syncope.common.to.PushTaskTO;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.springframework.stereotype.Component;
 
@@ -99,6 +100,8 @@ public class TaskRestClient extends Base
             result = TaskType.SCHEDULED;
         } else if (SyncTaskTO.class.equals(reference)) {
             result = TaskType.SYNCHRONIZATION;
+        } else if (PushTaskTO.class.equals(reference)) {
+            result = TaskType.PUSH;
         }
         return result;
     }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ImplementationClassNamesLoader.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ImplementationClassNamesLoader.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ImplementationClassNamesLoader.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ImplementationClassNamesLoader.java Tue Jan  7 14:33:44 2014
@@ -29,8 +29,10 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.propagation.PropagationActions;
 import org.apache.syncope.core.quartz.TaskJob;
 import org.apache.syncope.core.report.Reportlet;
+import org.apache.syncope.core.sync.PushActions;
 import org.apache.syncope.core.sync.SyncActions;
 import org.apache.syncope.core.sync.SyncCorrelationRule;
+import org.apache.syncope.core.sync.impl.PushJob;
 import org.apache.syncope.core.sync.impl.SyncJob;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -53,7 +55,9 @@ public class ImplementationClassNamesLoa
         REPORTLET,
         TASKJOB,
         SYNC_ACTIONS,
+        PUSH_ACTIONS,
         SYNC_CORRELATION_RULES,
+        PUSH_CORRELATION_RULES,
         PROPAGATION_ACTIONS,
         VALIDATOR
 
@@ -90,7 +94,9 @@ public class ImplementationClassNamesLoa
                     }
 
                     if ((interfaces.contains(TaskJob.class))
-                            && !metadata.isAbstract() && !SyncJob.class.getName().equals(metadata.getClassName())) {
+                            && !metadata.isAbstract()
+                            && !SyncJob.class.getName().equals(metadata.getClassName())
+                            && !PushJob.class.getName().equals(metadata.getClassName())) {
 
                         classNames.get(Type.TASKJOB).add(metadata.getClassName());
                     }
@@ -99,10 +105,16 @@ public class ImplementationClassNamesLoa
                         classNames.get(Type.SYNC_ACTIONS).add(metadata.getClassName());
                     }
 
+                    if (interfaces.contains(PushActions.class) && !metadata.isAbstract()) {
+                        classNames.get(Type.PUSH_ACTIONS).add(metadata.getClassName());
+                    }
+
                     if (interfaces.contains(SyncCorrelationRule.class) && !metadata.isAbstract()) {
                         classNames.get(Type.SYNC_CORRELATION_RULES).add(metadata.getClassName());
                     }
 
+                    // TODO: add push correlation rules management
+
                     if (interfaces.contains(PropagationActions.class) && !metadata.isAbstract()) {
                         classNames.get(Type.PROPAGATION_ACTIONS).add(metadata.getClassName());
                     }

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=1556227&r1=1556226&r2=1556227&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 Tue Jan  7 14:33:44 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.PushTask;
 import org.apache.syncope.core.persistence.beans.Report;
 import org.apache.syncope.core.persistence.beans.SchedTask;
 import org.apache.syncope.core.persistence.beans.SyncTask;
@@ -35,8 +36,11 @@ 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.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.util.ApplicationContextProvider;
 import org.quartz.Job;
@@ -179,6 +183,21 @@ public class JobInstanceLoader {
                     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)) {
+                try {
+                    syncActionsClass = Class.forName(jobActionsClassName);
+                } catch (Exception e) {
+                    LOG.error("Class {} not found, reverting to {}", jobActionsClassName,
+                            syncActionsClass.getName(), e);
+                }
+            }
+            PushActions pushActions = (PushActions) ApplicationContextProvider.getBeanFactory().
+                    createBean(syncActionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
+
+            ((PushJob) jobInstance).setActions(pushActions);
         }
 
         registerJob(getJobName(task), jobInstance, cronExpression);
@@ -240,6 +259,7 @@ public class JobInstanceLoader {
         // 1. jobs for SchedTasks
         Set<SchedTask> tasks = new HashSet<SchedTask>(taskDAO.findAll(SchedTask.class));
         tasks.addAll(taskDAO.findAll(SyncTask.class));
+        tasks.addAll(taskDAO.findAll(PushTask.class));
         for (SchedTask task : tasks) {
             try {
                 registerJob(task, task.getJobClassName(), task.getCronExpression());

Copied: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractSyncTask.java (from r1554763, syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractSyncTask.java?p2=syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractSyncTask.java&p1=syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java&r1=1554763&r2=1556227&rev=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractSyncTask.java Tue Jan  7 14:33:44 2014
@@ -19,19 +19,15 @@
 package org.apache.syncope.core.persistence.beans;
 
 import javax.persistence.Basic;
-import javax.persistence.Entity;
-import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
-import org.apache.syncope.common.to.RoleTO;
-import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.core.persistence.validation.entity.SyncTaskCheck;
-import org.apache.syncope.core.util.XMLSerializer;
 
-@Entity
+@MappedSuperclass
 @SyncTaskCheck
-public class SyncTask extends SchedTask {
+public abstract class AbstractSyncTask extends SchedTask {
 
     private static final long serialVersionUID = -4141057723006682562L;
 
@@ -41,12 +37,6 @@ public class SyncTask extends SchedTask 
     @ManyToOne
     private ExternalResource resource;
 
-    @Lob
-    private String userTemplate;
-
-    @Lob
-    private String roleTemplate;
-
     @Basic
     @Min(0)
     @Max(1)
@@ -67,20 +57,11 @@ public class SyncTask extends SchedTask 
     @Max(1)
     private Integer syncStatus;
 
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer fullReconciliation;
-
     private String actionsClassName;
 
-    /**
-     * Default constructor.
-     */
-    public SyncTask() {
+    public AbstractSyncTask(final String jobClassName) {
         super();
-
-        super.setJobClassName("org.apache.syncope.core.sync.impl.SyncJob");
+        super.setJobClassName(jobClassName);
     }
 
     @Override
@@ -96,26 +77,6 @@ public class SyncTask extends SchedTask 
         this.resource = resource;
     }
 
-    public UserTO getUserTemplate() {
-        return userTemplate == null
-                ? new UserTO()
-                : XMLSerializer.<UserTO>deserialize(userTemplate);
-    }
-
-    public void setUserTemplate(final UserTO userTemplate) {
-        this.userTemplate = XMLSerializer.serialize(userTemplate);
-    }
-
-    public RoleTO getRoleTemplate() {
-        return userTemplate == null
-                ? new RoleTO()
-                : XMLSerializer.<RoleTO>deserialize(roleTemplate);
-    }
-
-    public void setRoleTemplate(final RoleTO roleTemplate) {
-        this.roleTemplate = XMLSerializer.serialize(roleTemplate);
-    }
-
     public boolean isPerformCreate() {
         return isBooleanAsInteger(performCreate);
     }
@@ -148,19 +109,11 @@ public class SyncTask extends SchedTask 
         this.syncStatus = getBooleanAsInteger(syncStatus);
     }
 
-    public boolean isFullReconciliation() {
-        return isBooleanAsInteger(fullReconciliation);
-    }
-
-    public void setFullReconciliation(final boolean fullReconciliation) {
-        this.fullReconciliation = getBooleanAsInteger(fullReconciliation);
-    }
-
     public String getActionsClassName() {
         return actionsClassName;
     }
 
-    public void setActionsClassName(String actionsClassName) {
+    public void setActionsClassName(final String actionsClassName) {
         this.actionsClassName = actionsClassName;
     }
 }

Copied: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java (from r1554763, syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java?p2=syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java&p1=syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java&r1=1554763&r2=1556227&rev=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/PushTask.java Tue Jan  7 14:33:44 2014
@@ -18,149 +18,17 @@
  */
 package org.apache.syncope.core.persistence.beans;
 
-import javax.persistence.Basic;
 import javax.persistence.Entity;
-import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import org.apache.syncope.common.to.RoleTO;
-import org.apache.syncope.common.to.UserTO;
-import org.apache.syncope.core.persistence.validation.entity.SyncTaskCheck;
-import org.apache.syncope.core.util.XMLSerializer;
 
 @Entity
-@SyncTaskCheck
-public class SyncTask extends SchedTask {
+public class PushTask extends AbstractSyncTask {
 
-    private static final long serialVersionUID = -4141057723006682562L;
-
-    /**
-     * ExternalResource to which the sync happens.
-     */
-    @ManyToOne
-    private ExternalResource resource;
-
-    @Lob
-    private String userTemplate;
-
-    @Lob
-    private String roleTemplate;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer performCreate;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer performUpdate;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer performDelete;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer syncStatus;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer fullReconciliation;
-
-    private String actionsClassName;
+    private static final long serialVersionUID = -4141057723006682564L;
 
     /**
      * Default constructor.
      */
-    public SyncTask() {
-        super();
-
-        super.setJobClassName("org.apache.syncope.core.sync.impl.SyncJob");
-    }
-
-    @Override
-    public void setJobClassName(final String jobClassName) {
-        // fixed to SyncJob, cannot be changed
-    }
-
-    public ExternalResource getResource() {
-        return resource;
-    }
-
-    public void setResource(ExternalResource resource) {
-        this.resource = resource;
-    }
-
-    public UserTO getUserTemplate() {
-        return userTemplate == null
-                ? new UserTO()
-                : XMLSerializer.<UserTO>deserialize(userTemplate);
-    }
-
-    public void setUserTemplate(final UserTO userTemplate) {
-        this.userTemplate = XMLSerializer.serialize(userTemplate);
-    }
-
-    public RoleTO getRoleTemplate() {
-        return userTemplate == null
-                ? new RoleTO()
-                : XMLSerializer.<RoleTO>deserialize(roleTemplate);
-    }
-
-    public void setRoleTemplate(final RoleTO roleTemplate) {
-        this.roleTemplate = XMLSerializer.serialize(roleTemplate);
-    }
-
-    public boolean isPerformCreate() {
-        return isBooleanAsInteger(performCreate);
-    }
-
-    public void setPerformCreate(final boolean performCreate) {
-        this.performCreate = getBooleanAsInteger(performCreate);
-    }
-
-    public boolean isPerformUpdate() {
-        return isBooleanAsInteger(performUpdate);
-    }
-
-    public void setPerformUpdate(final boolean performUpdate) {
-        this.performUpdate = getBooleanAsInteger(performUpdate);
-    }
-
-    public boolean isPerformDelete() {
-        return isBooleanAsInteger(performDelete);
-    }
-
-    public void setPerformDelete(boolean performDelete) {
-        this.performDelete = getBooleanAsInteger(performDelete);
-    }
-
-    public boolean isSyncStatus() {
-        return isBooleanAsInteger(syncStatus);
-    }
-
-    public void setSyncStatus(final boolean syncStatus) {
-        this.syncStatus = getBooleanAsInteger(syncStatus);
-    }
-
-    public boolean isFullReconciliation() {
-        return isBooleanAsInteger(fullReconciliation);
-    }
-
-    public void setFullReconciliation(final boolean fullReconciliation) {
-        this.fullReconciliation = getBooleanAsInteger(fullReconciliation);
-    }
-
-    public String getActionsClassName() {
-        return actionsClassName;
-    }
-
-    public void setActionsClassName(String actionsClassName) {
-        this.actionsClassName = actionsClassName;
+    public PushTask() {
+        super("org.apache.syncope.core.sync.impl.PushJob");
     }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/SyncTask.java Tue Jan  7 14:33:44 2014
@@ -21,25 +21,16 @@ package org.apache.syncope.core.persiste
 import javax.persistence.Basic;
 import javax.persistence.Entity;
 import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import org.apache.syncope.common.to.RoleTO;
 import org.apache.syncope.common.to.UserTO;
-import org.apache.syncope.core.persistence.validation.entity.SyncTaskCheck;
 import org.apache.syncope.core.util.XMLSerializer;
 
 @Entity
-@SyncTaskCheck
-public class SyncTask extends SchedTask {
+public class SyncTask extends AbstractSyncTask {
 
-    private static final long serialVersionUID = -4141057723006682562L;
-
-    /**
-     * ExternalResource to which the sync happens.
-     */
-    @ManyToOne
-    private ExternalResource resource;
+    private static final long serialVersionUID = -4141057723006682563L;
 
     @Lob
     private String userTemplate;
@@ -50,50 +41,13 @@ public class SyncTask extends SchedTask 
     @Basic
     @Min(0)
     @Max(1)
-    private Integer performCreate;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer performUpdate;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer performDelete;
-
-    @Basic
-    @Min(0)
-    @Max(1)
-    private Integer syncStatus;
-
-    @Basic
-    @Min(0)
-    @Max(1)
     private Integer fullReconciliation;
 
-    private String actionsClassName;
-
     /**
      * Default constructor.
      */
     public SyncTask() {
-        super();
-
-        super.setJobClassName("org.apache.syncope.core.sync.impl.SyncJob");
-    }
-
-    @Override
-    public void setJobClassName(final String jobClassName) {
-        // fixed to SyncJob, cannot be changed
-    }
-
-    public ExternalResource getResource() {
-        return resource;
-    }
-
-    public void setResource(ExternalResource resource) {
-        this.resource = resource;
+        super("org.apache.syncope.core.sync.impl.SyncJob");
     }
 
     public UserTO getUserTemplate() {
@@ -116,38 +70,6 @@ public class SyncTask extends SchedTask 
         this.roleTemplate = XMLSerializer.serialize(roleTemplate);
     }
 
-    public boolean isPerformCreate() {
-        return isBooleanAsInteger(performCreate);
-    }
-
-    public void setPerformCreate(final boolean performCreate) {
-        this.performCreate = getBooleanAsInteger(performCreate);
-    }
-
-    public boolean isPerformUpdate() {
-        return isBooleanAsInteger(performUpdate);
-    }
-
-    public void setPerformUpdate(final boolean performUpdate) {
-        this.performUpdate = getBooleanAsInteger(performUpdate);
-    }
-
-    public boolean isPerformDelete() {
-        return isBooleanAsInteger(performDelete);
-    }
-
-    public void setPerformDelete(boolean performDelete) {
-        this.performDelete = getBooleanAsInteger(performDelete);
-    }
-
-    public boolean isSyncStatus() {
-        return isBooleanAsInteger(syncStatus);
-    }
-
-    public void setSyncStatus(final boolean syncStatus) {
-        this.syncStatus = getBooleanAsInteger(syncStatus);
-    }
-
     public boolean isFullReconciliation() {
         return isBooleanAsInteger(fullReconciliation);
     }
@@ -155,12 +77,4 @@ public class SyncTask extends SchedTask 
     public void setFullReconciliation(final boolean fullReconciliation) {
         this.fullReconciliation = getBooleanAsInteger(fullReconciliation);
     }
-
-    public String getActionsClassName() {
-        return actionsClassName;
-    }
-
-    public void setActionsClassName(String actionsClassName) {
-        this.actionsClassName = actionsClassName;
-    }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/TaskDAOImpl.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/TaskDAOImpl.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/TaskDAOImpl.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/TaskDAOImpl.java Tue Jan  7 14:33:44 2014
@@ -25,6 +25,7 @@ import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.core.persistence.beans.ExternalResource;
 import org.apache.syncope.core.persistence.beans.NotificationTask;
+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;
@@ -47,7 +48,10 @@ public class TaskDAOImpl extends Abstrac
         StringBuilder queryString = new StringBuilder("SELECT e FROM ").append(reference.getSimpleName()).append(" e ");
         if (SchedTask.class.equals(reference)) {
             queryString.append("WHERE e.id NOT IN (SELECT e.id FROM ").
-                    append(SyncTask.class.getSimpleName()).append(" e) ");
+                    append(SyncTask.class.getSimpleName()).
+                    append(" e) AND e.id NOT IN (SELECT e.id FROM ").
+                    append(PushTask.class.getSimpleName()).
+                    append(" e)");
         }
 
         return queryString;

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/validation/entity/SyncTaskValidator.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/validation/entity/SyncTaskValidator.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/validation/entity/SyncTaskValidator.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/validation/entity/SyncTaskValidator.java Tue Jan  7 14:33:44 2014
@@ -22,10 +22,10 @@ import javax.validation.ConstraintValida
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.types.EntityViolationType;
-import org.apache.syncope.core.persistence.beans.SyncTask;
+import org.apache.syncope.core.persistence.beans.AbstractSyncTask;
 import org.apache.syncope.core.sync.SyncActions;
 
-public class SyncTaskValidator extends AbstractValidator<SyncTaskCheck, SyncTask> {
+public class SyncTaskValidator extends AbstractValidator<SyncTaskCheck, AbstractSyncTask> {
 
     private final SchedTaskValidator schedV;
 
@@ -36,7 +36,7 @@ public class SyncTaskValidator extends A
     }
 
     @Override
-    public boolean isValid(final SyncTask object, final ConstraintValidatorContext context) {
+    public boolean isValid(final AbstractSyncTask object, final ConstraintValidatorContext context) {
         boolean isValid = schedV.isValid(object, context);
 
         if (isValid) {

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=1556227&r1=1556226&r2=1556227&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 Tue Jan  7 14:33:44 2014
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.propagation.impl;
 
 import java.util.ArrayList;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -138,15 +137,23 @@ public abstract class AbstractPropagatio
         return result;
     }
 
-    protected void createOrUpdate(final PropagationTask task, final ConnectorObject beforeObj,
-            final Connector connector, final Set<String> propagationAttempted) {
+    public static void createOrUpdate(
+            final ObjectClass oclass,
+            final String accountId,
+            final Set<Attribute> attrs,
+            final String resource,
+            final PropagationMode propagationMode,
+            final ConnectorObject beforeObj,
+            final Connector connector,
+            final Set<String> propagationAttempted,
+            final ConnObjectUtil connObjectUtil) {
 
         // set of attributes to be propagated
-        final Set<Attribute> attributes = new HashSet<Attribute>(task.getAttributes());
+        final Set<Attribute> attributes = new HashSet<Attribute>(attrs);
 
         // check if there is any missing or null / empty mandatory attribute
         List<Object> mandatoryAttrNames = new ArrayList<Object>();
-        Attribute mandatoryMissing = AttributeUtil.find(MANDATORY_MISSING_ATTR_NAME, task.getAttributes());
+        Attribute mandatoryMissing = AttributeUtil.find(MANDATORY_MISSING_ATTR_NAME, attrs);
         if (mandatoryMissing != null) {
             attributes.remove(mandatoryMissing);
 
@@ -154,7 +161,7 @@ public abstract class AbstractPropagatio
                 mandatoryAttrNames.addAll(mandatoryMissing.getValue());
             }
         }
-        Attribute mandatoryNullOrEmpty = AttributeUtil.find(MANDATORY_NULL_OR_EMPTY_ATTR_NAME, task.getAttributes());
+        Attribute mandatoryNullOrEmpty = AttributeUtil.find(MANDATORY_NULL_OR_EMPTY_ATTR_NAME, attrs);
         if (mandatoryNullOrEmpty != null) {
             attributes.remove(mandatoryNullOrEmpty);
 
@@ -166,30 +173,26 @@ public abstract class AbstractPropagatio
         }
 
         if (beforeObj == null) {
-            // 1. get accountId
-            final String accountId = task.getAccountId();
-
-            // 2. get name
+            // 1. get name
             final Name name = (Name) AttributeUtil.find(Name.NAME, attributes);
 
-            // 3. check if:
+            // 2. check if:
             //      * accountId is not blank;
             //      * accountId is not equal to Name.
             if (StringUtils.isNotBlank(accountId) && (name == null || !accountId.equals(name.getNameValue()))) {
-                // 3.a retrieve uid
+                // 2.a retrieve uid
                 final Uid uid = (Uid) AttributeUtil.find(Uid.NAME, attributes);
 
-                // 3.b add Uid if not provided
+                // 2.b add Uid if not provided
                 if (uid == null) {
                     attributes.add(AttributeBuilder.build(Uid.NAME, Collections.singleton(accountId)));
                 }
             }
 
-            // 4. provision entry
-            LOG.debug("Create {} on {}", attributes, task.getResource().getName());
+            // 3. provision entry
+            LOG.debug("Create {} on {}", attributes, resource);
 
-            connector.create(task.getPropagationMode(), new ObjectClass(task.getObjectClassName()),
-                    attributes, null, propagationAttempted);
+            connector.create(propagationMode, oclass, attributes, null, propagationAttempted);
         } else {
             // 1. check if rename is really required
             final Name newName = (Name) AttributeUtil.find(Name.NAME, attributes);
@@ -230,14 +233,32 @@ public abstract class AbstractPropagatio
                 }
 
                 // 3. provision entry
-                LOG.debug("Update {} on {}", strictlyModified, task.getResource().getName());
+                LOG.debug("Update {} on {}", strictlyModified, resource);
 
-                connector.update(task.getPropagationMode(), beforeObj.getObjectClass(),
+                connector.update(propagationMode, beforeObj.getObjectClass(),
                         beforeObj.getUid(), strictlyModified, null, propagationAttempted);
             }
         }
     }
 
+    protected void createOrUpdate(
+            final PropagationTask task,
+            final ConnectorObject beforeObj,
+            final Connector connector,
+            final Set<String> propagationAttempted) {
+
+        createOrUpdate(
+                new ObjectClass(task.getObjectClassName()),
+                task.getAccountId(),
+                task.getAttributes(),
+                task.getResource().getName(),
+                task.getResource().getPropagationMode(),
+                beforeObj,
+                connector,
+                propagationAttempted,
+                connObjectUtil);
+    }
+
     protected AbstractAttributable getSubject(final PropagationTask task) {
         AbstractAttributable subject = null;
 
@@ -510,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/PropagationManager.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java Tue Jan  7 14:33:44 2014
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.propagation.impl;
 
-import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -31,11 +30,9 @@ import org.apache.syncope.common.mod.Att
 import org.apache.syncope.common.mod.UserMod;
 import org.apache.syncope.common.to.AttributeTO;
 import org.apache.syncope.common.types.AttributableType;
-import org.apache.syncope.common.types.IntMappingType;
 import org.apache.syncope.common.types.MappingPurpose;
 import org.apache.syncope.common.types.ResourceOperation;
 import org.apache.syncope.core.connid.ConnObjectUtil;
-import org.apache.syncope.core.connid.PasswordGenerator;
 import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractMappingItem;
 import org.apache.syncope.core.persistence.beans.AbstractVirAttr;
@@ -54,12 +51,10 @@ import org.apache.syncope.core.rest.data
 import org.apache.syncope.core.util.AttributableUtil;
 import org.apache.syncope.core.util.JexlUtil;
 import org.apache.syncope.core.util.MappingUtil;
-import org.apache.syncope.core.util.VirAttrCache;
 import org.apache.syncope.core.workflow.WorkflowResult;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeBuilder;
 import org.identityconnectors.framework.common.objects.AttributeUtil;
-import org.identityconnectors.framework.common.objects.OperationalAttributes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -100,15 +95,6 @@ public class PropagationManager {
     @Autowired
     private ConnObjectUtil connObjectUtil;
 
-    @Autowired
-    private PasswordGenerator passwordGenerator;
-
-    /**
-     * Virtual attribute cache.
-     */
-    @Autowired
-    private VirAttrCache virAttrCache;
-
     /**
      * Create the user on every associated resource.
      *
@@ -496,7 +482,7 @@ public class PropagationManager {
         SyncopeRole role = roleDataBinder.getRoleFromId(roleId);
         return getDeleteTaskIds(role, role.getResourceNames(), noPropResourceNames);
     }
-    
+
     /**
      * Perform delete on each resource associated to the user. It is possible to ask for a mandatory provisioning for
      * some resources specifying a set of resource names. Exceptions won't be ignored and the process will be stopped if
@@ -530,85 +516,6 @@ public class PropagationManager {
     }
 
     /**
-     * Prepare attributes for sending to a connector instance.
-     *
-     * @param <T> user / role
-     * @param attrUtil user / role
-     * @param subject given user / role
-     * @param password clear-text password
-     * @param changePwd whether password should be included for propagation attributes or not
-     * @param vAttrsToBeRemoved virtual attributes to be removed
-     * @param vAttrsToBeUpdated virtual attributes to be added
-     * @param enable whether user must be enabled or not
-     * @param resource target resource
-     * @return account link + prepared attributes
-     */
-    protected <T extends AbstractAttributable> Map.Entry<String, Set<Attribute>> prepareAttributes(
-            final AttributableUtil attrUtil, final T subject, final String password, final boolean changePwd,
-            final Set<String> vAttrsToBeRemoved, final Map<String, AttributeMod> vAttrsToBeUpdated,
-            final Boolean enable, final ExternalResource resource) {
-
-        LOG.debug("Preparing resource attributes for {} on resource {} with attributes {}",
-                subject, resource, subject.getAttrs());
-
-        Set<Attribute> attributes = new HashSet<Attribute>();
-        String accountId = null;
-
-        for (AbstractMappingItem mapping : attrUtil.getMappingItems(resource, MappingPurpose.PROPAGATION)) {
-            LOG.debug("Processing schema {}", mapping.getIntAttrName());
-
-            try {
-                if ((attrUtil.getType() == AttributableType.USER
-                        && mapping.getIntMappingType() == IntMappingType.UserVirtualSchema)
-                        || (attrUtil.getType() == AttributableType.ROLE
-                        && mapping.getIntMappingType() == IntMappingType.RoleVirtualSchema)) {
-
-                    LOG.debug("Expire entry cache {}-{}", subject.getId(), mapping.getIntAttrName());
-                    virAttrCache.expire(attrUtil.getType(), subject.getId(), mapping.getIntAttrName());
-                }
-
-                Map.Entry<String, Attribute> preparedAttribute = MappingUtil.prepareAttribute(
-                        resource, mapping, subject, password, passwordGenerator, vAttrsToBeRemoved, vAttrsToBeUpdated);
-
-                if (preparedAttribute != null && preparedAttribute.getKey() != null) {
-                    accountId = preparedAttribute.getKey();
-                }
-
-                if (preparedAttribute != null && preparedAttribute.getValue() != null) {
-                    Attribute alreadyAdded = AttributeUtil.find(preparedAttribute.getValue().getName(), attributes);
-
-                    if (alreadyAdded == null) {
-                        attributes.add(preparedAttribute.getValue());
-                    } else {
-                        attributes.remove(alreadyAdded);
-
-                        Set<Object> values = new HashSet<Object>(alreadyAdded.getValue());
-                        values.addAll(preparedAttribute.getValue().getValue());
-
-                        attributes.add(AttributeBuilder.build(preparedAttribute.getValue().getName(), values));
-                    }
-                }
-            } catch (Exception e) {
-                LOG.debug("Attribute '{}' processing failed", mapping.getIntAttrName(), e);
-            }
-        }
-
-        attributes.add(MappingUtil.evaluateNAME(subject, resource, accountId));
-
-        if (enable != null) {
-            attributes.add(AttributeBuilder.buildEnabled(enable));
-        }
-        if (!changePwd) {
-            Attribute pwdAttr = AttributeUtil.find(OperationalAttributes.PASSWORD_NAME, attributes);
-            if (pwdAttr != null) {
-                attributes.remove(pwdAttr);
-            }
-        }
-
-        return new SimpleEntry<String, Set<Attribute>>(accountId, attributes);
-    }
-
-    /**
      * Create propagation tasks.
      *
      * @param <T> user / role
@@ -675,7 +582,7 @@ public class PropagationManager {
                     task.setPropagationMode(resource.getPropagationMode());
                     task.setOldAccountId(propByRes.getOldAccountId(resource.getName()));
 
-                    Map.Entry<String, Set<Attribute>> preparedAttrs = prepareAttributes(attrUtil, subject,
+                    Map.Entry<String, Set<Attribute>> preparedAttrs = MappingUtil.prepareAttributes(attrUtil, subject,
                             password, changePwd, vAttrsToBeRemoved, vAttrsToBeUpdated, enable, resource);
                     task.setAccountId(preparedAttrs.getKey());
 

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/quartz/AbstractTaskJob.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/quartz/AbstractTaskJob.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/quartz/AbstractTaskJob.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/quartz/AbstractTaskJob.java Tue Jan  7 14:33:44 2014
@@ -137,7 +137,6 @@ public abstract class AbstractTaskJob im
         if (hasToBeRegistered(execution)) {
             taskExecDAO.saveAndAdd(taskId, execution);
         }
-
         task = taskDAO.save(task);
 
         notificationManager.createTasks(

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java Tue Jan  7 14:33:44 2014
@@ -242,25 +242,31 @@ public class LoggerController extends Ab
 
             events.add(new EventCategoryTO(EventCategoryType.PROPAGATION));
             events.add(new EventCategoryTO(EventCategoryType.SYNCHRONIZATION));
+            events.add(new EventCategoryTO(EventCategoryType.PUSH));
 
             for (AttributableType attributableType : AttributableType.values()) {
                 for (ExternalResource resource : resourceDAO.findAll()) {
                     final EventCategoryTO propEventCategoryTO = new EventCategoryTO(EventCategoryType.PROPAGATION);
                     final EventCategoryTO syncEventCategoryTO = new EventCategoryTO(EventCategoryType.SYNCHRONIZATION);
+                    final EventCategoryTO pushEventCategoryTO = new EventCategoryTO(EventCategoryType.PUSH);
 
                     propEventCategoryTO.setCategory(attributableType.name().toLowerCase());
                     propEventCategoryTO.setSubcategory(resource.getName());
 
                     syncEventCategoryTO.setCategory(attributableType.name().toLowerCase());
+                    pushEventCategoryTO.setCategory(attributableType.name().toLowerCase());
                     syncEventCategoryTO.setSubcategory(resource.getName());
+                    pushEventCategoryTO.setSubcategory(resource.getName());
 
                     for (ResourceOperation resourceOperation : ResourceOperation.values()) {
                         propEventCategoryTO.getEvents().add(resourceOperation.name().toLowerCase());
                         syncEventCategoryTO.getEvents().add(resourceOperation.name().toLowerCase());
+                        pushEventCategoryTO.getEvents().add(resourceOperation.name().toLowerCase());
                     }
 
                     events.add(propEventCategoryTO);
                     events.add(syncEventCategoryTO);
+                    events.add(pushEventCategoryTO);
                 }
             }
 

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/TaskController.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/TaskController.java?rev=1556227&r1=1556226&r2=1556227&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/TaskController.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/TaskController.java Tue Jan  7 14:33:44 2014
@@ -167,6 +167,11 @@ public class TaskController extends Abst
         return classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.SYNC_ACTIONS);
     }
 
+    @PreAuthorize("hasRole('TASK_LIST')")
+    public Set<String> getPushActionsClasses() {
+        return classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.PUSH_ACTIONS);
+    }
+
     @PreAuthorize("hasRole('TASK_READ')")
     public <T extends AbstractTaskTO> T read(final Long taskId) {
         Task task = taskDAO.find(taskId);
@@ -207,6 +212,7 @@ public class TaskController extends Abst
 
             case SCHEDULED:
             case SYNCHRONIZATION:
+            case PUSH:
                 try {
                     jobInstanceLoader.registerJob(task,
                             ((SchedTask) task).getJobClassName(),
@@ -291,7 +297,9 @@ public class TaskController extends Abst
 
         T taskToDelete = binder.getTaskTO(task, taskUtil);
 
-        if (TaskType.SCHEDULED == taskUtil.getType() || TaskType.SYNCHRONIZATION == taskUtil.getType()) {
+        if (TaskType.SCHEDULED == taskUtil.getType()
+                || TaskType.SYNCHRONIZATION == taskUtil.getType()
+                || TaskType.PUSH == taskUtil.getType()) {
             jobInstanceLoader.unregisterJob(task);
         }
 

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=1556227&r1=1556226&r2=1556227&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 Tue Jan  7 14:33:44 2014
@@ -33,7 +33,9 @@ import org.apache.syncope.common.types.C
 import org.apache.syncope.common.types.TaskType;
 import org.apache.syncope.common.util.BeanUtils;
 import org.apache.syncope.common.SyncopeClientException;
+import org.apache.syncope.common.to.AbstractSyncTaskTO;
 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;
@@ -64,9 +66,9 @@ 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"};
+    private static final String[] IGNORE_TASK_EXECUTION_PROPERTIES = { "id", "task" };
 
     @Autowired
     private ResourceDAO resourceDAO;
@@ -91,54 +93,69 @@ public class TaskDataBinder {
         }
     }
 
-    private void fill(final SyncTask task, final SyncTaskTO taskTO) {
+    private void fill(final AbstractSyncTask task, final AbstractSyncTaskTO taskTO) {
         SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSyncTask);
 
-        // 1. validate JEXL expressions in user and role templates
-        if (taskTO.getUserTemplate() != null) {
-            UserTO template = taskTO.getUserTemplate();
+        if (task instanceof SyncTask && taskTO instanceof SyncTaskTO) {
+            final SyncTask syncTask = (SyncTask) task;
+            final SyncTaskTO syncTaskTO = (SyncTaskTO) taskTO;
+
+            // 1. validate JEXL expressions in user and role templates
+            if (syncTaskTO.getUserTemplate() != null) {
+                UserTO template = syncTaskTO.getUserTemplate();
+
+                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())) {
+                    sce.getElements().add("Invalid JEXL: " + template.getPassword());
+                }
 
-            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())) {
-                sce.getElements().add("Invalid JEXL: " + template.getPassword());
+                checkJexl(template, sce);
+
+                for (MembershipTO memb : template.getMemberships()) {
+                    checkJexl(memb, sce);
+                }
             }
+            if (syncTaskTO.getRoleTemplate() != null) {
+                RoleTO template = syncTaskTO.getRoleTemplate();
 
-            checkJexl(template, sce);
+                if (StringUtils.isNotBlank(template.getName()) && !JexlUtil.isExpressionValid(template.getName())) {
+                    sce.getElements().add("Invalid JEXL: " + template.getName());
+                }
 
-            for (MembershipTO memb : template.getMemberships()) {
-                checkJexl(memb, sce);
+                checkJexl(template, sce);
             }
-        }
-        if (taskTO.getRoleTemplate() != null) {
-            RoleTO template = taskTO.getRoleTemplate();
-
-            if (StringUtils.isNotBlank(template.getName()) && !JexlUtil.isExpressionValid(template.getName())) {
-                sce.getElements().add("Invalid JEXL: " + template.getName());
+            if (!sce.isEmpty()) {
+                throw sce;
             }
 
-            checkJexl(template, sce);
-        }
-        if (!sce.isEmpty()) {
-            throw sce;
-        }
+            // 2. all JEXL expressions are valid: accept user and role templates
+            syncTask.setUserTemplate(syncTaskTO.getUserTemplate());
+            syncTask.setRoleTemplate(syncTaskTO.getRoleTemplate());
 
-        // 2. all JEXL expressions are valid: accept user and role templates
-        task.setUserTemplate(taskTO.getUserTemplate());
-        task.setRoleTemplate(taskTO.getRoleTemplate());
+            syncTask.setFullReconciliation(syncTaskTO.isFullReconciliation());
+        }
 
         // 3. fill the remaining fields
         task.setPerformCreate(taskTO.isPerformCreate());
         task.setPerformUpdate(taskTO.isPerformUpdate());
         task.setPerformDelete(taskTO.isPerformDelete());
         task.setSyncStatus(taskTO.isSyncStatus());
-        task.setFullReconciliation(taskTO.isFullReconciliation());
 
         task.setActionsClassName(taskTO.getActionsClassName());
     }
 
     public SchedTask createSchedTask(final SchedTaskTO taskTO, final TaskUtil taskUtil) {
+        final Class<?> taskTOClass = taskUtil.taskTOClass();
+
+        if (taskTOClass == null || !taskTOClass.equals(taskTO.getClass())) {
+            throw new ClassCastException(
+                    String.format("taskUtil is type %s but task is not: %s", taskTOClass, taskTO.getClass()));
+        }
+
         SchedTask task = taskUtil.newTask();
         task.setCronExpression(taskTO.getCronExpression());
         task.setName(taskTO.getName());
@@ -146,13 +163,8 @@ public class TaskDataBinder {
 
         if (taskUtil.getType() == TaskType.SCHEDULED) {
             task.setJobClassName(taskTO.getJobClassName());
-        }
-        if (taskUtil.getType() == TaskType.SYNCHRONIZATION) {
-            if (!(taskTO instanceof SyncTaskTO)) {
-                throw new ClassCastException("taskUtil is type SyncTask but taskTO is not SyncTaskTO: " + taskTO.
-                        getClass().getName());
-            }
-            SyncTaskTO syncTaskTO = (SyncTaskTO) taskTO;
+        } else if (taskTO instanceof AbstractSyncTaskTO) {
+            final AbstractSyncTaskTO syncTaskTO = (AbstractSyncTaskTO) taskTO;
 
             ExternalResource resource = resourceDAO.find(syncTaskTO.getResource());
             if (resource == null) {
@@ -160,13 +172,26 @@ public class TaskDataBinder {
             }
             ((SyncTask) task).setResource(resource);
 
-            fill((SyncTask) task, syncTaskTO);
+            fill((AbstractSyncTask) task, syncTaskTO);
         }
 
         return task;
     }
 
     public void updateSchedTask(final SchedTask task, final SchedTaskTO taskTO, final TaskUtil taskUtil) {
+        Class<?> taskClass = taskUtil.taskClass();
+        Class<?> 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()));
+        }
+
+        if (taskTOClass == null || !taskTOClass.equals(taskTO.getClass())) {
+            throw new ClassCastException(
+                    String.format("taskUtil is type %s but task is not: %s", taskTOClass, taskTO.getClass()));
+        }
+
         task.setCronExpression(taskTO.getCronExpression());
         if (StringUtils.isNotBlank(taskTO.getName())) {
             task.setName(taskTO.getName());
@@ -175,17 +200,8 @@ public class TaskDataBinder {
             task.setDescription(taskTO.getDescription());
         }
 
-        if (taskUtil.getType() == TaskType.SYNCHRONIZATION) {
-            if (!(task instanceof SyncTask)) {
-                throw new ClassCastException("taskUtil is type SyncTask but task is not SyncTask: " + task.getClass().
-                        getName());
-            }
-            if (!(taskTO instanceof SyncTaskTO)) {
-                throw new ClassCastException("taskUtil is type SyncTask but taskTO is not SyncTaskTO: " + taskTO.
-                        getClass().getName());
-            }
-
-            fill((SyncTask) task, (SyncTaskTO) taskTO);
+        if (task instanceof AbstractSyncTask) {
+            fill((AbstractSyncTask) task, (AbstractSyncTaskTO) taskTO);
         }
     }
 

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=1556227&r1=1556226&r2=1556227&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 Tue Jan  7 14:33:44 2014
@@ -37,6 +37,7 @@ import org.apache.syncope.common.types.R
 import org.apache.syncope.common.types.PropagationTaskExecStatus;
 import org.apache.syncope.common.types.TaskType;
 import org.apache.syncope.common.util.CollectionWrapper;
+import org.apache.syncope.common.wrap.PushActionClass;
 import org.apache.syncope.core.persistence.dao.search.OrderByClause;
 import org.apache.syncope.core.rest.controller.TaskController;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -89,6 +90,11 @@ public class TaskServiceImpl extends Abs
     }
 
     @Override
+    public List<PushActionClass> getPushActionsClasses() {
+        return CollectionWrapper.wrap(controller.getPushActionsClasses(), PushActionClass.class);
+    }
+
+    @Override
     public <T extends AbstractTaskTO> PagedResult<T> list(final TaskType taskType) {
         return list(taskType, DEFAULT_PARAM_PAGE_VALUE, DEFAULT_PARAM_SIZE_VALUE, null);
     }

Copied: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/AbstractSyncActions.java (from r1554763, 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/AbstractSyncActions.java?p2=syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/AbstractSyncActions.java&p1=syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/SyncActions.java&r1=1554763&r2=1556227&rev=1556227&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/AbstractSyncActions.java Tue Jan  7 14:33:44 2014
@@ -19,17 +19,10 @@
 package org.apache.syncope.core.sync;
 
 import java.util.List;
-
-import org.apache.syncope.common.mod.AbstractAttributableMod;
-import org.apache.syncope.common.to.AbstractAttributableTO;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-import org.identityconnectors.framework.common.objects.SyncResultsHandler;
+import org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler;
 import org.quartz.JobExecutionException;
 
-/**
- * Interface for actions to be performed during SyncJob execution.
- */
-public interface SyncActions {
+public interface AbstractSyncActions<T extends AbstractSyncopeResultHandler> {
 
     /**
      * Action to be executed before to start the synchronization task execution.
@@ -37,57 +30,7 @@ public interface SyncActions {
      * @param handler synchronization handler being executed.
      * @throws JobExecutionException in case of generic failure.
      */
-    void beforeAll(final SyncResultsHandler handler) throws JobExecutionException;
-
-    /**
-     * Action to be executed before to create a synchronized user locally.
-     *
-     * @param handler synchronization handler being executed.
-     * @param delta retrieved synchronization information
-     * @param subject user / role to be created
-     * @return synchronization information used for user status evaluation and to be passed to the 'after' method.
-     * @throws JobExecutionException in case of generic failure
-     */
-    <T extends AbstractAttributableTO> SyncDelta beforeCreate(final SyncResultsHandler handler,
-            final SyncDelta delta, final T subject) throws JobExecutionException;
-
-    /**
-     * Action to be executed before to update a synchronized user locally.
-     *
-     * @param handler synchronization handler being executed.
-     * @param delta retrieved synchronization information
-     * @param subject local user / role information
-     * @param subjectMod modification
-     * @return synchronization information used for logging and to be passed to the 'after' method.
-     * @throws JobExecutionException in case of generic failure.
-     */
-    <T extends AbstractAttributableTO, K extends AbstractAttributableMod> SyncDelta beforeUpdate(
-            final SyncResultsHandler handler, final SyncDelta delta, final T subject, final K subjectMod)
-            throws JobExecutionException;
-
-    /**
-     * Action to be executed before to delete a synchronized user locally.
-     *
-     * @param handler synchronization handler being executed.
-     * @param delta retrieved synchronization information
-     * @param subject lcao 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 SyncResultsHandler handler,
-            final SyncDelta delta, final T subject) throws JobExecutionException;
-
-    /**
-     * Action to be executed after each local user synchronization.
-     *
-     * @param handler synchronization handler being executed.
-     * @param delta retrieved synchronization information (may be modified by 'beforeCreate/beforeUpdate/beforeDelete')
-     * @param subject synchronized local user / role
-     * @param result global synchronization results at the current synchronization step
-     * @throws JobExecutionException in case of generic failure
-     */
-    <T extends AbstractAttributableTO> void after(final SyncResultsHandler handler, final SyncDelta delta,
-            final T subject, final SyncResult result) throws JobExecutionException;
+    void beforeAll(final T handler) throws JobExecutionException;
 
     /**
      * Action to be executed after the synchronization task completion.
@@ -96,5 +39,5 @@ public interface SyncActions {
      * @param results synchronization result
      * @throws JobExecutionException in case of generic failure
      */
-    void afterAll(final SyncResultsHandler handler, final List<SyncResult> results) throws JobExecutionException;
+    void afterAll(final T handler, final List<SyncResult> results) throws JobExecutionException;
 }

Copied: syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java (from r1554763, 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/DefaultPushActions.java?p2=syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultPushActions.java&p1=syncope/trunk/core/src/main/java/org/apache/syncope/core/sync/DefaultSyncActions.java&r1=1554763&r2=1556227&rev=1556227&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/DefaultPushActions.java Tue Jan  7 14:33:44 2014
@@ -19,51 +19,51 @@
 package org.apache.syncope.core.sync;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
-import org.apache.syncope.common.mod.AbstractAttributableMod;
-import org.apache.syncope.common.to.AbstractAttributableTO;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-import org.identityconnectors.framework.common.objects.SyncResultsHandler;
+import org.apache.syncope.core.persistence.beans.AbstractAttributable;
+import org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler;
+import org.identityconnectors.framework.common.objects.Attribute;
 import org.quartz.JobExecutionException;
 
 /**
- * Default (empty) implementation of SyncActions.
+ * Default (empty) implementation of PushActions.
  */
-public class DefaultSyncActions implements SyncActions {
+public class DefaultPushActions implements PushActions {
 
     @Override
-    public void beforeAll(final SyncResultsHandler handler) throws JobExecutionException {
+    public void beforeAll(final AbstractSyncopeResultHandler handler) throws JobExecutionException {
     }
 
     @Override
-    public <T extends AbstractAttributableTO> SyncDelta beforeCreate(final SyncResultsHandler handler,
-            final SyncDelta delta, final T subject) throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <T extends AbstractAttributableTO, K extends AbstractAttributableMod> SyncDelta beforeUpdate(
-            final SyncResultsHandler handler, final SyncDelta delta, final T subject, final K subjectMod)
-            throws JobExecutionException {
-
+    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 {
         return delta;
     }
 
     @Override
-    public <T extends AbstractAttributableTO> SyncDelta beforeDelete(
-            final SyncResultsHandler handler, final SyncDelta delta, final T subject) throws JobExecutionException {
+    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 {
 
         return delta;
     }
 
     @Override
-    public <T extends AbstractAttributableTO> void after(final SyncResultsHandler handler,
-            final SyncDelta delta, final T subject, final SyncResult result) throws JobExecutionException {
+    public <T extends AbstractAttributable> void after(
+            final AbstractSyncopeResultHandler handler,
+            final T subject,
+            final Map.Entry<String, Set<Attribute>> delta, SyncResult result) throws JobExecutionException {
     }
 
     @Override
-    public void afterAll(final SyncResultsHandler handler, final List<SyncResult> results)
+    public void afterAll(
+            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=1556227&r1=1556226&r2=1556227&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 Tue Jan  7 14:33:44 2014
@@ -22,8 +22,8 @@ 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.identityconnectors.framework.common.objects.SyncDelta;
-import org.identityconnectors.framework.common.objects.SyncResultsHandler;
 import org.quartz.JobExecutionException;
 
 /**
@@ -32,19 +32,24 @@ import org.quartz.JobExecutionException;
 public class DefaultSyncActions implements SyncActions {
 
     @Override
-    public void beforeAll(final SyncResultsHandler handler) throws JobExecutionException {
+    public void beforeAll(final AbstractSyncopeSyncResultHandler handler) throws JobExecutionException {
     }
 
     @Override
-    public <T extends AbstractAttributableTO> SyncDelta beforeCreate(final SyncResultsHandler handler,
-            final SyncDelta delta, final T subject) throws JobExecutionException {
+    public <T extends AbstractAttributableTO> SyncDelta beforeCreate(
+            final AbstractSyncopeSyncResultHandler handler,
+            final SyncDelta delta,
+            final T subject) throws JobExecutionException {
 
         return delta;
     }
 
     @Override
     public <T extends AbstractAttributableTO, K extends AbstractAttributableMod> SyncDelta beforeUpdate(
-            final SyncResultsHandler handler, final SyncDelta delta, final T subject, final K subjectMod)
+            final AbstractSyncopeSyncResultHandler handler,
+            final SyncDelta delta,
+            final T subject,
+            final K subjectMod)
             throws JobExecutionException {
 
         return delta;
@@ -52,18 +57,25 @@ public class DefaultSyncActions implemen
 
     @Override
     public <T extends AbstractAttributableTO> SyncDelta beforeDelete(
-            final SyncResultsHandler handler, final SyncDelta delta, final T subject) throws JobExecutionException {
+            final AbstractSyncopeSyncResultHandler handler,
+            final SyncDelta delta,
+            final T subject) throws JobExecutionException {
 
         return delta;
     }
 
     @Override
-    public <T extends AbstractAttributableTO> void after(final SyncResultsHandler handler,
-            final SyncDelta delta, final T subject, final SyncResult result) throws JobExecutionException {
+    public <T extends AbstractAttributableTO> void after(
+            final AbstractSyncopeSyncResultHandler handler,
+            final SyncDelta delta,
+            final T subject,
+            final SyncResult result) throws JobExecutionException {
     }
 
     @Override
-    public void afterAll(final SyncResultsHandler handler, final List<SyncResult> results)
+    public void afterAll(
+            final AbstractSyncopeSyncResultHandler handler,
+            final List<SyncResult> results)
             throws JobExecutionException {
     }
 }