http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncResultHandler.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncResultHandler.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncResultHandler.java
deleted file mode 100644
index 42762f2..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncResultHandler.java
+++ /dev/null
@@ -1,797 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-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;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.common.lib.types.AuditElements.Result;
-import org.apache.syncope.common.lib.types.MatchingRule;
-import org.apache.syncope.common.lib.types.PatchOperation;
-import org.apache.syncope.common.lib.types.PropagationByResource;
-import org.apache.syncope.common.lib.types.ResourceOperation;
-import org.apache.syncope.common.lib.types.UnmatchingRule;
-import org.apache.syncope.core.persistence.api.dao.NotFoundException;
-import org.apache.syncope.core.persistence.api.entity.task.SyncTask;
-import 
org.apache.syncope.core.provisioning.api.propagation.PropagationException;
-import org.apache.syncope.core.provisioning.api.syncpull.SyncActions;
-import 
org.apache.syncope.core.spring.security.DelegatedAdministrationException;
-import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
-import org.apache.syncope.core.persistence.api.entity.resource.Provision;
-import org.apache.syncope.core.provisioning.api.ProvisioningManager;
-import org.apache.syncope.core.provisioning.api.cache.VirAttrCache;
-import org.apache.syncope.core.provisioning.api.cache.VirAttrCacheValue;
-import 
org.apache.syncope.core.provisioning.api.syncpull.IgnoreProvisionException;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningReport;
-import 
org.apache.syncope.core.provisioning.api.syncpull.SyncopeSyncResultHandler;
-import org.identityconnectors.framework.common.objects.Attribute;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-import org.identityconnectors.framework.common.objects.SyncDeltaType;
-import org.quartz.JobExecutionException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional(rollbackFor = Throwable.class)
-public abstract class AbstractSyncResultHandler extends 
AbstractSyncopeResultHandler<SyncTask, SyncActions>
-        implements SyncopeSyncResultHandler {
-
-    @Autowired
-    protected SyncUtils syncUtilities;
-
-    @Autowired
-    protected VirSchemaDAO virSchemaDAO;
-
-    @Autowired
-    protected VirAttrCache virAttrCache;
-
-    protected abstract String getName(AnyTO anyTO);
-
-    protected abstract ProvisioningManager<?, ?> getProvisioningManager();
-
-    protected abstract AnyTO doCreate(AnyTO anyTO, SyncDelta delta, 
ProvisioningReport result);
-
-    protected AnyTO doLink(final AnyTO before, final boolean unlink) {
-        AnyPatch patch = newPatch(before.getKey());
-        patch.setKey(before.getKey());
-        patch.getResources().add(new StringPatchItem.Builder().
-                operation(unlink ? PatchOperation.DELETE : 
PatchOperation.ADD_REPLACE).
-                value(profile.getTask().getResource().getKey()).build());
-
-        return getAnyTO(update(patch).getResult());
-    }
-
-    protected abstract AnyTO doUpdate(AnyTO before, AnyPatch anyPatch, 
SyncDelta delta, ProvisioningReport result);
-
-    protected void doDeprovision(final AnyTypeKind kind, final Long key, final 
boolean unlink) {
-        PropagationByResource propByRes = new PropagationByResource();
-        propByRes.add(ResourceOperation.DELETE, 
profile.getTask().getResource().getKey());
-        taskExecutor.execute(propagationManager.getDeleteTasks(
-                kind,
-                key,
-                propByRes,
-                null));
-
-        if (unlink) {
-            AnyPatch anyObjectPatch = newPatch(key);
-            anyObjectPatch.getResources().add(new StringPatchItem.Builder().
-                    operation(PatchOperation.DELETE).
-                    value(profile.getTask().getResource().getKey()).build());
-        }
-    }
-
-    protected void doDelete(final AnyTypeKind kind, final Long key) {
-        PropagationByResource propByRes = new PropagationByResource();
-        propByRes.add(ResourceOperation.DELETE, 
profile.getTask().getResource().getKey());
-        try {
-            taskExecutor.execute(propagationManager.getDeleteTasks(
-                    kind,
-                    key,
-                    propByRes,
-                    null));
-        } catch (Exception e) {
-            // A propagation failure doesn't imply a synchronization failure.
-            // The propagation exception status will be reported into the 
propagation task execution.
-            LOG.error("Could not propagate anyObject " + key, e);
-        }
-
-        getProvisioningManager().delete(key, true);
-    }
-
-    @Override
-    public boolean handle(final SyncDelta delta) {
-        Provision provision = null;
-        try {
-            provision = 
profile.getTask().getResource().getProvision(delta.getObject().getObjectClass());
-            if (provision == null) {
-                throw new JobExecutionException("No provision found on " + 
profile.getTask().getResource() + " for "
-                        + delta.getObject().getObjectClass());
-            }
-
-            doHandle(delta, provision);
-            return true;
-        } catch (IgnoreProvisionException e) {
-            ProvisioningReport result = new ProvisioningReport();
-            result.setOperation(ResourceOperation.NONE);
-            result.setAnyType(provision == null
-                    ? getAnyUtils().getAnyTypeKind().name() : 
provision.getAnyType().getKey());
-            result.setStatus(ProvisioningReport.Status.IGNORE);
-            result.setKey(0L);
-            result.setName(delta.getObject().getName().getNameValue());
-            profile.getResults().add(result);
-
-            LOG.warn("Ignoring during synchronization", e);
-            return true;
-        } catch (JobExecutionException e) {
-            LOG.error("Synchronization failed", e);
-            return false;
-        }
-    }
-
-    protected List<ProvisioningReport> assign(
-            final SyncDelta delta, final Provision provision, final AnyUtils 
anyUtils)
-            throws JobExecutionException {
-
-        if (!profile.getTask().isPerformCreate()) {
-            LOG.debug("SyncTask not configured for create");
-            return Collections.<ProvisioningReport>emptyList();
-        }
-
-        AnyTO anyTO = connObjectUtils.getAnyTO(delta.getObject(), 
profile.getTask(), provision, anyUtils);
-
-        anyTO.getResources().add(profile.getTask().getResource().getKey());
-
-        ProvisioningReport result = new ProvisioningReport();
-        result.setOperation(ResourceOperation.CREATE);
-        result.setAnyType(provision.getAnyType().getKey());
-        result.setStatus(ProvisioningReport.Status.SUCCESS);
-        result.setName(getName(anyTO));
-
-        if (profile.isDryRun()) {
-            result.setKey(0L);
-        } else {
-            SyncDelta actionedDelta = delta;
-            for (SyncActions action : profile.getActions()) {
-                actionedDelta = action.beforeAssign(this.getProfile(), 
actionedDelta, anyTO);
-            }
-
-            create(anyTO, actionedDelta, 
UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result);
-        }
-
-        return Collections.singletonList(result);
-    }
-
-    protected List<ProvisioningReport> provision(
-            final SyncDelta delta, final Provision provision, final AnyUtils 
anyUtils)
-            throws JobExecutionException {
-
-        if (!profile.getTask().isPerformCreate()) {
-            LOG.debug("SyncTask not configured for create");
-            return Collections.<ProvisioningReport>emptyList();
-        }
-
-        AnyTO anyTO = connObjectUtils.getAnyTO(delta.getObject(), 
profile.getTask(), provision, anyUtils);
-
-        ProvisioningReport result = new ProvisioningReport();
-        result.setOperation(ResourceOperation.CREATE);
-        result.setAnyType(provision.getAnyType().getKey());
-        result.setStatus(ProvisioningReport.Status.SUCCESS);
-        result.setName(getName(anyTO));
-
-        if (profile.isDryRun()) {
-            result.setKey(0L);
-        } else {
-            SyncDelta actionedDelta = delta;
-            for (SyncActions action : profile.getActions()) {
-                actionedDelta = action.beforeProvision(this.getProfile(), 
actionedDelta, anyTO);
-            }
-
-            create(anyTO, actionedDelta, 
UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result);
-        }
-
-        return Collections.singletonList(result);
-    }
-
-    private void create(
-            final AnyTO anyTO,
-            final SyncDelta delta,
-            final String operation,
-            final ProvisioningReport result)
-            throws JobExecutionException {
-
-        Object output;
-        Result resultStatus;
-
-        try {
-            AnyTO actual = doCreate(anyTO, delta, result);
-            result.setName(getName(actual));
-            output = actual;
-            resultStatus = Result.SUCCESS;
-
-            for (SyncActions action : profile.getActions()) {
-                action.after(this.getProfile(), delta, actual, result);
-            }
-        } catch (IgnoreProvisionException e) {
-            throw e;
-        } catch (PropagationException e) {
-            // A propagation failure doesn't imply a synchronization failure.
-            // The propagation exception status will be reported into the 
propagation task execution.
-            LOG.error("Could not propagate {} {}", anyTO.getType(), 
delta.getUid().getUidValue(), e);
-            output = e;
-            resultStatus = Result.FAILURE;
-
-            for (SyncActions action : profile.getActions()) {
-                action.onError(this.getProfile(), delta, result, e);
-            }
-        } catch (Exception e) {
-            result.setStatus(ProvisioningReport.Status.FAILURE);
-            result.setMessage(ExceptionUtils.getRootCauseMessage(e));
-            LOG.error("Could not create {} {} ", anyTO.getType(), 
delta.getUid().getUidValue(), e);
-            output = e;
-            resultStatus = Result.FAILURE;
-
-            for (SyncActions action : profile.getActions()) {
-                action.onError(this.getProfile(), delta, result, e);
-            }
-        }
-
-        audit(operation, resultStatus, null, output, delta);
-    }
-
-    protected List<ProvisioningReport> update(final SyncDelta delta, final 
List<Long> anys,
-            final Provision provision) throws JobExecutionException {
-
-        if (!profile.getTask().isPerformUpdate()) {
-            LOG.debug("SyncTask not configured for update");
-            return Collections.<ProvisioningReport>emptyList();
-        }
-
-        LOG.debug("About to update {}", anys);
-
-        List<ProvisioningReport> results = new ArrayList<>();
-
-        SyncDelta workingDelta = delta;
-        for (Long key : anys) {
-            LOG.debug("About to update {}", key);
-
-            ProvisioningReport result = new ProvisioningReport();
-            result.setOperation(ResourceOperation.UPDATE);
-            result.setAnyType(provision.getAnyType().getKey());
-            result.setStatus(ProvisioningReport.Status.SUCCESS);
-            result.setKey(key);
-
-            AnyTO before = getAnyTO(key);
-            if (before == null) {
-                result.setStatus(ProvisioningReport.Status.FAILURE);
-                result.setMessage(String.format("Any '%s(%d)' not found", 
provision.getAnyType().getKey(), key));
-            } else {
-                result.setName(getName(before));
-            }
-
-            Result resultStatus;
-            Object output;
-            if (!profile.isDryRun()) {
-                if (before == null) {
-                    resultStatus = Result.FAILURE;
-                    output = null;
-                } else {
-                    try {
-                        AnyPatch anyPatch = connObjectUtils.getAnyPatch(
-                                before.getKey(),
-                                workingDelta.getObject(),
-                                before,
-                                profile.getTask(),
-                                provision,
-                                getAnyUtils());
-
-                        for (SyncActions action : profile.getActions()) {
-                            workingDelta = 
action.beforeUpdate(this.getProfile(), workingDelta, before, anyPatch);
-                        }
-
-                        AnyTO updated = doUpdate(before, anyPatch, 
workingDelta, result);
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.after(this.getProfile(), workingDelta, 
updated, result);
-                        }
-
-                        output = updated;
-                        resultStatus = Result.SUCCESS;
-                        result.setName(getName(updated));
-                        LOG.debug("{} {} successfully updated", 
provision.getAnyType().getKey(), key);
-                    } catch (IgnoreProvisionException e) {
-                        throw e;
-                    } catch (PropagationException e) {
-                        // A propagation failure doesn't imply a 
synchronization failure.
-                        // The propagation exception status will be reported 
into the propagation task execution.
-                        LOG.error("Could not propagate {} {}",
-                                provision.getAnyType().getKey(), 
workingDelta.getUid().getUidValue(), e);
-                        output = e;
-                        resultStatus = Result.FAILURE;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.onError(this.getProfile(), workingDelta, 
result, e);
-                        }
-                    } catch (Exception e) {
-                        result.setStatus(ProvisioningReport.Status.FAILURE);
-                        
result.setMessage(ExceptionUtils.getRootCauseMessage(e));
-                        LOG.error("Could not update {} {}",
-                                provision.getAnyType().getKey(), 
workingDelta.getUid().getUidValue(), e);
-                        output = e;
-                        resultStatus = Result.FAILURE;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.onError(this.getProfile(), workingDelta, 
result, e);
-                        }
-                    }
-                }
-                audit(MatchingRule.toEventName(MatchingRule.UPDATE), 
resultStatus, before, output, workingDelta);
-            }
-            results.add(result);
-        }
-        return results;
-    }
-
-    protected List<ProvisioningReport> deprovision(
-            final SyncDelta delta,
-            final List<Long> anys,
-            final Provision provision,
-            final boolean unlink)
-            throws JobExecutionException {
-
-        if (!profile.getTask().isPerformUpdate()) {
-            LOG.debug("SyncTask not configured for update");
-            return Collections.<ProvisioningReport>emptyList();
-        }
-
-        LOG.debug("About to update {}", anys);
-
-        final List<ProvisioningReport> updResults = new ArrayList<>();
-
-        for (Long key : anys) {
-            LOG.debug("About to unassign resource {}", key);
-
-            Object output;
-            Result resultStatus;
-
-            ProvisioningReport result = new ProvisioningReport();
-            result.setOperation(ResourceOperation.DELETE);
-            result.setAnyType(provision.getAnyType().getKey());
-            result.setStatus(ProvisioningReport.Status.SUCCESS);
-            result.setKey(key);
-
-            AnyTO before = getAnyTO(key);
-
-            if (before == null) {
-                result.setStatus(ProvisioningReport.Status.FAILURE);
-                result.setMessage(String.format("Any '%s(%d)' not found", 
provision.getAnyType().getKey(), key));
-            }
-
-            if (!profile.isDryRun()) {
-                if (before == null) {
-                    resultStatus = Result.FAILURE;
-                    output = null;
-                } else {
-                    result.setName(getName(before));
-
-                    try {
-                        if (unlink) {
-                            for (SyncActions action : profile.getActions()) {
-                                action.beforeUnassign(this.getProfile(), 
delta, before);
-                            }
-                        } else {
-                            for (SyncActions action : profile.getActions()) {
-                                action.beforeDeprovision(this.getProfile(), 
delta, before);
-                            }
-                        }
-
-                        doDeprovision(provision.getAnyType().getKind(), key, 
unlink);
-                        output = getAnyTO(key);
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.after(this.getProfile(), delta, 
AnyTO.class.cast(output), result);
-                        }
-
-                        resultStatus = Result.SUCCESS;
-                        LOG.debug("{} {} successfully updated", 
provision.getAnyType().getKey(), key);
-                    } catch (IgnoreProvisionException e) {
-                        throw e;
-                    } catch (PropagationException e) {
-                        // A propagation failure doesn't imply a 
synchronization failure.
-                        // The propagation exception status will be reported 
into the propagation task execution.
-                        LOG.error("Could not propagate {} {}",
-                                provision.getAnyType().getKey(), 
delta.getUid().getUidValue(), e);
-                        output = e;
-                        resultStatus = Result.FAILURE;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.onError(this.getProfile(), delta, result, 
e);
-                        }
-                    } catch (Exception e) {
-                        result.setStatus(ProvisioningReport.Status.FAILURE);
-                        
result.setMessage(ExceptionUtils.getRootCauseMessage(e));
-                        LOG.error("Could not update {} {}",
-                                provision.getAnyType().getKey(), 
delta.getUid().getUidValue(), e);
-                        output = e;
-                        resultStatus = Result.FAILURE;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.onError(this.getProfile(), delta, result, 
e);
-                        }
-                    }
-                }
-                audit(unlink
-                        ? MatchingRule.toEventName(MatchingRule.UNASSIGN)
-                        : MatchingRule.toEventName(MatchingRule.DEPROVISION), 
resultStatus, before, output, delta);
-            }
-            updResults.add(result);
-        }
-
-        return updResults;
-    }
-
-    protected List<ProvisioningReport> link(
-            final SyncDelta delta,
-            final List<Long> anys,
-            final Provision provision,
-            final boolean unlink)
-            throws JobExecutionException {
-
-        if (!profile.getTask().isPerformUpdate()) {
-            LOG.debug("SyncTask not configured for update");
-            return Collections.<ProvisioningReport>emptyList();
-        }
-
-        LOG.debug("About to update {}", anys);
-
-        final List<ProvisioningReport> updResults = new ArrayList<>();
-
-        for (Long key : anys) {
-            LOG.debug("About to unassign resource {}", key);
-
-            Object output;
-            Result resultStatus;
-
-            ProvisioningReport result = new ProvisioningReport();
-            result.setOperation(ResourceOperation.NONE);
-            result.setAnyType(provision.getAnyType().getKey());
-            result.setStatus(ProvisioningReport.Status.SUCCESS);
-            result.setKey(key);
-
-            AnyTO before = getAnyTO(key);
-
-            if (before == null) {
-                result.setStatus(ProvisioningReport.Status.FAILURE);
-                result.setMessage(String.format("Any '%s(%d)' not found", 
provision.getAnyType().getKey(), key));
-            }
-
-            if (!profile.isDryRun()) {
-                if (before == null) {
-                    resultStatus = Result.FAILURE;
-                    output = null;
-                } else {
-                    result.setName(getName(before));
-
-                    try {
-                        if (unlink) {
-                            for (SyncActions action : profile.getActions()) {
-                                action.beforeUnlink(this.getProfile(), delta, 
before);
-                            }
-                        } else {
-                            for (SyncActions action : profile.getActions()) {
-                                action.beforeLink(this.getProfile(), delta, 
before);
-                            }
-                        }
-
-                        output = doLink(before, unlink);
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.after(this.getProfile(), delta, 
AnyTO.class.cast(output), result);
-                        }
-
-                        resultStatus = Result.SUCCESS;
-                        LOG.debug("{} {} successfully updated", 
provision.getAnyType().getKey(), key);
-                    } catch (IgnoreProvisionException e) {
-                        throw e;
-                    } catch (PropagationException e) {
-                        // A propagation failure doesn't imply a 
synchronization failure.
-                        // The propagation exception status will be reported 
into the propagation task execution.
-                        LOG.error("Could not propagate {} {}",
-                                provision.getAnyType().getKey(), 
delta.getUid().getUidValue(), e);
-                        output = e;
-                        resultStatus = Result.FAILURE;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.onError(this.getProfile(), delta, result, 
e);
-                        }
-                    } catch (Exception e) {
-                        result.setStatus(ProvisioningReport.Status.FAILURE);
-                        
result.setMessage(ExceptionUtils.getRootCauseMessage(e));
-                        LOG.error("Could not update {} {}",
-                                provision.getAnyType().getKey(), 
delta.getUid().getUidValue(), e);
-                        output = e;
-                        resultStatus = Result.FAILURE;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.onError(this.getProfile(), delta, result, 
e);
-                        }
-                    }
-                }
-                audit(unlink ? MatchingRule.toEventName(MatchingRule.UNLINK)
-                        : MatchingRule.toEventName(MatchingRule.LINK), 
resultStatus, before, output, delta);
-            }
-            updResults.add(result);
-        }
-
-        return updResults;
-    }
-
-    protected List<ProvisioningReport> delete(
-            final SyncDelta delta,
-            final List<Long> anys,
-            final Provision provision)
-            throws JobExecutionException {
-
-        if (!profile.getTask().isPerformDelete()) {
-            LOG.debug("SyncTask not configured for delete");
-            return Collections.<ProvisioningReport>emptyList();
-        }
-
-        LOG.debug("About to delete {}", anys);
-
-        List<ProvisioningReport> delResults = new ArrayList<>();
-
-        SyncDelta workingDelta = delta;
-        for (Long key : anys) {
-            Object output;
-            Result resultStatus = Result.FAILURE;
-
-            ProvisioningReport result = new ProvisioningReport();
-
-            try {
-                AnyTO before = getAnyTO(key);
-
-                result.setKey(key);
-                result.setName(getName(before));
-                result.setOperation(ResourceOperation.DELETE);
-                result.setAnyType(provision.getAnyType().getKey());
-                result.setStatus(ProvisioningReport.Status.SUCCESS);
-
-                if (!profile.isDryRun()) {
-                    for (SyncActions action : profile.getActions()) {
-                        workingDelta = action.beforeDelete(this.getProfile(), 
workingDelta, before);
-                    }
-
-                    try {
-                        doDelete(provision.getAnyType().getKind(), key);
-                        output = null;
-                        resultStatus = Result.SUCCESS;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.after(this.getProfile(), workingDelta, 
before, result);
-                        }
-                    } catch (IgnoreProvisionException e) {
-                        throw e;
-                    } catch (Exception e) {
-                        result.setStatus(ProvisioningReport.Status.FAILURE);
-                        
result.setMessage(ExceptionUtils.getRootCauseMessage(e));
-                        LOG.error("Could not delete {} {}", 
provision.getAnyType().getKey(), key, e);
-                        output = e;
-
-                        for (SyncActions action : profile.getActions()) {
-                            action.onError(this.getProfile(), workingDelta, 
result, e);
-                        }
-                    }
-
-                    audit(ResourceOperation.DELETE.name().toLowerCase(), 
resultStatus, before, output, workingDelta);
-                }
-
-                delResults.add(result);
-            } catch (NotFoundException e) {
-                LOG.error("Could not find {} {}", 
provision.getAnyType().getKey(), key, e);
-            } catch (DelegatedAdministrationException e) {
-                LOG.error("Not allowed to read {} {}", 
provision.getAnyType().getKey(), key, e);
-            } catch (Exception e) {
-                LOG.error("Could not delete {} {}", 
provision.getAnyType().getKey(), key, e);
-            }
-        }
-
-        return delResults;
-    }
-
-    private List<ProvisioningReport> ignore(
-            final SyncDelta delta,
-            final Provision provision,
-            final boolean matching)
-            throws JobExecutionException {
-
-        LOG.debug("Any to ignore {}", 
delta.getObject().getUid().getUidValue());
-
-        final List<ProvisioningReport> ignoreResults = new ArrayList<>();
-        ProvisioningReport result = new ProvisioningReport();
-
-        result.setKey(null);
-        result.setName(delta.getObject().getUid().getUidValue());
-        result.setOperation(ResourceOperation.NONE);
-        result.setAnyType(provision.getAnyType().getKey());
-        result.setStatus(ProvisioningReport.Status.SUCCESS);
-        ignoreResults.add(result);
-
-        if (!profile.isDryRun()) {
-            audit(matching
-                    ? MatchingRule.toEventName(MatchingRule.IGNORE)
-                    : UnmatchingRule.toEventName(UnmatchingRule.IGNORE), 
Result.SUCCESS, null, null, delta);
-        }
-
-        return ignoreResults;
-    }
-
-    /**
-     * Look into SyncDelta and take necessary profile.getActions() (create / 
update / delete) on any object(s).
-     *
-     * @param delta returned by the underlying profile.getConnector()
-     * @param provision provisioning info
-     * @throws JobExecutionException in case of synchronization failure.
-     */
-    protected void doHandle(final SyncDelta delta, final Provision provision) 
throws JobExecutionException {
-        AnyUtils anyUtils = getAnyUtils();
-
-        LOG.debug("Process {} for {} as {}",
-                delta.getDeltaType(), delta.getUid().getUidValue(), 
delta.getObject().getObjectClass());
-
-        String uid = delta.getPreviousUid() == null
-                ? delta.getUid().getUidValue()
-                : delta.getPreviousUid().getUidValue();
-
-        try {
-            List<Long> anyKeys = syncUtilities.findExisting(uid, 
delta.getObject(), provision, anyUtils);
-            LOG.debug("Match(es) found for {} as {}: {}",
-                    delta.getUid().getUidValue(), 
delta.getObject().getObjectClass(), anyKeys);
-
-            if (anyKeys.size() > 1) {
-                switch (profile.getResAct()) {
-                    case IGNORE:
-                        throw new IllegalStateException("More than one match " 
+ anyKeys);
-
-                    case FIRSTMATCH:
-                        anyKeys = anyKeys.subList(0, 1);
-                        break;
-
-                    case LASTMATCH:
-                        anyKeys = anyKeys.subList(anyKeys.size() - 1, 
anyKeys.size());
-                        break;
-
-                    default:
-                    // keep anyKeys unmodified
-                }
-            }
-
-            if (SyncDeltaType.CREATE_OR_UPDATE == delta.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
-                    switch (profile.getTask().getUnmatchingRule()) {
-                        case ASSIGN:
-                            profile.getResults().addAll(assign(delta, 
provision, anyUtils));
-                            break;
-
-                        case PROVISION:
-                            profile.getResults().addAll(provision(delta, 
provision, anyUtils));
-                            break;
-
-                        case IGNORE:
-                            profile.getResults().addAll(ignore(delta, 
provision, false));
-                            break;
-
-                        default:
-                        // do nothing
-                    }
-                } else {
-                    // update VirAttrCache
-                    for (VirSchema virSchema : 
virSchemaDAO.findByProvision(provision)) {
-                        Attribute attr = 
delta.getObject().getAttributeByName(virSchema.getExtAttrName());
-                        for (Long anyKey : anyKeys) {
-                            if (attr == null) {
-                                virAttrCache.expire(
-                                        provision.getAnyType().getKey(),
-                                        anyKey,
-                                        virSchema.getKey());
-                            } else {
-                                VirAttrCacheValue cacheValue = new 
VirAttrCacheValue();
-                                cacheValue.setValues(attr.getValue());
-                                virAttrCache.put(
-                                        provision.getAnyType().getKey(),
-                                        anyKey,
-                                        virSchema.getKey(),
-                                        cacheValue);
-                            }
-                        }
-                    }
-
-                    switch (profile.getTask().getMatchingRule()) {
-                        case UPDATE:
-                            profile.getResults().addAll(update(delta, anyKeys, 
provision));
-                            break;
-
-                        case DEPROVISION:
-                            profile.getResults().addAll(deprovision(delta, 
anyKeys, provision, false));
-                            break;
-
-                        case UNASSIGN:
-                            profile.getResults().addAll(deprovision(delta, 
anyKeys, provision, true));
-                            break;
-
-                        case LINK:
-                            profile.getResults().addAll(link(delta, anyKeys, 
provision, false));
-                            break;
-
-                        case UNLINK:
-                            profile.getResults().addAll(link(delta, anyKeys, 
provision, true));
-                            break;
-
-                        case IGNORE:
-                            profile.getResults().addAll(ignore(delta, 
provision, true));
-                            break;
-
-                        default:
-                        // do nothing
-                    }
-                }
-            } else if (SyncDeltaType.DELETE == delta.getDeltaType()) {
-                if (anyKeys.isEmpty()) {
-                    LOG.debug("No match found for deletion");
-                } else {
-                    profile.getResults().addAll(delete(delta, anyKeys, 
provision));
-                }
-            }
-        } catch (IllegalStateException | IllegalArgumentException e) {
-            LOG.warn(e.getMessage());
-        }
-    }
-
-    private void audit(
-            final String event,
-            final Result result,
-            final Object before,
-            final Object output,
-            final Object... input) {
-
-        
notificationManager.createTasks(AuditElements.EventCategoryType.SYNCHRONIZATION,
-                getAnyUtils().getAnyTypeKind().name().toLowerCase(),
-                profile.getTask().getResource().getKey(),
-                event,
-                result,
-                before,
-                output,
-                input);
-
-        auditManager.audit(AuditElements.EventCategoryType.SYNCHRONIZATION,
-                getAnyUtils().getAnyTypeKind().name().toLowerCase(),
-                profile.getTask().getResource().getKey(),
-                event,
-                result,
-                before,
-                output,
-                input);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncopeResultHandler.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncopeResultHandler.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncopeResultHandler.java
deleted file mode 100644
index bf2cd6e..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AbstractSyncopeResultHandler.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask;
-import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
-import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
-import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
-import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
-import 
org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningProfile;
-import org.apache.syncope.core.provisioning.api.syncpull.SyncopeResultHandler;
-import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
-import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
-import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
-import org.apache.syncope.core.provisioning.api.AuditManager;
-import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
-import 
org.apache.syncope.core.provisioning.api.notification.NotificationManager;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningActions;
-import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
-import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
-import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public abstract class AbstractSyncopeResultHandler<T extends ProvisioningTask, 
A extends ProvisioningActions>
-        implements SyncopeResultHandler<T, A> {
-
-    protected static final Logger LOG = 
LoggerFactory.getLogger(SyncopeResultHandler.class);
-
-    @Autowired
-    protected AnyObjectDAO anyObjectDAO;
-
-    @Autowired
-    protected UserDAO userDAO;
-
-    @Autowired
-    protected GroupDAO groupDAO;
-
-    /**
-     * ConnectorObject utils.
-     */
-    @Autowired
-    protected ConnObjectUtils connObjectUtils;
-
-    /**
-     * Notification Manager.
-     */
-    @Autowired
-    protected NotificationManager notificationManager;
-
-    /**
-     * Audit Manager.
-     */
-    @Autowired
-    protected AuditManager auditManager;
-
-    /**
-     * Propagation manager.
-     */
-    @Autowired
-    protected PropagationManager propagationManager;
-
-    /**
-     * Task executor.
-     */
-    @Autowired
-    protected PropagationTaskExecutor taskExecutor;
-
-    protected AnyObjectWorkflowAdapter awfAdapter;
-
-    /**
-     * User workflow adapter.
-     */
-    @Autowired
-    protected UserWorkflowAdapter uwfAdapter;
-
-    /**
-     * Group workflow adapter.
-     */
-    @Autowired
-    protected GroupWorkflowAdapter gwfAdapter;
-
-    @Autowired
-    protected AnyObjectDataBinder anyObjectDataBinder;
-
-    @Autowired
-    protected UserDataBinder userDataBinder;
-
-    @Autowired
-    protected GroupDataBinder groupDataBinder;
-
-    @Autowired
-    protected AnyObjectProvisioningManager anyObjectProvisioningManager;
-
-    @Autowired
-    protected UserProvisioningManager userProvisioningManager;
-
-    @Autowired
-    protected GroupProvisioningManager groupProvisioningManager;
-
-    @Autowired
-    protected AnyUtilsFactory anyUtilsFactory;
-
-    /**
-     * Sync profile.
-     */
-    protected ProvisioningProfile<T, A> profile;
-
-    protected abstract AnyUtils getAnyUtils();
-
-    protected abstract AnyTO getAnyTO(long key);
-
-    protected abstract Any<?> getAny(long key);
-
-    protected abstract AnyPatch newPatch(final long key);
-
-    protected abstract WorkflowResult<Long> update(AnyPatch patch);
-
-    @Override
-    public void setProfile(final ProvisioningProfile<T, A> profile) {
-        this.profile = profile;
-    }
-
-    @Override
-    public ProvisioningProfile<T, A> getProfile() {
-        return profile;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectPushResultHandlerImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectPushResultHandlerImpl.java
deleted file mode 100644
index 6f83727..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectPushResultHandlerImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.patch.AnyObjectPatch;
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import 
org.apache.syncope.core.provisioning.api.syncpull.AnyObjectPushResultHandler;
-
-public class AnyObjectPushResultHandlerImpl extends AbstractPushResultHandler 
implements AnyObjectPushResultHandler {
-
-    @Override
-    protected AnyUtils getAnyUtils() {
-        return anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT);
-    }
-
-    @Override
-    protected String getName(final Any<?> any) {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    protected Any<?> getAny(final long key) {
-        try {
-            return anyObjectDAO.authFind(key);
-        } catch (Exception e) {
-            LOG.warn("Error retrieving anyObject {}", key, e);
-            return null;
-        }
-    }
-
-    @Override
-    protected AnyTO getAnyTO(final long key) {
-        return anyObjectDataBinder.getAnyObjectTO(key);
-    }
-
-    @Override
-    protected AnyPatch newPatch(final long key) {
-        AnyObjectPatch patch = new AnyObjectPatch();
-        patch.setKey(key);
-        return patch;
-    }
-
-    @Override
-    protected WorkflowResult<Long> update(final AnyPatch patch) {
-        return awfAdapter.update((AnyObjectPatch) patch);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectSyncResultHandlerImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectSyncResultHandlerImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectSyncResultHandlerImpl.java
deleted file mode 100644
index a8c6c1b..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/AnyObjectSyncResultHandlerImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.patch.AnyObjectPatch;
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.PropagationStatus;
-import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.provisioning.api.ProvisioningManager;
-import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningReport;
-import 
org.apache.syncope.core.provisioning.api.syncpull.AnyObjectSyncResultHandler;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-
-public class AnyObjectSyncResultHandlerImpl extends AbstractSyncResultHandler 
implements AnyObjectSyncResultHandler {
-
-    @Override
-    protected AnyUtils getAnyUtils() {
-        return anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT);
-    }
-
-    @Override
-    protected String getName(final AnyTO anyTO) {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    protected ProvisioningManager<?, ?> getProvisioningManager() {
-        return anyObjectProvisioningManager;
-    }
-
-    @Override
-    protected Any<?> getAny(final long key) {
-        try {
-            return anyObjectDAO.authFind(key);
-        } catch (Exception e) {
-            LOG.warn("Error retrieving anyObject {}", key, e);
-            return null;
-        }
-    }
-
-    @Override
-    protected AnyTO getAnyTO(final long key) {
-        return anyObjectDataBinder.getAnyObjectTO(key);
-    }
-
-    @Override
-    protected AnyPatch newPatch(final long key) {
-        AnyObjectPatch patch = new AnyObjectPatch();
-        patch.setKey(key);
-        return patch;
-    }
-
-    @Override
-    protected WorkflowResult<Long> update(final AnyPatch patch) {
-        return awfAdapter.update((AnyObjectPatch) patch);
-    }
-
-    @Override
-    protected AnyTO doCreate(final AnyTO anyTO, final SyncDelta delta, final 
ProvisioningReport result) {
-        AnyObjectTO anyObjectTO = AnyObjectTO.class.cast(anyTO);
-
-        Map.Entry<Long, List<PropagationStatus>> created = 
anyObjectProvisioningManager.create(
-                anyObjectTO, 
Collections.singleton(profile.getTask().getResource().getKey()), true);
-
-        result.setKey(created.getKey());
-        result.setName(getName(anyTO));
-
-        return getAnyTO(created.getKey());
-    }
-
-    @Override
-    protected AnyTO doUpdate(
-            final AnyTO before,
-            final AnyPatch anyPatch,
-            final SyncDelta delta,
-            final ProvisioningReport result) {
-
-        AnyObjectPatch anyObjectPatch = AnyObjectPatch.class.cast(anyPatch);
-
-        Map.Entry<Long, List<PropagationStatus>> updated =
-                anyObjectProvisioningManager.update(anyObjectPatch, true);
-
-        AnyObjectTO after = 
anyObjectDataBinder.getAnyObjectTO(updated.getKey());
-        result.setName(getName(after));
-        return after;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DBPasswordSyncActions.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DBPasswordSyncActions.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DBPasswordSyncActions.java
deleted file mode 100644
index 84504ec..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DBPasswordSyncActions.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.patch.PasswordPatch;
-import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.CipherAlgorithm;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.provisioning.api.Connector;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningProfile;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningReport;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * A SyncActions implementation which allows the ability to import passwords 
from a Database
- * backend, where the passwords are hashed according to the password cipher 
algorithm property
- * of the (DB) Connector and HEX-encoded.
- */
-public class DBPasswordSyncActions extends DefaultSyncActions {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(DBPasswordSyncActions.class);
-
-    private static final String CLEARTEXT = "CLEARTEXT";
-
-    @Autowired
-    private UserDAO userDAO;
-
-    private String encodedPassword;
-
-    private CipherAlgorithm cipher;
-
-    @Transactional(readOnly = true)
-    @Override
-    public <A extends AnyTO> SyncDelta beforeProvision(
-            final ProvisioningProfile<?, ?> profile,
-            final SyncDelta delta,
-            final A any) throws JobExecutionException {
-
-        if (any instanceof UserTO) {
-            String password = ((UserTO) any).getPassword();
-            parseEncodedPassword(password, profile.getConnector());
-        }
-
-        return delta;
-    }
-
-    @Transactional(readOnly = true)
-    @Override
-    public <A extends AnyTO, M extends AnyPatch> SyncDelta beforeUpdate(
-            final ProvisioningProfile<?, ?> profile,
-            final SyncDelta delta,
-            final A any,
-            final M anyPatch) throws JobExecutionException {
-
-        if (anyPatch instanceof UserPatch) {
-            PasswordPatch modPassword = ((UserPatch) anyPatch).getPassword();
-            parseEncodedPassword(modPassword == null ? null : 
modPassword.getValue(), profile.getConnector());
-        }
-
-        return delta;
-    }
-
-    private void parseEncodedPassword(final String password, final Connector 
connector) {
-        if (password != null) {
-            ConnInstance connInstance = connector.getConnInstance();
-
-            String cipherAlgorithm = getCipherAlgorithm(connInstance);
-            if (!CLEARTEXT.equals(cipherAlgorithm)) {
-                try {
-                    encodedPassword = password;
-                    cipher = CipherAlgorithm.valueOf(cipherAlgorithm);
-                } catch (IllegalArgumentException e) {
-                    LOG.error("Cipher algorithm not allowed: {}", 
cipherAlgorithm, e);
-                    encodedPassword = null;
-                }
-            }
-        }
-    }
-
-    private String getCipherAlgorithm(final ConnInstance connInstance) {
-        ConnConfProperty cipherAlgorithm =
-                IterableUtils.find(connInstance.getConf(), new 
Predicate<ConnConfProperty>() {
-
-                    @Override
-                    public boolean evaluate(final ConnConfProperty property) {
-                        return 
"cipherAlgorithm".equals(property.getSchema().getName())
-                        && property.getValues() != null && 
!property.getValues().isEmpty();
-                    }
-                });
-
-        return cipherAlgorithm == null
-                ? CLEARTEXT
-                : (String) cipherAlgorithm.getValues().get(0);
-    }
-
-    @Transactional(readOnly = true)
-    @Override
-    public <A extends AnyTO> void after(
-            final ProvisioningProfile<?, ?> profile,
-            final SyncDelta delta,
-            final A any,
-            final ProvisioningReport result) throws JobExecutionException {
-
-        if (any instanceof UserTO && encodedPassword != null && cipher != 
null) {
-            User syncopeUser = userDAO.find(any.getKey());
-            if (syncopeUser != null) {
-                syncopeUser.setEncodedPassword(encodedPassword.toUpperCase(), 
cipher);
-            }
-            encodedPassword = null;
-            cipher = null;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultPushActions.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultPushActions.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultPushActions.java
deleted file mode 100644
index 49135f9..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultPushActions.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.provisioning.api.syncpull.PushActions;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningProfile;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningReport;
-import org.quartz.JobExecutionException;
-
-/**
- * Default (empty) implementation of PushActions.
- */
-public abstract class DefaultPushActions implements PushActions {
-
-    @Override
-    public void beforeAll(final ProvisioningProfile<?, ?> profile) throws 
JobExecutionException {
-    }
-
-    @Override
-    public <A extends Any<?>> A beforeAssign(final ProvisioningProfile<?, ?> 
profile, final A any)
-            throws JobExecutionException {
-
-        return any;
-    }
-
-    @Override
-    public <A extends Any<?>> A beforeProvision(final ProvisioningProfile<?, 
?> profile, final A any)
-            throws JobExecutionException {
-
-        return any;
-    }
-
-    @Override
-    public <A extends Any<?>> A beforeLink(final ProvisioningProfile<?, ?> 
profile, final A any)
-            throws JobExecutionException {
-
-        return any;
-    }
-
-    @Override
-    public <A extends Any<?>> A beforeUnassign(final ProvisioningProfile<?, ?> 
profile, final A any)
-            throws JobExecutionException {
-
-        return any;
-    }
-
-    @Override
-    public <A extends Any<?>> A beforeDeprovision(final ProvisioningProfile<?, 
?> profile, final A any)
-            throws JobExecutionException {
-
-        return any;
-    }
-
-    @Override
-    public <A extends Any<?>> A beforeUnlink(final ProvisioningProfile<?, ?> 
profile, final A any)
-            throws JobExecutionException {
-
-        return any;
-    }
-
-    @Override
-    public <A extends Any<?>> void onError(
-            final ProvisioningProfile<?, ?> profile, final A any, final 
ProvisioningReport result,
-            final Exception error) throws JobExecutionException {
-
-        // do nothing
-    }
-
-    @Override
-    public <A extends Any<?>> void after(
-            final ProvisioningProfile<?, ?> profile, final A any, final 
ProvisioningReport result)
-            throws JobExecutionException {
-
-        // do nothing
-    }
-
-    @Override
-    public void afterAll(final ProvisioningProfile<?, ?> profile)
-            throws JobExecutionException {
-
-        // do nothing
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultReconciliationFilterBuilder.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultReconciliationFilterBuilder.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultReconciliationFilterBuilder.java
deleted file mode 100644
index f82b40c..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultReconciliationFilterBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import static 
org.identityconnectors.framework.impl.api.local.operations.FilteredResultsHandler.PassThroughFilter;
-
-import org.identityconnectors.framework.common.objects.filter.Filter;
-import 
org.apache.syncope.core.provisioning.api.syncpull.ReconciliationFilterBuilder;
-
-/**
- * Default (pass-through) implementation of {@link 
ReconciliationFilterBuilder}.
- */
-public abstract class DefaultReconciliationFilterBuilder implements 
ReconciliationFilterBuilder {
-
-    private static final PassThroughFilter PASS_THROUGH = new 
PassThroughFilter();
-
-    @Override
-    public Filter build() {
-        return PASS_THROUGH;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultSyncActions.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultSyncActions.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultSyncActions.java
deleted file mode 100644
index 159382c..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/DefaultSyncActions.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.core.provisioning.api.syncpull.SyncActions;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningProfile;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningReport;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-import org.quartz.JobExecutionException;
-
-/**
- * Default (empty) implementation of {@link SyncActions}.
- */
-public abstract class DefaultSyncActions implements SyncActions {
-
-    @Override
-    public void beforeAll(final ProvisioningProfile<?, ?> profile) throws 
JobExecutionException {
-    }
-
-    @Override
-    public <A extends AnyTO, P extends AnyPatch> SyncDelta beforeUpdate(
-            final ProvisioningProfile<?, ?> profile,
-            final SyncDelta delta,
-            final A any,
-            final P anyMod) throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <A extends AnyTO> SyncDelta beforeDelete(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any)
-            throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <A extends AnyTO> SyncDelta beforeAssign(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any)
-            throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <A extends AnyTO> SyncDelta beforeProvision(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any)
-            throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <A extends AnyTO> SyncDelta beforeLink(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any)
-            throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <A extends AnyTO> SyncDelta beforeUnassign(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any)
-            throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <A extends AnyTO> SyncDelta beforeDeprovision(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any)
-            throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public <A extends AnyTO> SyncDelta beforeUnlink(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any)
-            throws JobExecutionException {
-
-        return delta;
-    }
-
-    @Override
-    public void onError(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final ProvisioningReport result,
-            final Exception error) throws JobExecutionException {
-    }
-
-    @Override
-    public <A extends AnyTO> void after(
-            final ProvisioningProfile<?, ?> profile, final SyncDelta delta, 
final A any,
-            final ProvisioningReport result)
-            throws JobExecutionException {
-    }
-
-    @Override
-    public void afterAll(final ProvisioningProfile<?, ?> profile)
-            throws JobExecutionException {
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupPushResultHandlerImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupPushResultHandlerImpl.java
deleted file mode 100644
index 0455b08..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupPushResultHandlerImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import org.apache.syncope.common.lib.patch.GroupPatch;
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import 
org.apache.syncope.core.provisioning.api.syncpull.GroupPushResultHandler;
-
-public class GroupPushResultHandlerImpl extends AbstractPushResultHandler 
implements GroupPushResultHandler {
-
-    @Override
-    protected AnyUtils getAnyUtils() {
-        return anyUtilsFactory.getInstance(AnyTypeKind.GROUP);
-    }
-
-    @Override
-    protected String getName(final Any<?> any) {
-        return Group.class.cast(any).getName();
-    }
-
-    @Override
-    protected Any<?> getAny(final long key) {
-        try {
-            return groupDAO.authFind(key);
-        } catch (Exception e) {
-            LOG.warn("Error retrieving group {}", key, e);
-            return null;
-        }
-    }
-
-    @Override
-    protected AnyTO getAnyTO(final long key) {
-        return groupDataBinder.getGroupTO(key);
-    }
-
-    @Override
-    protected AnyPatch newPatch(final long key) {
-        GroupPatch patch = new GroupPatch();
-        patch.setKey(key);
-        return patch;
-    }
-
-    @Override
-    protected WorkflowResult<Long> update(final AnyPatch patch) {
-        return gwfAdapter.update((GroupPatch) patch);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/61a7fdd3/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupSyncResultHandlerImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupSyncResultHandlerImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupSyncResultHandlerImpl.java
deleted file mode 100644
index 8b73e42..0000000
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/syncpull/GroupSyncResultHandlerImpl.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.syncpull;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.patch.AttrPatch;
-import org.apache.syncope.common.lib.patch.GroupPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.PropagationStatus;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PatchOperation;
-import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-import org.apache.syncope.core.provisioning.api.ProvisioningManager;
-import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.syncpull.ProvisioningReport;
-import 
org.apache.syncope.core.provisioning.api.syncpull.GroupSyncResultHandler;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-
-public class GroupSyncResultHandlerImpl extends AbstractSyncResultHandler 
implements GroupSyncResultHandler {
-
-    protected final Map<Long, String> groupOwnerMap = new HashMap<>();
-
-    @Override
-    public Map<Long, String> getGroupOwnerMap() {
-        return this.groupOwnerMap;
-    }
-
-    @Override
-    protected AnyUtils getAnyUtils() {
-        return anyUtilsFactory.getInstance(AnyTypeKind.GROUP);
-    }
-
-    @Override
-    protected String getName(final AnyTO anyTO) {
-        return GroupTO.class.cast(anyTO).getName();
-    }
-
-    @Override
-    protected ProvisioningManager<?, ?> getProvisioningManager() {
-        return groupProvisioningManager;
-    }
-
-    @Override
-    protected Any<?> getAny(final long key) {
-        try {
-            return groupDAO.authFind(key);
-        } catch (Exception e) {
-            LOG.warn("Error retrieving group {}", key, e);
-            return null;
-        }
-    }
-
-    @Override
-    protected AnyTO getAnyTO(final long key) {
-        return groupDataBinder.getGroupTO(key);
-    }
-
-    @Override
-    protected AnyPatch newPatch(final long key) {
-        GroupPatch patch = new GroupPatch();
-        patch.setKey(key);
-        return patch;
-    }
-
-    @Override
-    protected WorkflowResult<Long> update(final AnyPatch patch) {
-        return gwfAdapter.update((GroupPatch) patch);
-    }
-
-    @Override
-    protected AnyTO doCreate(final AnyTO anyTO, final SyncDelta delta, final 
ProvisioningReport result) {
-        GroupTO groupTO = GroupTO.class.cast(anyTO);
-
-        Map.Entry<Long, List<PropagationStatus>> created = 
groupProvisioningManager.create(
-                groupTO,
-                groupOwnerMap,
-                
Collections.singleton(profile.getTask().getResource().getKey()),
-                true);
-
-        result.setKey(created.getKey());
-        result.setName(getName(anyTO));
-
-        return getAnyTO(created.getKey());
-    }
-
-    @Override
-    protected AnyTO doUpdate(
-            final AnyTO before,
-            final AnyPatch anyPatch,
-            final SyncDelta delta,
-            final ProvisioningReport result) {
-
-        GroupPatch groupPatch = GroupPatch.class.cast(anyPatch);
-
-        Map.Entry<Long, List<PropagationStatus>> updated = 
groupProvisioningManager.update(groupPatch, true);
-
-        String groupOwner = null;
-        for (AttrPatch attrPatch : groupPatch.getPlainAttrs()) {
-            if (attrPatch.getOperation() == PatchOperation.ADD_REPLACE && 
attrPatch.getAttrTO() != null
-                    && attrPatch.getAttrTO().getSchema().isEmpty() && 
!attrPatch.getAttrTO().getValues().isEmpty()) {
-
-                groupOwner = attrPatch.getAttrTO().getValues().get(0);
-            }
-        }
-        if (groupOwner != null) {
-            groupOwnerMap.put(updated.getKey(), groupOwner);
-        }
-
-        GroupTO after = groupDataBinder.getGroupTO(updated.getKey());
-
-        result.setName(getName(after));
-
-        return after;
-    }
-
-}

Reply via email to