use of io.jans.scim.model.scim2.bulk.BulkOperation in project oxTrust by GluuFederation.
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
@ApiOperation(value = "Bulk Operations", notes = "Bulk Operations (https://tools.ietf.org/html/rfc7644#section-3.7)", response = BulkResponse.class)
public Response processBulkOperations(@ApiParam(value = "BulkRequest", required = true) 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<BulkOperation>();
Map<String, String> processedBulkIds = new HashMap<String, String>();
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;
}
use of io.jans.scim.model.scim2.bulk.BulkOperation in project oxTrust by GluuFederation.
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.size() == 0)
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);
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.BulkOperation 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.BulkOperation 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.BulkOperation in project jans by JanssenProject.
the class UsersBulkTest method bulkJson1.
@Parameters("users_bulk1")
@Test
public void bulkJson1(String json) {
logger.info("Sending a bulk with POST, PUT, and PATCH operations...");
Response response = client.processBulkOperations(json);
assertEquals(response.getStatus(), Status.OK.getStatusCode());
BulkResponse br = response.readEntity(BulkResponse.class);
List<BulkOperation> ops = br.getOperations();
assertTrue(ops.size() > 2);
assertSuccessfulOps(ops);
String location = ops.get(0).getLocation();
assertNotNull(location);
id = location.substring(location.lastIndexOf("/") + 1);
logger.info("User id is {}", id);
}
Aggregations