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 2018/10/10 07:00:56 UTC

[1/3] syncope git commit: [SYNCOPE-1380] Raise IgnoreProvisionException, more appropriate

Repository: syncope
Updated Branches:
  refs/heads/2_0_X 350f650ae -> dd09c8a20
  refs/heads/2_1_X cbd3c33e3 -> 4dd8eff0b
  refs/heads/master cf5a50298 -> 2c4853338


[SYNCOPE-1380] Raise IgnoreProvisionException, more appropriate


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

Branch: refs/heads/2_1_X
Commit: 4dd8eff0b229fff32e1ec3bbbbbc5c6069a7bb81
Parents: cbd3c33
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Oct 10 08:52:07 2018 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Oct 10 08:52:07 2018 +0200

----------------------------------------------------------------------
 .../api/pushpull/IgnoreProvisionException.java  | 10 ++++--
 .../pushpull/AbstractPullResultHandler.java     | 34 +++++++++++---------
 .../pushpull/AbstractPushResultHandler.java     | 20 ++++++------
 .../pushpull/DefaultRealmPullResultHandler.java |  3 +-
 4 files changed, 39 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/4dd8eff0/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
index bf56246..95d37e8 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
@@ -19,11 +19,17 @@
 package org.apache.syncope.core.provisioning.api.pushpull;
 
 /**
- * Raised by {@link PullActions} or {@link PushActions} methods when the given any object is to be ignored for
- * pull / push.
+ * Raised when the given any object is to be ignored for pull / push.
  */
 public class IgnoreProvisionException extends RuntimeException {
 
     private static final long serialVersionUID = -8803817097998786364L;
 
+    public IgnoreProvisionException() {
+        super();
+    }
+
+    public IgnoreProvisionException(final String message) {
+        super(message);
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/4dd8eff0/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 2ea3da9..c02077d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -154,6 +154,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             ignoreResult.setAnyType(provision == null
                     ? getAnyUtils().anyTypeKind().name() : provision.getAnyType().getKey());
             ignoreResult.setStatus(ProvisioningReport.Status.IGNORE);
+            ignoreResult.setMessage(e.getMessage());
             ignoreResult.setKey(null);
             ignoreResult.setName(delta.getObject().getName().getNameValue());
             profile.getResults().add(ignoreResult);
@@ -781,21 +782,22 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 processed.getDeltaType(), processed.getUid().getUidValue(), processed.getObject().getObjectClass());
 
         try {
-            List<String> anyKeys = pullUtils.match(processed.getObject(), provision, anyUtils);
+            List<String> keys = pullUtils.match(processed.getObject(), provision, anyUtils);
             LOG.debug("Match(es) found for {} as {}: {}",
-                    processed.getUid().getUidValue(), processed.getObject().getObjectClass(), anyKeys);
+                    processed.getUid().getUidValue(), processed.getObject().getObjectClass(), keys);
 
-            if (anyKeys.size() > 1) {
+            if (keys.size() > 1) {
                 switch (profile.getConflictResolutionAction()) {
                     case IGNORE:
-                        throw new IllegalStateException("More than one match: " + anyKeys);
+                        throw new IgnoreProvisionException("More than one match found for "
+                                + processed.getObject().getUid().getUidValue() + ": " + keys);
 
                     case FIRSTMATCH:
-                        anyKeys = anyKeys.subList(0, 1);
+                        keys = keys.subList(0, 1);
                         break;
 
                     case LASTMATCH:
-                        anyKeys = anyKeys.subList(anyKeys.size() - 1, anyKeys.size());
+                        keys = keys.subList(keys.size() - 1, keys.size());
                         break;
 
                     default:
@@ -804,7 +806,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             }
 
             if (SyncDeltaType.CREATE_OR_UPDATE == processed.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
+                if (keys.isEmpty()) {
                     switch (profile.getTask().getUnmatchingRule()) {
                         case ASSIGN:
                             profile.getResults().addAll(assign(processed, provision, anyUtils));
@@ -825,7 +827,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                     // update VirAttrCache
                     for (VirSchema virSchema : virSchemaDAO.findByProvision(provision)) {
                         Attribute attr = processed.getObject().getAttributeByName(virSchema.getExtAttrName());
-                        for (String anyKey : anyKeys) {
+                        for (String anyKey : keys) {
                             if (attr == null) {
                                 virAttrCache.expire(
                                         provision.getAnyType().getKey(),
@@ -845,27 +847,27 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
 
                     switch (profile.getTask().getMatchingRule()) {
                         case UPDATE:
-                            profile.getResults().addAll(update(processed, anyKeys, provision));
+                            profile.getResults().addAll(update(processed, keys, provision));
                             break;
 
                         case DEPROVISION:
-                            profile.getResults().addAll(deprovision(processed, anyKeys, provision, false));
+                            profile.getResults().addAll(deprovision(processed, keys, provision, false));
                             break;
 
                         case UNASSIGN:
-                            profile.getResults().addAll(deprovision(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(deprovision(processed, keys, provision, true));
                             break;
 
                         case LINK:
-                            profile.getResults().addAll(link(processed, anyKeys, provision, false));
+                            profile.getResults().addAll(link(processed, keys, provision, false));
                             break;
 
                         case UNLINK:
-                            profile.getResults().addAll(link(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(link(processed, keys, provision, true));
                             break;
 
                         case IGNORE:
-                            profile.getResults().addAll(ignore(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(ignore(processed, keys, provision, true));
                             break;
 
                         default:
@@ -873,11 +875,11 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                     }
                 }
             } else if (SyncDeltaType.DELETE == processed.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
+                if (keys.isEmpty()) {
                     finalize(ResourceOperation.DELETE.name().toLowerCase(), Result.SUCCESS, null, null, processed);
                     LOG.debug("No match found for deletion");
                 } else {
-                    profile.getResults().addAll(delete(processed, anyKeys, provision));
+                    profile.getResults().addAll(delete(processed, keys, provision));
                 }
             }
         } catch (IllegalStateException | IllegalArgumentException e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/4dd8eff0/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 6c48702..8ad473e 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
@@ -208,20 +208,21 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
             doHandle(any, provision);
             return true;
         } catch (IgnoreProvisionException e) {
-            ProvisioningReport result = profile.getResults().stream().
+            ProvisioningReport ignoreResult = profile.getResults().stream().
                     filter(report -> anyKey.equalsIgnoreCase(report.getKey())).
                     findFirst().
                     orElse(null);
-            if (result == null) {
-                result = new ProvisioningReport();
-                result.setKey(anyKey);
-                result.setAnyType(any == null ? null : any.getType().getKey());
+            if (ignoreResult == null) {
+                ignoreResult = new ProvisioningReport();
+                ignoreResult.setKey(anyKey);
+                ignoreResult.setAnyType(any == null ? null : any.getType().getKey());
 
-                profile.getResults().add(result);
+                profile.getResults().add(ignoreResult);
             }
 
-            result.setOperation(ResourceOperation.NONE);
-            result.setStatus(ProvisioningReport.Status.IGNORE);
+            ignoreResult.setOperation(ResourceOperation.NONE);
+            ignoreResult.setStatus(ProvisioningReport.Status.IGNORE);
+            ignoreResult.setMessage(e.getMessage());
 
             LOG.warn("Ignoring during push", e);
             return true;
@@ -249,7 +250,8 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
         if (connObjs.size() > 1) {
             switch (profile.getConflictResolutionAction()) {
                 case IGNORE:
-                    throw new IllegalStateException("More than one match: " + connObjs);
+                    throw new IgnoreProvisionException("More than one match found for "
+                            + any.getKey() + ": " + connObjs);
 
                 case FIRSTMATCH:
                     connObjs = connObjs.subList(0, 1);

http://git-wip-us.apache.org/repos/asf/syncope/blob/4dd8eff0/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
index 0c5bb6b..fb29bd4 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
@@ -687,7 +687,8 @@ public class DefaultRealmPullResultHandler
         if (keys.size() > 1) {
             switch (profile.getConflictResolutionAction()) {
                 case IGNORE:
-                    throw new IllegalStateException("More than one match " + keys);
+                        throw new IgnoreProvisionException("More than one match found for "
+                                + processed.getObject().getUid().getUidValue() + ": " + keys);
 
                 case FIRSTMATCH:
                     keys = keys.subList(0, 1);


[3/3] syncope git commit: [SYNCOPE-1380] Raise IgnoreProvisionException, more appropriate

Posted by il...@apache.org.
[SYNCOPE-1380] Raise IgnoreProvisionException, more appropriate


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

Branch: refs/heads/2_0_X
Commit: dd09c8a20bc8c4091b6cf635899c8e7fcd49e9f7
Parents: 350f650
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Oct 10 08:52:07 2018 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Oct 10 09:00:45 2018 +0200

----------------------------------------------------------------------
 .../api/pushpull/IgnoreProvisionException.java  | 10 ++++--
 .../pushpull/AbstractPullResultHandler.java     | 34 +++++++++++---------
 .../pushpull/AbstractPushResultHandler.java     |  1 +
 .../pushpull/DefaultRealmPullResultHandler.java |  3 +-
 4 files changed, 29 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/dd09c8a2/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
index bf56246..95d37e8 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
@@ -19,11 +19,17 @@
 package org.apache.syncope.core.provisioning.api.pushpull;
 
 /**
- * Raised by {@link PullActions} or {@link PushActions} methods when the given any object is to be ignored for
- * pull / push.
+ * Raised when the given any object is to be ignored for pull / push.
  */
 public class IgnoreProvisionException extends RuntimeException {
 
     private static final long serialVersionUID = -8803817097998786364L;
 
+    public IgnoreProvisionException() {
+        super();
+    }
+
+    public IgnoreProvisionException(final String message) {
+        super(message);
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/dd09c8a2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 0521990..6324199 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -144,6 +144,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             ignoreResult.setAnyType(provision == null
                     ? getAnyUtils().anyTypeKind().name() : provision.getAnyType().getKey());
             ignoreResult.setStatus(ProvisioningReport.Status.IGNORE);
+            ignoreResult.setMessage(e.getMessage());
             ignoreResult.setKey(null);
             ignoreResult.setName(delta.getObject().getName().getNameValue());
             profile.getResults().add(ignoreResult);
@@ -728,21 +729,22 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 processed.getDeltaType(), processed.getUid().getUidValue(), processed.getObject().getObjectClass());
 
         try {
-            List<String> anyKeys = pullUtils.match(processed.getObject(), provision, anyUtils);
+            List<String> keys = pullUtils.match(processed.getObject(), provision, anyUtils);
             LOG.debug("Match(es) found for {} as {}: {}",
-                    processed.getUid().getUidValue(), processed.getObject().getObjectClass(), anyKeys);
+                    processed.getUid().getUidValue(), processed.getObject().getObjectClass(), keys);
 
-            if (anyKeys.size() > 1) {
+            if (keys.size() > 1) {
                 switch (profile.getResAct()) {
                     case IGNORE:
-                        throw new IllegalStateException("More than one match " + anyKeys);
+                        throw new IgnoreProvisionException("More than one match found for "
+                                + processed.getObject().getUid().getUidValue() + ": " + keys);
 
                     case FIRSTMATCH:
-                        anyKeys = anyKeys.subList(0, 1);
+                        keys = keys.subList(0, 1);
                         break;
 
                     case LASTMATCH:
-                        anyKeys = anyKeys.subList(anyKeys.size() - 1, anyKeys.size());
+                        keys = keys.subList(keys.size() - 1, keys.size());
                         break;
 
                     default:
@@ -751,7 +753,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             }
 
             if (SyncDeltaType.CREATE_OR_UPDATE == processed.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
+                if (keys.isEmpty()) {
                     switch (profile.getTask().getUnmatchingRule()) {
                         case ASSIGN:
                             profile.getResults().addAll(assign(processed, provision, anyUtils));
@@ -772,7 +774,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                     // update VirAttrCache
                     for (VirSchema virSchema : virSchemaDAO.findByProvision(provision)) {
                         Attribute attr = processed.getObject().getAttributeByName(virSchema.getExtAttrName());
-                        for (String anyKey : anyKeys) {
+                        for (String anyKey : keys) {
                             if (attr == null) {
                                 virAttrCache.expire(
                                         provision.getAnyType().getKey(),
@@ -792,27 +794,27 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
 
                     switch (profile.getTask().getMatchingRule()) {
                         case UPDATE:
-                            profile.getResults().addAll(update(processed, anyKeys, provision));
+                            profile.getResults().addAll(update(processed, keys, provision));
                             break;
 
                         case DEPROVISION:
-                            profile.getResults().addAll(deprovision(processed, anyKeys, provision, false));
+                            profile.getResults().addAll(deprovision(processed, keys, provision, false));
                             break;
 
                         case UNASSIGN:
-                            profile.getResults().addAll(deprovision(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(deprovision(processed, keys, provision, true));
                             break;
 
                         case LINK:
-                            profile.getResults().addAll(link(processed, anyKeys, provision, false));
+                            profile.getResults().addAll(link(processed, keys, provision, false));
                             break;
 
                         case UNLINK:
-                            profile.getResults().addAll(link(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(link(processed, keys, provision, true));
                             break;
 
                         case IGNORE:
-                            profile.getResults().addAll(ignore(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(ignore(processed, keys, provision, true));
                             break;
 
                         default:
@@ -820,11 +822,11 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                     }
                 }
             } else if (SyncDeltaType.DELETE == processed.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
+                if (keys.isEmpty()) {
                     finalize(ResourceOperation.DELETE.name().toLowerCase(), Result.SUCCESS, null, null, processed);
                     LOG.debug("No match found for deletion");
                 } else {
-                    profile.getResults().addAll(delete(processed, anyKeys, provision));
+                    profile.getResults().addAll(delete(processed, keys, provision));
                 }
             }
         } catch (IllegalStateException | IllegalArgumentException e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/dd09c8a2/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 076f7bd..298760a 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
@@ -242,6 +242,7 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
 
             result.setOperation(ResourceOperation.NONE);
             result.setStatus(ProvisioningReport.Status.IGNORE);
+            result.setMessage(e.getMessage());
 
             LOG.warn("Ignoring during push", e);
             return true;

http://git-wip-us.apache.org/repos/asf/syncope/blob/dd09c8a2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
index 95cb3d5..ad45010 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
@@ -687,7 +687,8 @@ public class DefaultRealmPullResultHandler
         if (keys.size() > 1) {
             switch (profile.getResAct()) {
                 case IGNORE:
-                    throw new IllegalStateException("More than one match " + keys);
+                        throw new IgnoreProvisionException("More than one match found for "
+                                + processed.getObject().getUid().getUidValue() + ": " + keys);
 
                 case FIRSTMATCH:
                     keys = keys.subList(0, 1);


[2/3] syncope git commit: [SYNCOPE-1380] Raise IgnoreProvisionException, more appropriate

Posted by il...@apache.org.
[SYNCOPE-1380] Raise IgnoreProvisionException, more appropriate


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

Branch: refs/heads/master
Commit: 2c48533389ee654602effc6deb78ae4587d0c3e1
Parents: cf5a502
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Oct 10 08:52:07 2018 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Oct 10 08:52:23 2018 +0200

----------------------------------------------------------------------
 .../api/pushpull/IgnoreProvisionException.java  | 10 ++++--
 .../pushpull/AbstractPullResultHandler.java     | 34 +++++++++++---------
 .../pushpull/AbstractPushResultHandler.java     | 20 ++++++------
 .../pushpull/DefaultRealmPullResultHandler.java |  3 +-
 4 files changed, 39 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/2c485333/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
index bf56246..95d37e8 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/IgnoreProvisionException.java
@@ -19,11 +19,17 @@
 package org.apache.syncope.core.provisioning.api.pushpull;
 
 /**
- * Raised by {@link PullActions} or {@link PushActions} methods when the given any object is to be ignored for
- * pull / push.
+ * Raised when the given any object is to be ignored for pull / push.
  */
 public class IgnoreProvisionException extends RuntimeException {
 
     private static final long serialVersionUID = -8803817097998786364L;
 
+    public IgnoreProvisionException() {
+        super();
+    }
+
+    public IgnoreProvisionException(final String message) {
+        super(message);
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2c485333/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 2ea3da9..c02077d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -154,6 +154,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             ignoreResult.setAnyType(provision == null
                     ? getAnyUtils().anyTypeKind().name() : provision.getAnyType().getKey());
             ignoreResult.setStatus(ProvisioningReport.Status.IGNORE);
+            ignoreResult.setMessage(e.getMessage());
             ignoreResult.setKey(null);
             ignoreResult.setName(delta.getObject().getName().getNameValue());
             profile.getResults().add(ignoreResult);
@@ -781,21 +782,22 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 processed.getDeltaType(), processed.getUid().getUidValue(), processed.getObject().getObjectClass());
 
         try {
-            List<String> anyKeys = pullUtils.match(processed.getObject(), provision, anyUtils);
+            List<String> keys = pullUtils.match(processed.getObject(), provision, anyUtils);
             LOG.debug("Match(es) found for {} as {}: {}",
-                    processed.getUid().getUidValue(), processed.getObject().getObjectClass(), anyKeys);
+                    processed.getUid().getUidValue(), processed.getObject().getObjectClass(), keys);
 
-            if (anyKeys.size() > 1) {
+            if (keys.size() > 1) {
                 switch (profile.getConflictResolutionAction()) {
                     case IGNORE:
-                        throw new IllegalStateException("More than one match: " + anyKeys);
+                        throw new IgnoreProvisionException("More than one match found for "
+                                + processed.getObject().getUid().getUidValue() + ": " + keys);
 
                     case FIRSTMATCH:
-                        anyKeys = anyKeys.subList(0, 1);
+                        keys = keys.subList(0, 1);
                         break;
 
                     case LASTMATCH:
-                        anyKeys = anyKeys.subList(anyKeys.size() - 1, anyKeys.size());
+                        keys = keys.subList(keys.size() - 1, keys.size());
                         break;
 
                     default:
@@ -804,7 +806,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             }
 
             if (SyncDeltaType.CREATE_OR_UPDATE == processed.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
+                if (keys.isEmpty()) {
                     switch (profile.getTask().getUnmatchingRule()) {
                         case ASSIGN:
                             profile.getResults().addAll(assign(processed, provision, anyUtils));
@@ -825,7 +827,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                     // update VirAttrCache
                     for (VirSchema virSchema : virSchemaDAO.findByProvision(provision)) {
                         Attribute attr = processed.getObject().getAttributeByName(virSchema.getExtAttrName());
-                        for (String anyKey : anyKeys) {
+                        for (String anyKey : keys) {
                             if (attr == null) {
                                 virAttrCache.expire(
                                         provision.getAnyType().getKey(),
@@ -845,27 +847,27 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
 
                     switch (profile.getTask().getMatchingRule()) {
                         case UPDATE:
-                            profile.getResults().addAll(update(processed, anyKeys, provision));
+                            profile.getResults().addAll(update(processed, keys, provision));
                             break;
 
                         case DEPROVISION:
-                            profile.getResults().addAll(deprovision(processed, anyKeys, provision, false));
+                            profile.getResults().addAll(deprovision(processed, keys, provision, false));
                             break;
 
                         case UNASSIGN:
-                            profile.getResults().addAll(deprovision(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(deprovision(processed, keys, provision, true));
                             break;
 
                         case LINK:
-                            profile.getResults().addAll(link(processed, anyKeys, provision, false));
+                            profile.getResults().addAll(link(processed, keys, provision, false));
                             break;
 
                         case UNLINK:
-                            profile.getResults().addAll(link(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(link(processed, keys, provision, true));
                             break;
 
                         case IGNORE:
-                            profile.getResults().addAll(ignore(processed, anyKeys, provision, true));
+                            profile.getResults().addAll(ignore(processed, keys, provision, true));
                             break;
 
                         default:
@@ -873,11 +875,11 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                     }
                 }
             } else if (SyncDeltaType.DELETE == processed.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
+                if (keys.isEmpty()) {
                     finalize(ResourceOperation.DELETE.name().toLowerCase(), Result.SUCCESS, null, null, processed);
                     LOG.debug("No match found for deletion");
                 } else {
-                    profile.getResults().addAll(delete(processed, anyKeys, provision));
+                    profile.getResults().addAll(delete(processed, keys, provision));
                 }
             }
         } catch (IllegalStateException | IllegalArgumentException e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/2c485333/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 6c48702..8ad473e 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
@@ -208,20 +208,21 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
             doHandle(any, provision);
             return true;
         } catch (IgnoreProvisionException e) {
-            ProvisioningReport result = profile.getResults().stream().
+            ProvisioningReport ignoreResult = profile.getResults().stream().
                     filter(report -> anyKey.equalsIgnoreCase(report.getKey())).
                     findFirst().
                     orElse(null);
-            if (result == null) {
-                result = new ProvisioningReport();
-                result.setKey(anyKey);
-                result.setAnyType(any == null ? null : any.getType().getKey());
+            if (ignoreResult == null) {
+                ignoreResult = new ProvisioningReport();
+                ignoreResult.setKey(anyKey);
+                ignoreResult.setAnyType(any == null ? null : any.getType().getKey());
 
-                profile.getResults().add(result);
+                profile.getResults().add(ignoreResult);
             }
 
-            result.setOperation(ResourceOperation.NONE);
-            result.setStatus(ProvisioningReport.Status.IGNORE);
+            ignoreResult.setOperation(ResourceOperation.NONE);
+            ignoreResult.setStatus(ProvisioningReport.Status.IGNORE);
+            ignoreResult.setMessage(e.getMessage());
 
             LOG.warn("Ignoring during push", e);
             return true;
@@ -249,7 +250,8 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
         if (connObjs.size() > 1) {
             switch (profile.getConflictResolutionAction()) {
                 case IGNORE:
-                    throw new IllegalStateException("More than one match: " + connObjs);
+                    throw new IgnoreProvisionException("More than one match found for "
+                            + any.getKey() + ": " + connObjs);
 
                 case FIRSTMATCH:
                     connObjs = connObjs.subList(0, 1);

http://git-wip-us.apache.org/repos/asf/syncope/blob/2c485333/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
index 0c5bb6b..fb29bd4 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
@@ -687,7 +687,8 @@ public class DefaultRealmPullResultHandler
         if (keys.size() > 1) {
             switch (profile.getConflictResolutionAction()) {
                 case IGNORE:
-                    throw new IllegalStateException("More than one match " + keys);
+                        throw new IgnoreProvisionException("More than one match found for "
+                                + processed.getObject().getUid().getUidValue() + ": " + keys);
 
                 case FIRSTMATCH:
                     keys = keys.subList(0, 1);