protected UserTO updateUser(final Long id, SyncDelta delta, final boolean dryRun, final SyncResult result)
throws Exception {
UserTO userTO = userDataBinder.getUserTO(id);
UserMod userMod = connObjectUtil.getAttributableMod(
id, delta.getObject(), userTO, syncTask, AttributableUtil.getInstance(AttributableType.USER));
delta = actions.beforeUpdate(this, delta, userTO, userMod);
if (dryRun) {
return userTO;
}
WorkflowResult<Map.Entry<Long, Boolean>> updated;
try {
updated = uwfAdapter.update(userMod);
} catch (Exception e) {
LOG.error("Update of user {} failed, trying to sync its status anyway (if configured)", id, e);
result.setStatus(SyncResult.Status.FAILURE);
result.setMessage("Update failed, trying to sync status anyway (if configured)\n" + e.getMessage());
updated = new WorkflowResult<Map.Entry<Long, Boolean>>(
new AbstractMap.SimpleEntry<Long, Boolean>(id, false), new PropagationByResource(),
new HashSet<String>());
}
Boolean enabled = readEnabled(delta.getObject());
if (enabled != null) {
SyncopeUser user = userDAO.find(id);
WorkflowResult<Long> enableUpdate = null;
if (user.isSuspended() == null) {
enableUpdate = uwfAdapter.activate(id, null);
} else if (enabled && user.isSuspended()) {
enableUpdate = uwfAdapter.reactivate(id);
} else if (!enabled && !user.isSuspended()) {
enableUpdate = uwfAdapter.suspend(id);
}
if (enableUpdate != null) {
if (enableUpdate.getPropByRes() != null) {
updated.getPropByRes().merge(enableUpdate.getPropByRes());
updated.getPropByRes().purge();
}
updated.getPerformedTasks().addAll(enableUpdate.getPerformedTasks());
}
}
List<PropagationTask> tasks = propagationManager.getUserUpdateTaskIds(updated,
userMod.getPassword(),
userMod.getVirtualAttributesToBeRemoved(),
userMod.getVirtualAttributesToBeUpdated(),
Collections.singleton(syncTask.getResource().getName()));
taskExecutor.execute(tasks);
notificationManager.createTasks(updated.getResult().getKey(), updated.getPerformedTasks());