You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/07/12 16:07:04 UTC

[1/2] syncope git commit: [SYNCOPE-1159] Now PushTasks have source Realm

Repository: syncope
Updated Branches:
  refs/heads/2_0_X f191fd002 -> a8c813a2b
  refs/heads/master 3e90e38fd -> bd6f46e9d


[SYNCOPE-1159] Now PushTasks have source Realm


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/a8c813a2
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/a8c813a2
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/a8c813a2

Branch: refs/heads/2_0_X
Commit: a8c813a2bf1ef99f1c6aae4e0262bd852ec80daa
Parents: f191fd0
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Jul 12 18:06:38 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Jul 12 18:06:38 2017 +0200

----------------------------------------------------------------------
 .../tasks/ProvisioningTaskDirectoryPanel.java   |  4 +++
 .../client/console/tasks/PushTaskFilters.java   |  4 ---
 .../console/tasks/SchedTaskWizardBuilder.java   | 22 ++++++++++++-
 .../panels/search/AbstractSearchPanel.html      | 21 ++++++-------
 .../tasks/SchedTaskDirectoryPanel.properties    |  1 +
 .../tasks/SchedTaskDirectoryPanel_it.properties |  1 +
 .../SchedTaskDirectoryPanel_pt_BR.properties    |  1 +
 .../tasks/SchedTaskDirectoryPanel_ru.properties | 29 ++++++++---------
 .../tasks/SchedTaskWizardBuilder$Profile.html   |  4 +++
 .../syncope/common/lib/to/PushTaskTO.java       | 10 ++++++
 .../persistence/api/entity/task/PushTask.java   |  5 +++
 .../jpa/dao/AbstractAnySearchDAO.java           | 12 ++++++-
 .../jpa/entity/task/JPAPushTask.java            | 17 ++++++++++
 .../test/resources/domains/MasterContent.xml    | 11 +++++++
 .../java/data/TaskDataBinderImpl.java           |  3 ++
 .../pushpull/AbstractPushResultHandler.java     |  8 +++++
 .../java/pushpull/PushJobDelegate.java          | 33 +++++++++-----------
 .../pushpull/RealmPushResultHandlerImpl.java    |  8 +++++
 .../apache/syncope/fit/core/PushTaskITCase.java |  5 +++
 .../reference-guide/concepts/tasks.adoc         |  1 +
 20 files changed, 149 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
index 6634736..0fa0f7b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
@@ -29,6 +29,7 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AbstractProvisioningTaskTO;
 import org.apache.syncope.common.lib.to.PullTaskTO;
+import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
@@ -83,6 +84,9 @@ public abstract class ProvisioningTaskDirectoryPanel<T extends AbstractProvision
         if (reference == PullTaskTO.class) {
             columns.add(new PropertyColumn<T, String>(
                     new StringResourceModel("destinationRealm", this), "destinationRealm", "destinationRealm"));
+        } else if (reference == PushTaskTO.class) {
+            columns.add(new PropertyColumn<T, String>(
+                    new StringResourceModel("sourceRealm", this), "sourceRealm", "sourceRealm"));
         }
 
         columns.add(new DatePropertyColumn<T>(

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
index c1e7e14..af40248 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
@@ -54,9 +54,6 @@ public class PushTaskFilters extends WizardStep {
             }
         };
 
-        // ------------------------
-        // aDynMembershipConds
-        // ------------------------
         add(new ListView<AnyTypeTO>("filters", types) {
 
             private static final long serialVersionUID = 9101744072914090143L;
@@ -80,6 +77,5 @@ public class PushTaskFilters extends WizardStep {
                         .setOutputMarkupId(true));
             }
         });
-        // ------------------------
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
index fb08a87..dccc22a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
@@ -240,8 +240,28 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
             pullTaskSpecifics.add(destinationRealm);
 
             // ------------------------------
+            // Only for pull tasks
+            // ------------------------------  
+            WebMarkupContainer pushTaskSpecifics = new WebMarkupContainer("pushTaskSpecifics");
+            add(pushTaskSpecifics.setRenderBodyOnly(true));
+
+            if (!(taskTO instanceof PushTaskTO)) {
+                pushTaskSpecifics.setEnabled(false).setVisible(false);
+            }
+
+            AjaxDropDownChoicePanel<String> sourceRealm = new AjaxDropDownChoicePanel<>(
+                    "sourceRealm", "sourceRealm",
+                    new PropertyModel<String>(taskTO, "sourceRealm"), false).
+                    setChoices(realms);
+            if (taskTO instanceof PushTaskTO) {
+                sourceRealm.addRequiredLabel();
+            }
+            sourceRealm.setNullValid(!(taskTO instanceof PushTaskTO));
+            pushTaskSpecifics.add(sourceRealm);
+
+            // ------------------------------
             // For push and pull tasks
-            // ------------------------------            
+            // ------------------------------
             WebMarkupContainer provisioningTaskSpecifics = new WebMarkupContainer("provisioningTaskSpecifics");
             add(provisioningTaskSpecifics.setRenderBodyOnly(true));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
index 190a28f..91b3321 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
@@ -17,16 +17,13 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <head><title></title></head>
-  <body>
-    <wicket:panel>
-      <span class="searchBox">
-        <div class="col-xs-12">
-          <span wicket:id="searchFormContainer">
-            <span wicket:id="search">[SEARCH]</span>
-          </span>
-        </div>
-      </span>
-    </wicket:panel>
-  </body>
+  <wicket:panel>
+    <span class="searchBox">
+      <div class="col-xs-12">
+        <span wicket:id="searchFormContainer">
+          <span wicket:id="search">[SEARCH]</span>
+        </span>
+      </div>
+    </span>
+  </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
index 6234fe1..1226b8c 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
@@ -29,3 +29,4 @@ any.cancel=Cancel ${name}
 pullMode=Pull Mode
 reconciliationFilterBuilderClassName=Reconciliation Filter Builder
 actionsClassNames=Actions
+sourceRealm=Source Realm

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
index 1a3156f..5341c88 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
@@ -29,3 +29,4 @@ any.cancel=Annulla ${name}
 pullMode=Pull Mode
 reconciliationFilterBuilderClassName=Reconciliation Filter Builder
 actionsClassNames=Actions
+sourceRealm=Realm sorgente

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
index 6234fe1..1226b8c 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
@@ -29,3 +29,4 @@ any.cancel=Cancel ${name}
 pullMode=Pull Mode
 reconciliationFilterBuilderClassName=Reconciliation Filter Builder
 actionsClassNames=Actions
+sourceRealm=Source Realm

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
index 52cfb2a..103731f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
@@ -14,32 +14,33 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-# name=Название
+# name=\u00d0\u009d\u00d0\u00b0\u00d0\u00b7\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
 name=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435
-# description=Описание
+# description=\u00d0\u009e\u00d0\u00bf\u00d0\u00b8\u00d1\u0081\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
 description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
