use of org.wso2.charon3.core.schema.AttributeSchema in project charon by wso2.
the class PatchOperationUtil method doPatchReplaceWithFiltersForLevelTwo.
/*
* This method is to do patch replace for level two attributes with a filter present.
* @param oldResource
* @param attributeParts
* @param expressionNode
* @param operation
* @param schema
* @param decoder
* @return
* @throws CharonException
* @throws BadRequestException
* @throws JSONException
* @throws InternalErrorException
*/
private static AbstractSCIMObject doPatchReplaceWithFiltersForLevelTwo(AbstractSCIMObject oldResource, String[] attributeParts, ExpressionNode expressionNode, PatchOperation operation, SCIMResourceTypeSchema schema, JSONDecoder decoder) throws CharonException, BadRequestException, JSONException, InternalErrorException {
Attribute attribute = oldResource.getAttribute(attributeParts[0]);
boolean isValueFound = false;
if (attribute != null) {
if (attribute.getMultiValued()) {
List<Attribute> subValues = ((MultiValuedAttribute) attribute).getAttributeValues();
if (subValues != null) {
for (Attribute subValue : subValues) {
Map<String, Attribute> subAttributes = ((ComplexAttribute) subValue).getSubAttributesList();
// this map is to avoid concurrent modification exception.
Map<String, Attribute> tempSubAttributes = (Map<String, Attribute>) CopyUtil.deepCopy(subAttributes);
for (Iterator<Attribute> iterator = tempSubAttributes.values().iterator(); iterator.hasNext(); ) {
Attribute subAttribute = iterator.next();
if (subAttribute.getName().equals(expressionNode.getAttributeValue())) {
if (((SimpleAttribute) subAttribute).getValue().equals(expressionNode.getValue())) {
Attribute replacingAttribute = subAttributes.get(attributeParts[1]);
if (replacingAttribute == null) {
// add the attribute
AttributeSchema replacingAttributeSchema = SchemaUtil.getAttributeSchema(attributeParts[0] + "." + attributeParts[1], schema);
if (replacingAttributeSchema.getMultiValued()) {
MultiValuedAttribute multiValuedAttribute = new MultiValuedAttribute(replacingAttributeSchema.getName());
DefaultAttributeFactory.createAttribute(replacingAttributeSchema, multiValuedAttribute);
multiValuedAttribute.setAttributePrimitiveValue(operation.getValues());
((ComplexAttribute) subValue).setSubAttribute(multiValuedAttribute);
break;
} else {
SimpleAttribute simpleAttribute = new SimpleAttribute(replacingAttributeSchema.getName(), operation.getValues());
DefaultAttributeFactory.createAttribute(replacingAttributeSchema, simpleAttribute);
((ComplexAttribute) subValue).setSubAttribute(simpleAttribute);
break;
}
}
if (replacingAttribute.getMutability().equals(SCIMDefinitions.Mutability.READ_ONLY) || replacingAttribute.getMutability().equals(SCIMDefinitions.Mutability.IMMUTABLE)) {
throw new BadRequestException("Can not remove a immutable attribute or a read-only attribute", ResponseCodeConstants.MUTABILITY);
} else {
if (replacingAttribute.getMultiValued()) {
((MultiValuedAttribute) replacingAttribute).getAttributePrimitiveValues().remove(expressionNode.getValue());
((MultiValuedAttribute) replacingAttribute).setAttributePrimitiveValue(operation.getValues());
} else {
((SimpleAttribute) (replacingAttribute)).setValue(operation.getValues());
}
isValueFound = true;
}
}
}
}
}
if (!isValueFound) {
throw new BadRequestException("No matching filter value found.", ResponseCodeConstants.NO_TARGET);
}
}
} else if (attribute.getType().equals(SCIMDefinitions.DataType.COMPLEX)) {
// this is only valid for extension
Attribute subAttribute = attribute.getSubAttribute(attributeParts[1]);
if (subAttribute == null) {
// add the attribute
AttributeSchema subAttributeSchema = SchemaUtil.getAttributeSchema(attributeParts[0] + "." + attributeParts[1], schema);
if (subAttributeSchema != null) {
if (subAttributeSchema.getMultiValued()) {
MultiValuedAttribute multiValuedAttribute = new MultiValuedAttribute(subAttributeSchema.getName());
DefaultAttributeFactory.createAttribute(subAttributeSchema, multiValuedAttribute);
multiValuedAttribute.setAttributeValue(decoder.buildComplexAttribute(subAttributeSchema, (JSONObject) operation.getValues()));
((ComplexAttribute) (attribute)).setSubAttribute(multiValuedAttribute);
} else {
throw new BadRequestException("Attribute : " + attributeParts[1] + "is not a multi valued attribute.", ResponseCodeConstants.INVALID_PATH);
}
} else {
throw new BadRequestException("Attribute : " + attributeParts[0] + "." + attributeParts[1] + "does not exists.", ResponseCodeConstants.INVALID_PATH);
}
} else {
List<Attribute> subValues = ((MultiValuedAttribute) (subAttribute)).getAttributeValues();
if (subValues != null) {
for (Iterator<Attribute> subValueIterator = subValues.iterator(); subValueIterator.hasNext(); ) {
Attribute subValue = subValueIterator.next();
Map<String, Attribute> subValuesSubAttribute = ((ComplexAttribute) subValue).getSubAttributesList();
for (Iterator<Attribute> iterator = subValuesSubAttribute.values().iterator(); iterator.hasNext(); ) {
Attribute subSubAttribute = iterator.next();
if (subSubAttribute.getName().equals(expressionNode.getAttributeValue())) {
if (((SimpleAttribute) (subSubAttribute)).getValue().equals(expressionNode.getValue())) {
if (subValue.getMutability().equals(SCIMDefinitions.Mutability.READ_ONLY) || subValue.getMutability().equals(SCIMDefinitions.Mutability.IMMUTABLE)) {
throw new BadRequestException("Can not remove a immutable attribute or a read-only attribute", ResponseCodeConstants.MUTABILITY);
} else {
subValueIterator.remove();
isValueFound = true;
}
}
}
}
}
AttributeSchema attributeSchema = SchemaUtil.getAttributeSchema(attributeParts[0] + "." + attributeParts[1], schema);
subValues.add(decoder.buildComplexAttribute(attributeSchema, (JSONObject) operation.getValues()));
if (!isValueFound) {
throw new BadRequestException("No matching filter value found.", ResponseCodeConstants.NO_TARGET);
}
}
}
} else {
throw new BadRequestException("Attribute : " + expressionNode.getAttributeValue() + " " + "is not a multivalued attribute.", ResponseCodeConstants.INVALID_PATH);
}
} else {
// add the attribute
AttributeSchema attributeSchema = SchemaUtil.getAttributeSchema(attributeParts[0], schema);
if (attributeSchema != null) {
if (attributeSchema.getMultiValued()) {
MultiValuedAttribute multiValuedAttribute = new MultiValuedAttribute(attributeSchema.getName());
DefaultAttributeFactory.createAttribute(attributeSchema, multiValuedAttribute);
String complexName = attributeSchema.getName() + "_" + SCIMConstants.DEFAULT + "_" + SCIMConstants.DEFAULT;
ComplexAttribute complexAttribute = new ComplexAttribute(complexName);
DefaultAttributeFactory.createAttribute(attributeSchema, complexAttribute);
AttributeSchema subAttributeSchema = SchemaUtil.getAttributeSchema(attributeParts[0] + "." + attributeParts[1], schema);
if (subAttributeSchema != null) {
if (subAttributeSchema.getMultiValued()) {
MultiValuedAttribute multiValuedSubAttribute = new MultiValuedAttribute(subAttributeSchema.getName());
DefaultAttributeFactory.createAttribute(subAttributeSchema, multiValuedSubAttribute);
multiValuedAttribute.setAttributePrimitiveValue(operation.getValues());
complexAttribute.setSubAttribute(multiValuedSubAttribute);
multiValuedAttribute.setAttributeValue(complexAttribute);
oldResource.setAttribute(multiValuedAttribute);
} else {
SimpleAttribute simpleAttribute = new SimpleAttribute(subAttributeSchema.getName(), operation.getValues());
DefaultAttributeFactory.createAttribute(subAttributeSchema, simpleAttribute);
complexAttribute.setSubAttribute(simpleAttribute);
multiValuedAttribute.setAttributeValue(complexAttribute);
oldResource.setAttribute(multiValuedAttribute);
}
} else {
throw new BadRequestException("Attribute : " + attributeParts[0] + "." + attributeParts[1] + "does not exists.", ResponseCodeConstants.INVALID_PATH);
}
} else {
ComplexAttribute extensionComplexAttribute = new ComplexAttribute(attributeSchema.getName());
DefaultAttributeFactory.createAttribute(attributeSchema, extensionComplexAttribute);
AttributeSchema subAttributeSchema = SchemaUtil.getAttributeSchema(attributeParts[0] + "." + attributeParts[1], schema);
if (subAttributeSchema != null) {
if (subAttributeSchema.getMultiValued()) {
MultiValuedAttribute multiValuedAttribute = new MultiValuedAttribute(subAttributeSchema.getName());
DefaultAttributeFactory.createAttribute(subAttributeSchema, multiValuedAttribute);
multiValuedAttribute.setAttributeValue(decoder.buildComplexAttribute(subAttributeSchema, (JSONObject) operation.getValues()));
oldResource.setAttribute(multiValuedAttribute);
} else {
throw new BadRequestException("Attribute : " + attributeParts[1] + "is not a multi valued attribute.", ResponseCodeConstants.INVALID_PATH);
}
} else {
throw new BadRequestException("Attribute : " + attributeParts[0] + "." + attributeParts[1] + "does not exists.", ResponseCodeConstants.INVALID_PATH);
}
}
} else {
throw new BadRequestException("No such attribute with the name : " + attributeParts[0], ResponseCodeConstants.INVALID_PATH);
}
}
return oldResource;
}
use of org.wso2.charon3.core.schema.AttributeSchema 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.schema.AttributeSchema 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.schema.AttributeSchema in project charon by wso2.
the class AbstractValidator method removeAnyReadOnlyAttributes.
/*
* Check for readonlyAttributes and remove them if they have been modified. - (create method)
*
* @param scimObject
* @param resourceSchema
* @throws CharonException
*/
public static void removeAnyReadOnlyAttributes(AbstractSCIMObject scimObject, SCIMResourceTypeSchema resourceSchema) throws CharonException {
// No need to check for immutable as immutable attributes can be defined at resource creation
// 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 read-only attributes.
if (attributeSchema.getMutability() == SCIMDefinitions.Mutability.READ_ONLY) {
if (attributeList.containsKey(attributeSchema.getName())) {
String error = "Read only attribute: " + attributeSchema.getName() + " is set from consumer in the SCIM Object. " + "Removing it.";
logger.debug(error);
scimObject.deleteAttribute(attributeSchema.getName());
}
}
// check for readonly sub attributes.
AbstractAttribute attribute = (AbstractAttribute) attributeList.get(attributeSchema.getName());
removeAnyReadOnlySubAttributes(attribute, attributeSchema);
}
}
use of org.wso2.charon3.core.schema.AttributeSchema 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());
}
}
}
}
}
}
}
Aggregations