use of io.jans.scim.model.scim2.Constants.MEDIA_TYPE_SCIM_JSON in project jans by JanssenProject.
the class ServiceProviderConfigWS method serve.
@GET
@Produces(MEDIA_TYPE_SCIM_JSON + UTF8_CHARSET_FRAGMENT)
@HeaderParam("Accept")
@DefaultValue(MEDIA_TYPE_SCIM_JSON)
@RejectFilterParam
public Response serve() {
try {
ServiceProviderConfig serviceProviderConfig = new ServiceProviderConfig();
serviceProviderConfig.getFilter().setMaxResults(appConfiguration.getMaxCount());
Meta meta = new Meta();
meta.setLocation(endpointUrl);
meta.setResourceType(ScimResourceUtil.getType(serviceProviderConfig.getClass()));
serviceProviderConfig.setMeta(meta);
serviceProviderConfig.setAuthenticationSchemes(Collections.singletonList(AuthenticationScheme.createOAuth2(true)));
return Response.ok(resourceSerializer.serialize(serviceProviderConfig)).build();
} catch (Exception e) {
log.error(e.getMessage(), e);
return getErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, "Unexpected error: " + e.getMessage());
}
}
use of io.jans.scim.model.scim2.Constants.MEDIA_TYPE_SCIM_JSON in project jans by JanssenProject.
the class SearchResourcesWebService method search.
@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/all-resources.search" })
@RefAdjusted
public Response search(SearchRequest searchRequest) {
SearchRequest searchReq = new SearchRequest();
Response response = prepareSearchRequest(searchRequest.getSchemas(), searchRequest.getFilter(), searchRequest.getSortBy(), searchRequest.getSortOrder(), searchRequest.getStartIndex(), searchRequest.getCount(), searchRequest.getAttributesStr(), searchRequest.getExcludedAttributesStr(), searchReq);
if (response == null) {
try {
List<JsonNode> resources = new ArrayList<>();
Pair<Integer, Integer> totals = computeResults(searchReq, resources);
ListResponseJsonSerializer custSerializer = new ListResponseJsonSerializer(resourceSerializer, searchReq.getAttributesStr(), searchReq.getExcludedAttributesStr(), searchReq.getCount() == 0);
if (resources.size() > 0)
custSerializer.setJsonResources(resources);
ObjectMapper objmapper = new ObjectMapper();
SimpleModule module = new SimpleModule("ListResponseModule", Version.unknownVersion());
module.addSerializer(ListResponse.class, custSerializer);
objmapper.registerModule(module);
// Provide to constructor original start index, and totals calculated in computeResults call
ListResponse listResponse = new ListResponse(searchReq.getStartIndex(), totals.getFirst(), totals.getSecond());
String json = objmapper.writeValueAsString(listResponse);
response = Response.ok(json).location(new URI(endpointUrl)).build();
} catch (Exception e) {
log.error("Failure at search method", e);
response = getErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, "Unexpected error: " + e.getMessage());
}
}
return response;
}
use of io.jans.scim.model.scim2.Constants.MEDIA_TYPE_SCIM_JSON in project jans by JanssenProject.
the class UserWebService method updateUser.
/**
* This implementation differs from spec in the following aspects:
* - Passing a null value for an attribute, does not modify the attribute in the destination, however passing an
* empty array for a multivalued attribute does clear the attribute. Thus, to clear single-valued attribute, PATCH
* operation should be used
*/
@Path("{id}")
@PUT
@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/users.write" })
@RefAdjusted
public Response updateUser(UserResource user, @PathParam("id") String id, @QueryParam(QUERY_PARAM_ATTRIBUTES) String attrsList, @QueryParam(QUERY_PARAM_EXCLUDED_ATTRS) String excludedAttrsList) {
Response response;
try {
log.debug("Executing web service method. updateUser");
// Check if the ids match in case the user coming has one
if (user.getId() != null && !user.getId().equals(id))
throw new SCIMException("Parameter id does not match with id attribute of User");
ScimCustomPerson person = userPersistenceHelper.getPersonByInum(id);
if (person == null)
return notFoundResponse(id, userResourceType);
response = externalConstraintsService.applyEntityCheck(person, user, httpHeaders, uriInfo, HttpMethod.PUT, userResourceType);
if (response != null)
return response;
executeValidation(user, true);
if (StringUtils.isNotEmpty(user.getUserName())) {
checkUidExistence(user.getUserName(), id);
}
ScimResourceUtil.adjustPrimarySubAttributes(user);
UserResource updatedResource = scim2UserService.updateUser(person, user, endpointUrl);
String json = resourceSerializer.serialize(updatedResource, attrsList, excludedAttrsList);
response = Response.ok(new URI(updatedResource.getMeta().getLocation())).entity(json).build();
} catch (DuplicateEntryException e) {
log.error(e.getMessage());
response = getErrorResponse(Response.Status.CONFLICT, ErrorScimType.UNIQUENESS, e.getMessage());
} catch (SCIMException e) {
log.error("Validation check at updateUser returned: {}", e.getMessage());
response = getErrorResponse(Response.Status.BAD_REQUEST, ErrorScimType.INVALID_VALUE, e.getMessage());
} catch (InvalidAttributeValueException e) {
log.error(e.getMessage());
response = getErrorResponse(Response.Status.BAD_REQUEST, ErrorScimType.MUTABILITY, e.getMessage());
} catch (Exception e) {
log.error("Failure at updateUser method", e);
response = getErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, "Unexpected error: " + e.getMessage());
}
return response;
}
use of io.jans.scim.model.scim2.Constants.MEDIA_TYPE_SCIM_JSON in project jans by JanssenProject.
the class UserWebService method getUserById.
@Path("{id}")
@GET
@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/users.read" })
@RefAdjusted
public Response getUserById(@PathParam("id") String id, @QueryParam(QUERY_PARAM_ATTRIBUTES) String attrsList, @QueryParam(QUERY_PARAM_EXCLUDED_ATTRS) String excludedAttrsList) {
Response response;
try {
log.debug("Executing web service method. getUserById");
ScimCustomPerson person = userPersistenceHelper.getPersonByInum(id);
if (person == null)
return notFoundResponse(id, userResourceType);
response = externalConstraintsService.applyEntityCheck(person, null, httpHeaders, uriInfo, HttpMethod.GET, userResourceType);
if (response != null)
return response;
UserResource user = scim2UserService.buildUserResource(person, endpointUrl);
String json = resourceSerializer.serialize(user, attrsList, excludedAttrsList);
response = Response.ok(new URI(user.getMeta().getLocation())).entity(json).build();
} catch (Exception e) {
log.error("Failure at getUserById method", e);
response = getErrorResponse(Response.Status.INTERNAL_SERVER_ERROR, "Unexpected error: " + e.getMessage());
}
return response;
}
use of io.jans.scim.model.scim2.Constants.MEDIA_TYPE_SCIM_JSON 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