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

    //@include lib_Class.js
    //@include lib_sol.common.SordUtils.js
    //@include lib_sol.common.ix.DynKwlUtils.js
    //@include lib_sol.common.ix.FunctionBase.js

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

    /**
     * Applies data from a dynamic keywordlist using a lookup field.
     *
     * # As workflow node
     *
     * ObjId is set based on the element that the workflow is attached to.
     * Following additional configuration can be applied to the comments field.
     *
     *     {
     *       "lookupFields": [ "MY_INDEX_FIELD" ]
     *     }
     *
     * # As IX function call
     *
     * In addition to the workflow node configuration the objId must be passed.
     *
     *     sol.common.IxUtils.execute("RF_sol_function_ApplyDynKwl", {
     *       objId: "4712",
     *       lookupFields: [ "MY_INDEX_FIELD" ]
     *     });
     *
     *
     * @author PZ, ELO Digital Office GmbH
     * @version 1.0
     *
     * @eloix
     * @requires sol.common.JsonUtils
     * @requires sol.common.SordUtils
     * @requires sol.common.WfUtils
     * @requires sol.common.ix.RfUtils
     * @requires sol.common.ix.DynKwlUtils
     * @requires sol.common.ix.FunctionBase
     *
     */
    sol.define("sol.common.ix.functions.ApplyDynKwl", {
      extend: "sol.common.ix.FunctionBase",

      requiredConfig: ["objId", "lookupFields"],

      /**
       * @cfg {String} objId (required)
       */

      /**
       * @cfg {String} lookupFields (required)
       * Field from which the keywordlist will be user and which contains the lookup value
       */

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

      /**
       * Performes the lookup.
       */
      process: function () {
        var me = this,
            dirty = false,
            sord, name;
        try {
          me.logger.info(["apply dynamic keywordlist to sord: objId={0}; lookupFields={1}", me.objId, me.lookupFields]);
          sord = ixConnect.ix().checkoutSord(me.objId, SordC.mbAllIndex, LockC.NO);

          me.lookupFields.forEach(function (lookupField) {
            dirty = sol.common.ix.DynKwlUtils.fillSord(sord, lookupField, { ignoreMissingFields: true }) || dirty;
          });

          if (dirty === true) {
            ixConnect.ix().checkinSord(sord, SordC.mbAllIndex, LockC.NO);
          } else {
            me.logger.debug("no changes applied");
          }
        } catch (ex) {
          name = (sord) ? sord.name : "--no_sord--";
          me.logger.error(["error applying values from dynamic keywordlist to sord: objId={0}; name={1}; lookupFields={2}", me.objId, name, me.lookupFields], ex);
        }
      }
    });

    /**
     * @member sol.common.ix.functions.ApplyDynKwl
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#onEnterNode
     */
    function onEnterNode(clInfo, userId, wFDiagram, nodeId) {
      logger.enter("onEnterNode_ApplyDynKwl", { flowId: wFDiagram.id, nodeId: nodeId });
      var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId),
          module;

      params.objId = wFDiagram.objId;
      module = sol.create("sol.common.ix.functions.ApplyDynKwl", params);

      module.process();

      logger.exit("onEnterNode_ApplyDynKwl");
    }

    /**
     * @member sol.common.ix.functions.ApplyDynKwl
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#onExitNode
     */
    function onExitNode(clInfo, userId, wFDiagram, nodeId) {
      logger.enter("onExitNode_ApplyDynKwl", { flowId: wFDiagram.id, nodeId: nodeId });
      var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId),
          module;

      params.objId = wFDiagram.objId;
      module = sol.create("sol.common.ix.functions.ApplyDynKwl", params);

      module.process();

      logger.exit("onExitNode_ApplyDynKwl");
    }

    /**
     * @member sol.common.ix.functions.ApplyDynKwl
     * @method RF_sol_function_ApplyDynKwl
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
     */
    function RF_sol_function_ApplyDynKwl(iXSEContext, args) {
      logger.enter("RF_sol_function_ApplyDynKwl", args);
      var params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "objId", "lookupFields"),
          module = sol.create("sol.common.ix.functions.ApplyDynKwl", params);

      module.process();

      logger.exit("RF_sol_function_ApplyDynKwl");
    }