in scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java [395:488]
private void handleBulkOperationMethod(List<IWishJavaHadTuples> unresolveds, BulkOperation operationResult, Map<String, BulkOperation> bulkIdKeyToOperationResult, UriInfo uriInfo) throws ResourceException, UnresolvableOperationException {
ScimResource scimResource = operationResult.getData();
Method bulkOperationMethod = operationResult.getMethod();
String bulkId = operationResult.getBulkId();
Class<ScimResource> scimResourceClass;
if (scimResource == null) {
String path = operationResult.getPath();
String endPoint = path.substring(0, path.lastIndexOf('/'));
Class<ScimResource> clazz = (Class<ScimResource>) schemaRegistry.getScimResourceClassFromEndpoint(endPoint);
scimResourceClass = clazz;
} else {
@SuppressWarnings("unchecked")
Class<ScimResource> clazz = (Class<ScimResource>) scimResource.getClass();
scimResourceClass = clazz;
}
Repository<ScimResource> repository = repositoryRegistry.getRepository(scimResourceClass);
switch (bulkOperationMethod) {
case POST: {
log.debug("POST: {}", scimResource);
this.resolveTopLevel(unresolveds, operationResult, bulkIdKeyToOperationResult);
log.debug("Creating {}", scimResource);
ScimResource newScimResource = repository.create(scimResource);
String bulkOperationPath = operationResult.getPath();
String newResourceId = newScimResource.getId();
String newResourceUri = uriInfo.getBaseUriBuilder()
.path(bulkOperationPath)
.path(newResourceId)
.build()
.toString();
if (bulkId != null) {
String bulkIdKey = "bulkId:" + bulkId;
log.debug("adding {} = {}", bulkIdKey, newResourceId);
bulkIdKeyToOperationResult.get(bulkIdKey)
.setData(newScimResource);
}
operationResult.setData(newScimResource);
operationResult.setLocation(newResourceUri);
operationResult.setPath(null);
operationResult.setStatus(StatusWrapper.wrap(Status.CREATED));
}
break;
case DELETE: {
log.debug("DELETE: {}", operationResult.getPath());
String scimResourceId = operationResult.getPath()
.substring(operationResult.getPath()
.lastIndexOf("/")
+ 1);
repository.delete(scimResourceId);
operationResult.setStatus(StatusWrapper.wrap(Status.NO_CONTENT));
}
break;
case PUT: {
log.debug("PUT: {}", scimResource);
this.resolveTopLevel(unresolveds, operationResult, bulkIdKeyToOperationResult);
String id = operationResult.getPath()
.substring(operationResult.getPath()
.lastIndexOf("/")
+ 1);
try {
ScimResource original = repository.get(id);
UpdateRequest<ScimResource> updateRequest = new UpdateRequest<>(id, original, scimResource, schemaRegistry);
repository.update(updateRequest);
operationResult.setStatus(StatusWrapper.wrap(Status.OK));
} catch (UnableToRetrieveResourceException e) {
operationResult.setStatus(StatusWrapper.wrap(Status.NOT_FOUND));
}
}
break;
default: {
BulkOperation.Method method = operationResult.getMethod();
String detail = "Method not allowed: " + method;
log.error("Received unallowed method: {}", method);
createAndSetErrorResponse(operationResult, Status.METHOD_NOT_ALLOWED, detail);
}
break;
}
}