    //@include lib_Class.js
    //@include lib_sol.common.ActionBase.js

    /**
     * @abstract
     *
     * Base class for IX actions.
     *
     * # Implementation example
     *
     * Actions must be provided as registered functions.
     *
     *     sol.define("sol.my.ix.actions.MyAction", {
     *       extend: "sol.common.ix.ActionBase",
     *
     *       requiredConfig: ["objId"],
     *
     *       initialize: function (config) {
     *         var me = this;
     *         me.$super("sol.common.ix.ActionBase", "initialize", [config]);
     *         // some other initialization
     *       },
     *
     *       getName: function () {
     *         return "MyAction";
     *       },
     *
     *       process: function () {
     *         // do your stuff
     *         // add some events / data
     *       }
     *     });
     *
     *     function RF_sol_my_actions_MyAction(ec, configAny) {
     *       var rfUtils = sol.common.ix.RfUtils,
     *       config = rfUtils.parseAndCheckParams(ec, arguments.callee.name, configAny, "objId"),
     *       closeFile;
     *
     *       config.ci = ec.ci;
     *       config.user = ec.user;
     *
     *       closeFile = sol.create("sol.my.ix.actions.MyAction", config);
     *       return closeFile.execute();
     *     }
     *
     * # Executing IX actions from clients
     *
     * Actions can be executed thanks to handler implementations in the Java Client and Web Client. Refer to
     * sol.common.jc.ActionHandler#execute and sol.common.web.ActionHandler#execute for more information.
     *
     *     sol.common.jc.ActionHandler.execute('RF_sol_my_actions_MyAction' {
     *       objId: '234'
     *     });
     *
     * @author PZ, ELO Digital Office GmbH
     * @version 1.03.006
     *
     * @eloix
     * @requires sol.common.JsonUtils
     * @requires sol.common.SordUtils
     * @requires sol.common.IxUtils
     * @requires sol.common.CounterUtils
     * @requires sol.common.TranslateTerms
     * @requires sol.common.WfUtils
     */
    sol.define("sol.common.ix.ActionBase", {
      extend: "sol.common.ActionBase",

      initialize: function (config) {
        var me = this, renderedConfig;

        if (me.$className === "sol.common.ix.ActionBase") {
          throw "can not create instance of abstract class 'sol.common.ix.ActionBase'";
        }

        if (!(config._$disableParamsTemplating === true)) {
          renderedConfig = me.renderConfig(config);
          Object.keys(renderedConfig).forEach(function (prop) {
            if ((Object.prototype.toString.call(config[prop]) !== "[object JavaObject]") || config[prop] instanceof java.lang.String) {
              config[prop] = renderedConfig[prop];
            }
          });
          config.$templating = undefined;
        }

        me.$super("sol.common.ActionBase", "initialize", [config]);
      },

      /**
       * @abstract
       * Name of the action. Has to be implemented by subclass.
       */
      getName: function () {
        throw "cannot call 'name' of abstract class 'sol.common.ix.ActionBase'";
      },

      /**
       * @abstract
       * Implementation of the action. Has to be implemented by subclass.
       */
      process: function () {
        throw "cannot call 'process' of abstract class 'sol.common.ix.ActionBase'";
      },

      /**
       * @protected
       * @inheritdoc sol.common.ActionBase#addActionEvent
       */
      addActionEvent: function (registeredFunction, params, on) {
        var me = this,
            eventCfg = { registeredFunction: registeredFunction, params: params };

        me._registeredEvents.push(me.createEvent(sol.common.IxUtils.CONST.EVENT_TYPES.ACTION, eventCfg, on));
      },

      /**
       * @private
       * @inheritdoc sol.common.ActionBase#createEvent
       */
      createEvent: function (type, params, on) {
        var event = { ID: type, COMPONENT: sol.common.IxUtils.CONST.COMPONENTS.IX, obj: {} },
            param;

        if (on) {
          event.ON = on;
        }

        for (param in params) {
          if (params.hasOwnProperty(param)) {
            event.obj[param] = params[param];
          }
        }

        return event;
      }

    });

    /**
     * @member sol.common.ix.ActionBase
     * @method RF_FunctionName
     * @static
     * @abstract
     *
     * This function can be called from an application by invoking the API function "executeRegisteredFunction" or by using
     * sol.common.IxUtils.execute which internally handles the Any-Object conversion.
     *
     * All configuration params should be passed as a configuration object to the args param.
     *
     *     sol.common.IxUtils.execute('RF_FunctionName', {
     *       configParam1: 'myParam'
     *     });
     *
     * @param {de.elo.ix.client.IXServerEventsContext} Execution context
     * @param {Object} args Argument array sent by the client application.
     */