3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay/*
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay *
c8408fe9c4eb7f97ffa5b6aafcd4157afd478bc8Jon Branch * Copyright 2014-2015 ForgeRock AS
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay *
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * The contents of this file are subject to the terms
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * of the Common Development and Distribution License
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * (the License). You may not use this file except in
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * compliance with the License.
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay *
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * You can obtain a copy of the License at
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * http://forgerock.org/license/CDDLv1.0.html
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * See the License for the specific language governing
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * permission and limitations under the License.
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay *
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * When distributing Covered Code, include this CDDL
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * Header Notice in each file and include the License file
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * at http://forgerock.org/license/CDDLv1.0.html
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * If applicable, add the following below the CDDL Header,
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * with the fields enclosed by brackets [] replaced by
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * your own identifying information:
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * "Portions Copyrighted [year] [name of copyright owner]"
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay */
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport groovy.json.JsonOutput
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport groovy.json.JsonSlurper
c8408fe9c4eb7f97ffa5b6aafcd4157afd478bc8Jon Branchimport org.forgerock.json.JsonPointer
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.forgerock.openicf.misc.crest.VisitorParameter
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.common.CollectionUtil
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.common.Pair
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.common.security.GuardedByteArray
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.common.security.GuardedString
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.exceptions.ConfigurationException
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.Attribute
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.AttributeInfo
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.AttributeInfoBuilder
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.AttributeUtil
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.Name
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.ObjectClass
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.QualifiedUid
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.Uid
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay/**
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * A CRESTSchema parses the OpenIDM configuration and builds the schema from.
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay *
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay * @author Laszlo Hordos
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay */
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayclass SchemaSlurper {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String TYPE_STRING = "string";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String TYPE_NUMBER = "number";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String TYPE_INTEGER = "integer";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String TYPE_BOOLEAN = "boolean";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String TYPE_OBJECT = "object";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String TYPE_ARRAY = "array";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String TYPE_NULL = "null";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_BIGDECIMAL = "JAVA_TYPE_BIGDECIMAL";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_BIGINTEGER = "JAVA_TYPE_BIGINTEGER";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_PRIMITIVE_BOOLEAN = "JAVA_TYPE_PRIMITIVE_BOOLEAN";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_BYTE_ARRAY = "JAVA_TYPE_BYTE_ARRAY";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_CHAR = "JAVA_TYPE_CHAR";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_CHARACTER = "JAVA_TYPE_CHARACTER";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_DATE = "JAVA_TYPE_DATE";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_PRIMITIVE_DOUBLE = "JAVA_TYPE_PRIMITIVE_DOUBLE";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_DOUBLE = "JAVA_TYPE_DOUBLE";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_FILE = "JAVA_TYPE_FILE";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_PRIMITIVE_FLOAT = "JAVA_TYPE_PRIMITIVE_FLOAT";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_FLOAT = "JAVA_TYPE_FLOAT";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_GUARDEDBYTEARRAY = "JAVA_TYPE_GUARDEDBYTEARRAY";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_GUARDEDSTRING = "JAVA_TYPE_GUARDEDSTRING";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_INT = "JAVA_TYPE_INT";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_PRIMITIVE_LONG = "JAVA_TYPE_PRIMITIVE_LONG";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_LONG = "JAVA_TYPE_LONG";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_NAME = "JAVA_TYPE_NAME";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_OBJECTCLASS = "JAVA_TYPE_OBJECTCLASS";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_QUALIFIEDUID = "JAVA_TYPE_QUALIFIEDUID";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_SCRIPT = "JAVA_TYPE_SCRIPT";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_UID = "JAVA_TYPE_UID";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_URI = "JAVA_TYPE_URI";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_BYTE = "JAVA_TYPE_BYTE";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay public static final String JAVA_TYPE_PRIMITIVE_BYTE = "JAVA_TYPE_PRIMITIVE_BYTE";
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay static Map<String, Object> parse(URL jsonConfig) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay assert null != jsonConfig;
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay new SchemaSlurper(jsonConfig).validate()
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay private def schema = [:]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay Map<String, Object> validate() {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay schema.each { key, Map value ->
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (!value.attributes.containsKey(Name.NAME)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay throw new ConfigurationException("Schema of ${key} does not contain '__NAME__'")
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay private SchemaSlurper(URL url) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay Map<String, Class> typeMap = new HashMap<String, Class>(43);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(TYPE_ARRAY, List.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(TYPE_BOOLEAN, Boolean.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(TYPE_INTEGER, Integer.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(TYPE_NUMBER, Number.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(TYPE_OBJECT, Map.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(TYPE_STRING, String.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_BIGDECIMAL, BigDecimal.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_BIGINTEGER, BigInteger.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_PRIMITIVE_BOOLEAN, boolean.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_BYTE_ARRAY, byte[].class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_CHAR, char.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_CHARACTER, Character.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_DATE, Date.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_PRIMITIVE_DOUBLE, double.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_DOUBLE, Double.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_FILE, File.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_PRIMITIVE_FLOAT, float.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_FLOAT, Float.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_GUARDEDBYTEARRAY, GuardedByteArray.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_GUARDEDSTRING, GuardedString.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_INT, int.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_PRIMITIVE_LONG, long.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_LONG, Long.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_NAME, Name.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_OBJECTCLASS, ObjectClass.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_QUALIFIEDUID, QualifiedUid.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_SCRIPT, org.identityconnectors.common.script.Script.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_UID, Uid.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_URI, URI.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_BYTE, Byte.class);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay typeMap.put(JAVA_TYPE_PRIMITIVE_BYTE, Byte.TYPE);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def slurper = new JsonSlurper()
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay //def url = getClass().getClassLoader().getResource("schema.json")
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def result = slurper.parse(url)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay result.objectTypes.collectEntries(schema) { objectName, objectDefinition ->
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay [objectDefinition.nativeType,
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay [resourceContainer: objectName,
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay attributes :
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay objectDefinition.properties.collectEntries {String propertyName, Map propertyDefinition ->
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (AttributeUtil.namesEqual(Uid.NAME, propertyDefinition.nativeName)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay //Ignore it
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return null
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def jsonType = propertyDefinition.type
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay AttributeInfoBuilder builder = new AttributeInfoBuilder(propertyDefinition.nativeName);
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (propertyDefinition?.required) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay builder.setRequired(true)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay propertyDefinition?.flags?.each {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if ("NOT_CREATABLE".equalsIgnoreCase(it)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay builder.setCreateable(false)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else if ("NOT_UPDATEABLE".equalsIgnoreCase(it)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay builder.setUpdateable(false)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else if ("NOT_READABLE".equalsIgnoreCase(it)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay builder.setReadable(false)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else if ("NOT_RETURNED_BY_DEFAULT".equalsIgnoreCase(it)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay builder.setReturnedByDefault(false)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (TYPE_ARRAY.equals(jsonType)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay builder.setMultiValued(true)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay jsonType = propertyDefinition.items.type
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (null != propertyDefinition.nativeType) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay builder.setType(typeMap[propertyDefinition.nativeType])
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return [propertyDefinition.nativeName,
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay [attributeInfo: builder.build(),
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay jsonType : jsonType,
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay jsonName : new JsonPointer(propertyName),
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay ]]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }]]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay String getResourceContainer(ObjectClass objectClass) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay for (Pair<String, String> pair : cache.keySet()) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (objectClass.is(pair.second)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return pair.first
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay throw new UnsupportedOperationException("Unsupported ObjectClass: " + objectClass.objectClassValue)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay Map<String, Set<AttributeInfo>> getAttributeInfo() {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return cache.collectEntries { key, value ->
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay [key.second, value*.value.attributeInfo]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay private Map<String, VisitorParameter> visitorCache;
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay VisitorParameter getVisitorParameter(ObjectClass objectClass) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (visitorCache == null) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay visitorCache = CollectionUtil.newCaseInsensitiveMap();
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay cache.each { key, value ->
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay final
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def parameter = visitorCache[key.second] = new org.forgerock.openicf.misc.crest.VisitorParameter() {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def params = value
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay String translateName(String filter) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def a = params[filter]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (null != a) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return a.attributeInfo.name
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay filter
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay String convertValue(Attribute filter) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def a = params[filter]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (null != a) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (TYPE_ARRAY.equals(a.jsonType)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay JsonOutput.toJson(filter.value.each {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay CRESTHelper.setAttributeValue(a.attributeInfo, it)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay })
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else if (TYPE_BOOLEAN.equals(a.jsonType)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay AttributeUtil.getBooleanValue(filter)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay CRESTHelper.setAttributeValue(a.attributeInfo, AttributeUtil.getSingleValue(filter))
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay AttributeUtil.getAsStringValue(filter)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay parameter
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay VisitorParameter p = visitorCache[objectClass.objectClassValue]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (null != p) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return p
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay throw new UnsupportedOperationException("Unsupported ObjectClass: " + objectClass.objectClassValue)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay}