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

//@include lib_Class.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.ObjectUtils.js
//@include lib_sol.common.StringUtils.js
//@include lib_sol.common.JsonUtils.js
//@include lib_sol.common.RepoUtils.js
//@include lib_sol.common.WfUtils.js
//@include lib_sol.common.ix.RfUtils.js

/**
 * @abstract
 *
 * Basic operations used by elo business solutions are modularized as ix function modules.
 *
 * Implementations should allow using functions in different ways:
 *   - As a workflow node (onEnterNode, onExitNode)
 *   - Executed as a registered function call.
 *
 * # Implementing a a function
 *
 * A function must extend the class FunctionBase and should implement the functions onEnterNode, onExitNode and RF_custom_functions_MyFunction on js script scope level.
 *
 *     sol.define("custom.function.MyFunction", {
 *       extend: "sol.common.ix.FunctionBase",
 *
 *       requiredConfig: ["objId", "myParam"],
 *
 *       initialize: function (config) {
 *         var me = this;
 *         me.$super("sol.common.ix.FunctionBase", "initialize", [config]);
 *       },
 *
 *       process: function() {
 *         // function logic goes here
 *         var me = this;
 *         me.myParam;
 *       },
 *     });
 *
 *     function onEnterNode(clInfo, userId, wFDiagram, nodeId) {
 *       var params = sol.common.ix.WfUtils.parseAndCheckParams(wFDiagram, nodeId),
 *           module;
 *         params.objId = wFDiagram.objId;
 *         module = sol.create("custom.functions.MyFunction", params);
 *         module.process();
 *     }
 *
 *     function onExitNode(clInfo, userId, wFDiagram, nodeId) {
 *       // same than onEnterNode
 *     }
 *
 *     function RF_custom_functions_MyFunction(iXSEContext, args) {
 *       var params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "objId", "myParam"),
 *           module;
 *         module = sol.create("RF_custom_solution_functions_MyFunction", params);
 *         module.process();
 *     }
 *
 * # Executing function as Workflow Node
 *
 * Functions can be used as Workflow scripts. In this case the objId is set based on the current workflow and must not
 * be passed to the function.
 *
 * Other configurations can be defined in the notes field of each workflow. It is recommended to use one workflow node
 * for each function.
 *
 *     {
 *       myParam: "Yeah!"
 *     }
 *
 * # Execute function as ix registered function
 *
 * Functions can be exectud with the help of sol.common.ix.RfUtils.execute. In this case the Utils class handles the
 * ix Any-Object transformation.
 *
 *     sol.common.IxUtils.execute('RF_custom_functions_MyFunction', {
 *       objId: "4711",
 *       myParam: "Yeah!"
 *     });
 *
 * @eloix
 * @requires sol.Logger
 */
sol.define("sol.common.ix.FunctionBase", {

  /**
   * @property {sol.Logger}
   * @protected
   * The logger for the module
   */
  logger: undefined,

  /** @cfg {string}
   * Object ID for the element
   */
  objId: undefined,

  initialize: function (config) {
    var me = this;
    RhinoManager.registerClass(me.$className);
    this.$super("sol.Base", "initialize", [config]);
  },

  /**
   * @abstract
   * Implementation of function modules' process.
   * This function must be implemented by the child class and should contain the logic of the function module.
   */
  process: function () {
    throw "cannot call 'process' of abstract FunctionBase";
  }
});

/**
 * @member sol.common.ix.FunctionBase
 * @method onEnterNode
 * @static
 * @abstract
 *
 * This function is called before a workflow node is activated.
 *
 * The configuration for this function can be defined in the comments section of each workflow node and should be valid js.
 * For more information on using this function please refer to the functions documentation.
 *
 * @param {de.elo.ix.client.ClientInfo} clInfo object with language, country and ticket
 * @param {number} userId The calling users ID
 * @param {de.elo.ix.client.WFDiagram} wFDiagram
 * @param {number} nodeId The activated node ID
 */


/**
 * @member sol.common.ix.FunctionBase
 * @method onExitNode
 * @static
 * @abstract
 *
 * This function is called after a workflow node is deactivated.
 *
 * The configuration for this function can be defined in the comments section of each workflow node and should be valid js.
 * For more information on using this function please refer to the functions documentation.
 *
 * @param {de.elo.ix.client.ClientInfo} clInfo  object with language, country and ticket
 * @param {number} userId  The calling users ID
 * @param {de.elo.ix.client.WFDiagram} wFDiagram
 * @param {number} nodeId  The deactivated node ID
 */

/**
 * @member sol.common.ix.FunctionBase
 * @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.
 */