-# destinationRealm=Область действия
+# destinationRealm=\u00d0\u009e\u00d0\u00b1\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d1\u0082\u00d1\u008c \u00d0\u00b4\u00d0\u00b5\u00d0\u00b9\u00d1\u0081\u00d1\u0082\u00d0\u00b2\u00d0\u00b8\u00d1\u008f
 destinationRealm=\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f
-# jobDelegateClassName=Название класса
+# jobDelegateClassName=\u00d0\u009d\u00d0\u00b0\u00d0\u00b7\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5 \u00d0\u00ba\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d1\u0081\u00d0\u00b0
 jobDelegateClassName=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430
-# lastExec=Предыдущий запуск
+# lastExec=\u00d0\u009f\u00d1\u0080\u00d0\u00b5\u00d0\u00b4\u00d1\u008b\u00d0\u00b4\u00d1\u0083\u00d1\u0089\u00d0\u00b8\u00d0\u00b9 \u00d0\u00b7\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba
 lastExec=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a
-# nextExec=Следующий запуск
+# nextExec=\u00d0\u00a1\u00d0\u00bb\u00d0\u00b5\u00d0\u00b4\u00d1\u0083\u00d1\u008e\u00d1\u0089\u00d0\u00b8\u00d0\u00b9 \u00d0\u00b7\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba
 nextExec=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a
-# active=Активна
+# active=\u00d0\u0090\u00d0\u00ba\u00d1\u0082\u00d0\u00b8\u00d0\u00b2\u00d0\u00bd\u00d0\u00b0
 active=\u0410\u043a\u0442\u0438\u0432\u043d\u0430
 
-# any.edit=Изменить ${name}
+# any.edit=\u00d0\u0098\u00d0\u00b7\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c ${name}
 any.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c ${name}
-# any.new=Создать задачу
+# any.new=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d1\u0083
 any.new=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443
-# any.finish=Сохранить ${name}
+# any.finish=\u00d0\u00a1\u00d0\u00be\u00d1\u0085\u00d1\u0080\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c ${name}
 any.finish=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c ${name}
-# any.cancel=Отменить ${name}
+# any.cancel=\u00d0\u009e\u00d1\u0082\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c ${name}
 any.cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c ${name}
-# pullMode=Режим получения данных
+# pullMode=\u00d0\u00a0\u00d0\u00b5\u00d0\u00b6\u00d0\u00b8\u00d0\u00bc \u00d0\u00bf\u00d0\u00be\u00d0\u00bb\u00d1\u0083\u00d1\u0087\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u008f \u00d0\u00b4\u00d0\u00b0\u00d0\u00bd\u00d0\u00bd\u00d1\u008b\u00d1\u0085
 pullMode=\u0420\u0435\u0436\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445
-# reconciliationFilterBuilderClassName=Фильтр реконсилиации
+# reconciliationFilterBuilderClassName=\u00d0\u00a4\u00d0\u00b8\u00d0\u00bb\u00d1\u008c\u00d1\u0082\u00d1\u0080 \u00d1\u0080\u00d0\u00b5\u00d0\u00ba\u00d0\u00be\u00d0\u00bd\u00d1\u0081\u00d0\u00b8\u00d0\u00bb\u00d0\u00b8\u00d0\u00b0\u00d1\u0086\u00d0\u00b8\u00d0\u00b8
 reconciliationFilterBuilderClassName=\u0424\u0438\u043b\u044c\u0442\u0440 \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u0438\u0430\u0446\u0438\u0438
-# actionsClassNames=Действия
+# actionsClassNames=\u00d0\u0094\u00d0\u00b5\u00d0\u00b9\u00d1\u0081\u00d1\u0082\u00d0\u00b2\u00d0\u00b8\u00d1\u008f
 actionsClassNames=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+sourceRealm=Source Realm

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
index 838ff65..17b1e42 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
@@ -30,6 +30,10 @@ under the License.
       <div class="form-group"><span wicket:id="reconciliationFilterBuilderClassName">[filter]</span></div>
     </span>      
 
