in scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java [672:737]
private void resolveTopLevel(List<IWishJavaHadTuples> unresolveds, BulkOperation bulkOperationResult, Map<String, BulkOperation> bulkIdKeyToOperationResult) throws UnresolvableOperationException {
ScimResource scimResource = bulkOperationResult.getData();
String schemaUrn = scimResource.getBaseUrn();
Schema schema = this.schemaRegistry.getSchema(schemaUrn);
List<UnresolvedTopLevel> unresolvedTopLevels = new ArrayList<>();
for (Schema.Attribute attribute : schema.getAttributes()) {
Schema.AttributeAccessor accessor = attribute.getAccessor();
if (attribute.isScimResourceIdReference()) {
String bulkIdKey = accessor.get(scimResource);
if (bulkIdKey != null && bulkIdKey.startsWith("bulkId:")) {
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) {
String resolvedId = resolvedResource.getId();
accessor.set(scimResource, resolvedId);
} else {
UnresolvedTopLevel unresolved = new UnresolvedTopLevelBulkId(accessor, bulkIdKey);
accessor.set(scimResource, null);
unresolvedTopLevels.add(unresolved);
}
} else {
throw new UnresolvableOperationException(String.format(BULK_ID_DOES_NOT_EXIST, bulkIdKey));
}
}
} else if (attribute.getType() == Schema.Attribute.Type.COMPLEX) {
Object attributeFieldValue = accessor.get(scimResource);
if (attributeFieldValue != null) {
List<UnresolvedComplex> subUnresolveds = new ArrayList<>();
Class<?> subFieldClass = attributeFieldValue.getClass();
boolean isCollection = Collection.class.isAssignableFrom(subFieldClass);
if (isCollection || subFieldClass.isArray()) {
@SuppressWarnings("unchecked")
Collection<Object> subFieldValues = isCollection ? (Collection<Object>) attributeFieldValue : Arrays.asList((Object[]) attributeFieldValue);
for (Object subArrayFieldValue : subFieldValues) {
resolveAttribute(subUnresolveds, subArrayFieldValue, attribute, bulkIdKeyToOperationResult);
}
} else {
resolveAttribute(subUnresolveds, attributeFieldValue, attribute, bulkIdKeyToOperationResult);
}
if (subUnresolveds.size() > 0) {
UnresolvedTopLevel unresolved = new UnresolvedTopLevelComplex(accessor, attributeFieldValue, subUnresolveds);
accessor.set(scimResource, null);
unresolvedTopLevels.add(unresolved);
}
}
}
}
if (unresolvedTopLevels.size() > 0) {
String bulkIdKey = "bulkId:" + bulkOperationResult.getBulkId();
unresolveds.add(new IWishJavaHadTuples(bulkIdKey, unresolvedTopLevels, bulkOperationResult));
}
}