Name

global.SLAOfflineUpdateSNC

Description

No description available

Script

var SLAOfflineUpdateSNC = Class.create();

SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE = 'sla_offline_update';
SLAOfflineUpdateSNC.SLA_OFFLINE_ATTRIBUTE = 'offline_timestamp_field';

SLAOfflineUpdateSNC.getOfflineFieldName = function (tableName) {
  return GlideTableDescriptor.get("" + tableName).getED().getAttribute(SLAOfflineUpdateSNC.SLA_OFFLINE_ATTRIBUTE);
};

SLAOfflineUpdateSNC.prototype = {

  SLA_OFFLINE_UPDATE_LOG: 'sla.offline.update.log',
  MUTEX_SLA_OFFLINE_UPDATE: 'Process SLA Offline Update Mutex ',

  initialize: function(taskGr) {
  	this.lu = new global.GSLog(this.SLA_OFFLINE_UPDATE_LOG, this.type);
  	this.lu.includeTimestamp();

  	if (!taskGr || !taskGr.isValidRecord()) {
  		this.lu.logError('initialize: no record supplied');
  		return;
  	}

  	this._taskGr = taskGr;
  	this._offlineField = null;

  	if (this._taskGr.operation() === 'insert') {
  		if (this.lu.atLevel(GSLog.DEBUG))
  			this.lu.logDebug("initialize: no need to proccess 'insert' operation for " + this._taskGr.getRecordClassName() + " " + this._taskGr.getDisplayValue());
  		return;
  	}

  	if (!GlideTableDescriptor.isValid(SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE)) {
  		this.lu.logError("initialize: table '" + SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE + "' is not valid!");
  		return;
  	}

  	this._offlineField = SLAOfflineUpdateSNC.getOfflineFieldName(this._taskGr.getRecordClassName());

  	if (JSUtil.nil(this._offlineField) || !this._taskGr.isValidField(this._offlineField)) {
  		if (this.lu.atLevel(GSLog.DEBUG))
  			this.lu.logDebug("initialize: no valid field '" + this._offlineField + "' from attribute  '" + SLAOfflineUpdateSNC.SLA_OFFLINE_ATTRIBUTE + "' in '" + this._taskGr.getRecordClassName() + "' dictionary!");
  		return;
  	}

  	this._hasSLA = new SLACacheManager().hasDefinitionForRecord(this._taskGr);
  	this._offlineDictionaryEnvironmentSet = true;
  },

  hasQueuedOfflineUpdate: function() {
  	if (!this._taskGr) {
  		this.lu.logError('hasQueuedOfflineUpdate: no record supplied');
  		return false;
  	}

  	if (!this._offlineDictionaryEnvironmentSet)
  		return false;

  	var response = this._getReadyOfflineUpdate().hasNext();

  	if (response && this.lu.atLevel(GSLog.DEBUG))
  		this.lu.logDebug("hasQueuedOfflineUpdate: found sla_offline_update record for " + this._taskGr.getRecordClassName() + " " + this._taskGr.getDisplayValue());

  	return response;
  },

  isOfflineUpdate: function() {
  	if (!this._taskGr) {
  		this.lu.logError('checkOfflineUpdate: no record supplied');
  		return false;
  	}

  	if (!this._offlineDictionaryEnvironmentSet)
  		return false;

  	var response =  this._taskGr[this._offlineField].changes();

  	if (response && this.lu.atLevel(GSLog.DEBUG))
  		this.lu.logDebug("isOfflineUpdate: update for " + this._taskGr.getRecordClassName() + " " + this._taskGr.getDisplayValue() + " is offline");

  	return response;
  },

  queue: function() {
  	if (!this._taskGr) {
  		this.lu.logError('checkOfflineUpdate: no record supplied');
  		return;
  	}

  	if (!this._offlineDictionaryEnvironmentSet || !this._hasSLA)
  		return;

  	SelfCleaningMutex.enterCriticalSectionRecordInStats(this.MUTEX_SLA_OFFLINE_UPDATE + this._taskGr.getUniqueValue(), this.MUTEX_SLA_OFFLINE_UPDATE, this, this._queue);
  },

  setProcessing: function() {
  	if (!this._taskGr) {
  		this.lu.logError('checkOfflineUpdate: no record supplied');
  		return;
  	}

  	this._setState('processing');
  },

  setError: function() {
  	if (!this._taskGr) {
  		this.lu.logError('checkOfflineUpdate: no record supplied');
  		return;
  	}

  	this._setState('error');
  },

  remove: function() {
  	if (!this._taskGr) {
  		this.lu.logError('checkOfflineUpdate: no record supplied');
  		return;
  	}

  	this._remove();
  },

  // private functions
  _queue: function() {
  	if (this._getReadyOfflineUpdate().hasNext())
  		return;

  	var slaOfflineUpdateGr = new GlideRecord(SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE);
  	slaOfflineUpdateGr.initialize();
  	slaOfflineUpdateGr.setValue('document_table', this._taskGr.getRecordClassName());
  	slaOfflineUpdateGr.setValue('document_id', this._taskGr.getUniqueValue());
  	slaOfflineUpdateGr.setValue('state', 'ready');
  	slaOfflineUpdateGr.setWorkflow(false);
  	if (!slaOfflineUpdateGr.insert()) {
  		this.lu.logError("_queue: failed to create entry in table " + SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE + " for " + this._taskGr.getRecordClassName() + " " + this._taskGr.getDisplayValue());
  		return;
  	}

  	if (this.lu.atLevel(GSLog.DEBUG))
  		this.lu.logDebug("_queue: Entry in " + SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE + " table successfully inserted for " + this._taskGr.getRecordClassName() + " " + this._taskGr.getDisplayValue());
  },

  _remove: function() {
  	if (this.lu.atLevel(GSLog.DEBUG))
  		this.lu.logDebug("_remove: Deleting entry in table " + SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE + " for " + this._taskGr.getRecordClassName() + " " + this._taskGr.getDisplayValue());

  	var offlineUpdateGr = this._getOfflineUpdate();
  	if (!offlineUpdateGr.next())
  		return;

  	offlineUpdateGr.deleteRecord();
  },

  _setState: function(newState) {
  	if (JSUtil.nil(newState))
  		return;

  	if (this.lu.atLevel(GSLog.DEBUG))
  		this.lu.logDebug("_setState: Set " + SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE + " state field to " + newState + " for " + this._taskGr.getRecordClassName() + " " + this._taskGr.getDisplayValue());

  	var offlineUpdateGr = this._getOfflineUpdate();
  	if (!offlineUpdateGr.next())
  		return;

  	offlineUpdateGr.setValue('state', newState);
  	offlineUpdateGr.setWorkflow(false);
  	offlineUpdateGr.update();
  },

  _getReadyOfflineUpdate: function() {
  	return this._getOfflineUpdate('ready');
  },

  _getOfflineUpdate: function(state) {
  	var slaOfflineUpdateGr = new GlideRecord(SLAOfflineUpdateSNC.SLA_OFFLINE_UPDATE);
  	slaOfflineUpdateGr.addQuery('document_id', this._taskGr.getUniqueValue());
  	if (!JSUtil.nil(state))
  		slaOfflineUpdateGr.addQuery('state', state);
  	slaOfflineUpdateGr.query();
  	return slaOfflineUpdateGr;
  },

  type: 'SLAOfflineUpdateSNC'
};

Sys ID

910271a3b7012300e36a24f6ee11a9ef

Offical Documentation

Official Docs: