use of io.jans.scim.model.scim2.bulk.BulkRequest in project jans by JanssenProject.
the class BulkWebService method prepareRequest.
private Response prepareRequest(BulkRequest request, String contentLength) {
Response response = null;
if (request.getFailOnErrors() == null)
request.setFailOnErrors(MAX_BULK_OPERATIONS);
List<BulkOperation> operations = request.getOperations();
if (operations == null || operations.isEmpty())
response = getErrorResponse(BAD_REQUEST, ErrorScimType.INVALID_VALUE, "No operations supplied");
else {
int contentLen;
try {
// log.debug("CONT LEN {}", contentLength);
contentLen = Integer.valueOf(contentLength);
} catch (Exception e) {
contentLen = MAX_BULK_PAYLOAD_SIZE;
}
boolean payloadExceeded = contentLen > MAX_BULK_PAYLOAD_SIZE;
boolean operationsExceeded = operations.size() > MAX_BULK_OPERATIONS;
StringBuilder sb = new StringBuilder();
if (payloadExceeded)
sb.append("The size of the bulk operation exceeds the maxPayloadSize (").append(MAX_BULK_PAYLOAD_SIZE).append(" bytes). ");
if (operationsExceeded)
sb.append("The number of operations exceed the maxOperations value (").append(MAX_BULK_OPERATIONS).append("). ");
if (sb.length() > 0)
response = getErrorResponse(REQUEST_ENTITY_TOO_LARGE, sb.toString());
}
if (response == null) {
try {
for (BulkOperation operation : operations) {
if (operation == null)
throw new Exception("An operation passed was found to be null");
String path = operation.getPath();
if (StringUtils.isEmpty(path))
throw new Exception("path parameter is required");
path = adjustPath(path);
operation.setPath(path);
String method = operation.getMethod();
if (StringUtils.isNotEmpty(method)) {
method = method.toUpperCase();
operation.setMethod(method);
}
Verb verb = Verb.valueOf(method);
if (!availableMethods.contains(verb))
throw new Exception("method not recognized: " + method);
// Check if path passed is consistent with respect to method:
List<String> availableEndpoints = Arrays.asList(usersEndpoint, groupsEndpoint, fidodevicesEndpoint, fido2devicesEndpoint);
boolean consistent = false;
for (String endpoint : availableEndpoints) {
if (verb.equals(POST))
consistent = path.equals(endpoint);
else
// Checks if there is something after the additional slash
consistent = path.startsWith(endpoint + "/") && (path.length() > endpoint.length() + 1);
if (consistent)
break;
}
if (!consistent)
throw new Exception("path parameter is not consistent with method " + method);
// Check if bulkId must be present
String bulkId = operation.getBulkId();
if (StringUtils.isEmpty(bulkId) && verb.equals(POST))
throw new Exception("bulkId parameter is required for method " + method);
// Check if data must be present
String data = operation.getDataStr();
List<Verb> dataMethods = Arrays.asList(POST, PUT, PATCH);
if (dataMethods.contains(verb) && StringUtils.isEmpty(data))
throw new Exception("data parameter is required for method " + method);
}
} catch (Exception e) {
response = getErrorResponse(BAD_REQUEST, ErrorScimType.INVALID_SYNTAX, e.getMessage());
}
}
return response;
}
use of io.jans.scim.model.scim2.bulk.BulkRequest in project jans by JanssenProject.
the class GroupsBulkTest method delete.
@Test(dependsOnMethods = "bulkObject", alwaysRun = true)
public void delete() {
logger.info("Cleaning...");
// Prepare a bulk with 2 deletes
List<BulkOperation> ops = new ArrayList<>();
BulkOperation op = new BulkOperation();
op.setMethod("DELETE");
op.setPath("/Groups/" + groupId);
ops.add(op);
op = new BulkOperation();
op.setMethod("DELETE");
op.setPath("/Users/" + userId);
ops.add(op);
BulkRequest breq = new BulkRequest();
breq.setOperations(ops);
// Execute and check success
Response response = client.processBulkOperations(breq);
assertEquals(response.getStatus(), Status.OK.getStatusCode());
BulkResponse bres = response.readEntity(BulkResponse.class);
ops = bres.getOperations();
assertTrue(ops.stream().allMatch(oper -> Integer.parseInt(oper.getStatus()) == Status.NO_CONTENT.getStatusCode()));
}
use of io.jans.scim.model.scim2.bulk.BulkRequest in project jans by JanssenProject.
the class UsersBulkTest method bulkWithObject.
@Test(dependsOnMethods = "bulkJson1")
public void bulkWithObject() {
logger.info("Sending a bulk with one DELETE...");
BulkOperation op = new BulkOperation();
op.setMethod("DELETE");
op.setPath("/Users/" + id);
BulkRequest breq = new BulkRequest();
breq.setOperations(Collections.singletonList(op));
Response response = client.processBulkOperations(breq);
assertEquals(response.getStatus(), Status.OK.getStatusCode());
BulkResponse bres = response.readEntity(BulkResponse.class);
List<BulkOperation> ops = bres.getOperations();
assertEquals(ops.size(), 1);
// Verify resource was deleted
assertEquals(Status.NO_CONTENT.getStatusCode(), Integer.parseInt(ops.get(0).getStatus()));
}
use of io.jans.scim.model.scim2.bulk.BulkRequest in project jans by JanssenProject.
the class GroupsBulkTest method bulkObject.
@Test(dependsOnMethods = "bulkJson")
public void bulkObject() {
logger.info("Sending a bulk with a patch to insert admin user into group");
// Creates a patch request consisting of adding the admin user to the group created
PatchOperation po = new PatchOperation();
po.setOperation("add");
po.setPath("members.value");
po.setValue(getAdminId());
PatchRequest pr = new PatchRequest();
pr.setOperations(Collections.singletonList(po));
// Creates the bulk operation associated to the patch request
BulkOperation bop = new BulkOperation();
bop.setMethod("PATCH");
bop.setPath("/Groups/" + groupId);
bop.setData(mapper.convertValue(pr, new TypeReference<Map<String, Object>>() {
}));
BulkRequest breq = new BulkRequest();
breq.setOperations(Collections.singletonList(bop));
// Send bulk and check success of processing
Response response = client.processBulkOperations(breq);
assertEquals(response.getStatus(), Status.OK.getStatusCode());
BulkResponse bres = response.readEntity(BulkResponse.class);
assertSuccessfulOps(bres.getOperations());
}
use of io.jans.scim.model.scim2.bulk.BulkRequest in project jans by JanssenProject.
the class BulkWebService method processBulkOperations.
@javax.ws.rs.POST
@Consumes({ MEDIA_TYPE_SCIM_JSON, MediaType.APPLICATION_JSON })
@Produces({ MEDIA_TYPE_SCIM_JSON + UTF8_CHARSET_FRAGMENT, MediaType.APPLICATION_JSON + UTF8_CHARSET_FRAGMENT })
@HeaderParam("Accept")
@DefaultValue(MEDIA_TYPE_SCIM_JSON)
@ProtectedApi(scopes = { "https://jans.io/scim/bulk" })
public Response processBulkOperations(BulkRequest request) {
Response response = prepareRequest(request, getValueFromHeaders(httpHeaders, "Content-Length"));
if (response == null) {
log.debug("Executing web service method. processBulkOperations");
int i, errors = 0;
List<BulkOperation> operations = request.getOperations();
List<BulkOperation> responseOperations = new ArrayList<>();
Map<String, String> processedBulkIds = new HashMap<>();
for (i = 0; i < operations.size() && errors < request.getFailOnErrors(); i++) {
BulkOperation operation = operations.get(i);
BulkOperation operationResponse = new BulkOperation();
Response subResponse;
String method = operation.getMethod();
String bulkId = operation.getBulkId();
try {
String path = operation.getPath();
BaseScimWebService service = getWSForPath(path);
String fragment = getFragment(path, service, processedBulkIds);
Verb verb = Verb.valueOf(method);
String data = operation.getDataStr();
if (!verb.equals(DELETE))
data = replaceBulkIds(data, processedBulkIds);
Pair<Response, String> pair = execute(verb, service, data, fragment);
String idCreated = pair.getSecond();
subResponse = pair.getFirst();
int status = subResponse.getStatus();
if (familyOf(status).equals(SUCCESSFUL)) {
if (!verb.equals(DELETE)) {
if (verb.equals(POST)) {
// Update bulkIds
processedBulkIds.put(bulkId, idCreated);
fragment = idCreated;
}
String loc = service.getEndpointUrl() + "/" + fragment;
operationResponse.setLocation(loc);
}
} else {
operationResponse.setResponse(subResponse.getEntity());
errors += familyOf(status).equals(CLIENT_ERROR) || familyOf(status).equals(SERVER_ERROR) ? 1 : 0;
}
subResponse.close();
operationResponse.setStatus(Integer.toString(status));
} catch (Exception e) {
log.error(e.getMessage(), e);
subResponse = getErrorResponse(BAD_REQUEST, ErrorScimType.INVALID_SYNTAX, e.getMessage());
operationResponse.setStatus(Integer.toString(BAD_REQUEST.getStatusCode()));
operationResponse.setResponse(subResponse.getEntity());
errors++;
}
operationResponse.setBulkId(bulkId);
operationResponse.setMethod(method);
responseOperations.add(operationResponse);
log.debug("Operation {} processed with status {}. Method {}, Accumulated errors {}", i + 1, operationResponse.getStatus(), method, errors);
}
try {
BulkResponse bulkResponse = new BulkResponse();
bulkResponse.setOperations(responseOperations);
String json = mapper.writeValueAsString(bulkResponse);
response = Response.ok(json).build();
} catch (Exception e) {
log.error(e.getMessage(), e);
response = getErrorResponse(INTERNAL_SERVER_ERROR, e.getMessage());
}
}
return response;
}
Aggregations