Search in sources :

Example 21 with Extension

use of org.gluu.oxtrust.model.scim2.extensions.Extension in project oxTrust by GluuFederation.

the class ExtensionService method extensionOfAttribute.

public Extension extensionOfAttribute(Class<? extends BaseScimResource> cls, String attribute) {
    List<Extension> extensions = getResourceExtensions(cls);
    Extension belong = null;
    try {
        for (Extension ext : extensions) {
            if (attribute.startsWith(ext.getUrn() + ":")) {
                attribute = attribute.substring(ext.getUrn().length() + 1);
                for (String fieldName : ext.getFields().keySet()) if (attribute.equals(fieldName)) {
                    belong = ext;
                    break;
                }
            }
        }
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    }
    return belong;
}
Also used : Extension(org.gluu.oxtrust.model.scim2.extensions.Extension)

Example 22 with Extension

use of org.gluu.oxtrust.model.scim2.extensions.Extension in project oxTrust by GluuFederation.

the class Scim2PatchService method applyPatchOperation.

public BaseScimResource applyPatchOperation(BaseScimResource resource, PatchOperation operation) throws Exception {
    BaseScimResource result = null;
    Map<String, Object> genericMap = null;
    PatchOperationType opType = operation.getType();
    Class<? extends BaseScimResource> clazz = resource.getClass();
    String path = operation.getPath();
    log.debug("applyPatchOperation of type {}", opType);
    // Determine if operation is with value filter
    if (StringUtils.isNotEmpty(path) && !operation.getType().equals(PatchOperationType.ADD)) {
        Pair<Boolean, String> pair = validateBracketedPath(path);
        if (pair.getFirst()) {
            String valSelFilter = pair.getSecond();
            if (valSelFilter == null)
                throw new SCIMException("Unexpected syntax in value selection filter");
            else {
                int i = path.indexOf("[");
                String attribute = path.substring(0, i);
                i = path.lastIndexOf("].");
                String subAttribute = i == -1 ? "" : path.substring(i + 2);
                // Abort earlier
                return applyPatchOperationWithValueFilter(resource, operation, valSelFilter, attribute, subAttribute);
            }
        }
    }
    if (!opType.equals(PatchOperationType.REMOVE)) {
        Object value = operation.getValue();
        List<String> extensionUrns = extService.getUrnsOfExtensions(clazz);
        if (value instanceof Map)
            genericMap = IntrospectUtil.strObjMap(value);
        else {
            // It's an atomic value or an array
            if (StringUtils.isEmpty(path))
                throw new SCIMException("Value(s) supplied for resource not parseable");
            // Create a simple map and trim the last part of path
            String[] subPaths = ScimResourceUtil.splitPath(path, extensionUrns);
            genericMap = Collections.singletonMap(subPaths[subPaths.length - 1], value);
            if (subPaths.length == 1)
                path = "";
            else
                path = path.substring(0, path.lastIndexOf("."));
        }
        if (StringUtils.isNotEmpty(path)) {
            // Visit backwards creating a composite map
            String[] subPaths = ScimResourceUtil.splitPath(path, extensionUrns);
            for (int i = subPaths.length - 1; i >= 0; i--) {
                // Create a string consisting of all subpaths until the i-th
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j <= i; j++) sb.append(subPaths[j]).append(".");
                Attribute annot = IntrospectUtil.getFieldAnnotation(sb.substring(0, sb.length() - 1), clazz, Attribute.class);
                boolean multivalued = !(annot == null || annot.multiValueClass().equals(NullType.class));
                Map<String, Object> genericBiggerMap = new HashMap<String, Object>();
                genericBiggerMap.put(subPaths[i], multivalued ? Collections.singletonList(genericMap) : genericMap);
                genericMap = genericBiggerMap;
            }
        }
        log.debug("applyPatchOperation. Generating a ScimResource from generic map: {}", genericMap.toString());
    }
    // Try parse genericMap as an instance of the resource
    ObjectMapper mapper = new ObjectMapper();
    BaseScimResource alter = opType.equals(PatchOperationType.REMOVE) ? resource : mapper.convertValue(genericMap, clazz);
    List<Extension> extensions = extService.getResourceExtensions(clazz);
    switch(operation.getType()) {
        case REPLACE:
            result = ScimResourceUtil.transferToResourceReplace(alter, resource, extensions);
            break;
        case ADD:
            result = ScimResourceUtil.transferToResourceAdd(alter, resource, extensions);
            break;
        case REMOVE:
            result = ScimResourceUtil.deleteFromResource(alter, operation.getPath(), extensions);
            break;
    }
    return result;
}
Also used : PatchOperationType(org.gluu.oxtrust.model.scim2.patch.PatchOperationType) Attribute(org.gluu.oxtrust.model.scim2.annotations.Attribute) Extension(org.gluu.oxtrust.model.scim2.extensions.Extension) SCIMException(org.gluu.oxtrust.model.exception.SCIMException) BaseScimResource(org.gluu.oxtrust.model.scim2.BaseScimResource) NullType(javax.lang.model.type.NullType) ObjectMapper(org.codehaus.jackson.map.ObjectMapper)

Example 23 with Extension

use of org.gluu.oxtrust.model.scim2.extensions.Extension in project oxTrust by GluuFederation.

the class SchemaWebService method setup.

@PostConstruct
public void setup() {
    // Do not use getClass() here... a typical weld issue...
    endpointUrl = appConfiguration.getBaseEndpoint() + SchemaWebService.class.getAnnotation(Path.class).value();
    List<Class<? extends BaseScimResource>> excludedResources = Arrays.asList(SchemaResource.class, ResourceType.class, ServiceProviderConfig.class);
    resourceSchemas = new HashMap<String, Class<? extends BaseScimResource>>();
    // Fill map with urn vs. resource
    for (Class<? extends BaseScimResource> cls : IntrospectUtil.allAttrs.keySet()) {
        if (!excludedResources.contains(cls)) {
            resourceSchemas.put(ScimResourceUtil.getDefaultSchemaUrn(cls), cls);
            for (Extension extension : extService.getResourceExtensions(cls)) resourceSchemas.put(extension.getUrn(), cls);
        }
    }
}
Also used : Extension(org.gluu.oxtrust.model.scim2.extensions.Extension) BaseScimResource(org.gluu.oxtrust.model.scim2.BaseScimResource) PostConstruct(javax.annotation.PostConstruct)

Aggregations

Extension (org.gluu.oxtrust.model.scim2.extensions.Extension)14 Extension (org.gluu.oxtrust.model.scim2.Extension)8 ObjectMapper (org.codehaus.jackson.map.ObjectMapper)6 ExtensionField (org.gluu.oxtrust.model.scim2.extensions.ExtensionField)6 GluuAttribute (org.xdi.model.GluuAttribute)6 BigDecimal (java.math.BigDecimal)5 Date (java.util.Date)5 HashMap (java.util.HashMap)4 User (org.gluu.oxtrust.model.scim2.User)4 IOException (java.io.IOException)3 ArrayList (java.util.ArrayList)3 Map (java.util.Map)3 GluuCustomPerson (org.gluu.oxtrust.model.GluuCustomPerson)3 SCIMException (org.gluu.oxtrust.model.exception.SCIMException)3 GluuAttributeDataType (org.xdi.model.GluuAttributeDataType)3 List (java.util.List)2 InvalidAttributeValueException (javax.management.InvalidAttributeValueException)2 JsonNode (org.codehaus.jackson.JsonNode)2 Version (org.codehaus.jackson.Version)2 SimpleModule (org.codehaus.jackson.map.module.SimpleModule)2