+    <span wicket:id="pushTaskSpecifics">
+      <div class="form-group"><span wicket:id="sourceRealm">[sourceRealm]</span></div>
+    </span>      
+
     <span wicket:id="provisioningTaskSpecifics">
       <div class="form-group form-palette">
         <span wicket:id="actionsClassNames">[actionsClassNames]</span>

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
index dd3347a..4528f11 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
@@ -36,10 +36,20 @@ public class PushTaskTO extends AbstractProvisioningTaskTO {
 
     private static final long serialVersionUID = -2143537546915809018L;
 
+    private String sourceRealm;
+
     @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     @JsonIgnore
     private final Map<String, String> filters = new HashMap<>();
 
+    public String getSourceRealm() {
+        return sourceRealm;
+    }
+
+    public void setSourceRealm(final String sourceRealm) {
+        this.sourceRealm = sourceRealm;
+    }
+
     @JsonProperty
     public Map<String, String> getFilters() {
         return filters;

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
index 93e112d..fe86726 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
@@ -20,9 +20,14 @@ package org.apache.syncope.core.persistence.api.entity.task;
 
 import java.util.List;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.Realm;
 
 public interface PushTask extends ProvisioningTask {
 
+    Realm getSourceRealm();
+
+    void setSourceRealm(Realm sourceRealm);
+
     boolean add(PushTaskAnyFilter filter);
 
     PushTaskAnyFilter getFilter(AnyType anyType);

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index 7c1a1b0..c9daf03 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -355,7 +355,17 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
             return Collections.<T>emptyList();
         }
 
-        return doSearch(adminRealms, cond, page, itemsPerPage, orderBy, kind);
+        List<OrderByClause> effectiveOrderBy;
+        if (orderBy.isEmpty()) {
+            OrderByClause keyClause = new OrderByClause();
+            keyClause.setField("key");
+            keyClause.setDirection(OrderByClause.Direction.ASC);
+            effectiveOrderBy = Collections.singletonList(keyClause);
+        } else {
+            effectiveOrderBy = orderBy;
+        }
+
+        return doSearch(adminRealms, cond, page, itemsPerPage, effectiveOrderBy, kind);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
index 1afb4ee..1ef12a4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
@@ -30,12 +30,15 @@ import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.task.PushTask;
 import org.apache.syncope.core.persistence.api.entity.task.PushTaskAnyFilter;
+import org.apache.syncope.core.persistence.jpa.entity.JPARealm;
 
 @Entity
 @DiscriminatorValue("PushTask")
@@ -43,6 +46,9 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
 
     private static final long serialVersionUID = -4141057723006682564L;
 
+    @ManyToOne(fetch = FetchType.EAGER, optional = false)
+    private JPARealm sourceRealm;
+
     @ElementCollection(fetch = FetchType.EAGER)
     @Column(name = "actionClassName")
     @CollectionTable(name = "PushTask_actionsClassNames",
@@ -54,6 +60,17 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
     private List<JPAPushTaskAnyFilter> filters = new ArrayList<>();
 
     @Override
+    public JPARealm getSourceRealm() {
+        return sourceRealm;
+    }
+
+    @Override
+    public void setSourceRealm(final Realm sourceRealm) {
+        checkType(sourceRealm, JPARealm.class);
+        this.sourceRealm = (JPARealm) sourceRealm;
+    }
+
+    @Override
     public Set<String> getActionsClassNames() {
         return actionsClassNames;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 1010dff..b88aee1 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1201,56 +1201,67 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <Task DTYPE="PushTask" id="af558be4-9d2f-4359-bf85-a554e6e90be1" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"         
         unmatchingRule="ASSIGN" matchingRule="IGNORE" active="1"/>  
   <PushTaskAnyFilter id="1fdcff65-765f-4a6e-98a7-13ef7cca47e2" anyType_id="USER" pushTask_id="af558be4-9d2f-4359-bf85-a554e6e90be1" fiql="surname==Vivaldi"/>
   <PushTaskAnyFilter id="3b564c51-5d64-48b3-8da5-fd4ebc10e0a8" anyType_id="GROUP" pushTask_id="af558be4-9d2f-4359-bf85-a554e6e90be1" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="97f327b6-2eff-4d35-85e8-d581baaab855" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"         
         unmatchingRule="PROVISION" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="199efd21-5e89-46ac-95de-f47e9d0569fc" anyType_id="USER" pushTask_id="97f327b6-2eff-4d35-85e8-d581baaab855" fiql="surname==Bellini"/>
   <PushTaskAnyFilter id="7672a167-77d6-4639-8b1d-0af561293c7d" anyType_id="GROUP" pushTask_id="97f327b6-2eff-4d35-85e8-d581baaab855" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="03aa2a04-4881-4573-9117-753f81b04865" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="UNLINK" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="39a11ba6-397a-4c94-8bfe-1f4f757d6501" anyType_id="USER" pushTask_id="03aa2a04-4881-4573-9117-753f81b04865" fiql="surname==Puccini"/>
   <PushTaskAnyFilter id="5bd7501e-8a18-4fbd-a3fe-a1e731ba95db" anyType_id="GROUP" pushTask_id="03aa2a04-4881-4573-9117-753f81b04865" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="5e5f7c7e-9de7-4c6a-99f1-4df1af959807" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"         
         unmatchingRule="IGNORE" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="0d0371a3-5772-4b4c-ad14-139adf1d346a" anyType_id="USER" pushTask_id="5e5f7c7e-9de7-4c6a-99f1-4df1af959807" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="2e7488ae-a2fc-4657-a93b-159b8433c0e7" anyType_id="GROUP" pushTask_id="5e5f7c7e-9de7-4c6a-99f1-4df1af959807" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="0bc11a19-6454-45c2-a4e3-ceef84e5d79b" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="ASSIGN" matchingRule="UPDATE" active="1"/>
   <PushTaskAnyFilter id="41bf22fe-a014-41af-9a75-402b987eb433" anyType_id="USER" pushTask_id="0bc11a19-6454-45c2-a4e3-ceef84e5d79b" fiql="username==_NO_ONE_"/>
   <PushTaskAnyFilter id="fa983fde-795e-4c89-a6f7-1ccd80a8adeb" anyType_id="GROUP" pushTask_id="0bc11a19-6454-45c2-a4e3-ceef84e5d79b" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="ec674143-480a-4816-98ad-b61fa090821e" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="DEPROVISION" active="1"/>
   <PushTaskAnyFilter id="e238a6dc-0b04-46cf-9bfa-be68bd9f2da0" anyType_id="USER" pushTask_id="ec674143-480a-4816-98ad-b61fa090821e" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="0eaa643e-0add-4c46-8273-539f9d6abec5" anyType_id="GROUP" pushTask_id="ec674143-480a-4816-98ad-b61fa090821e" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="c46edc3a-a18b-4af2-b707-f4a415507496" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UNASSIGN" active="1"/>
   <PushTaskAnyFilter id="335b4f11-589a-44c5-80b0-ba94892f0c62" anyType_id="USER" pushTask_id="c46edc3a-a18b-4af2-b707-f4a415507496" fiql="surname==Rossini"/>
   <PushTaskAnyFilter id="b32eecc2-aa4f-43c6-a501-a692c3e93113" anyType_id="GROUP" pushTask_id="c46edc3a-a18b-4af2-b707-f4a415507496" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="51318433-cce4-4f71-8f45-9534b6c9c819" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="LINK" active="1"/>
   <PushTaskAnyFilter id="9f974a0d-87d8-4cae-9ea9-1fc245bc1dbf" anyType_id="USER" pushTask_id="51318433-cce4-4f71-8f45-9534b6c9c819" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="0dc46ba4-1270-4fa9-b3e1-79f940d4308f" anyType_id="GROUP" pushTask_id="51318433-cce4-4f71-8f45-9534b6c9c819" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="24b1be9c-7e3b-443a-86c9-798ebce5eaf2" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UNLINK" active="1"/>
   <PushTaskAnyFilter id="3aa3b0b8-7469-4859-89d5-476ae5915101" anyType_id="USER" pushTask_id="24b1be9c-7e3b-443a-86c9-798ebce5eaf2" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="f054810e-6842-4017-8f60-5b4031fa2c72" anyType_id="GROUP" pushTask_id="24b1be9c-7e3b-443a-86c9-798ebce5eaf2" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="375c7b7f-9e3a-4833-88c9-b7787b0a69f2" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UPDATE"  active="1"/>
   <PushTaskAnyFilter id="95f047fc-1a8a-45f4-b56c-6e04d8ca5567" anyType_id="USER" pushTask_id="375c7b7f-9e3a-4833-88c9-b7787b0a69f2" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="013a4298-4b14-4f8b-9f59-191c2d53dbd8" anyType_id="GROUP" pushTask_id="375c7b7f-9e3a-4833-88c9-b7787b0a69f2" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="fd905ba5-9d56-4f51-83e2-859096a67b75" name="Export on resource-ldap" resource_id="resource-ldap"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="ASSIGN" matchingRule="UNLINK" active="1"/>
   <PushTaskAnyFilter id="30842acc-f2dd-4d47-b359-20db06c30803" anyType_id="USER" pushTask_id="fd905ba5-9d56-4f51-83e2-859096a67b75" fiql="username==_NO_ONE_"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
index 4045872..09b5d12 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
@@ -116,6 +116,8 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
             pushTask.setJobDelegateClassName(PushJobDelegate.class.getName());
 
+            pushTask.setSourceRealm(realmDAO.findByFullPath(pushTaskTO.getSourceRealm()));
+
             pushTask.setMatchingRule(pushTaskTO.getMatchingRule() == null
                     ? MatchingRule.LINK : pushTaskTO.getMatchingRule());
             pushTask.setUnmatchingRule(pushTaskTO.getUnmatchingRule() == null
@@ -346,6 +348,7 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
             case PUSH:
                 setExecTime((SchedTaskTO) taskTO, task);
+                ((PushTaskTO) taskTO).setSourceRealm(((PushTask) task).getSourceRealm().getFullPath());
                 ((PushTaskTO) taskTO).setResource(((PushTask) task).getResource().getKey());
                 ((PushTaskTO) taskTO).setMatchingRule(((PushTask) task).getMatchingRule() == null
                         ? MatchingRule.LINK : ((PushTask) task).getMatchingRule());

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
index 66595ac..772c42a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IteratorUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.StringPatchItem;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -424,10 +425,17 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
                     action.after(profile, any, result);
                 }
 
+                if (result.getStatus() == null) {
+                    result.setStatus(ProvisioningReport.Status.SUCCESS);
+                }
+                resultStatus = AuditElements.Result.SUCCESS;
                 output = getRemoteObject(connObjecKey, provision.getObjectClass());
             } catch (IgnoreProvisionException e) {
                 throw e;
             } catch (Exception e) {
+                result.setStatus(ProvisioningReport.Status.FAILURE);
+                result.setMessage(ExceptionUtils.getRootCauseMessage(e));
+                resultStatus = AuditElements.Result.FAILURE;
                 output = e;
 
                 LOG.warn("Error pushing {} towards {}", any, profile.getTask().getResource(), e);

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
index 7c3bbe3..76ff65b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
@@ -199,26 +198,22 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
                 String filter = pushTask.getFilter(provision.getAnyType()) == null
                         ? null
                         : pushTask.getFilter(provision.getAnyType()).getFIQLCond();
-                if (StringUtils.isBlank(filter)) {
-                    for (int page = 1; page <= (anyDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                        doHandle(anyDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE), handler, pushTask.getResource());
-                    }
-                } else {
-                    SearchCond cond = SearchCondConverter.convert(filter);
-                    int count = searchDAO.count(
-                            SyncopeConstants.FULL_ADMIN_REALMS,
+                SearchCond cond = StringUtils.isBlank(filter)
+                        ? anyDAO.getAllMatchingCond()
+                        : SearchCondConverter.convert(filter);
+                int count = searchDAO.count(
+                        Collections.singleton(profile.getTask().getSourceRealm().getFullPath()),
+                        cond,
+                        provision.getAnyType().getKind());
+                for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+                    List<? extends Any<?>> anys = searchDAO.search(
+                            Collections.singleton(profile.getTask().getSourceRealm().getFullPath()),
                             cond,
+                            page,
+                            AnyDAO.DEFAULT_PAGE_SIZE,
+                            Collections.<OrderByClause>emptyList(),
                             provision.getAnyType().getKind());
-                    for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                        List<? extends Any<?>> anys = searchDAO.search(
-                                SyncopeConstants.FULL_ADMIN_REALMS,
-                                cond,
-                                page,
-                                AnyDAO.DEFAULT_PAGE_SIZE,
-                                Collections.<OrderByClause>emptyList(),
-                                provision.getAnyType().getKind());
-                        doHandle(anys, handler, pushTask.getResource());
-                    }
+                    doHandle(anys, handler, pushTask.getResource());
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
index 9cd574a..f028b38 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
@@ -370,6 +371,10 @@ public class RealmPushResultHandlerImpl
                     action.after(profile, realm, result);
                 }
 
+                if (result.getStatus() == null) {
+                    result.setStatus(ProvisioningReport.Status.SUCCESS);
+                }
+                resultStatus = AuditElements.Result.SUCCESS;
                 output = getRemoteObject(
                         realm.getName(),
                         profile.getConnector(),
@@ -377,6 +382,9 @@ public class RealmPushResultHandlerImpl
             } catch (IgnoreProvisionException e) {
                 throw e;
             } catch (Exception e) {
+                result.setStatus(ProvisioningReport.Status.FAILURE);
+                result.setMessage(ExceptionUtils.getRootCauseMessage(e));
+                resultStatus = AuditElements.Result.FAILURE;
                 output = e;
 
                 LOG.warn("Error pushing {} towards {}", realm, profile.getTask().getResource(), e);

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
index eb35e65..4ed4a52 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
@@ -30,6 +30,7 @@ import java.util.Set;
 import javax.sql.DataSource;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.PagedResult;
@@ -101,6 +102,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         PushTaskTO task = new PushTaskTO();
         task.setName("Test create Push");
         task.setResource(RESOURCE_NAME_WS2);
+        task.setSourceRealm(SyncopeConstants.ROOT_REALM);
         task.getFilters().put(AnyTypeKind.USER.name(),
                 SyncopeClient.getUserSearchConditionBuilder().hasNotResources(RESOURCE_NAME_TESTDB2).query());
         task.getFilters().put(AnyTypeKind.GROUP.name(),
@@ -281,6 +283,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         task.setName("For orgUnit");
         task.setActive(true);
         task.setResource(RESOURCE_NAME_LDAP_ORGUNIT);
+        task.setSourceRealm(SyncopeConstants.ROOT_REALM);
         task.setPerformCreate(true);
         task.setPerformDelete(true);
         task.setPerformUpdate(true);
@@ -363,6 +366,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
             task.setName("issueSYNCOPE598");
             task.setActive(true);
             task.setResource(resourceName);
+            task.setSourceRealm(SyncopeConstants.ROOT_REALM);
             task.setPerformCreate(true);
             task.setPerformDelete(true);
             task.setPerformUpdate(true);
@@ -393,6 +397,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         task.setName("Test create Push");
         task.setActive(true);
         task.setResource(RESOURCE_NAME_LDAP);
+        task.setSourceRealm(SyncopeConstants.ROOT_REALM);
         task.getFilters().put(AnyTypeKind.USER.name(),
                 SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo("_NO_ONE_").query());
         task.getFilters().put(AnyTypeKind.GROUP.name(),

http://git-wip-us.apache.org/repos/asf/syncope/blob/a8c813a2/src/main/asciidoc/reference-guide/concepts/tasks.adoc
----------------------------------------------------------------------
diff --git a/src/main/asciidoc/reference-guide/concepts/tasks.adoc b/src/main/asciidoc/reference-guide/concepts/tasks.adoc
index c058c98..cf4c710 100644
--- a/src/main/asciidoc/reference-guide/concepts/tasks.adoc
+++ b/src/main/asciidoc/reference-guide/concepts/tasks.adoc
@@ -113,6 +113,7 @@ Push tasks are required to define and trigger the <<provisioning-push,push>> pro
 When defining a push task, the following information must be provided:
 
 * related <<external-resources,external resource>>
+* source <<realms,Realm>> - where entities to push will be read from
 * filter information for selecting which internal entities will be pushed onto the identity store
 * whether creation, update or deletion on the identity store are allowed or not
 * whether to synchronize the status information with internal storage


[2/2] syncope git commit: [SYNCOPE-1159] Now PushTasks have source Realm

Posted by il...@apache.org.
[SYNCOPE-1159] Now PushTasks have source Realm


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/bd6f46e9
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/bd6f46e9
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/bd6f46e9

Branch: refs/heads/master
Commit: bd6f46e9df674fe02721687d8ae810f040e850bc
Parents: 3e90e38
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Jul 12 18:06:38 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Jul 12 18:06:54 2017 +0200

----------------------------------------------------------------------
 .../tasks/ProvisioningTaskDirectoryPanel.java   |  4 +++
 .../client/console/tasks/PushTaskFilters.java   |  4 ---
 .../console/tasks/SchedTaskWizardBuilder.java   | 22 ++++++++++++-
 .../panels/search/AbstractSearchPanel.html      | 21 ++++++-------
 .../tasks/SchedTaskDirectoryPanel.properties    |  1 +
 .../tasks/SchedTaskDirectoryPanel_it.properties |  1 +
 .../SchedTaskDirectoryPanel_pt_BR.properties    |  1 +
 .../tasks/SchedTaskDirectoryPanel_ru.properties | 29 ++++++++---------
 .../tasks/SchedTaskWizardBuilder$Profile.html   |  4 +++
 .../syncope/common/lib/to/PushTaskTO.java       | 10 ++++++
 .../persistence/api/entity/task/PushTask.java   |  5 +++
 .../jpa/dao/AbstractAnySearchDAO.java           | 12 ++++++-
 .../jpa/entity/task/JPAPushTask.java            | 17 ++++++++++
 .../test/resources/domains/MasterContent.xml    | 11 +++++++
 .../java/data/TaskDataBinderImpl.java           |  3 ++
 .../pushpull/AbstractPushResultHandler.java     |  8 +++++
 .../java/pushpull/PushJobDelegate.java          | 33 +++++++++-----------
 .../pushpull/RealmPushResultHandlerImpl.java    |  8 +++++
 .../apache/syncope/fit/core/PushTaskITCase.java |  5 +++
 .../reference-guide/concepts/tasks.adoc         |  1 +
 20 files changed, 149 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
index 6634736..0fa0f7b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
@@ -29,6 +29,7 @@ import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AbstractProvisioningTaskTO;
 import org.apache.syncope.common.lib.to.PullTaskTO;
+import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
@@ -83,6 +84,9 @@ public abstract class ProvisioningTaskDirectoryPanel<T extends AbstractProvision
         if (reference == PullTaskTO.class) {
             columns.add(new PropertyColumn<T, String>(
                     new StringResourceModel("destinationRealm", this), "destinationRealm", "destinationRealm"));
+        } else if (reference == PushTaskTO.class) {
+            columns.add(new PropertyColumn<T, String>(
+                    new StringResourceModel("sourceRealm", this), "sourceRealm", "sourceRealm"));
         }
 
         columns.add(new DatePropertyColumn<T>(

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
index c1e7e14..af40248 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskFilters.java
@@ -54,9 +54,6 @@ public class PushTaskFilters extends WizardStep {
             }
         };
 
-        // ------------------------
-        // aDynMembershipConds
-        // ------------------------
         add(new ListView<AnyTypeTO>("filters", types) {
 
             private static final long serialVersionUID = 9101744072914090143L;
@@ -80,6 +77,5 @@ public class PushTaskFilters extends WizardStep {
                         .setOutputMarkupId(true));
             }
         });
-        // ------------------------
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
index fb08a87..dccc22a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
@@ -240,8 +240,28 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
             pullTaskSpecifics.add(destinationRealm);
 
             // ------------------------------
+            // Only for pull tasks
+            // ------------------------------  
+            WebMarkupContainer pushTaskSpecifics = new WebMarkupContainer("pushTaskSpecifics");
+            add(pushTaskSpecifics.setRenderBodyOnly(true));
+
+            if (!(taskTO instanceof PushTaskTO)) {
+                pushTaskSpecifics.setEnabled(false).setVisible(false);
+            }
+
+            AjaxDropDownChoicePanel<String> sourceRealm = new AjaxDropDownChoicePanel<>(
+                    "sourceRealm", "sourceRealm",
+                    new PropertyModel<String>(taskTO, "sourceRealm"), false).
+                    setChoices(realms);
+            if (taskTO instanceof PushTaskTO) {
+                sourceRealm.addRequiredLabel();
+            }
+            sourceRealm.setNullValid(!(taskTO instanceof PushTaskTO));
+            pushTaskSpecifics.add(sourceRealm);
+
+            // ------------------------------
             // For push and pull tasks
-            // ------------------------------            
+            // ------------------------------
             WebMarkupContainer provisioningTaskSpecifics = new WebMarkupContainer("provisioningTaskSpecifics");
             add(provisioningTaskSpecifics.setRenderBodyOnly(true));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
index 190a28f..91b3321 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.html
@@ -17,16 +17,13 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <head><title></title></head>
-  <body>
-    <wicket:panel>
-      <span class="searchBox">
-        <div class="col-xs-12">
-          <span wicket:id="searchFormContainer">
-            <span wicket:id="search">[SEARCH]</span>
-          </span>
-        </div>
-      </span>
-    </wicket:panel>
-  </body>
+  <wicket:panel>
+    <span class="searchBox">
+      <div class="col-xs-12">
+        <span wicket:id="searchFormContainer">
+          <span wicket:id="search">[SEARCH]</span>
+        </span>
+      </div>
+    </span>
+  </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
index 6234fe1..1226b8c 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.properties
@@ -29,3 +29,4 @@ any.cancel=Cancel ${name}
 pullMode=Pull Mode
 reconciliationFilterBuilderClassName=Reconciliation Filter Builder
 actionsClassNames=Actions
+sourceRealm=Source Realm

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
index 1a3156f..5341c88 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_it.properties
@@ -29,3 +29,4 @@ any.cancel=Annulla ${name}
 pullMode=Pull Mode
 reconciliationFilterBuilderClassName=Reconciliation Filter Builder
 actionsClassNames=Actions
+sourceRealm=Realm sorgente

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
index 6234fe1..1226b8c 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_pt_BR.properties
@@ -29,3 +29,4 @@ any.cancel=Cancel ${name}
 pullMode=Pull Mode
 reconciliationFilterBuilderClassName=Reconciliation Filter Builder
 actionsClassNames=Actions
+sourceRealm=Source Realm

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
index 52cfb2a..103731f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel_ru.properties
@@ -14,32 +14,33 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-# name=Название
+# name=\u00d0\u009d\u00d0\u00b0\u00d0\u00b7\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
 name=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435
-# description=Описание
+# description=\u00d0\u009e\u00d0\u00bf\u00d0\u00b8\u00d1\u0081\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
 description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
-# destinationRealm=Область действия
+# destinationRealm=\u00d0\u009e\u00d0\u00b1\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d1\u0082\u00d1\u008c \u00d0\u00b4\u00d0\u00b5\u00d0\u00b9\u00d1\u0081\u00d1\u0082\u00d0\u00b2\u00d0\u00b8\u00d1\u008f
 destinationRealm=\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f
-# jobDelegateClassName=Название класса
+# jobDelegateClassName=\u00d0\u009d\u00d0\u00b0\u00d0\u00b7\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5 \u00d0\u00ba\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d1\u0081\u00d0\u00b0
 jobDelegateClassName=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430
-# lastExec=Предыдущий запуск
+# lastExec=\u00d0\u009f\u00d1\u0080\u00d0\u00b5\u00d0\u00b4\u00d1\u008b\u00d0\u00b4\u00d1\u0083\u00d1\u0089\u00d0\u00b8\u00d0\u00b9 \u00d0\u00b7\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba
 lastExec=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a
-# nextExec=Следующий запуск
+# nextExec=\u00d0\u00a1\u00d0\u00bb\u00d0\u00b5\u00d0\u00b4\u00d1\u0083\u00d1\u008e\u00d1\u0089\u00d0\u00b8\u00d0\u00b9 \u00d0\u00b7\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba
 nextExec=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a
-# active=Активна
+# active=\u00d0\u0090\u00d0\u00ba\u00d1\u0082\u00d0\u00b8\u00d0\u00b2\u00d0\u00bd\u00d0\u00b0
 active=\u0410\u043a\u0442\u0438\u0432\u043d\u0430
 
-# any.edit=Изменить ${name}
+# any.edit=\u00d0\u0098\u00d0\u00b7\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c ${name}
 any.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c ${name}
-# any.new=Создать задачу
+# any.new=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d1\u0083
 any.new=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443
-# any.finish=Сохранить ${name}
+# any.finish=\u00d0\u00a1\u00d0\u00be\u00d1\u0085\u00d1\u0080\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c ${name}
 any.finish=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c ${name}
-# any.cancel=Отменить ${name}
+# any.cancel=\u00d0\u009e\u00d1\u0082\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c ${name}
 any.cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c ${name}
-# pullMode=Режим получения данных
+# pullMode=\u00d0\u00a0\u00d0\u00b5\u00d0\u00b6\u00d0\u00b8\u00d0\u00bc \u00d0\u00bf\u00d0\u00be\u00d0\u00bb\u00d1\u0083\u00d1\u0087\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u008f \u00d0\u00b4\u00d0\u00b0\u00d0\u00bd\u00d0\u00bd\u00d1\u008b\u00d1\u0085
 pullMode=\u0420\u0435\u0436\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445
-# reconciliationFilterBuilderClassName=Фильтр реконсилиации
+# reconciliationFilterBuilderClassName=\u00d0\u00a4\u00d0\u00b8\u00d0\u00bb\u00d1\u008c\u00d1\u0082\u00d1\u0080 \u00d1\u0080\u00d0\u00b5\u00d0\u00ba\u00d0\u00be\u00d0\u00bd\u00d1\u0081\u00d0\u00b8\u00d0\u00bb\u00d0\u00b8\u00d0\u00b0\u00d1\u0086\u00d0\u00b8\u00d0\u00b8
 reconciliationFilterBuilderClassName=\u0424\u0438\u043b\u044c\u0442\u0440 \u0440\u0435\u043a\u043e\u043d\u0441\u0438\u043b\u0438\u0430\u0446\u0438\u0438
-# actionsClassNames=Действия
+# actionsClassNames=\u00d0\u0094\u00d0\u00b5\u00d0\u00b9\u00d1\u0081\u00d1\u0082\u00d0\u00b2\u00d0\u00b8\u00d1\u008f
 actionsClassNames=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+sourceRealm=Source Realm

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
index 838ff65..17b1e42 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder$Profile.html
@@ -30,6 +30,10 @@ under the License.
       <div class="form-group"><span wicket:id="reconciliationFilterBuilderClassName">[filter]</span></div>
     </span>      
 
+    <span wicket:id="pushTaskSpecifics">
+      <div class="form-group"><span wicket:id="sourceRealm">[sourceRealm]</span></div>
+    </span>      
+
     <span wicket:id="provisioningTaskSpecifics">
       <div class="form-group form-palette">
         <span wicket:id="actionsClassNames">[actionsClassNames]</span>

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
index dd3347a..4528f11 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/PushTaskTO.java
@@ -36,10 +36,20 @@ public class PushTaskTO extends AbstractProvisioningTaskTO {
 
     private static final long serialVersionUID = -2143537546915809018L;
 
+    private String sourceRealm;
+
     @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
     @JsonIgnore
     private final Map<String, String> filters = new HashMap<>();
 
+    public String getSourceRealm() {
+        return sourceRealm;
+    }
+
+    public void setSourceRealm(final String sourceRealm) {
+        this.sourceRealm = sourceRealm;
+    }
+
     @JsonProperty
     public Map<String, String> getFilters() {
         return filters;

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
index 93e112d..fe86726 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
@@ -20,9 +20,14 @@ package org.apache.syncope.core.persistence.api.entity.task;
 
 import java.util.List;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.Realm;
 
 public interface PushTask extends ProvisioningTask {
 
+    Realm getSourceRealm();
+
+    void setSourceRealm(Realm sourceRealm);
+
     boolean add(PushTaskAnyFilter filter);
 
     PushTaskAnyFilter getFilter(AnyType anyType);

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index 7c1a1b0..c9daf03 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -355,7 +355,17 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
             return Collections.<T>emptyList();
         }
 
-        return doSearch(adminRealms, cond, page, itemsPerPage, orderBy, kind);
+        List<OrderByClause> effectiveOrderBy;
+        if (orderBy.isEmpty()) {
+            OrderByClause keyClause = new OrderByClause();
+            keyClause.setField("key");
+            keyClause.setDirection(OrderByClause.Direction.ASC);
+            effectiveOrderBy = Collections.singletonList(keyClause);
+        } else {
+            effectiveOrderBy = orderBy;
+        }
+
+        return doSearch(adminRealms, cond, page, itemsPerPage, effectiveOrderBy, kind);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
index 1afb4ee..1ef12a4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
@@ -30,12 +30,15 @@ import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.task.PushTask;
 import org.apache.syncope.core.persistence.api.entity.task.PushTaskAnyFilter;
+import org.apache.syncope.core.persistence.jpa.entity.JPARealm;
 
 @Entity
 @DiscriminatorValue("PushTask")
@@ -43,6 +46,9 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
 
     private static final long serialVersionUID = -4141057723006682564L;
 
+    @ManyToOne(fetch = FetchType.EAGER, optional = false)
+    private JPARealm sourceRealm;
+
     @ElementCollection(fetch = FetchType.EAGER)
     @Column(name = "actionClassName")
     @CollectionTable(name = "PushTask_actionsClassNames",
@@ -54,6 +60,17 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
     private List<JPAPushTaskAnyFilter> filters = new ArrayList<>();
 
     @Override
+    public JPARealm getSourceRealm() {
+        return sourceRealm;
+    }
+
+    @Override
+    public void setSourceRealm(final Realm sourceRealm) {
+        checkType(sourceRealm, JPARealm.class);
+        this.sourceRealm = (JPARealm) sourceRealm;
+    }
+
+    @Override
     public Set<String> getActionsClassNames() {
         return actionsClassNames;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 1010dff..b88aee1 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1201,56 +1201,67 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <Task DTYPE="PushTask" id="af558be4-9d2f-4359-bf85-a554e6e90be1" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"         
         unmatchingRule="ASSIGN" matchingRule="IGNORE" active="1"/>  
   <PushTaskAnyFilter id="1fdcff65-765f-4a6e-98a7-13ef7cca47e2" anyType_id="USER" pushTask_id="af558be4-9d2f-4359-bf85-a554e6e90be1" fiql="surname==Vivaldi"/>
   <PushTaskAnyFilter id="3b564c51-5d64-48b3-8da5-fd4ebc10e0a8" anyType_id="GROUP" pushTask_id="af558be4-9d2f-4359-bf85-a554e6e90be1" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="97f327b6-2eff-4d35-85e8-d581baaab855" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"         
         unmatchingRule="PROVISION" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="199efd21-5e89-46ac-95de-f47e9d0569fc" anyType_id="USER" pushTask_id="97f327b6-2eff-4d35-85e8-d581baaab855" fiql="surname==Bellini"/>
   <PushTaskAnyFilter id="7672a167-77d6-4639-8b1d-0af561293c7d" anyType_id="GROUP" pushTask_id="97f327b6-2eff-4d35-85e8-d581baaab855" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="03aa2a04-4881-4573-9117-753f81b04865" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="UNLINK" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="39a11ba6-397a-4c94-8bfe-1f4f757d6501" anyType_id="USER" pushTask_id="03aa2a04-4881-4573-9117-753f81b04865" fiql="surname==Puccini"/>
   <PushTaskAnyFilter id="5bd7501e-8a18-4fbd-a3fe-a1e731ba95db" anyType_id="GROUP" pushTask_id="03aa2a04-4881-4573-9117-753f81b04865" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="5e5f7c7e-9de7-4c6a-99f1-4df1af959807" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"         
         unmatchingRule="IGNORE" matchingRule="IGNORE" active="1"/>
   <PushTaskAnyFilter id="0d0371a3-5772-4b4c-ad14-139adf1d346a" anyType_id="USER" pushTask_id="5e5f7c7e-9de7-4c6a-99f1-4df1af959807" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="2e7488ae-a2fc-4657-a93b-159b8433c0e7" anyType_id="GROUP" pushTask_id="5e5f7c7e-9de7-4c6a-99f1-4df1af959807" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="0bc11a19-6454-45c2-a4e3-ceef84e5d79b" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="ASSIGN" matchingRule="UPDATE" active="1"/>
   <PushTaskAnyFilter id="41bf22fe-a014-41af-9a75-402b987eb433" anyType_id="USER" pushTask_id="0bc11a19-6454-45c2-a4e3-ceef84e5d79b" fiql="username==_NO_ONE_"/>
   <PushTaskAnyFilter id="fa983fde-795e-4c89-a6f7-1ccd80a8adeb" anyType_id="GROUP" pushTask_id="0bc11a19-6454-45c2-a4e3-ceef84e5d79b" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="ec674143-480a-4816-98ad-b61fa090821e" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="DEPROVISION" active="1"/>
   <PushTaskAnyFilter id="e238a6dc-0b04-46cf-9bfa-be68bd9f2da0" anyType_id="USER" pushTask_id="ec674143-480a-4816-98ad-b61fa090821e" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="0eaa643e-0add-4c46-8273-539f9d6abec5" anyType_id="GROUP" pushTask_id="ec674143-480a-4816-98ad-b61fa090821e" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="c46edc3a-a18b-4af2-b707-f4a415507496" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UNASSIGN" active="1"/>
   <PushTaskAnyFilter id="335b4f11-589a-44c5-80b0-ba94892f0c62" anyType_id="USER" pushTask_id="c46edc3a-a18b-4af2-b707-f4a415507496" fiql="surname==Rossini"/>
   <PushTaskAnyFilter id="b32eecc2-aa4f-43c6-a501-a692c3e93113" anyType_id="GROUP" pushTask_id="c46edc3a-a18b-4af2-b707-f4a415507496" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="51318433-cce4-4f71-8f45-9534b6c9c819" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="LINK" active="1"/>
   <PushTaskAnyFilter id="9f974a0d-87d8-4cae-9ea9-1fc245bc1dbf" anyType_id="USER" pushTask_id="51318433-cce4-4f71-8f45-9534b6c9c819" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="0dc46ba4-1270-4fa9-b3e1-79f940d4308f" anyType_id="GROUP" pushTask_id="51318433-cce4-4f71-8f45-9534b6c9c819" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="24b1be9c-7e3b-443a-86c9-798ebce5eaf2" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UNLINK" active="1"/>
   <PushTaskAnyFilter id="3aa3b0b8-7469-4859-89d5-476ae5915101" anyType_id="USER" pushTask_id="24b1be9c-7e3b-443a-86c9-798ebce5eaf2" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="f054810e-6842-4017-8f60-5b4031fa2c72" anyType_id="GROUP" pushTask_id="24b1be9c-7e3b-443a-86c9-798ebce5eaf2" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="375c7b7f-9e3a-4833-88c9-b7787b0a69f2" name="Export on resource-testdb2" resource_id="resource-testdb2"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="IGNORE" matchingRule="UPDATE"  active="1"/>
   <PushTaskAnyFilter id="95f047fc-1a8a-45f4-b56c-6e04d8ca5567" anyType_id="USER" pushTask_id="375c7b7f-9e3a-4833-88c9-b7787b0a69f2" fiql="surname==Verdi"/>
   <PushTaskAnyFilter id="013a4298-4b14-4f8b-9f59-191c2d53dbd8" anyType_id="GROUP" pushTask_id="375c7b7f-9e3a-4833-88c9-b7787b0a69f2" fiql="name==_NO_ONE_"/>
   <Task DTYPE="PushTask" id="fd905ba5-9d56-4f51-83e2-859096a67b75" name="Export on resource-ldap" resource_id="resource-ldap"
+        sourceRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28"
         performCreate="1" performUpdate="1" performDelete="1" syncStatus="1"        
         unmatchingRule="ASSIGN" matchingRule="UNLINK" active="1"/>
   <PushTaskAnyFilter id="30842acc-f2dd-4d47-b359-20db06c30803" anyType_id="USER" pushTask_id="fd905ba5-9d56-4f51-83e2-859096a67b75" fiql="username==_NO_ONE_"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
index 4045872..09b5d12 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
@@ -116,6 +116,8 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
             pushTask.setJobDelegateClassName(PushJobDelegate.class.getName());
 
+            pushTask.setSourceRealm(realmDAO.findByFullPath(pushTaskTO.getSourceRealm()));
+
             pushTask.setMatchingRule(pushTaskTO.getMatchingRule() == null
                     ? MatchingRule.LINK : pushTaskTO.getMatchingRule());
             pushTask.setUnmatchingRule(pushTaskTO.getUnmatchingRule() == null
@@ -346,6 +348,7 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
             case PUSH:
                 setExecTime((SchedTaskTO) taskTO, task);
+                ((PushTaskTO) taskTO).setSourceRealm(((PushTask) task).getSourceRealm().getFullPath());
                 ((PushTaskTO) taskTO).setResource(((PushTask) task).getResource().getKey());
                 ((PushTaskTO) taskTO).setMatchingRule(((PushTask) task).getMatchingRule() == null
                         ? MatchingRule.LINK : ((PushTask) task).getMatchingRule());

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
index 66595ac..772c42a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IteratorUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.StringPatchItem;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -424,10 +425,17 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
                     action.after(profile, any, result);
                 }
 
+                if (result.getStatus() == null) {
+                    result.setStatus(ProvisioningReport.Status.SUCCESS);
+                }
+                resultStatus = AuditElements.Result.SUCCESS;
                 output = getRemoteObject(connObjecKey, provision.getObjectClass());
             } catch (IgnoreProvisionException e) {
                 throw e;
             } catch (Exception e) {
+                result.setStatus(ProvisioningReport.Status.FAILURE);
+                result.setMessage(ExceptionUtils.getRootCauseMessage(e));
+                resultStatus = AuditElements.Result.FAILURE;
                 output = e;
 
                 LOG.warn("Error pushing {} towards {}", any, profile.getTask().getResource(), e);

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
index 7c3bbe3..76ff65b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
@@ -199,26 +198,22 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
                 String filter = pushTask.getFilter(provision.getAnyType()) == null
                         ? null
                         : pushTask.getFilter(provision.getAnyType()).getFIQLCond();
-                if (StringUtils.isBlank(filter)) {
-                    for (int page = 1; page <= (anyDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                        doHandle(anyDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE), handler, pushTask.getResource());
-                    }
-                } else {
-                    SearchCond cond = SearchCondConverter.convert(filter);
-                    int count = searchDAO.count(
-                            SyncopeConstants.FULL_ADMIN_REALMS,
+                SearchCond cond = StringUtils.isBlank(filter)
+                        ? anyDAO.getAllMatchingCond()
+                        : SearchCondConverter.convert(filter);
+                int count = searchDAO.count(
+                        Collections.singleton(profile.getTask().getSourceRealm().getFullPath()),
+                        cond,
+                        provision.getAnyType().getKind());
+                for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+                    List<? extends Any<?>> anys = searchDAO.search(
+                            Collections.singleton(profile.getTask().getSourceRealm().getFullPath()),
                             cond,
+                            page,
+                            AnyDAO.DEFAULT_PAGE_SIZE,
+                            Collections.<OrderByClause>emptyList(),
                             provision.getAnyType().getKind());
-                    for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                        List<? extends Any<?>> anys = searchDAO.search(
-                                SyncopeConstants.FULL_ADMIN_REALMS,
-                                cond,
-                                page,
-                                AnyDAO.DEFAULT_PAGE_SIZE,
-                                Collections.<OrderByClause>emptyList(),
-                                provision.getAnyType().getKind());
-                        doHandle(anys, handler, pushTask.getResource());
-                    }
+                    doHandle(anys, handler, pushTask.getResource());
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
index 9cd574a..f028b38 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
@@ -370,6 +371,10 @@ public class RealmPushResultHandlerImpl
                     action.after(profile, realm, result);
                 }
 
+                if (result.getStatus() == null) {
+                    result.setStatus(ProvisioningReport.Status.SUCCESS);
+                }
+                resultStatus = AuditElements.Result.SUCCESS;
                 output = getRemoteObject(
                         realm.getName(),
                         profile.getConnector(),
@@ -377,6 +382,9 @@ public class RealmPushResultHandlerImpl
             } catch (IgnoreProvisionException e) {
                 throw e;
             } catch (Exception e) {
+                result.setStatus(ProvisioningReport.Status.FAILURE);
+                result.setMessage(ExceptionUtils.getRootCauseMessage(e));
+                resultStatus = AuditElements.Result.FAILURE;
                 output = e;
 
                 LOG.warn("Error pushing {} towards {}", realm, profile.getTask().getResource(), e);

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
index eb35e65..4ed4a52 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
@@ -30,6 +30,7 @@ import java.util.Set;
 import javax.sql.DataSource;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.PagedResult;
@@ -101,6 +102,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         PushTaskTO task = new PushTaskTO();
         task.setName("Test create Push");
         task.setResource(RESOURCE_NAME_WS2);
+        task.setSourceRealm(SyncopeConstants.ROOT_REALM);
         task.getFilters().put(AnyTypeKind.USER.name(),
                 SyncopeClient.getUserSearchConditionBuilder().hasNotResources(RESOURCE_NAME_TESTDB2).query());
         task.getFilters().put(AnyTypeKind.GROUP.name(),
@@ -281,6 +283,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         task.setName("For orgUnit");
         task.setActive(true);
         task.setResource(RESOURCE_NAME_LDAP_ORGUNIT);
+        task.setSourceRealm(SyncopeConstants.ROOT_REALM);
         task.setPerformCreate(true);
         task.setPerformDelete(true);
         task.setPerformUpdate(true);
@@ -363,6 +366,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
             task.setName("issueSYNCOPE598");
             task.setActive(true);
             task.setResource(resourceName);
+            task.setSourceRealm(SyncopeConstants.ROOT_REALM);
             task.setPerformCreate(true);
             task.setPerformDelete(true);
             task.setPerformUpdate(true);
@@ -393,6 +397,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         task.setName("Test create Push");
         task.setActive(true);
         task.setResource(RESOURCE_NAME_LDAP);
+        task.setSourceRealm(SyncopeConstants.ROOT_REALM);
         task.getFilters().put(AnyTypeKind.USER.name(),
                 SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo("_NO_ONE_").query());
         task.getFilters().put(AnyTypeKind.GROUP.name(),

http://git-wip-us.apache.org/repos/asf/syncope/blob/bd6f46e9/src/main/asciidoc/reference-guide/concepts/tasks.adoc
----------------------------------------------------------------------
diff --git a/src/main/asciidoc/reference-guide/concepts/tasks.adoc b/src/main/asciidoc/reference-guide/concepts/tasks.adoc
index 8b8432c..070090b 100644
--- a/src/main/asciidoc/reference-guide/concepts/tasks.adoc
+++ b/src/main/asciidoc/reference-guide/concepts/tasks.adoc
@@ -113,6 +113,7 @@ Push tasks are required to define and trigger the <<provisioning-push,push>> pro
 When defining a push task, the following information must be provided:
 
 * related <<external-resources,external resource>>
+* source <<realms,Realm>> - where entities to push will be read from
 * filter information for selecting which internal entities will be pushed onto the identity store
 * whether creation, update or deletion on the identity store are allowed or not
 * whether to synchronize the status information with internal storage