in scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java [605:660]
private static List<UnresolvedComplex> resolveAttribute(List<UnresolvedComplex> unresolveds, Object attributeValue, Schema.Attribute attribute, Map<String, BulkOperation> bulkIdKeyToOperationResult) throws UnresolvableOperationException {
if (attributeValue == null) {
return unresolveds;
}
Set<Schema.Attribute> attributes = attribute.getAttributes();
for (Schema.Attribute subAttribute : attributes) {
Schema.AttributeAccessor accessor = subAttribute.getAccessor();
if (subAttribute.isScimResourceIdReference()) {
// TODO - This will fail if field is a char or Character array
String bulkIdKey = accessor.get(attributeValue);
if (bulkIdKey != null && bulkIdKey.startsWith("bulkId:")) {
log.debug("Found bulkId: {}", bulkIdKey);
if (bulkIdKeyToOperationResult.containsKey(bulkIdKey)) {
BulkOperation resolvedOperationResult = bulkIdKeyToOperationResult.get(bulkIdKey);
BaseResource response = resolvedOperationResult.getResponse();
ScimResource resolvedResource = resolvedOperationResult.getData();
if ((response == null || !(response instanceof ErrorResponse)) && resolvedResource != null && resolvedResource.getId() != null) {
String resolvedId = resolvedResource.getId();
accessor.set(attributeValue, resolvedId);
} else {
UnresolvedComplex unresolved = new UnresolvedComplex(attributeValue, accessor, bulkIdKey);
unresolveds.add(unresolved);
}
} else {
throw new UnresolvableOperationException(String.format(BULK_ID_DOES_NOT_EXIST, bulkIdKey));
}
}
} else if (subAttribute.getType() == Schema.Attribute.Type.COMPLEX) {
Object subFieldValue = accessor.get(attributeValue);
if (subFieldValue != null) {
Class<?> subFieldClass = subFieldValue.getClass();
boolean isCollection = Collection.class.isAssignableFrom(subFieldClass);
if (isCollection || subFieldClass.isArray()) {
@SuppressWarnings("unchecked")
Collection<Object> subFieldValues = isCollection ? (Collection<Object>) subFieldValue : Arrays.asList((Object[]) subFieldValue);
for (Object subArrayFieldValue : subFieldValues) {
resolveAttribute(unresolveds, subArrayFieldValue, subAttribute, bulkIdKeyToOperationResult);
}
} else {
resolveAttribute(unresolveds, subFieldValue, subAttribute, bulkIdKeyToOperationResult);
}
}
}
}
log.debug("Resolved attribute had {} unresolved fields", unresolveds.size());
return unresolveds;
}