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 Lemay
c8408fe9c4eb7f97ffa5b6aafcd4157afd478bc8Jon Branchimport org.forgerock.json.JsonValue
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.forgerock.json.resource.ActionRequest
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.forgerock.json.resource.Connection
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.forgerock.json.resource.Requests
c8408fe9c4eb7f97ffa5b6aafcd4157afd478bc8Jon Branchimport org.forgerock.services.context.RootContext
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.forgerock.openicf.connectors.scriptedcrest.ScriptedCRESTConfiguration
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.forgerock.openicf.misc.scriptedcommon.OperationType
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.common.logging.Log
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayimport org.identityconnectors.framework.common.objects.OperationOptions
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef operation = operation as OperationType
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef configuration = configuration as ScriptedCRESTConfiguration
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef connection = connection as Connection
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef log = log as Log
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef options = options as OperationOptions
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef scriptArguments = scriptArguments as Map
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef scriptLanguage = scriptLanguage as String
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemaydef scriptText = scriptText as String
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemayif ("crest".equalsIgnoreCase(scriptLanguage)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay ActionRequest request = Requests.newActionRequest("users", scriptText)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay request.setContent(new JsonValue(scriptArguments))
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def response = connection.action(new RootContext(), request)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return response.getObject()
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay} else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay ActionRequest request = Requests.newActionRequest("system/ldap/account", "script")
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay request.setAdditionalParameter("_scriptId", "")
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if ("resource".equalsIgnoreCase(scriptLanguage)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay request.setAdditionalParameter("_scriptExecuteMode", "resource")
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (null != options.options.variablePrefix) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay request.setAdditionalParameter("_scriptVariablePrefix", options.options.variablePrefix)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay scriptArguments.each { String key, Object value ->
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (!key.startsWith('_')) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if (value instanceof String) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay request.setAdditionalParameter(key, value as String)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay log.warn("Argument parameter ${key} is ignored because its type ${value?.class} is not supported.")
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def result = connection.action(new RootContext(), request)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay def returnValue = []
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay result.actions.each { key, value ->
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay if ("error".equals(key)) {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay throw new ConnectException(value as String)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay } else {
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay returnValue.add(value)
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay }
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay return returnValue as Object[]
3b9de50fdf0980762d6930a49e1a0f20b61a6f6bJason Lemay}