use of org.wso2.charon3.core.exceptions.BadRequestException in project charon by wso2.
the class UserResourceManager method listWithGET.
/*
* To list all the resources of resource endpoint.
*
* @param usermanager
* @param filter
* @param startIndex
* @param count
* @param sortBy
* @param sortOrder
* @param attributes
* @param excludeAttributes
* @return
*/
public SCIMResponse listWithGET(UserManager userManager, String filter, int startIndex, int count, String sortBy, String sortOrder, String attributes, String excludeAttributes) {
FilterTreeManager filterTreeManager = null;
Node rootNode = null;
JSONEncoder encoder = null;
try {
// According to SCIM 2.0 spec minus values will be considered as 0
if (count < 0) {
count = 0;
}
// According to SCIM 2.0 spec minus values will be considered as 1
if (startIndex < 1) {
startIndex = 1;
}
if (sortOrder != null) {
if (!(sortOrder.equalsIgnoreCase(SCIMConstants.OperationalConstants.ASCENDING) || sortOrder.equalsIgnoreCase(SCIMConstants.OperationalConstants.DESCENDING))) {
String error = " Invalid sortOrder value is specified";
throw new BadRequestException(error, ResponseCodeConstants.INVALID_VALUE);
}
}
// ascending.
if (sortOrder == null && sortBy != null) {
sortOrder = SCIMConstants.OperationalConstants.ASCENDING;
}
// unless configured returns core-user schema or else returns extended user schema)
SCIMResourceTypeSchema schema = SCIMResourceSchemaManager.getInstance().getUserResourceSchema();
if (filter != null) {
filterTreeManager = new FilterTreeManager(filter, schema);
rootNode = filterTreeManager.buildTree();
}
// obtain the json encoder
encoder = getEncoder();
// get the URIs of required attributes which must be given a value
Map<String, Boolean> requiredAttributes = ResourceManagerUtil.getOnlyRequiredAttributesURIs((SCIMResourceTypeSchema) CopyUtil.deepCopy(schema), attributes, excludeAttributes);
List<Object> returnedUsers;
int totalResults = 0;
// API user should pass a usermanager usermanager to UserResourceEndpoint.
if (userManager != null) {
List<Object> tempList = userManager.listUsersWithGET(rootNode, startIndex, count, sortBy, sortOrder, requiredAttributes);
totalResults = (int) tempList.get(0);
tempList.remove(0);
returnedUsers = tempList;
for (Object user : returnedUsers) {
// perform service provider side validation.
ServerSideValidator.validateRetrievedSCIMObjectInList((User) user, schema, attributes, excludeAttributes);
}
// create a listed resource object out of the returned users list.
ListedResource listedResource = createListedResource(returnedUsers, startIndex, totalResults);
// convert the listed resource into specific format.
String encodedListedResource = encoder.encodeSCIMObject(listedResource);
// 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);
return new SCIMResponse(ResponseCodeConstants.CODE_OK, encodedListedResource, responseHeaders);
} else {
String error = "Provided user manager handler is null.";
// throw internal server error.
throw new InternalErrorException(error);
}
} catch (CharonException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (NotFoundException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (InternalErrorException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (BadRequestException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (NotImplementedException e) {
return AbstractResourceManager.encodeSCIMException(e);
} catch (IOException e) {
String error = "Error in tokenization of the input filter";
CharonException charonException = new CharonException(error);
return AbstractResourceManager.encodeSCIMException(charonException);
}
}
use of org.wso2.charon3.core.exceptions.BadRequestException in project charon by wso2.
the class AbstractValidator method validateSCIMObjectForRequiredAttributes.
/*
* Validate SCIMObject for required attributes given the object and the corresponding schema.
*
* @param scimObject
* @param resourceSchema
*/
public static void validateSCIMObjectForRequiredAttributes(AbstractSCIMObject scimObject, ResourceTypeSchema resourceSchema) throws BadRequestException, CharonException {
// get attributes from schema.
List<AttributeSchema> attributeSchemaList = resourceSchema.getAttributesList();
// get attribute list from scim object.
Map<String, Attribute> attributeList = scimObject.getAttributeList();
for (AttributeSchema attributeSchema : attributeSchemaList) {
// check for required attributes.
if (attributeSchema.getRequired()) {
if (!attributeList.containsKey(attributeSchema.getName())) {
String error = "Required attribute " + attributeSchema.getName() + " is missing in the SCIM " + "Object.";
throw new BadRequestException(error, ResponseCodeConstants.INVALID_VALUE);
}
}
// check for required sub attributes.
AbstractAttribute attribute = (AbstractAttribute) attributeList.get(attributeSchema.getName());
validateSCIMObjectForRequiredSubAttributes(attribute, attributeSchema);
}
}
use of org.wso2.charon3.core.exceptions.BadRequestException in project charon by wso2.
the class AbstractValidator method setDisplayNameInComplexMultiValuedAttributes.
/*
* This method is basically for adding display sub attribute to multivalued attributes
* which has 'display' as a sub attribute in the respective attribute schema
*
* @param scimObject
* @param resourceSchema
* @throws CharonException
* @throws BadRequestException
*/
protected static void setDisplayNameInComplexMultiValuedAttributes(AbstractSCIMObject scimObject, SCIMResourceTypeSchema resourceSchema) throws CharonException, BadRequestException {
Map<String, Attribute> attributeList = scimObject.getAttributeList();
ArrayList<AttributeSchema> attributeSchemaList = resourceSchema.getAttributesList();
for (AttributeSchema attributeSchema : attributeSchemaList) {
if (attributeSchema.getMultiValued() && attributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
if (attributeSchema.getSubAttributeSchema(SCIMConstants.CommonSchemaConstants.DISPLAY) != null) {
if (attributeList.containsKey(attributeSchema.getName())) {
Attribute multiValuedAttribute = attributeList.get(attributeSchema.getName());
setDisplayNameInComplexMultiValuedSubAttributes(multiValuedAttribute, attributeSchema);
}
}
} else if (attributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
// this is only valid for extension schema
List<SCIMAttributeSchema> subAttributeSchemaList = attributeSchema.getSubAttributeSchemas();
for (AttributeSchema subAttributeSchema : subAttributeSchemaList) {
if (subAttributeSchema.getMultiValued() && subAttributeSchema.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
if (subAttributeSchema.getSubAttributeSchema(SCIMConstants.CommonSchemaConstants.DISPLAY) != null) {
Attribute extensionAttribute = attributeList.get(attributeSchema.getName());
if (extensionAttribute != null) {
if ((((ComplexAttribute) extensionAttribute).getSubAttribute(subAttributeSchema.getName())) != null) {
Attribute multiValuedAttribute = (attributeList.get(attributeSchema.getName())).getSubAttribute(subAttributeSchema.getName());
setDisplayNameInComplexMultiValuedSubAttributes(multiValuedAttribute, subAttributeSchema);
}
}
}
}
}
}
}
}
use of org.wso2.charon3.core.exceptions.BadRequestException in project charon by wso2.
the class AbstractValidator method checkIfReadOnlyAndImmutableSubAttributesModified.
/*
* check for read only and immutable sub attributes which has been modified on update request
*
* @param newAttributeList
* @param oldAttributeList
* @param attributeSchema
* @throws BadRequestException
* @throws CharonException
*/
private static void checkIfReadOnlyAndImmutableSubAttributesModified(Map<String, Attribute> newAttributeList, Map<String, Attribute> oldAttributeList, AttributeSchema attributeSchema) throws BadRequestException, CharonException {
// check for sub attributes.
AbstractAttribute newAttribute = (AbstractAttribute) newAttributeList.get(attributeSchema.getName());
AbstractAttribute oldAttribute = (AbstractAttribute) oldAttributeList.get(attributeSchema.getName());
List<SCIMAttributeSchema> subAttributeSchemaList = attributeSchema.getSubAttributeSchemas();
if (subAttributeSchemaList != null) {
if (SCIMResourceSchemaManager.getInstance().getExtensionName() != null) {
if (attributeSchema.getName().equals(SCIMResourceSchemaManager.getInstance().getExtensionName())) {
checkIfReadOnlyAndImmutableExtensionAttributesModified(subAttributeSchemaList, newAttribute, oldAttribute);
}
}
if (newAttribute != null && oldAttribute != null) {
if (attributeSchema.getMultiValued()) {
// this is complex multivalued case
List<Attribute> newSubValuesList = ((MultiValuedAttribute) newAttribute).getAttributeValues();
List<Attribute> oldSubValuesList = ((MultiValuedAttribute) oldAttribute).getAttributeValues();
// if size aren't equal, they do not preserver immutable quality
if (newSubValuesList.size() != oldSubValuesList.size() && attributeSchema.getMutability().equals(SCIMDefinitions.Mutability.IMMUTABLE)) {
throw new BadRequestException(ResponseCodeConstants.MUTABILITY);
}
// no need to check sub attributes of sub values separately for equality, stop at the sub value level
for (Attribute subValue : newSubValuesList) {
if (!isListContains((((ComplexAttribute) subValue).getName()), oldSubValuesList) && attributeSchema.getMutability().equals(SCIMDefinitions.Mutability.IMMUTABLE)) {
throw new BadRequestException(ResponseCodeConstants.MUTABILITY);
}
}
} else {
// A complex attribute itself can not be immutable if it's sub variables are not immutable
checkForReadOnlyAndImmutableInComplexAttributes(newAttribute, oldAttribute, subAttributeSchemaList);
}
} else if (newAttribute == null && oldAttribute != null) {
if (attributeSchema.getMultiValued()) {
List<Attribute> oldSubValuesList = ((MultiValuedAttribute) oldAttribute).getAttributeValues();
Attribute clonedMultiValuedAttribute = (Attribute) CopyUtil.deepCopy(oldAttribute);
clonedMultiValuedAttribute.deleteSubAttributes();
for (Attribute subValue : oldSubValuesList) {
Attribute clonedSubValue = (Attribute) CopyUtil.deepCopy(subValue);
clonedSubValue.deleteSubAttributes();
for (AttributeSchema subAttributeSchema : subAttributeSchemaList) {
if (subAttributeSchema.getMutability().equals(SCIMDefinitions.Mutability.READ_ONLY) || subAttributeSchema.getMutability().equals(SCIMDefinitions.Mutability.IMMUTABLE)) {
if (((ComplexAttribute) subValue).isSubAttributeExist(subAttributeSchema.getName())) {
Attribute clonedSubValuesAttribute = (Attribute) CopyUtil.deepCopy(((ComplexAttribute) subValue).getSubAttribute(subAttributeSchema.getName()));
((ComplexAttribute) clonedSubValue).setSubAttribute(clonedSubValuesAttribute);
}
}
}
((MultiValuedAttribute) (clonedMultiValuedAttribute)).setAttributeValue(clonedSubValue);
}
} else {
Map<String, Attribute> oldSubAttributeList = ((ComplexAttribute) (oldAttribute)).getSubAttributesList();
Attribute clonedAttribute = (Attribute) CopyUtil.deepCopy(oldAttribute);
clonedAttribute.deleteSubAttributes();
for (AttributeSchema subAttributeSchema : subAttributeSchemaList) {
if (subAttributeSchema.getMutability().equals(SCIMDefinitions.Mutability.READ_ONLY) || subAttributeSchema.getMutability().equals(SCIMDefinitions.Mutability.IMMUTABLE)) {
if (oldSubAttributeList.containsKey(subAttributeSchema.getName())) {
((ComplexAttribute) (clonedAttribute)).setSubAttribute((Attribute) CopyUtil.deepCopy(oldSubAttributeList.get(subAttributeSchema.getName())));
}
}
}
newAttributeList.put(clonedAttribute.getName(), clonedAttribute);
}
} else if (newAttribute != null && oldAttribute == null) {
if (attributeSchema.getMultiValued()) {
if (attributeSchema.getMultiValued()) {
List<Attribute> newSubValuesList = ((MultiValuedAttribute) newAttribute).getAttributeValues();
for (Attribute subValue : newSubValuesList) {
for (AttributeSchema subAttributeSchema : subAttributeSchemaList) {
if (subAttributeSchema.getMutability().equals(SCIMDefinitions.Mutability.READ_ONLY)) {
((ComplexAttribute) (subValue)).removeSubAttribute(subAttributeSchema.getName());
}
}
}
}
} else {
// this is complex attribute case
Map<String, Attribute> newSubAttributeList = ((ComplexAttribute) (newAttribute)).getSubAttributesList();
for (AttributeSchema subAttributeSchema : subAttributeSchemaList) {
if (subAttributeSchema.getMutability().equals(SCIMDefinitions.Mutability.READ_ONLY)) {
if (newSubAttributeList.containsKey(subAttributeSchema.getName())) {
String error = "Read only attribute: " + subAttributeSchema.getName() + " is set from consumer in the SCIM Object. Removing it.";
logger.debug(error);
((ComplexAttribute) newAttribute).removeSubAttribute(subAttributeSchema.getName());
}
}
}
}
}
}
}
use of org.wso2.charon3.core.exceptions.BadRequestException in project charon by wso2.
the class JSONDecoder method buildSimpleAttribute.
/*
* Return a simple attribute with the user defined value included and necessary attribute characteristics set
*
* @param attributeSchema - Attribute schema
* @param attributeValue - value for the attribute
* @return SimpleAttribute
*/
public SimpleAttribute buildSimpleAttribute(AttributeSchema attributeSchema, Object attributeValue) throws CharonException, BadRequestException {
Object attributeValueObject = AttributeUtil.getAttributeValueFromString(attributeValue, attributeSchema.getType());
SimpleAttribute simpleAttribute = new SimpleAttribute(attributeSchema.getName(), attributeValueObject);
return (SimpleAttribute) DefaultAttributeFactory.createAttribute(attributeSchema, simpleAttribute);
}
Aggregations