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

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

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

    /**
     * Checks the extension of an document.
     *
     * If the element is folder it is assumend, that the folder is document container.
     * In this case, the first element in the folder is checked for the file extension.
     *
     * # Example
     *
     *     {
     *       "checks": { "hasExtension": ["tiff", "tif", "pdf", "jpg", "jpeg"] },
     *       "wfStatus": { "onSuccess": "TRUE", "onFailure": "FALSE" }
     *     }
     *
     * @author MW, ELO Digital Office GmbH
     * @version 1.0
     *
     * @eloix
     * @requires  sol.common.RepoUtils
     * @requires  sol.common.SordUtils
     * @requires  sol.common.ix.FunctionBase
     *
     */
    sol.define("sol.common.ix.functions.CheckDoc", {
      extend: "sol.common.ix.FunctionBase",

      requiredConfig: ["wfDiagram", "checks"],

      /**
       * @cfg {de.elo.ix.client.wfDiagram} wfDiagram (required)
       * The workflow which should be checked.
       */

      /**
       * @cfg {Object} checks
       * Checks
       */

      /**
       * @cfg {String[]} checks.extensions
       * Extensions
       */

      /**
       * @cfg {Object} wfStatus
       *
       *     "wfStatus": { "onSuccess": "yaaay", "onFailure": "ohNooo" }
       *
       * - `onSuccess`: set as ELO_WF_STATUS after a successfull check
       * - `onFailure`: set as ELO_WF_STATUS after a check failure
       */

      /**
       * @private
       * @property {String} [DEFAULT_PASSED_STATUS="PASSED"] Default workflow status in case of a successful check
       */
      DEFAULT_PASSED_STATUS: "PASSED",

      /**
       * @private
       * @property {String} [DEFAULT_FAILED_STATUS="FAILED"] Default workflow status in case of a check failure
       */
      DEFAULT_FAILED_STATUS: "FAILED",

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

      /**
       * Perform the checks.
       */
      process: function () {
        var me = this,
            result, status;

        me.sord = ixConnect.ix().checkoutSord(me.wfDiagram.objId, SordC.mbAllIndex, LockC.NO);
        result = me.check();

        if (result) {
          status = (me.wfStatus && me.wfStatus.onSuccess) ? me.wfStatus.onSuccess : me.DEFAULT_PASSED_STATUS;
        } else {
          status = (me.wfStatus && me.wfStatus.onFailure) ? me.wfStatus.onFailure : me.DEFAULT_FAILED_STATUS;
        }

        sol.common.WfUtils.setWorkflowStatus(me.wfDiagram, status);
      },

      check: function () {
        var me = this,
            sord, isFolder, extension, result;

        sord = ixConnect.ix().checkoutSord(me.wfDiagram.objId, SordC.mbAll, LockC.NO);
        isFolder = sol.common.SordUtils.isFolder(sord);
        if (isFolder) {
          sord = me.getFirstChildDocument(sord);
        }
        if (!sord || !sord.docVersion || !sord.docVersion.ext) {
          return false;
        }
        extension = (sord.docVersion.ext + "").toLowerCase();

        if (!me.checks || !me.checks.hasExtension) {
          return false;
        }

        me.checks.hasExtension = me.checks.hasExtension.map(function (ext) {
          return ext.toLowerCase();
        });

        result = (me.checks.hasExtension.indexOf(extension) > 0);

        return result;
      },

      getFirstChildDocument: function (sord) {
        var sords, firstChildDocument;

        sords = sol.common.RepoUtils.findChildren(sord.id, {
          includeDocuments: true,
          includeFolders: false
        });

        if (!sords || (sords.length < 1)) {
          return null;
        }

        firstChildDocument = sords[0];
        return firstChildDocument;
      }
    });

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

      logger.enter("onExitNode_CheckDoc", { flowId: wfDiagram.id, nodeId: nodeId });

      params = sol.common.WfUtils.parseAndCheckParams(wfDiagram, nodeId);
      params.wfDiagram = wfDiagram;

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

      module.process();

      logger.exit("onExitNode_CheckDoc");
    }