Name

global.ChangeConfigExportUtility

Description

Utility class to export Change Management Configuration to an update set.

Script

var ChangeConfigExportUtility = Class.create();
ChangeConfigExportUtility.prototype = {
  initialize: function(_gs) {
  	this._gs = _gs || gs;
  },

  workerSave: function(toExport, workerName) {
  	if (!toExport)
  		return null;
  	
  	if (!workerName)
  		workerName = this._gs.getMessage("Exporting Configuration");
  	
  	var worker = new GlideScriptedHierarchicalWorker();
  	worker.setProgressName(workerName);
  	worker.setScriptIncludeName(this.type);
  	worker.setScriptIncludeMethod("saveMultiple");
  	worker.putMethodArg("toExport", toExport);
  	worker.putMethodArg("useTracker", true);
  	worker.setSource(this.type);
  	worker.setBackground(true);
  	worker.setCannotCancel(true);
  	worker.start();
  	
  	return worker.getProgressID();
  },
  
  //Save multiple records and/or GlideRecord classes to an update set
  saveMultiple: function(toExport, useTracker) {
  	var tracker = null;
  	if (useTracker)
  		tracker = SNC.GlideExecutionTracker.getLastRunning();
  	
  	if (!toExport) {
  		if (useTracker) {
  			tracker.setMaxProgressValue(0);
  			tracker.run();
  			tracker.complete();
  		}
  		return {};
  	}
  	
  	if (!Array.isArray(toExport))
  		toExport = [toExport];
  	
  	if (useTracker) {
  		var maxProgressValue = 0;
  		toExport.forEach(function(gr) {
  			maxProgressValue += gr.getRowCount();
  		});
  		tracker.setMaxProgressValue(maxProgressValue);
  		tracker.run();
  	}
  	
  	var complete = true;
  	var retVal = {};
  	toExport.forEach(function(configGr) {
  		var tableName = configGr.getTableName() + "";
  		
  		if (configGr.getRowCount() === 1 && configGr.isValidRecord()) {
  			retVal[tableName] = this.save(configGr);
  			if (useTracker)
  				tracker.incrementProgressValue(1);
  		}
  		else {
  			retVal[tableName] = true;
  			while (configGr.next()) {
  				retVal[tableName] = this.save(configGr) && retVal[tableName];
  				if (useTracker)
  					tracker.incrementProgressValue(1);
  			}
  		}
  		
  		complete = complete && retVal[tableName];
  	}, this);
  	
  	if (useTracker)
  		if (complete)
  			tracker.success();
  		else
  			tracker.fail(JSON.stringify(retVal));

  	return retVal;
  },
  
  // Saves the contents of a GlideRecord to an update set
  save: function(configGr) {
  	if (!this.isValidExportTable(configGr.getTableName()) || !configGr.isValidRecord())
  		return false;

  	return new GlideUpdateManager2().saveRecord(configGr);
  },
  
  isValidExportTable: function(tableName) {
  	var WHITELIST = [
  		{ "table": "chg_ml_prop", "extensions": true },
  		{ "table": "chg_ml_prop_solution", "extensions": true },
  		{ "table": "chg_ml_similarity_boosters", "extensions": false }
  	];

  	var validExports = [];
  	WHITELIST.forEach(function(whiteListEl) {
  		if (!whiteListEl.extensions) {
  			validExports.push(whiteListEl.table);
  			return;
  		}
  		var extensions = new TableUtils(whiteListEl.table).getAllExtensions();
  		for (var i = 0; i < extensions.size(); i++)
  			validExports.push(extensions.get(i) + "");
  	});

  	return  validExports.indexOf(tableName + "") !== -1;
  },
  
  // Returns an array of populated GlideRecord objects for export
  // rootTable: The name of the table to export from
  // rootSysId: The sys_id of the record to export
  // related: Related information to export.  An array of strings with the format table.referenceField
  getConfigRecords: function(rootTable, rootSysId, related) {
  	if (!new TableUtils(rootTable).tableExists() || !this.isValidExportTable(rootTable) || !rootSysId)
  		return [];
  	
  	var rootGr = new GlideRecordSecure(rootTable);
  	if (!rootGr.get(rootSysId))
  		return [];
  	
  	var retVal = [];
  	retVal.push(rootGr);
  	
  	if (related && Array.isArray(related)) {
  		related.forEach(function(relatedRef) {
  			var refEl = relatedRef.split(".");
  			if (refEl.length < 2)
  				return;
  			
  			var relTableName = refEl[0];
  			var relFieldName = refEl[1];
  			
  			var relTu = new TableUtils(relTableName);
  			if (!relTu.tableExists() || !this.isValidExportTable(relTableName) || !relTu.isValidField(relFieldName))
  				return;

  			var relGr = new GlideRecordSecure(relTableName);
  			relGr.addQuery(relFieldName, rootSysId);
  			relGr.query();
  			retVal.push(relGr);
  		}, this);
  	}
  	
  	return retVal;
  },
  
  type: 'ChangeConfigExportUtility'
};

Sys ID

0ed23c605373001034d1ddeeff7b12b4

Offical Documentation

Official Docs: