use of org.wso2.charon3.core.exceptions.NotImplementedException in project charon by wso2.
the class PatchOperationUtil method doPatchReplace.
/*
* This is the main patch replace method.
* @param operation
* @param decoder
* @param oldResource
* @param copyOfOldResource
* @param schema
* @return
* @throws CharonException
* @throws NotImplementedException
* @throws BadRequestException
* @throws JSONException
* @throws InternalErrorException
*/
public static AbstractSCIMObject doPatchReplace(PatchOperation operation, JSONDecoder decoder, AbstractSCIMObject oldResource, AbstractSCIMObject copyOfOldResource, SCIMResourceTypeSchema schema) throws CharonException, NotImplementedException, BadRequestException, InternalErrorException {
if (operation.getPath() != null) {
String path = operation.getPath();
// split the path to extract the filter if present.
String[] parts = path.split("[\\[\\]]");
if (operation.getPath().contains("[")) {
try {
doPatchReplaceOnPathWithFilters(oldResource, schema, decoder, operation, parts);
} catch (JSONException e) {
throw new BadRequestException(ResponseCodeConstants.INVALID_SYNTAX);
}
} else {
doPatchReplaceOnPathWithoutFilters(oldResource, schema, decoder, operation, parts);
}
} else {
doPatchReplaceOnResource(oldResource, copyOfOldResource, schema, decoder, operation);
}
// validate the updated object
AbstractSCIMObject validatedResource = ServerSideValidator.validateUpdatedSCIMObject(copyOfOldResource, oldResource, schema);
return validatedResource;
}
use of org.wso2.charon3.core.exceptions.NotImplementedException in project charon by wso2.
the class PatchOperationUtil method doPatchRemove.
/*
* This method corresponds to the remove operation in patch requests.
* @param operation
* @param decoder
* @param oldResource
* @param copyOfOldResource
* @return
* @throws BadRequestException
* @throws IOException
* @throws NotImplementedException
* @throws CharonException
*/
public static AbstractSCIMObject doPatchRemove(PatchOperation operation, AbstractSCIMObject oldResource, AbstractSCIMObject copyOfOldResource, SCIMResourceTypeSchema schema) throws BadRequestException, NotImplementedException, CharonException {
if (operation.getPath() == null) {
throw new BadRequestException("No path value specified for remove operation", ResponseCodeConstants.NO_TARGET);
}
String path = operation.getPath();
// split the path to extract the filter if present.
String[] parts = path.split("[\\[\\]]");
if (parts.length != 1) {
// currently we only support simple filters here.
String[] filterParts = parts[1].split(" ");
ExpressionNode expressionNode = new ExpressionNode();
expressionNode.setAttributeValue(filterParts[0]);
expressionNode.setOperation(filterParts[1]);
expressionNode.setValue(filterParts[2]);
if (expressionNode.getOperation().equalsIgnoreCase((SCIMConstants.OperationalConstants.EQ).trim())) {
doPatchRemoveWithFilters(parts, oldResource, expressionNode);
} else {
throw new NotImplementedException("Only Eq filter is supported");
}
} else {
doPatchRemoveWithoutFilters(parts, oldResource);
}
// validate the updated object
AbstractSCIMObject validatedResource = ServerSideValidator.validateUpdatedSCIMObject(copyOfOldResource, oldResource, schema);
return validatedResource;
}
use of org.wso2.charon3.core.exceptions.NotImplementedException in project charon by wso2.
the class GroupResourceManager method create.
/*
* Create group in the service provider given the submitted payload that contains the SCIM group
* resource, format and the handler to usermanager.
*
* @param scimObjectString - Payload of HTTP request, which contains the SCIM object.
* @param usermanager
* @param attributes
* @param excludeAttributes
* @return
*/
@Override
public SCIMResponse create(String scimObjectString, UserManager userManager, String attributes, String excludeAttributes) {
JSONEncoder encoder = null;
JSONDecoder decoder = null;
try {
// obtain the json encoder
encoder = getEncoder();
// obtain the json decoder
decoder = getDecoder();
// returns core-group schema
SCIMResourceTypeSchema schema = SCIMResourceSchemaManager.getInstance().getGroupResourceSchema();
// get the URIs of required attributes which must be given a value
Map<String, Boolean> requiredAttributes = ResourceManagerUtil.getOnlyRequiredAttributesURIs((SCIMResourceTypeSchema) CopyUtil.deepCopy(schema), attributes, excludeAttributes);
// decode the SCIM group object, encoded in the submitted payload.
Group group = (Group) decoder.decodeResource(scimObjectString, schema, new Group());
// validate decoded group
ServerSideValidator.validateCreatedSCIMObject(group, SCIMSchemaDefinitions.SCIM_GROUP_SCHEMA);
// handover the SCIM User object to the group usermanager provided by the SP.
Group createdGroup;
// need to send back the newly created group in the response payload
createdGroup = ((UserManager) userManager).createGroup(group, requiredAttributes);
// encode the newly created SCIM group object and add id attribute to Location header.
String encodedGroup;
Map<String, String> httpHeaders = new HashMap<String, String>();
if (createdGroup != null) {
encodedGroup = encoder.encodeSCIMObject(createdGroup);
// add location header
httpHeaders.put(SCIMConstants.LOCATION_HEADER, getResourceEndpointURL(SCIMConstants.GROUP_ENDPOINT) + "/" + createdGroup.getId());
httpHeaders.put(SCIMConstants.CONTENT_TYPE_HEADER, SCIMConstants.APPLICATION_JSON);
} else {
String message = "Newly created Group resource is null..";
throw new InternalErrorException(message);
}
// put the uri of the Group object in the response header parameter.
return new SCIMResponse(ResponseCodeConstants.CODE_CREATED, encodedGroup, httpHeaders);
} catch (InternalErrorException e) {
return encodeSCIMException(e);
} catch (BadRequestException e) {
return encodeSCIMException(e);
} catch (ConflictException e) {
return encodeSCIMException(e);
} catch (CharonException e) {
return encodeSCIMException(e);
} catch (NotFoundException e) {
return encodeSCIMException(e);
} catch (NotImplementedException e) {
return encodeSCIMException(e);
}
}
use of org.wso2.charon3.core.exceptions.NotImplementedException in project charon by wso2.
the class GroupResourceManager method get.
/*
* Retrieves a group resource given an unique group id. Mapped to HTTP GET request.
*
* @param id - unique resource id
* @param usermanager
* @param attributes
* @param excludeAttributes
* @return SCIM response to be returned.
*/
@Override
public SCIMResponse get(String id, UserManager userManager, String attributes, String excludeAttributes) {
JSONEncoder encoder = null;
try {
// obtain the correct encoder according to the format requested.
encoder = getEncoder();
// returns core-group schema
SCIMResourceTypeSchema schema = SCIMResourceSchemaManager.getInstance().getGroupResourceSchema();
// get the URIs of required attributes which must be given a value
Map<String, Boolean> requiredAttributes = ResourceManagerUtil.getOnlyRequiredAttributesURIs((SCIMResourceTypeSchema) CopyUtil.deepCopy(schema), attributes, excludeAttributes);
// API user should pass a usermanager usermanager to GroupResourceEndpoint.
// retrieve the group from the provided usermanager.
Group group = ((UserManager) userManager).getGroup(id, requiredAttributes);
// if group not found, return an error in relevant format.
if (group == null) {
String message = "Group not found in the user store.";
throw new NotFoundException(message);
}
ServerSideValidator.validateRetrievedSCIMObjectInList(group, schema, attributes, excludeAttributes);
// convert the group into specific format.
String encodedGroup = encoder.encodeSCIMObject(group);
// if there are any http headers to be added in the response header.
Map<String, String> httpHeaders = new HashMap<String, String>();
httpHeaders.put(SCIMConstants.CONTENT_TYPE_HEADER, SCIMConstants.APPLICATION_JSON);
return new SCIMResponse(ResponseCodeConstants.CODE_OK, encodedGroup, httpHeaders);
} catch (NotFoundException e) {
return encodeSCIMException(e);
} catch (BadRequestException e) {
return encodeSCIMException(e);
} catch (CharonException e) {
return encodeSCIMException(e);
} catch (NotImplementedException e) {
return encodeSCIMException(e);
}
}
use of org.wso2.charon3.core.exceptions.NotImplementedException in project charon by wso2.
the class GroupResourceManager method updateWithPUT.
/*
* method which corresponds to HTTP PUT - delete the group
* @param existingId
* @param scimObjectString
* @param usermanager
* @param attributes
* @param excludeAttributes
* @return
*/
@Override
public SCIMResponse updateWithPUT(String existingId, String scimObjectString, UserManager userManager, String attributes, String excludeAttributes) {
// needs to validate the incoming object. eg: id can not be set by the consumer.
JSONEncoder encoder = null;
JSONDecoder decoder = null;
try {
// obtain the json encoder
encoder = getEncoder();
// obtain the json decoder.
decoder = getDecoder();
SCIMResourceTypeSchema schema = SCIMResourceSchemaManager.getInstance().getGroupResourceSchema();
// get the URIs of required attributes which must be given a value
Map<String, Boolean> requiredAttributes = ResourceManagerUtil.getOnlyRequiredAttributesURIs((SCIMResourceTypeSchema) CopyUtil.deepCopy(schema), attributes, excludeAttributes);
// decode the SCIM User object, encoded in the submitted payload.
Group group = (Group) decoder.decodeResource(scimObjectString, schema, new Group());
Group updatedGroup = null;
if (userManager != null) {
// retrieve the old object
Group oldGroup = userManager.getGroup(existingId, ResourceManagerUtil.getAllAttributeURIs(schema));
if (oldGroup != null) {
Group newGroup = (Group) ServerSideValidator.validateUpdatedSCIMObject(oldGroup, group, schema);
updatedGroup = userManager.updateGroup(oldGroup, newGroup, requiredAttributes);
} else {
String error = "No user exists with the given id: " + existingId;
throw new NotFoundException(error);
}
} else {
String error = "Provided user manager handler is null.";
throw new InternalErrorException(error);
}
// encode the newly created SCIM user object and add id attribute to Location header.
String encodedGroup;
Map<String, String> httpHeaders = new HashMap<String, String>();
if (updatedGroup != null) {
// create a deep copy of the user object since we are going to change it.
Group copiedGroup = (Group) CopyUtil.deepCopy(updatedGroup);
// need to remove password before returning
ServerSideValidator.validateReturnedAttributes(copiedGroup, attributes, excludeAttributes);
encodedGroup = encoder.encodeSCIMObject(copiedGroup);
// add location header
httpHeaders.put(SCIMConstants.LOCATION_HEADER, getResourceEndpointURL(SCIMConstants.GROUP_ENDPOINT) + "/" + updatedGroup.getId());
httpHeaders.put(SCIMConstants.CONTENT_TYPE_HEADER, SCIMConstants.APPLICATION_JSON);
} else {
String error = "Updated Group resource is null.";
throw new InternalErrorException(error);
}
// put the uri of the User object in the response header parameter.
return new SCIMResponse(ResponseCodeConstants.CODE_OK, encodedGroup, httpHeaders);
} catch (NotFoundException e) {
return encodeSCIMException(e);
} catch (BadRequestException e) {
return encodeSCIMException(e);
} catch (CharonException e) {
return encodeSCIMException(e);
} catch (InternalErrorException e) {
return encodeSCIMException(e);
} catch (NotImplementedException e) {
return encodeSCIMException(e);
}
}
Aggregations