public ConstraintsCheckingResult check(Task task, OperationResult result) throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException {
constraintsCheckingResult = new ConstraintsCheckingResult();
constraintsCheckingResult.setSatisfiesConstraints(true);
PrismContainer<?> attributesContainer = shadowObject.findContainer(ShadowType.F_ATTRIBUTES);
if (attributesContainer == null) {
LOGGER.trace("Current shadow does not contain attributes, skipping checking uniqueness.");
return constraintsCheckingResult;
}
RefinedObjectClassDefinition objectClassDefinition = provisioningContext.getObjectClassDefinition();
Collection<? extends ResourceAttributeDefinition> uniqueAttributeDefs = MiscUtil.unionExtends(objectClassDefinition.getPrimaryIdentifiers(),
objectClassDefinition.getSecondaryIdentifiers());
LOGGER.trace("Checking uniquenss of attributes: {}", uniqueAttributeDefs);
for (ResourceAttributeDefinition attrDef: uniqueAttributeDefs) {
PrismProperty<?> attr = attributesContainer.findProperty(attrDef.getName());
LOGGER.trace("Attempt to check uniqueness of {} (def {})", attr, attrDef);
if (attr == null) {
continue;
}
constraintsCheckingResult.getCheckedAttributes().add(attr.getElementName());
boolean unique = checkAttributeUniqueness(attr, objectClassDefinition, provisioningContext.getResource(), shadowOid, task, result);
if (!unique) {
LOGGER.debug("Attribute {} conflicts with existing object (in {})", attr, provisioningContext.getShadowCoordinates());
constraintsCheckingResult.getConflictingAttributes().add(attr.getElementName());
constraintsCheckingResult.setSatisfiesConstraints(false);
}
}
constraintsCheckingResult.setMessages(messageBuilder.toString());
return constraintsCheckingResult;
}