You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/09/22 08:15:55 UTC
[4/6] syncope git commit: [SYNCOPE-1212] Clearing and refactoring for
easier extensions
http://git-wip-us.apache.org/repos/asf/syncope/blob/9c289134/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java
deleted file mode 100644
index c4be4e2..0000000
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java
+++ /dev/null
@@ -1,795 +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.pushpull;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.RealmTO;
-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.ClientExceptionType;
-import org.apache.syncope.common.lib.types.MatchingRule;
-import org.apache.syncope.core.provisioning.api.PropagationByResource;
-import org.apache.syncope.common.lib.types.PullMode;
-import org.apache.syncope.common.lib.types.ResourceOperation;
-import org.apache.syncope.common.lib.types.UnmatchingRule;
-import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.search.AnyCond;
-import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
-import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
-import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
-import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
-import org.apache.syncope.core.persistence.api.entity.task.PullTask;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
-import org.apache.syncope.core.provisioning.api.pushpull.IgnoreProvisionException;
-import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport;
-import org.apache.syncope.core.provisioning.api.pushpull.PullActions;
-import org.apache.syncope.core.provisioning.api.pushpull.SyncopePullExecutor;
-import org.apache.syncope.core.provisioning.api.pushpull.SyncopePullResultHandler;
-import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
-import org.apache.syncope.core.spring.security.DelegatedAdministrationException;
-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 class RealmPullResultHandlerImpl
- extends AbstractRealmResultHandler<PullTask, PullActions>
- implements SyncopePullResultHandler {
-
- @Autowired
- private PullUtils pullUtils;
-
- @Autowired
- private ConnObjectUtils connObjectUtils;
-
- @Autowired
- private AnySearchDAO searchDAO;
-
- private SyncopePullExecutor executor;
-
- private Result latestResult;
-
- @Override
- public void setPullExecutor(final SyncopePullExecutor executor) {
- this.executor = executor;
- }
-
- @Override
- public boolean handle(final SyncDelta delta) {
- try {
- OrgUnit orgUnit = profile.getTask().getResource().getOrgUnit();
- if (orgUnit == null) {
- throw new JobExecutionException("No orgUnit found on " + profile.getTask().getResource() + " for "
- + delta.getObject().getObjectClass());
- }
-
- doHandle(delta, orgUnit);
-
- LOG.debug("Successfully handled {}", delta);
-
- if (profile.getTask().getPullMode() != PullMode.INCREMENTAL) {
- return true;
- }
-
- boolean shouldContinue;
- synchronized (this) {
- shouldContinue = latestResult == Result.SUCCESS;
- this.latestResult = null;
- }
- if (shouldContinue) {
- executor.setLatestSyncToken(delta.getObjectClass(), delta.getToken());
- }
- return shouldContinue;
- } catch (IgnoreProvisionException e) {
- ProvisioningReport ignoreResult = new ProvisioningReport();
- ignoreResult.setOperation(ResourceOperation.NONE);
- ignoreResult.setStatus(ProvisioningReport.Status.IGNORE);
- ignoreResult.setAnyType(REALM_TYPE);
- ignoreResult.setKey(null);
- ignoreResult.setName(delta.getObject().getName().getNameValue());
- profile.getResults().add(ignoreResult);
-
- LOG.warn("Ignoring during pull", e);
-
- executor.setLatestSyncToken(delta.getObjectClass(), delta.getToken());
-
- return true;
- } catch (JobExecutionException e) {
- LOG.error("Pull failed", e);
-
- return false;
- }
- }
-
- private List<ProvisioningReport> assign(final SyncDelta delta, final OrgUnit orgUnit) throws JobExecutionException {
- if (!profile.getTask().isPerformCreate()) {
- LOG.debug("PullTask not configured for create");
- finalize(UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), Result.SUCCESS, null, null, delta);
- return Collections.<ProvisioningReport>emptyList();
- }
-
- RealmTO realmTO = connObjectUtils.getRealmTO(delta.getObject(), profile.getTask(), orgUnit);
- if (realmTO.getFullPath() == null) {
- if (realmTO.getParent() == null) {
- realmTO.setParent(profile.getTask().getDestinatioRealm().getFullPath());
- }
-
- realmTO.setFullPath(realmTO.getParent() + "/" + realmTO.getName());
- }
- realmTO.getResources().add(profile.getTask().getResource().getKey());
-
- ProvisioningReport result = new ProvisioningReport();
- result.setOperation(ResourceOperation.CREATE);
- result.setAnyType(REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.SUCCESS);
- result.setName(realmTO.getFullPath());
-
- if (profile.isDryRun()) {
- result.setKey(null);
- finalize(UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), Result.SUCCESS, null, null, delta);
- } else {
- SyncDelta actionedDelta = delta;
- for (PullActions action : profile.getActions()) {
- actionedDelta = action.beforeAssign(profile, actionedDelta, realmTO);
- }
-
- create(realmTO, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result);
- }
-
- return Collections.singletonList(result);
- }
-
- private List<ProvisioningReport> provision(final SyncDelta delta, final OrgUnit orgUnit)
- throws JobExecutionException {
-
- if (!profile.getTask().isPerformCreate()) {
- LOG.debug("PullTask not configured for create");
- finalize(UnmatchingRule.toEventName(UnmatchingRule.PROVISION), Result.SUCCESS, null, null, delta);
- return Collections.<ProvisioningReport>emptyList();
- }
-
- RealmTO realmTO = connObjectUtils.getRealmTO(delta.getObject(), profile.getTask(), orgUnit);
- if (realmTO.getFullPath() == null) {
- if (realmTO.getParent() == null) {
- realmTO.setParent(profile.getTask().getDestinatioRealm().getFullPath());
- }
-
- realmTO.setFullPath(realmTO.getParent() + "/" + realmTO.getName());
- }
-
- ProvisioningReport result = new ProvisioningReport();
- result.setOperation(ResourceOperation.CREATE);
- result.setAnyType(REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.SUCCESS);
- result.setName(realmTO.getFullPath());
-
- if (profile.isDryRun()) {
- result.setKey(null);
- finalize(UnmatchingRule.toEventName(UnmatchingRule.PROVISION), Result.SUCCESS, null, null, delta);
- } else {
- SyncDelta actionedDelta = delta;
- for (PullActions action : profile.getActions()) {
- actionedDelta = action.beforeProvision(profile, actionedDelta, realmTO);
- }
-
- create(realmTO, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result);
- }
-
- return Collections.singletonList(result);
- }
-
- private void throwIgnoreProvisionException(final SyncDelta delta, final Exception exception)
- throws JobExecutionException {
-
- if (exception instanceof IgnoreProvisionException) {
- throw IgnoreProvisionException.class.cast(exception);
- }
-
- IgnoreProvisionException ipe = null;
- for (PullActions action : profile.getActions()) {
- if (ipe == null) {
- ipe = action.onError(profile, delta, exception);
- }
- }
- if (ipe != null) {
- throw ipe;
- }
- }
-
- private void create(
- final RealmTO realmTO,
- final SyncDelta delta,
- final String operation,
- final ProvisioningReport result)
- throws JobExecutionException {
-
- Object output;
- Result resultStatus;
-
- try {
- Realm realm = realmDAO.save(binder.create(profile.getTask().getDestinatioRealm().getFullPath(), realmTO));
-
- PropagationByResource propByRes = new PropagationByResource();
- for (String resource : realm.getResourceKeys()) {
- propByRes.add(ResourceOperation.CREATE, resource);
- }
- List<PropagationTask> tasks = propagationManager.createTasks(realm, propByRes, null);
- taskExecutor.execute(tasks, false);
-
- RealmTO actual = binder.getRealmTO(realm, true);
-
- result.setKey(actual.getKey());
- result.setName(profile.getTask().getDestinatioRealm().getFullPath() + "/" + actual.getName());
-
- output = actual;
- resultStatus = Result.SUCCESS;
-
- for (PullActions action : profile.getActions()) {
- action.after(profile, delta, actual, result);
- }
-
- LOG.debug("Realm {} successfully created", actual.getKey());
- } catch (PropagationException e) {
- // A propagation failure doesn't imply a pull failure.
- // The propagation exception status will be reported into the propagation task execution.
- LOG.error("Could not propagate Realm {}", delta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- } catch (Exception e) {
- throwIgnoreProvisionException(delta, e);
-
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(ExceptionUtils.getRootCauseMessage(e));
- LOG.error("Could not create Realm {} ", delta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- }
-
- finalize(operation, resultStatus, null, output, delta);
- }
-
- private List<ProvisioningReport> update(final SyncDelta delta, final List<String> keys)
- throws JobExecutionException {
-
- if (!profile.getTask().isPerformUpdate()) {
- LOG.debug("PullTask not configured for update");
- finalize(MatchingRule.toEventName(MatchingRule.UPDATE), Result.SUCCESS, null, null, delta);
- return Collections.<ProvisioningReport>emptyList();
- }
-
- LOG.debug("About to update {}", keys);
-
- List<ProvisioningReport> results = new ArrayList<>();
-
- SyncDelta workingDelta = delta;
- for (String key : keys) {
- LOG.debug("About to update {}", key);
-
- ProvisioningReport result = new ProvisioningReport();
- result.setOperation(ResourceOperation.UPDATE);
- result.setAnyType(REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.SUCCESS);
- result.setKey(key);
-
- Realm realm = realmDAO.find(key);
- RealmTO before = binder.getRealmTO(realm, true);
- if (before == null) {
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(String.format("Realm '%s' not found", key));
- } else {
- result.setName(before.getFullPath());
- }
-
- if (!profile.isDryRun()) {
- Result resultStatus;
- Object output;
-
- if (before == null) {
- resultStatus = Result.FAILURE;
- output = null;
- } else {
- try {
- for (PullActions action : profile.getActions()) {
- workingDelta = action.beforeUpdate(profile, workingDelta, before, null);
- }
-
- PropagationByResource propByRes = binder.update(realm, before);
- realm = realmDAO.save(realm);
- RealmTO updated = binder.getRealmTO(realm, true);
-
- List<PropagationTask> tasks = propagationManager.createTasks(realm, propByRes, null);
- taskExecutor.execute(tasks, false);
-
- for (PullActions action : profile.getActions()) {
- action.after(profile, workingDelta, updated, result);
- }
-
- output = updated;
- resultStatus = Result.SUCCESS;
- result.setName(updated.getFullPath());
-
- LOG.debug("{} successfully updated", updated);
- } catch (PropagationException e) {
- // A propagation failure doesn't imply a pull failure.
- // The propagation exception status will be reported into the propagation task execution.
- LOG.error("Could not propagate Realm {}", workingDelta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- } catch (Exception e) {
- throwIgnoreProvisionException(workingDelta, e);
-
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(ExceptionUtils.getRootCauseMessage(e));
- LOG.error("Could not update Realm {}", workingDelta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- }
- }
- finalize(MatchingRule.toEventName(MatchingRule.UPDATE), resultStatus, before, output, workingDelta);
- }
- results.add(result);
- }
-
- return results;
- }
-
- private List<ProvisioningReport> deprovision(final SyncDelta delta, final List<String> keys, final boolean unlink)
- throws JobExecutionException {
-
- if (!profile.getTask().isPerformUpdate()) {
- LOG.debug("PullTask not configured for update");
- finalize(unlink
- ? MatchingRule.toEventName(MatchingRule.UNASSIGN)
- : MatchingRule.toEventName(MatchingRule.DEPROVISION), Result.SUCCESS, null, null, delta);
- return Collections.<ProvisioningReport>emptyList();
- }
-
- LOG.debug("About to deprovision {}", keys);
-
- final List<ProvisioningReport> results = new ArrayList<>();
-
- SyncDelta workingDelta = delta;
- for (String key : keys) {
- LOG.debug("About to unassign resource {}", key);
-
- ProvisioningReport result = new ProvisioningReport();
- result.setOperation(ResourceOperation.DELETE);
- result.setAnyType(REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.SUCCESS);
- result.setKey(key);
-
- Realm realm = realmDAO.find(key);
- RealmTO before = binder.getRealmTO(realm, true);
- if (before == null) {
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(String.format("Realm '%s' not found", key));
- } else {
- result.setName(before.getFullPath());
- }
-
- if (!profile.isDryRun()) {
- Object output;
- Result resultStatus;
-
- if (before == null) {
- resultStatus = Result.FAILURE;
- output = null;
- } else {
- try {
- if (unlink) {
- for (PullActions action : profile.getActions()) {
- workingDelta = action.beforeUnassign(profile, workingDelta, before);
- }
- } else {
- for (PullActions action : profile.getActions()) {
- workingDelta = action.beforeDeprovision(profile, workingDelta, before);
- }
- }
-
- PropagationByResource propByRes = new PropagationByResource();
- propByRes.add(ResourceOperation.DELETE, profile.getTask().getResource().getKey());
- taskExecutor.execute(propagationManager.createTasks(realm, propByRes, null), false);
-
- if (unlink) {
- realm.getResources().remove(profile.getTask().getResource());
- output = binder.getRealmTO(realmDAO.save(realm), true);
- } else {
- output = binder.getRealmTO(realm, true);
- }
-
- for (PullActions action : profile.getActions()) {
- action.after(profile, workingDelta, RealmTO.class.cast(output), result);
- }
-
- resultStatus = Result.SUCCESS;
-
- LOG.debug("{} successfully updated", realm);
- } catch (PropagationException e) {
- // A propagation failure doesn't imply a pull failure.
- // The propagation exception status will be reported into the propagation task execution.
- LOG.error("Could not propagate Realm {}", workingDelta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- } catch (Exception e) {
- throwIgnoreProvisionException(workingDelta, e);
-
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(ExceptionUtils.getRootCauseMessage(e));
- LOG.error("Could not update Realm {}", delta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- }
- }
- finalize(unlink
- ? MatchingRule.toEventName(MatchingRule.UNASSIGN)
- : MatchingRule.toEventName(MatchingRule.DEPROVISION), resultStatus, before, output, delta);
- }
- results.add(result);
- }
-
- return results;
- }
-
- private List<ProvisioningReport> link(final SyncDelta delta, final List<String> keys, final boolean unlink)
- throws JobExecutionException {
-
- if (!profile.getTask().isPerformUpdate()) {
- LOG.debug("PullTask not configured for update");
- finalize(unlink
- ? MatchingRule.toEventName(MatchingRule.UNLINK)
- : MatchingRule.toEventName(MatchingRule.LINK), Result.SUCCESS, null, null, delta);
- return Collections.<ProvisioningReport>emptyList();
- }
-
- LOG.debug("About to link {}", keys);
-
- final List<ProvisioningReport> results = new ArrayList<>();
-
- SyncDelta workingDelta = delta;
- for (String key : keys) {
- LOG.debug("About to unassign resource {}", key);
-
- ProvisioningReport result = new ProvisioningReport();
- result.setOperation(ResourceOperation.NONE);
- result.setAnyType(REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.SUCCESS);
- result.setKey(key);
-
- Realm realm = realmDAO.find(key);
- RealmTO before = binder.getRealmTO(realm, true);
- if (before == null) {
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(String.format("Realm '%s' not found", key));
- } else {
- result.setName(before.getFullPath());
- }
-
- Object output;
- Result resultStatus;
- if (!profile.isDryRun()) {
- if (before == null) {
- resultStatus = Result.FAILURE;
- output = null;
- } else {
- try {
- if (unlink) {
- for (PullActions action : profile.getActions()) {
- workingDelta = action.beforeUnlink(profile, workingDelta, before);
- }
- } else {
- for (PullActions action : profile.getActions()) {
- workingDelta = action.beforeLink(profile, workingDelta, before);
- }
- }
-
- if (unlink) {
- realm.getResources().remove(profile.getTask().getResource());
- } else {
- realm.add(profile.getTask().getResource());
- }
- output = update(workingDelta, Collections.singletonList(key));
-
- for (PullActions action : profile.getActions()) {
- action.after(profile, workingDelta, RealmTO.class.cast(output), result);
- }
-
- resultStatus = Result.SUCCESS;
-
- LOG.debug("{} successfully updated", realm);
- } catch (PropagationException e) {
- // A propagation failure doesn't imply a pull failure.
- // The propagation exception status will be reported into the propagation task execution.
- LOG.error("Could not propagate Realm {}", workingDelta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- } catch (Exception e) {
- throwIgnoreProvisionException(workingDelta, e);
-
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(ExceptionUtils.getRootCauseMessage(e));
- LOG.error("Could not update Realm {}", workingDelta.getUid().getUidValue(), e);
- output = e;
- resultStatus = Result.FAILURE;
- }
- }
- finalize(unlink
- ? MatchingRule.toEventName(MatchingRule.UNLINK)
- : MatchingRule.toEventName(MatchingRule.LINK), resultStatus, before, output, workingDelta);
- }
- results.add(result);
- }
-
- return results;
- }
-
- private List<ProvisioningReport> delete(final SyncDelta delta, final List<String> keys)
- throws JobExecutionException {
-
- if (!profile.getTask().isPerformDelete()) {
- LOG.debug("PullTask not configured for delete");
- finalize(ResourceOperation.DELETE.name().toLowerCase(), Result.SUCCESS, null, null, delta);
- return Collections.<ProvisioningReport>emptyList();
- }
-
- LOG.debug("About to delete {}", keys);
-
- List<ProvisioningReport> results = new ArrayList<>();
-
- SyncDelta workingDelta = delta;
- for (String key : keys) {
- Object output;
- Result resultStatus = Result.FAILURE;
-
- ProvisioningReport result = new ProvisioningReport();
-
- try {
- result.setKey(key);
- result.setOperation(ResourceOperation.DELETE);
- result.setAnyType(REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.SUCCESS);
-
- Realm realm = realmDAO.find(key);
- RealmTO before = binder.getRealmTO(realm, true);
- if (before == null) {
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(String.format("Realm '%s' not found", key));
- } else {
- result.setName(before.getFullPath());
- }
-
- if (!profile.isDryRun()) {
- for (PullActions action : profile.getActions()) {
- workingDelta = action.beforeDelete(profile, workingDelta, before);
- }
-
- try {
- if (!realmDAO.findChildren(realm).isEmpty()) {
- throw SyncopeClientException.build(ClientExceptionType.HasChildren);
- }
-
- Set<String> adminRealms = Collections.singleton(realm.getFullPath());
- AnyCond keyCond = new AnyCond(AttributeCond.Type.ISNOTNULL);
- keyCond.setSchema("key");
- SearchCond allMatchingCond = SearchCond.getLeafCond(keyCond);
- int users = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.USER);
- int groups = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.GROUP);
- int anyObjects = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.ANY_OBJECT);
-
- if (users + groups + anyObjects > 0) {
- SyncopeClientException containedAnys = SyncopeClientException.build(
- ClientExceptionType.AssociatedAnys);
- containedAnys.getElements().add(users + " user(s)");
- containedAnys.getElements().add(groups + " group(s)");
- containedAnys.getElements().add(anyObjects + " anyObject(s)");
- throw containedAnys;
- }
-
- PropagationByResource propByRes = new PropagationByResource();
- for (String resource : realm.getResourceKeys()) {
- propByRes.add(ResourceOperation.DELETE, resource);
- }
- List<PropagationTask> tasks = propagationManager.createTasks(realm, propByRes, null);
- taskExecutor.execute(tasks, false);
-
- realmDAO.delete(realm);
-
- output = null;
- resultStatus = Result.SUCCESS;
-
- for (PullActions action : profile.getActions()) {
- action.after(profile, workingDelta, before, result);
- }
- } catch (Exception e) {
- throwIgnoreProvisionException(workingDelta, e);
-
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(ExceptionUtils.getRootCauseMessage(e));
- LOG.error("Could not delete {}", realm, e);
- output = e;
- }
-
- finalize(ResourceOperation.DELETE.name().toLowerCase(), resultStatus, before, output, workingDelta);
- }
-
- results.add(result);
- } catch (DelegatedAdministrationException e) {
- LOG.error("Not allowed to read Realm {}", key, e);
- } catch (Exception e) {
- LOG.error("Could not delete Realm {}", key, e);
- }
- }
-
- return results;
- }
-
- private ProvisioningReport ignore(
- final SyncDelta delta,
- final boolean matching)
- throws JobExecutionException {
-
- LOG.debug("Any to ignore {}", delta.getObject().getUid().getUidValue());
-
- ProvisioningReport result = new ProvisioningReport();
-
- result.setKey(null);
- result.setName(delta.getObject().getUid().getUidValue());
- result.setOperation(ResourceOperation.NONE);
- result.setAnyType(REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.SUCCESS);
-
- if (!profile.isDryRun()) {
- finalize(matching
- ? MatchingRule.toEventName(MatchingRule.IGNORE)
- : UnmatchingRule.toEventName(UnmatchingRule.IGNORE), Result.SUCCESS, null, null, delta);
- }
-
- return result;
- }
-
- private void doHandle(final SyncDelta delta, final OrgUnit orgUnit) throws JobExecutionException {
- LOG.debug("Process {} for {} as {}",
- delta.getDeltaType(), delta.getUid().getUidValue(), delta.getObject().getObjectClass());
-
- String uid = delta.getPreviousUid() == null
- ? delta.getUid().getUidValue()
- : delta.getPreviousUid().getUidValue();
-
- List<String> keys = pullUtils.findExisting(uid, delta.getObject(), orgUnit);
- LOG.debug("Match found for {} as {}: {}",
- delta.getUid().getUidValue(), delta.getObject().getObjectClass(), keys);
-
- if (keys.size() > 1) {
- switch (profile.getResAct()) {
- case IGNORE:
- throw new IllegalStateException("More than one match " + keys);
-
- case FIRSTMATCH:
- keys = keys.subList(0, 1);
- break;
-
- case LASTMATCH:
- keys = keys.subList(keys.size() - 1, keys.size());
- break;
-
- default:
- // keep keys unmodified
- }
- }
-
- try {
- if (SyncDeltaType.CREATE_OR_UPDATE == delta.getDeltaType()) {
- if (keys.isEmpty()) {
- switch (profile.getTask().getUnmatchingRule()) {
- case ASSIGN:
- profile.getResults().addAll(assign(delta, orgUnit));
- break;
-
- case PROVISION:
- profile.getResults().addAll(provision(delta, orgUnit));
- break;
-
- case IGNORE:
- profile.getResults().add(ignore(delta, false));
- break;
-
- default:
- // do nothing
- }
- } else {
- switch (profile.getTask().getMatchingRule()) {
- case UPDATE:
- profile.getResults().addAll(update(delta, keys));
- break;
-
- case DEPROVISION:
- profile.getResults().addAll(deprovision(delta, keys, false));
- break;
-
- case UNASSIGN:
- profile.getResults().addAll(deprovision(delta, keys, true));
- break;
-
- case LINK:
- profile.getResults().addAll(link(delta, keys, false));
- break;
-
- case UNLINK:
- profile.getResults().addAll(link(delta, keys, true));
- break;
-
- case IGNORE:
- profile.getResults().add(ignore(delta, true));
- break;
-
- default:
- // do nothing
- }
- }
- } else if (SyncDeltaType.DELETE == delta.getDeltaType()) {
- if (keys.isEmpty()) {
- finalize(ResourceOperation.DELETE.name().toLowerCase(), Result.SUCCESS, null, null, delta);
- LOG.debug("No match found for deletion");
- } else {
- profile.getResults().addAll(delete(delta, keys));
- }
- }
- } catch (IllegalStateException | IllegalArgumentException e) {
- LOG.warn(e.getMessage());
- }
- }
-
- private void finalize(
- final String event,
- final Result result,
- final Object before,
- final Object output,
- final SyncDelta delta) {
-
- synchronized (this) {
- this.latestResult = result;
- }
-
- notificationManager.createTasks(AuditElements.EventCategoryType.PULL,
- REALM_TYPE.toLowerCase(),
- profile.getTask().getResource().getKey(),
- event,
- result,
- before,
- output,
- delta);
-
- auditManager.audit(AuditElements.EventCategoryType.PULL,
- REALM_TYPE.toLowerCase(),
- profile.getTask().getResource().getKey(),
- event,
- result,
- before,
- output,
- delta);
- }
-}
http://git-wip-us.apache.org/repos/asf/syncope/blob/9c289134/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
deleted file mode 100644
index 655f0c5..0000000
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
+++ /dev/null
@@ -1,450 +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.pushpull;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.common.lib.types.AuditElements.Result;
-import org.apache.syncope.common.lib.types.MatchingRule;
-import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
-import org.apache.syncope.core.provisioning.api.PropagationByResource;
-import org.apache.syncope.common.lib.types.ResourceOperation;
-import org.apache.syncope.common.lib.types.UnmatchingRule;
-import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.resource.Item;
-import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
-import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem;
-import org.apache.syncope.core.persistence.api.entity.task.PushTask;
-import org.apache.syncope.core.provisioning.api.MappingManager;
-import org.apache.syncope.core.provisioning.api.TimeoutException;
-import org.apache.syncope.core.provisioning.api.event.AfterHandlingEvent;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
-import org.apache.syncope.core.provisioning.api.pushpull.IgnoreProvisionException;
-import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport;
-import org.apache.syncope.core.provisioning.api.pushpull.PushActions;
-import org.apache.syncope.core.provisioning.api.pushpull.SyncopePushResultHandler;
-import org.apache.syncope.core.provisioning.java.job.AfterHandlingJob;
-import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
-import org.identityconnectors.framework.common.objects.AttributeBuilder;
-import org.identityconnectors.framework.common.objects.ConnectorObject;
-import org.identityconnectors.framework.common.objects.ObjectClass;
-import org.quartz.JobExecutionException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-public class RealmPushResultHandlerImpl
- extends AbstractRealmResultHandler<PushTask, PushActions>
- implements SyncopePushResultHandler {
-
- @Autowired
- private MappingManager mappingManager;
-
- @Autowired
- private SchedulerFactoryBean scheduler;
-
- @Transactional(propagation = Propagation.REQUIRES_NEW)
- @Override
- public boolean handle(final String realmKey) {
- Realm realm = null;
- try {
- realm = realmDAO.find(realmKey);
- doHandle(realm);
- return true;
- } catch (IgnoreProvisionException e) {
- ProvisioningReport result = new ProvisioningReport();
- result.setOperation(ResourceOperation.NONE);
- result.setAnyType(realm == null ? null : REALM_TYPE);
- result.setStatus(ProvisioningReport.Status.IGNORE);
- result.setKey(realmKey);
- profile.getResults().add(result);
-
- LOG.warn("Ignoring during push", e);
- return true;
- } catch (JobExecutionException e) {
- LOG.error("Push failed", e);
- return false;
- }
- }
-
- private void reportPropagation(final ProvisioningReport result, final PropagationReporter reporter) {
- if (!reporter.getStatuses().isEmpty()) {
- result.setStatus(toProvisioningReportStatus(reporter.getStatuses().get(0).getStatus()));
- result.setMessage(reporter.getStatuses().get(0).getFailureReason());
- }
- }
-
- private Realm update(final RealmTO realmTO, final ProvisioningReport result) {
- Realm realm = realmDAO.findByFullPath(realmTO.getFullPath());
- PropagationByResource propByRes = binder.update(realm, realmTO);
- realm = realmDAO.save(realm);
-
- PropagationReporter reporter = taskExecutor.execute(
- propagationManager.createTasks(realm, propByRes, null), false);
- reportPropagation(result, reporter);
-
- return realm;
- }
-
- private void deprovision(final Realm realm, final ProvisioningReport result) {
- List<String> noPropResources = new ArrayList<>(realm.getResourceKeys());
- noPropResources.remove(profile.getTask().getResource().getKey());
-
- PropagationByResource propByRes = new PropagationByResource();
- propByRes.addAll(ResourceOperation.DELETE, realm.getResourceKeys());
-
- PropagationReporter reporter = taskExecutor.execute(
- propagationManager.createTasks(realm, propByRes, noPropResources), false);
- reportPropagation(result, reporter);
- }
-
- private void provision(final Realm realm, final ProvisioningReport result) {
- List<String> noPropResources = new ArrayList<>(realm.getResourceKeys());
- noPropResources.remove(profile.getTask().getResource().getKey());
-
- PropagationByResource propByRes = new PropagationByResource();
- propByRes.add(ResourceOperation.CREATE, profile.getTask().getResource().getKey());
-
- PropagationReporter reporter = taskExecutor.execute(
- propagationManager.createTasks(realm, propByRes, noPropResources), false);
- reportPropagation(result, reporter);
- }
-
- private void link(final Realm realm, final boolean unlink, final ProvisioningReport result) {
- RealmTO realmTO = binder.getRealmTO(realm, true);
- if (unlink) {
- realmTO.getResources().remove(profile.getTask().getResource().getKey());
- } else {
- realmTO.getResources().add(profile.getTask().getResource().getKey());
- }
-
- update(realmTO, result);
- }
-
- private void unassign(final Realm realm, final ProvisioningReport result) {
- RealmTO realmTO = binder.getRealmTO(realm, true);
- realmTO.getResources().remove(profile.getTask().getResource().getKey());
-
- deprovision(update(realmTO, result), result);
- }
-
- private void assign(final Realm realm, final ProvisioningReport result) {
- RealmTO realmTO = binder.getRealmTO(realm, true);
- realmTO.getResources().add(profile.getTask().getResource().getKey());
-
- provision(update(realmTO, result), result);
- }
-
- protected ConnectorObject getRemoteObject(
- final ObjectClass objectClass,
- final String connObjectKey,
- final String connObjectKeyValue,
- final Iterator<? extends Item> iterator) {
-
- ConnectorObject obj = null;
- try {
- obj = profile.getConnector().getObject(
- objectClass,
- AttributeBuilder.build(connObjectKey, connObjectKeyValue),
- MappingUtils.buildOperationOptions(iterator));
- } catch (TimeoutException toe) {
- LOG.debug("Request timeout", toe);
- throw toe;
- } catch (RuntimeException ignore) {
- LOG.debug("While resolving {}", connObjectKeyValue, ignore);
- }
-
- return obj;
- }
-
- private void doHandle(final Realm realm) throws JobExecutionException {
- ProvisioningReport result = new ProvisioningReport();
- profile.getResults().add(result);
-
- result.setKey(realm.getKey());
- result.setAnyType(REALM_TYPE);
- result.setName(realm.getFullPath());
-
- LOG.debug("Propagating Realm with key {} towards {}", realm.getKey(), profile.getTask().getResource());
-
- Object output = null;
- Result resultStatus = null;
-
- // Try to read remote object BEFORE any actual operation
- OrgUnit orgUnit = profile.getTask().getResource().getOrgUnit();
- Optional<? extends OrgUnitItem> connObjectKey = orgUnit.getConnObjectKeyItem();
- String connObjecKeyValue = mappingManager.getConnObjectKeyValue(realm, orgUnit);
-
- ConnectorObject beforeObj = getRemoteObject(
- orgUnit.getObjectClass(),
- connObjectKey.get().getExtAttrName(),
- connObjecKeyValue,
- orgUnit.getItems().iterator());
-
- if (profile.isDryRun()) {
- if (beforeObj == null) {
- result.setOperation(toResourceOperation(profile.getTask().getUnmatchingRule()));
- } else {
- result.setOperation(toResourceOperation(profile.getTask().getMatchingRule()));
- }
- result.setStatus(ProvisioningReport.Status.SUCCESS);
- } else {
- String operation = beforeObj == null
- ? UnmatchingRule.toEventName(profile.getTask().getUnmatchingRule())
- : MatchingRule.toEventName(profile.getTask().getMatchingRule());
-
- boolean notificationsAvailable = notificationManager.notificationsAvailable(
- AuditElements.EventCategoryType.PUSH,
- REALM_TYPE.toLowerCase(),
- profile.getTask().getResource().getKey(),
- operation);
- boolean auditRequested = auditManager.auditRequested(
- AuditElements.EventCategoryType.PUSH,
- REALM_TYPE.toLowerCase(),
- profile.getTask().getResource().getKey(),
- operation);
- try {
- if (beforeObj == null) {
- result.setOperation(toResourceOperation(profile.getTask().getUnmatchingRule()));
-
- switch (profile.getTask().getUnmatchingRule()) {
- case ASSIGN:
- for (PushActions action : profile.getActions()) {
- action.beforeAssign(profile, realm);
- }
-
- if (!profile.getTask().isPerformCreate()) {
- LOG.debug("PushTask not configured for create");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- assign(realm, result);
- }
-
- break;
-
- case PROVISION:
- for (PushActions action : profile.getActions()) {
- action.beforeProvision(profile, realm);
- }
-
- if (!profile.getTask().isPerformCreate()) {
- LOG.debug("PushTask not configured for create");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- provision(realm, result);
- }
-
- break;
-
- case UNLINK:
- for (PushActions action : profile.getActions()) {
- action.beforeUnlink(profile, realm);
- }
-
- if (!profile.getTask().isPerformUpdate()) {
- LOG.debug("PushTask not configured for update");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- link(realm, true, result);
- }
-
- break;
-
- case IGNORE:
- LOG.debug("Ignored any: {}", realm);
- result.setStatus(ProvisioningReport.Status.IGNORE);
- break;
-
- default:
- // do nothing
- }
- } else {
- result.setOperation(toResourceOperation(profile.getTask().getMatchingRule()));
-
- switch (profile.getTask().getMatchingRule()) {
- case UPDATE:
- for (PushActions action : profile.getActions()) {
- action.beforeUpdate(profile, realm);
- }
- if (!profile.getTask().isPerformUpdate()) {
- LOG.debug("PushTask not configured for update");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- update(binder.getRealmTO(realm, true), result);
- }
-
- break;
-
- case DEPROVISION:
- for (PushActions action : profile.getActions()) {
- action.beforeDeprovision(profile, realm);
- }
-
- if (!profile.getTask().isPerformDelete()) {
- LOG.debug("PushTask not configured for delete");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- deprovision(realm, result);
- }
-
- break;
-
- case UNASSIGN:
- for (PushActions action : profile.getActions()) {
- action.beforeUnassign(profile, realm);
- }
-
- if (!profile.getTask().isPerformDelete()) {
- LOG.debug("PushTask not configured for delete");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- unassign(realm, result);
- }
-
- break;
-
- case LINK:
- for (PushActions action : profile.getActions()) {
- action.beforeLink(profile, realm);
- }
-
- if (!profile.getTask().isPerformUpdate()) {
- LOG.debug("PushTask not configured for update");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- link(realm, false, result);
- }
-
- break;
-
- case UNLINK:
- for (PushActions action : profile.getActions()) {
- action.beforeUnlink(profile, realm);
- }
-
- if (!profile.getTask().isPerformUpdate()) {
- LOG.debug("PushTask not configured for update");
- result.setStatus(ProvisioningReport.Status.IGNORE);
- } else {
- link(realm, true, result);
- }
-
- break;
-
- case IGNORE:
- LOG.debug("Ignored any: {}", realm);
- result.setStatus(ProvisioningReport.Status.IGNORE);
- break;
-
- default:
- // do nothing
- }
- }
-
- for (PushActions action : profile.getActions()) {
- action.after(profile, realm, result);
- }
-
- if (result.getStatus() == null) {
- result.setStatus(ProvisioningReport.Status.SUCCESS);
- }
- resultStatus = AuditElements.Result.SUCCESS;
- output = getRemoteObject(
- orgUnit.getObjectClass(),
- connObjectKey.get().getExtAttrName(),
- connObjecKeyValue,
- orgUnit.getItems().iterator());
- } catch (IgnoreProvisionException e) {
- throw e;
- } catch (Exception e) {
- result.setStatus(ProvisioningReport.Status.FAILURE);
- result.setMessage(ExceptionUtils.getRootCauseMessage(e));
- resultStatus = AuditElements.Result.FAILURE;
- output = e;
-
- LOG.warn("Error pushing {} towards {}", realm, profile.getTask().getResource(), e);
-
- for (PushActions action : profile.getActions()) {
- action.onError(profile, realm, result, e);
- }
-
- throw new JobExecutionException(e);
- } finally {
- if (notificationsAvailable || auditRequested) {
- Map<String, Object> jobMap = new HashMap<>();
- jobMap.put(AfterHandlingEvent.JOBMAP_KEY, new AfterHandlingEvent(
- AuditElements.EventCategoryType.PUSH,
- REALM_TYPE.toLowerCase(),
- profile.getTask().getResource().getKey(),
- operation,
- resultStatus,
- beforeObj,
- output,
- realm));
- AfterHandlingJob.schedule(scheduler, jobMap);
- }
- }
- }
- }
-
- private ResourceOperation toResourceOperation(final UnmatchingRule rule) {
- switch (rule) {
- case ASSIGN:
- case PROVISION:
- return ResourceOperation.CREATE;
- default:
- return ResourceOperation.NONE;
- }
- }
-
- private ResourceOperation toResourceOperation(final MatchingRule rule) {
- switch (rule) {
- case UPDATE:
- return ResourceOperation.UPDATE;
- case DEPROVISION:
- case UNASSIGN:
- return ResourceOperation.DELETE;
- default:
- return ResourceOperation.NONE;
- }
- }
-
- private ProvisioningReport.Status toProvisioningReportStatus(final PropagationTaskExecStatus status) {
- switch (status) {
- case FAILURE:
- return ProvisioningReport.Status.FAILURE;
-
- case SUCCESS:
- return ProvisioningReport.Status.SUCCESS;
-
- case CREATED:
- case NOT_ATTEMPTED:
- default:
- return ProvisioningReport.Status.IGNORE;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/syncope/blob/9c289134/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
deleted file mode 100644
index fa299a0..0000000
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
+++ /dev/null
@@ -1,134 +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.pushpull;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.PropagationStatus;
-import org.apache.syncope.common.lib.to.UserTO;
-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.UserProvisioningManager;
-import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport;
-import org.identityconnectors.framework.common.objects.SyncDelta;
-import org.apache.syncope.core.provisioning.api.pushpull.UserPullResultHandler;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class UserPullResultHandlerImpl extends AbstractPullResultHandler implements UserPullResultHandler {
-
- @Autowired
- private UserProvisioningManager userProvisioningManager;
-
- @Override
- protected AnyUtils getAnyUtils() {
- return anyUtilsFactory.getInstance(AnyTypeKind.USER);
- }
-
- @Override
- protected String getName(final AnyTO anyTO) {
- return UserTO.class.cast(anyTO).getUsername();
- }
-
- @Override
- protected ProvisioningManager<?, ?> getProvisioningManager() {
- return userProvisioningManager;
- }
-
- @Override
- protected Any<?> getAny(final String key) {
- try {
- return userDAO.authFind(key);
- } catch (Exception e) {
- LOG.warn("Error retrieving user {}", key, e);
- return null;
- }
- }
-
- @Override
- protected AnyTO getAnyTO(final String key) {
- return userDataBinder.getUserTO(key);
- }
-
- @Override
- protected AnyPatch newPatch(final String key) {
- UserPatch patch = new UserPatch();
- patch.setKey(key);
- return patch;
- }
-
- @Override
- protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
- WorkflowResult<Pair<UserPatch, Boolean>> update = uwfAdapter.update((UserPatch) patch);
- return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
- }
-
- @Override
- protected AnyTO doCreate(final AnyTO anyTO, final SyncDelta delta) {
- UserTO userTO = UserTO.class.cast(anyTO);
-
- Boolean enabled = pullUtils.readEnabled(delta.getObject(), profile.getTask());
- Map.Entry<String, List<PropagationStatus>> created =
- userProvisioningManager.create(userTO, true, true, enabled,
- Collections.singleton(profile.getTask().getResource().getKey()), true);
-
- return getAnyTO(created.getKey());
- }
-
- @Override
- protected AnyPatch doUpdate(
- final AnyTO before,
- final AnyPatch anyPatch,
- final SyncDelta delta,
- final ProvisioningReport result) {
-
- UserPatch userPatch = UserPatch.class.cast(anyPatch);
- Boolean enabled = pullUtils.readEnabled(delta.getObject(), profile.getTask());
-
- Pair<UserPatch, List<PropagationStatus>> updated = userProvisioningManager.update(
- userPatch,
- result,
- enabled,
- Collections.singleton(profile.getTask().getResource().getKey()),
- true);
-
- return updated.getLeft();
- }
-
- @Override
- protected void doDelete(final AnyTypeKind kind, final String key) {
- try {
- userProvisioningManager.delete(
- key, Collections.<String>singleton(profile.getTask().getResource().getKey()), true);
- } catch (Exception e) {
- // A propagation failure doesn't imply a pull failure.
- // The propagation exception status will be reported into the propagation task execution.
- LOG.error("Could not propagate user " + key, e);
- }
-
- uwfAdapter.delete(key);
- }
-}
http://git-wip-us.apache.org/repos/asf/syncope/blob/9c289134/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
deleted file mode 100644
index b89850f..0000000
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
+++ /dev/null
@@ -1,99 +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.pushpull;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.patch.AnyPatch;
-import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.provisioning.api.PropagationByResource;
-import org.apache.syncope.common.lib.types.ResourceOperation;
-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.user.User;
-import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
-import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport;
-import org.apache.syncope.core.provisioning.api.pushpull.UserPushResultHandler;
-
-public class UserPushResultHandlerImpl extends AbstractPushResultHandler implements UserPushResultHandler {
-
- @Override
- protected AnyUtils getAnyUtils() {
- return anyUtilsFactory.getInstance(AnyTypeKind.USER);
- }
-
- @Override
- protected void provision(final Any<?> any, final Boolean enabled, final ProvisioningReport result) {
- AnyTO before = getAnyTO(any.getKey());
-
- List<String> noPropResources = new ArrayList<>(before.getResources());
- noPropResources.remove(profile.getTask().getResource().getKey());
-
- PropagationByResource propByRes = new PropagationByResource();
- propByRes.add(ResourceOperation.CREATE, profile.getTask().getResource().getKey());
-
- PropagationReporter reporter = taskExecutor.execute(propagationManager.getUserCreateTasks(
- before.getKey(),
- null,
- enabled,
- propByRes,
- before.getVirAttrs(),
- noPropResources),
- false);
- reportPropagation(result, reporter);
- }
-
- @Override
- protected String getName(final Any<?> any) {
- return User.class.cast(any).getUsername();
- }
-
- @Override
- protected Any<?> getAny(final String key) {
- try {
- return userDAO.authFind(key);
- } catch (Exception e) {
- LOG.warn("Error retrieving user {}", key, e);
- return null;
- }
- }
-
- @Override
- protected AnyTO getAnyTO(final String key) {
- return userDataBinder.getUserTO(key);
- }
-
- @Override
- protected AnyPatch newPatch(final String key) {
- UserPatch patch = new UserPatch();
- patch.setKey(key);
- return patch;
- }
-
- @Override
- protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
- WorkflowResult<Pair<UserPatch, Boolean>> update = uwfAdapter.update((UserPatch) patch);
- return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
- }
-
-}