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

    //@include lib_Class.js
    //@include lib_sol.common.ix.ServiceBase.js

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

    /**
     * Generates a report of child entries for a given archive path.
     *
     * This report can be saved and used by `sol.common.ix.services.ScriptVersionReportValidate`
     * later in order to check for changes in files.
     *
     * # As IX service call
     *
     *     sol.common.IxUtils.execute('RF_sol_common_service_ScriptVersionReportCreate', {
     *       arcPath: "ARCPATH[1]:\\Administration\\Business Solutions"
     *     });
     *
     * # Returns data as followed
     *
     * The service creates a data structure that looks as follows.
     *
     *     {
     *       date: "20150623105541",
     *       files: [{
     *              refPath:  "¶Administration¶Business Solutions¶connector_xml¶resources",
     *              name:     "doc_import_example",
     *              filehash: "9F0FF55B9F675DBD3CE42E9B3B337DA3",
     *              guid:     "(B22ECD56-1537-3B3B-CBBA-5DAE2A66DA81)",
     *              version:  "6",
     *              editor:   "James Bond",
     *              date:     "20150414141537",
     *              deleted:  false
     *          }, {
     *              refPath:  "¶Administration¶Business Solutions¶connector_xml¶resources",
     *              name:     "standard_import_example",
     *              filehash: "6F35A6E25C927442CFD484EBBF6ECAE2",
     *              guid:     "(04089DB6-E667-EDDE-DB86-5FCB6E5F4DFB)",
     *              version:  "1",
     *              editor:   "Batman Superman",
     *              date:     "20150402162230",
     *              deleted:  false
     *          }]
     *     }
     *
     * @author JHR, ELO Digital Office GmbH
     * @version 1.0
     *
     * @eloix
     * @requires  sol.common.JsonUtils
     * @requires  sol.common.ix.RfUtils
     * @requires  sol.common.ix.ServiceBase
     *
     */
    sol.define("sol.common.ix.services.ScriptVersionReportCreate", {
      extend: "sol.common.ix.ServiceBase",

      /**
       * @cfg {string} arcPath (required)
       * Repository start path
       */
      arcPath: undefined,

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

      /**
       * Generates a Version Script List in JSON-Format into a document.
       * @return {Object}
       */
      process: function () {
        var me = this,
            sordsSubEntry = [],
            arcPath = me.arcPath,
            scriptVersionList = {},
            timeDateJava = new Date(),
            isoDate = me.isoFromDate(timeDateJava),
            i,
            fileentry,
            ed,
            dv;

        sordsSubEntry = me.findFileInfo(arcPath, sordsSubEntry);
        scriptVersionList.date = isoDate;
        scriptVersionList.files = [];
        for (i = 0; i < sordsSubEntry.length; i++) {
          fileentry = {};
          ed = ixConnect.ix().checkoutDoc(sordsSubEntry[i].id, -1, EditInfoC.mbDocument, LockC.NO);
          dv = me.getWorkVersion(ed.document.docs);
          if (!dv) {
            continue;
          }
          fileentry.refPath = sordsSubEntry[i].refPaths[0].pathAsString;
          fileentry.name = sordsSubEntry[i].name;
          fileentry.guid = sordsSubEntry[i].guid;
          fileentry.filehash = dv.md5;
          fileentry.version = dv.version;
          fileentry.editor = dv.ownerName;
          fileentry.date = dv.updateDateIso;
          fileentry.deleted = dv.deleted;
          scriptVersionList.files.push(fileentry);
        }
        me.logger.debug(["JSON-object scriptVersionList = '{0}' is generated", scriptVersionList]);
        return scriptVersionList;
      },

      /**
       * List sub entries of a folder
       *
       * @param {String} arcPath archive path to start search
       * @param {Object[]} sordsSubEntry (childelements) of current folder represented by de.elo.ix.client.Sord
       * @return {Object[]} Subentries (childelements) of current folder represented by de.elo.ix.client.Sord
       */
      findFileInfo: function (arcPath, sordsSubEntry) {
        var me = this,
            ed,
            parentId,
            fi,
            sordZ,
            fr,
            frSords,
            isFolder,
            isDocument,
            isReference,
            i,
            idx;

        try {
          ed = ixConnect.ix().checkoutSord(arcPath, EditInfoC.mbOnlyId, LockC.NO);
          parentId = ed.sord.id;

          fi = new FindInfo();
          fi.findChildren = new FindChildren();
          fi.findChildren.parentId = parentId;
          fi.findChildren.endLevel = 1;
          fi.findChildren.mainParent = true;
          sordZ = SordC.mbAll;

          idx = 0;
          fr = ixConnect.ix().findFirstSords(fi, 1000, sordZ);
          while (true) {
            frSords = fr.sords;
            for (i = 0; i < frSords.length; i++) {
              isFolder = frSords[i].type < SordC.LBT_DOCUMENT;
              isDocument = frSords[i].type >= SordC.LBT_DOCUMENT && frSords[i].type <= SordC.LBT_DOCUMENT_MAX;
              isReference = frSords[i].parentId != parentId;

              if (isFolder && !isReference) {
                sordsSubEntry = me.findFileInfo(arcPath + "\\" + frSords[i].name, sordsSubEntry);
              }
              if (isDocument && !isReference) {
                me.logger.debug("Arcpath=" + arcPath + "\\" + frSords[i].name);
                sordsSubEntry.push(frSords[i]);
              }
            }
            if (!fr.isMoreResults()) {
              break;
            }
            idx += fr.sords.length;
            fr = ixConnect.ix().findNextSords(fr.searchId, idx, 1000, sordZ);
            frSords = fr.sords;
          }
        } catch (e) {
          me.logger.debug(["function findChildren (arcPath: '{0}') catch (e) name: '{1}' message: '{2}'", arcPath, e.name, e.message]);
        }
        if (fr) {
          ixConnect.ix().findClose(fr.searchId);
        }
        return sordsSubEntry;
      },

      isoFromDate: function (timeDateJava) {
        var me = this,
            isoDate = me.pad(timeDateJava.getFullYear(), 4) +
            me.pad(timeDateJava.getMonth() + 1, 2) +
            me.pad(timeDateJava.getDate(), 2) +
            me.pad(timeDateJava.getHours(), 2) +
            me.pad(timeDateJava.getMinutes(), 2) +
            me.pad(timeDateJava.getSeconds(), 2);
        return isoDate;
      },

      pad: function (val, len) {
        val = String(val);
        while (val.length < len) {
          val = "0" + val;
        }
        return val;
      },

      getWorkVersion: function (docs) {
        var dv, i;

        dv = null;
        for (i = 0; i < docs.length; i++) {
          dv = docs[i];
          if (dv.workVersion) {
            return dv;
          }
        }
        return dv;
      }

    });

    /**
     * @member sol.common.ix.services.ScriptVersionReportCreate
     * @method RF_sol_common_service_ScriptVersionReportCreate
     * @static
     * @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
     */
    function RF_sol_common_service_ScriptVersionReportCreate(iXSEContext, args) {
      logger.enter("RF_sol_common_service_ScriptVersionReportCreate", args);
      var params, module, scriptVersionList;

      params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "arcPath");
      module = sol.create("sol.common.ix.services.ScriptVersionReportCreate", params);
      scriptVersionList = module.process();
      logger.exit("RF_sol_common_service_ScriptVersionReportCreate");
      return sol.common.ix.RfUtils.stringify(scriptVersionList);
    }