    importPackage(Packages.de.elo.ix.client);

    //@include lib_Class.js
    //@include lib_sol.common.AclUtils.js
    //@include lib_sol.common.ix.FunctionBase.js

    var logger = sol.create("sol.Logger", { scope: "sol.common.ix.functions.RestoreAcl" });

    /**
     * Restore ACL from whole folder structure.
     *
     * The ACL will be restored from a map field. The ACL can e.g. be saved to a map field by the {@link sol.common.ix.functions.RemoveAcl RemoveAcl} function.
     *
     * # As workflow node
     *
     * ObjId is set based on the element that the workflow is attached to.
     * Following configuration has to be applied to the comments field.
     *
     *     {
     *       "mapKey": "REMOVED_ACL",
     *       "recursive": true
     *     }
     *
     * The recursive flag is optional and the default will be `false`.
     *
     * # As IX function call
     *
     *     sol.common.IxUtils.execute("RF_sol_function_RestoreAcl", {
     *       objId: "4711",
     *       mapKey: "REMOVED_ACL"
     *     });
     *
     * @author JHR, ELO Digital Office GmbH
     * @version 1.03.000
     *
     * @eloix
     * @requires sol.common.JsonUtils
     * @requires sol.common.RepoUtils
     * @requires sol.common.AclUtils
     * @requires sol.common.WfUtils
     * @requires sol.common.ix.RfUtils
     * @requires sol.common.ix.FunctionBase
     *
     */
    sol.define("sol.common.ix.functions.RestoreAcl", {
      extend: "sol.common.ix.FunctionBase",

      requiredConfig: ["objId", "mapKey"],

      /**
       * @cfg {String} objId (required)
       * ObjectId of folder structure
       */

      /**
       * @cfg {String} mapKey (required)
       * Name of Mapfield which contains the ACL string
       */

      /** @cfg {Boolean} [recursive=false] (optional) */

      initialize: function (config) {
        var me = this;
        me.$super("sol.common.ix.FunctionBase", "initialize", [config]);
        me.recursive = config.recursive || false;
      },

      /**
       * Restores the ACL to whole folder structure.
       */
      process: function () {
        var me = this;

        sol.common.AclUtils.restoreRights(me.objId, { recursive: me.recursive, asAdmin: me.asAdmin, storeAcl: { type: "MAP", key: me.mapKey } });
      }

    });

    /**
     * @member sol.common.ix.functions.RestoreAcl
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#onEnterNode
     */
    function onEnterNode(clInfo, userId, wFDiagram, nodeId) {
      var params, module;

      logger.enter("onEnterNode_RestoreAcl", { flowId: wFDiagram.id, nodeId: nodeId });

      params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId, "mapKey");
      params.objId = wFDiagram.objId;

      if (params.asAdmin) {
        sol.common.WfUtils.checkMainAdminWf(wFDiagram);
      }

      module = sol.create("sol.common.ix.functions.RestoreAcl", params);
      module.process();

      logger.exit("onEnterNode_RestoreAcl");
    }

    /**
     * @member sol.common.ix.functions.RestoreAcl
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#onExitNode
     */
    function onExitNode(clInfo, userId, wFDiagram, nodeId) {
      var params, module;

      logger.enter("onExitNode_RestoreAcl", { flowId: wFDiagram.id, nodeId: nodeId });

      params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId, "mapKey");
      params.objId = wFDiagram.objId;

      if (params.asAdmin) {
        sol.common.WfUtils.checkMainAdminWf(wFDiagram);
      }

      module = sol.create("sol.common.ix.functions.RestoreAcl", params);
      module.process();

      logger.exit("onExitNode_RestoreAcl");
    }

    /**
     * @member sol.common.ix.functions.RestoreAcl
     * @method RF_sol_function_RestoreAcl
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
     */
    function RF_sol_function_RestoreAcl(ec, args) {
      logger.enter("RF_sol_function_RestoreAcl", args);
      var params, module;

      params = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, args, "objId", "mapKey");
      if (params.asAdmin) {
        sol.common.ix.RfUtils.checkMainAdminRights(ec.user, params);
      }

      module = sol.create("sol.common.ix.functions.RestoreAcl", params);
      module.process();

      logger.exit("RF_sol_function_RestoreAcl");
    }