org.apache.syncope.core.sync.impl.UserSyncResultHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.syncope.core.sync.impl.UserSyncResultHandler.java

Source

/*
 * 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.sync.impl;

import static org.apache.syncope.core.sync.impl.AbstractSyncopeResultHandler.LOG;

import java.util.AbstractMap;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.syncope.common.mod.AbstractSubjectMod;
import org.apache.syncope.common.mod.UserMod;
import org.apache.syncope.common.to.AbstractSubjectTO;
import org.apache.syncope.common.to.UserTO;
import org.apache.syncope.common.types.AttributableType;
import org.apache.syncope.core.persistence.beans.PropagationTask;
import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
import org.apache.syncope.core.propagation.PropagationByResource;
import org.apache.syncope.core.sync.SyncResult;
import org.apache.syncope.core.util.AttributableUtil;
import org.apache.syncope.core.workflow.WorkflowResult;
import org.identityconnectors.framework.common.objects.SyncDelta;

public class UserSyncResultHandler extends AbstractSubjectSyncResultHandler {

    @Override
    protected AttributableUtil getAttributableUtil() {
        return AttributableUtil.getInstance(AttributableType.USER);
    }

    @Override
    protected String getName(final AbstractSubjectTO subjectTO) {
        return UserTO.class.cast(subjectTO).getUsername();
    }

    @Override
    protected AbstractSubjectTO getSubjectTO(final long id) {
        try {
            return userDataBinder.getUserTO(id);
        } catch (Exception e) {
            LOG.warn("Error retrieving user {}", id, e);
            return null;
        }
    }

    @Override
    protected AbstractSubjectMod getSubjectMod(final AbstractSubjectTO subjectTO, final SyncDelta delta) {

        return connObjectUtil.getAttributableMod(subjectTO.getId(), delta.getObject(), subjectTO,
                profile.getSyncTask(), AttributableUtil.getInstance(AttributableType.USER));
    }

    @Override
    protected AbstractSubjectTO create(final AbstractSubjectTO subjectTO, final SyncDelta delta,
            final SyncResult result) {

        UserTO userTO = UserTO.class.cast(subjectTO);

        Boolean enabled = syncUtilities.readEnabled(delta.getObject(), profile.getSyncTask());
        WorkflowResult<Map.Entry<Long, Boolean>> created = uwfAdapter.create(userTO, true, enabled);

        List<PropagationTask> tasks = propagationManager.getUserCreateTaskIds(created, userTO.getPassword(),
                userTO.getVirAttrs(), Collections.singleton(profile.getSyncTask().getResource().getName()),
                userTO.getMemberships());

        taskExecutor.execute(tasks);

        userTO = userDataBinder.getUserTO(created.getResult().getKey());

        result.setId(created.getResult().getKey());

        return userTO;
    }

    @Override
    protected AbstractSubjectTO link(final AbstractSubjectTO before, final SyncResult result, final boolean unlink)
            throws Exception {

        final UserMod userMod = new UserMod();
        userMod.setId(before.getId());

        if (unlink) {
            userMod.getResourcesToRemove().add(profile.getSyncTask().getResource().getName());
        } else {
            userMod.getResourcesToAdd().add(profile.getSyncTask().getResource().getName());
        }

        return userDataBinder.getUserTO(uwfAdapter.update(userMod).getResult().getKey().getId());
    }

    @Override
    protected AbstractSubjectTO update(final AbstractSubjectTO before, final AbstractSubjectMod subjectMod,
            final SyncDelta delta, final SyncResult result) throws Exception {

        final UserMod userMod = UserMod.class.cast(subjectMod);

        WorkflowResult<Map.Entry<UserMod, Boolean>> updated;
        try {
            updated = uwfAdapter.update(userMod);
        } catch (Exception e) {
            LOG.error("Update of user {} failed, trying to sync its status anyway (if configured)", before.getId(),
                    e);

            result.setStatus(SyncResult.Status.FAILURE);
            result.setMessage("Update failed, trying to sync status anyway (if configured)\n"
                    + ExceptionUtils.getRootCauseMessage(e));

            updated = new WorkflowResult<Map.Entry<UserMod, Boolean>>(
                    new AbstractMap.SimpleEntry<UserMod, Boolean>(userMod, false), new PropagationByResource(),
                    new HashSet<String>());
        }

        final Boolean enabled = syncUtilities.readEnabled(delta.getObject(), profile.getSyncTask());
        if (enabled != null) {
            SyncopeUser user = userDAO.find(before.getId());

            WorkflowResult<Long> enableUpdate = null;
            if (user.isSuspended() == null) {
                enableUpdate = uwfAdapter.activate(before.getId(), null);
            } else if (enabled && user.isSuspended()) {
                enableUpdate = uwfAdapter.reactivate(before.getId());
            } else if (!enabled && !user.isSuspended()) {
                enableUpdate = uwfAdapter.suspend(before.getId());
            }

            if (enableUpdate != null) {
                if (enableUpdate.getPropByRes() != null) {
                    updated.getPropByRes().merge(enableUpdate.getPropByRes());
                    updated.getPropByRes().purge();
                }
                updated.getPerformedTasks().addAll(enableUpdate.getPerformedTasks());
            }
        }

        final List<PropagationTask> tasks = propagationManager.getUserUpdateTaskIds(updated,
                updated.getResult().getKey().getPassword() != null,
                Collections.singleton(profile.getSyncTask().getResource().getName()));

        taskExecutor.execute(tasks);

        return userDataBinder.getUserTO(updated.getResult().getKey().getId());
    }

    @Override
    protected void deprovision(final Long id, final boolean unlink) {

        taskExecutor.execute(
                propagationManager.getUserDeleteTaskIds(id, profile.getSyncTask().getResource().getName()));

        if (unlink) {
            final UserMod userMod = new UserMod();
            userMod.setId(id);
            userMod.getResourcesToRemove().add(profile.getSyncTask().getResource().getName());
        }
    }

    @Override
    protected void delete(final Long id) {
        try {
            taskExecutor.execute(
                    propagationManager.getUserDeleteTaskIds(id, profile.getSyncTask().getResource().getName()));
        } 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 user " + id, e);
        }

        uwfAdapter.delete(id);
    }
}