use of org.wso2.carbon.apimgt.rest.api.util.exception.BadRequestException in project charon by wso2.
the class UserResourceManager method updateWithPATCH.
/**
* Update the user resource by sequence of operations.
*
* @param existingId
* @param scimObjectString
* @param userManager
* @param attributes
* @param excludeAttributes
* @return
*/
public SCIMResponse updateWithPATCH(String existingId, String scimObjectString, UserManager userManager, String attributes, String excludeAttributes) {
try {
if (userManager == null) {
String error = "Provided user manager handler is null.";
throw new InternalErrorException(error);
}
// obtain the json decoder.
JSONDecoder decoder = getDecoder();
// decode the SCIM User object, encoded in the submitted payload.
List<PatchOperation> opList = decoder.decodeRequest(scimObjectString);
SCIMResourceTypeSchema schema = SCIMResourceSchemaManager.getInstance().getUserResourceSchema();
// get the user from the user core
User oldUser = userManager.getUser(existingId, ResourceManagerUtil.getAllAttributeURIs(schema));
if (oldUser == null) {
throw new NotFoundException("No user with the id : " + existingId + " in the user store.");
}
// make a copy of the original user
User copyOfOldUser = (User) CopyUtil.deepCopy(oldUser);
// make another copy of original user.
// this will be used to restore to the original condition if failure occurs.
User originalUser = (User) CopyUtil.deepCopy(copyOfOldUser);
User newUser = null;
for (PatchOperation operation : opList) {
if (operation.getOperation().equals(SCIMConstants.OperationalConstants.ADD)) {
if (newUser == null) {
newUser = (User) PatchOperationUtil.doPatchAdd(operation, getDecoder(), oldUser, copyOfOldUser, schema);
copyOfOldUser = (User) CopyUtil.deepCopy(newUser);
} else {
newUser = (User) PatchOperationUtil.doPatchAdd(operation, getDecoder(), newUser, copyOfOldUser, schema);
copyOfOldUser = (User) CopyUtil.deepCopy(newUser);
}
} else if (operation.getOperation().equals(SCIMConstants.OperationalConstants.REMOVE)) {
if (newUser == null) {
newUser = (User) PatchOperationUtil.doPatchRemove(operation, oldUser, copyOfOldUser, schema);
copyOfOldUser = (User) CopyUtil.deepCopy(newUser);
} else {
newUser = (User) PatchOperationUtil.doPatchRemove(operation, newUser, copyOfOldUser, schema);
copyOfOldUser = (User) CopyUtil.deepCopy(newUser);
}
} else if (operation.getOperation().equals(SCIMConstants.OperationalConstants.REPLACE)) {
if (newUser == null) {
newUser = (User) PatchOperationUtil.doPatchReplace(operation, getDecoder(), oldUser, copyOfOldUser, schema);
copyOfOldUser = (User) CopyUtil.deepCopy(newUser);
} else {
newUser = (User) PatchOperationUtil.doPatchReplace(operation, getDecoder(), newUser, copyOfOldUser, schema);
copyOfOldUser = (User) CopyUtil.deepCopy(newUser);
}
} else {
throw new BadRequestException("Unknown operation.", ResponseCodeConstants.INVALID_SYNTAX);
}
}
// get the URIs of required attributes which must be given a value
Map<String, Boolean> requiredAttributes = ResourceManagerUtil.getOnlyRequiredAttributesURIs((SCIMResourceTypeSchema) CopyUtil.deepCopy(schema), attributes, excludeAttributes);
User validatedUser = (User) ServerSideValidator.validateUpdatedSCIMObject(originalUser, newUser, schema);
newUser = userManager.updateUser(validatedUser, requiredAttributes);
// encode the newly created SCIM user object and add id attribute to Location header.
String encodedUser;
Map<String, String> httpHeaders = new HashMap<String, String>();
if (newUser != null) {
// create a deep copy of the user object since we are going to change it.
User copiedUser = (User) CopyUtil.deepCopy(newUser);
// need to remove password before returning
ServerSideValidator.validateReturnedAttributes(copiedUser, attributes, excludeAttributes);
encodedUser = getEncoder().encodeSCIMObject(copiedUser);
// add location header
httpHeaders.put(SCIMConstants.LOCATION_HEADER, getResourceEndpointURL(SCIMConstants.USER_ENDPOINT) + "/" + newUser.getId());
httpHeaders.put(SCIMConstants.CONTENT_TYPE_HEADER, SCIMConstants.APPLICATION_JSON);
} else {
String error = "Updated User resource is null.";
throw new CharonException(error);
}
// put the URI of the User object in the response header parameter.
return new SCIMResponse(ResponseCodeConstants.CODE_OK, encodedUser, httpHeaders);
} catch (NotFoundException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (BadRequestException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (NotImplementedException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (CharonException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (InternalErrorException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (RuntimeException e) {
CharonException e1 = new CharonException("Error in performing the patch operation on user resource.", e);
return AbstractResourceManager.encodeSCIMException(e1);
}
}
use of org.wso2.carbon.apimgt.rest.api.util.exception.BadRequestException in project charon by wso2.
the class UserResourceManager method get.
/*
* Retrieves a user resource given an unique user id. Mapped to HTTP GET request.
*
* @param id - unique resource id
* @param usermanager - usermanager instance defined by the external implementor of charon
* @return SCIM response to be returned.
*/
public SCIMResponse get(String id, UserManager userManager, String attributes, String excludeAttributes) {
JSONEncoder encoder = null;
try {
// obtain the json encoder
encoder = getEncoder();
// obtain the schema corresponding to user
// unless configured returns core-user schema or else returns extended user schema)
SCIMResourceTypeSchema schema = SCIMResourceSchemaManager.getInstance().getUserResourceSchema();
// 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 impl to UserResourceEndpoint.
retrieve the user from the provided UM handler.*/
User user = ((UserManager) userManager).getUser(id, requiredAttributes);
// if user not found, return an error in relevant format.
if (user == null) {
String error = "User not found in the user store.";
throw new NotFoundException(error);
}
// perform service provider side validation.
ServerSideValidator.validateRetrievedSCIMObject(user, schema, attributes, excludeAttributes);
// convert the user into requested format.
String encodedUser = encoder.encodeSCIMObject(user);
// if there are any http headers to be added in the response header.
Map<String, String> responseHeaders = new HashMap<String, String>();
responseHeaders.put(SCIMConstants.CONTENT_TYPE_HEADER, SCIMConstants.APPLICATION_JSON);
responseHeaders.put(SCIMConstants.LOCATION_HEADER, getResourceEndpointURL(SCIMConstants.USER_ENDPOINT) + "/" + user.getId());
return new SCIMResponse(ResponseCodeConstants.CODE_OK, encodedUser, responseHeaders);
} catch (NotFoundException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (CharonException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (BadRequestException e) {
return AbstractResourceManager.encodeSCIMException(e);
}
}
use of org.wso2.carbon.apimgt.rest.api.util.exception.BadRequestException in project charon by wso2.
the class AbstractValidator method setDisplayNameInComplexMultiValuedSubAttributes.
/*
* set the displayname sub attribute in complex type multi valued attribute
* eg. display name of emails
*
* @param multiValuedAttribute
* @param attributeSchema
* @throws CharonException
* @throws BadRequestException
*/
private static void setDisplayNameInComplexMultiValuedSubAttributes(Attribute multiValuedAttribute, AttributeSchema attributeSchema) throws CharonException, BadRequestException {
List<Attribute> subValuesList = ((MultiValuedAttribute) (multiValuedAttribute)).getAttributeValues();
for (Attribute subValue : subValuesList) {
for (AttributeSchema subAttributeSchema : attributeSchema.getSubAttributeSchemas()) {
if (subAttributeSchema.getName().equals(SCIMConstants.CommonSchemaConstants.VALUE)) {
if (!subAttributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX) && !subAttributeSchema.getMultiValued()) {
// take the value from the value sub attribute and put is as display attribute
SimpleAttribute simpleAttribute = null;
simpleAttribute = new SimpleAttribute(SCIMConstants.CommonSchemaConstants.DISPLAY, ((SimpleAttribute) (subValue.getSubAttribute(subAttributeSchema.getName()))).getValue());
AttributeSchema subSchema = attributeSchema.getSubAttributeSchema(SCIMConstants.CommonSchemaConstants.DISPLAY);
simpleAttribute = (SimpleAttribute) DefaultAttributeFactory.createAttribute(subSchema, simpleAttribute);
((ComplexAttribute) (subValue)).setSubAttribute(simpleAttribute);
} else if (!subAttributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX) && subAttributeSchema.getMultiValued()) {
Attribute valueSubAttribute = (MultiValuedAttribute) (subValue.getSubAttribute(subAttributeSchema.getName()));
Object displayValue = null;
try {
displayValue = ((MultiValuedAttribute) (valueSubAttribute)).getAttributePrimitiveValues().get(0);
} catch (Exception e) {
String error = "Can not set display attribute value without a value attribute value.";
throw new BadRequestException(ResponseCodeConstants.INVALID_SYNTAX, error);
}
// if multiple values are available, get the first value and put it as display name
SimpleAttribute simpleAttribute = new SimpleAttribute(SCIMConstants.CommonSchemaConstants.DISPLAY, displayValue);
AttributeSchema subSchema = attributeSchema.getSubAttributeSchema(SCIMConstants.CommonSchemaConstants.DISPLAY);
simpleAttribute = (SimpleAttribute) DefaultAttributeFactory.createAttribute(subSchema, simpleAttribute);
((ComplexAttribute) (subValue)).setSubAttribute(simpleAttribute);
}
}
}
}
}
use of org.wso2.carbon.apimgt.rest.api.util.exception.BadRequestException in project charon by wso2.
the class AbstractValidator method validateSCIMObjectForRequiredSubAttributes.
/*
* Validate SCIMObject for required sub attributes given the object and the corresponding schema.
*
* @param attribute
* @param attributeSchema
* @throws CharonException
* @throws BadRequestException
*/
private static void validateSCIMObjectForRequiredSubAttributes(AbstractAttribute attribute, AttributeSchema attributeSchema) throws CharonException, BadRequestException {
if (attribute != null) {
List<SCIMAttributeSchema> subAttributesSchemaList = ((SCIMAttributeSchema) attributeSchema).getSubAttributeSchemas();
if (subAttributesSchemaList != null) {
for (SCIMAttributeSchema subAttributeSchema : subAttributesSchemaList) {
if (subAttributeSchema.getRequired()) {
if (attribute instanceof ComplexAttribute) {
if (attribute.getSubAttribute(subAttributeSchema.getName()) == null) {
String error = "Required sub attribute: " + subAttributeSchema.getName() + " is missing in the SCIM Attribute: " + attribute.getName();
throw new BadRequestException(error, ResponseCodeConstants.INVALID_VALUE);
}
} else if (attribute instanceof MultiValuedAttribute) {
List<Attribute> values = ((MultiValuedAttribute) attribute).getAttributeValues();
for (Attribute value : values) {
if (value instanceof ComplexAttribute) {
if (value.getSubAttribute(subAttributeSchema.getName()) == null) {
String error = "Required sub attribute: " + subAttributeSchema.getName() + ", is missing in the SCIM Attribute: " + attribute.getName();
throw new BadRequestException(error, ResponseCodeConstants.INVALID_VALUE);
}
}
}
}
}
// Following is only applicable for extension schema validation.
AbstractAttribute subAttribute = null;
if (attribute instanceof ComplexAttribute) {
subAttribute = (AbstractAttribute) ((ComplexAttribute) attribute).getSubAttribute(subAttributeSchema.getName());
} else if (attribute instanceof MultiValuedAttribute) {
List<Attribute> subAttributeList = ((MultiValuedAttribute) attribute).getAttributeValues();
for (Attribute subAttrbte : subAttributeList) {
if (subAttrbte.getName().equals(subAttributeSchema.getName())) {
subAttribute = (AbstractAttribute) subAttrbte;
}
}
}
List<SCIMAttributeSchema> subSubAttributesSchemaList = ((SCIMAttributeSchema) subAttributeSchema).getSubAttributeSchemas();
if (subSubAttributesSchemaList != null) {
validateSCIMObjectForRequiredSubAttributes(subAttribute, subAttributeSchema);
}
}
}
}
}
use of org.wso2.carbon.apimgt.rest.api.util.exception.BadRequestException in project charon by wso2.
the class AbstractValidator method checkForSameValues.
/*
* check for same values in a simple singular attributes or multivalued primitive type attributes
*
* @param oldAttributeList
* @param newAttributeList
* @param attributeSchema
* @throws BadRequestException
*/
private static void checkForSameValues(Map<String, Attribute> oldAttributeList, Map<String, Attribute> newAttributeList, AttributeSchema attributeSchema) throws BadRequestException {
Attribute newTemporyAttribute = newAttributeList.get(attributeSchema.getName());
Attribute oldTemporyAttribute = oldAttributeList.get(attributeSchema.getName());
if (newTemporyAttribute instanceof SimpleAttribute) {
if (!((((SimpleAttribute) newTemporyAttribute).getValue()).equals(((SimpleAttribute) oldTemporyAttribute).getValue()))) {
throw new BadRequestException(ResponseCodeConstants.MUTABILITY);
}
} else if (newTemporyAttribute instanceof MultiValuedAttribute && !attributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
if (!checkListEquality(((MultiValuedAttribute) newTemporyAttribute).getAttributePrimitiveValues(), ((MultiValuedAttribute) oldTemporyAttribute).getAttributePrimitiveValues())) {
throw new BadRequestException(ResponseCodeConstants.MUTABILITY);
}
}
}
Aggregations