    //@include lib_Class.js

    /**
     * Utility methods for the monitoring modul.
     *
     * @author PZ, ELO Digital Office GmbH
     * @version 1.02.000
     *
     * @eloas
     * @requires moment
     * @requires sol.commom.SordUtils
     * @requires sol.common.DateUtils
     */
    sol.define("sol.common_monitoring.as.MonitorUtils", {
      singleton: true,

      // config for `registerUpdate`
      // Is duplicated in {@link sol.common_monitoring.ix.MonitorUtils} due to compatibility reasons. All changes schould be reflected there.
      queueId: "ARCPATH[(E10E1000-E100-E100-E100-E10E10E10E00)]:/Business Solutions/_global/Job queue",
      timestampBufferValue: -5,
      timestampBufferUnit: "s",

      /**
       * Evaluates a Sord and a configuration to determine a value and a unit.
       *
       * If no value was found, it will be set so `0` as default.
       * If no unit was found, it will be left blank.
       *
       *     { value: 10 }
       *     { value: 10, unit: "Y" }
       *     { value: 10, unit: { type: "GRP", key: "MY_UNIT" } }
       *     { type: "GRP", key: "MY_DATE" }
       *     { type: "GRP", key: "MY_DATE", unit: "Y" }
       *     { type: "GRP", key: "MY_DATE", unit: { type: "GRP", key: "MY_UNIT" } }
       *
       * The followig call
       *
       *      sol.common_monitoring.as.MonitorUtils.evalDateUnitConfig(sord, { value: 10, unit: "Y" });
       *
       * would just return the two fix values
       *
       *      { value: 10, unit: "Y" }
       *
       * while this call
       *
       *     sol.common_monitoring.as.MonitorUtils.evalDateUnitConfig(sord, { type: "GRP", key: "MY_DATE", unit: { type: "GRP", key: "MY_UNIT" } });
       *
       * would read the resulting `value` from the indexfield `MY_DATE` and the `unit` from the indexfield `MY_UNIT`.
       *
       * If the field holding the unit is filled by a localized keyword list, it will contain values like 'd - days'.
       * Therefor the function analyses the unit and if it contains any `-` the key (string befor the `-`) will be extracted and used.
       *
       * @param {de.elo.ix.client.Sord} sord
       * @param {Object} config
       * @return {Object} Returns an object with the two attributes: `value` and `unit`
       */
      evalDateUnitConfig: function (sord, config) {
        var me = this,
            result = {};

        if (config.type && config.key) {
          result.value = sol.common.SordUtils.getValue(sord, config) + "";
        } else {
          result.value = config.value;
        }

        if (!result.value) {
          result.value = 0;
        }

        if (config.unit && config.unit.type && config.unit.key) {
          result.unit = sol.common.SordUtils.getValue(sord, config.unit) + "";
          result.unit = me.getLocalizedKwlKey(result.unit);
        } else {
          result.unit = config.unit;
        }

        return result;
      },

      /**
       * @private
       * Extracts the unit, if the value was set from a localized keyword list.
       * @param {String} str
       * @return {String}
       */
      getLocalizedKwlKey: function (str) {
        var separator = "-",
            part, separatorPos;
        if (!str) {
          part = "";
        } else {
          separatorPos = str.indexOf(separator);
          if (separatorPos < 0) {
            part = str;
          } else {
            part = str.substring(0, separatorPos).trim();
          }
        }
        return part;
      },

      /**
       * Register object to be updated by the `JobQueue` rule.
       * Registration will be skipped if element is in chaos cabinet.
       *
       * Is duplicated by {@link sol.common_monitoring.ix.MonitorUtils} due to compatibility reasons. All changes schould be reflected there.
       * @param {String} objId
       * @param {String} wfTemplate
       */
      registerUpdate: function (objId, wfTemplate) {
        var me = this,
            qId, updatedSord, now, utcDate, isoDate, mapKeys;

        qId = ixConnect.ix().checkoutSord(me.queueId, SordC.mbOnlyId, LockC.NO).id;
        updatedSord = ixConnect.ix().checkoutSord(objId, SordC.mbMin, LockC.NO);

        if (updatedSord.parentId !== 0) {
          now = new Date();
          utcDate = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
          isoDate = sol.common.DateUtils.shift(utcDate, me.timestampBufferValue, { unit: me.timestampBufferUnit });

          mapKeys = [
            new KeyValue("SOL_UPDATE_WF_TEMPLATE." + objId, wfTemplate),
            new KeyValue("SOL_UPDATE_TIMESTAMP." + objId, sol.common.DateUtils.dateToIso(isoDate))
          ];
          ixConnect.ix().checkinMap(MapDomainC.DOMAIN_SORD, qId, qId, mapKeys, LockC.NO);

          ixConnect.ix().refSord(null, qId, objId, -1);

          me.logger.info(["registered element for update (objId={0})", objId]);
        } else {
          me.logger.warn(["element is in chaos cabinet; skip register element for update (objId={0})", objId]);
        }

      }

    });