if (!syncTask.isPerformCreate()) {
LOG.debug("SyncTask not configured for create");
return Collections.<SyncResult>emptyList();
}
final SyncResult result = new SyncResult();
result.setOperation(ResourceOperation.CREATE);
result.setSubjectType(attrUtil.getType());
result.setStatus(SyncResult.Status.SUCCESS);
AbstractAttributableTO subjectTO = connObjectUtil.getAttributableTO(delta.getObject(), syncTask, attrUtil);
delta = actions.beforeCreate(this, delta, subjectTO);
if (dryRun) {
result.setId(0L);
if (subjectTO instanceof UserTO) {
result.setName(((UserTO) subjectTO).getUsername());
}
if (subjectTO instanceof RoleTO) {
result.setName(((RoleTO) subjectTO).getName());
}
} else {
try {
if (AttributableType.USER == attrUtil.getType()) {
Boolean enabled = readEnabled(delta.getObject());
WorkflowResult<Map.Entry<Long, Boolean>> created =
uwfAdapter.create((UserTO) subjectTO, true, enabled);
List<PropagationTask> tasks = propagationManager.getUserCreateTaskIds(created,
((UserTO) subjectTO).getPassword(), subjectTO.getVirtualAttributes(),
Collections.singleton(syncTask.getResource().getName()));
taskExecutor.execute(tasks);
notificationManager.createTasks(created.getResult().getKey(), created.getPerformedTasks());
subjectTO = userDataBinder.getUserTO(created.getResult().getKey());
result.setId(created.getResult().getKey());
result.setName(((UserTO) subjectTO).getUsername());
}
if (AttributableType.ROLE == attrUtil.getType()) {
WorkflowResult<Long> created = rwfAdapter.create((RoleTO) subjectTO);
AttributeTO roleOwner = subjectTO.getAttributeMap().get(StringUtils.EMPTY);
if (roleOwner != null) {
roleOwnerMap.put(created.getResult(), roleOwner.getValues().iterator().next());
}
EntitlementUtil.extendAuthContext(created.getResult());
List<PropagationTask> tasks = propagationManager.getRoleCreateTaskIds(created,
subjectTO.getVirtualAttributes(), Collections.singleton(syncTask.getResource().getName()));
taskExecutor.execute(tasks);
subjectTO = roleDataBinder.getRoleTO(created.getResult());
result.setId(created.getResult());
result.setName(((RoleTO) subjectTO).getName());
}
} 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 {} {}", attrUtil.getType(), delta.getUid().getUidValue(), e);
} catch (Exception e) {
result.setStatus(SyncResult.Status.FAILURE);
result.setMessage(e.getMessage());
LOG.error("Could not create {} {} ", attrUtil.getType(), delta.getUid().getUidValue(), e);
}
}
actions.after(this, delta, subjectTO, result);