/** * Licensed Materials - Property of IBM * IBM Cognos Products: rs * (C) Copyright IBM Corp. 2020 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * */ define([ 'baglass/core-client/js/core-client/ui/core/Class', 'bi/authoring/utils/pat/rsLaunchParameters', 'q' ], function(Class, rsLaunchParameters, Q) { 'use strict'; /** * Utility class that does the real work of creating a dataset */ function C_DatasetCreator( glassContext ) { this._glassContext = glassContext; this._deferred = Q.defer(); }; C_DatasetCreator._serializer = new XMLSerializer(); /** * Perform XML parsing of a string */ C_DatasetCreator.prototype.parseString = function( v_sXML ) { var doc = null; try { doc = ( new DOMParser() ).parseFromString( v_sXML, "text/xml" ); } catch ( e ) { // IE throws an error return null; } if (doc.documentElement.querySelector("parsererror") || doc.documentElement.nodeName == "parsererror") { // Chrome injects parsererror in the document where the error occurred, others set the root as parsererror with a namespace return null; } return doc; }; C_DatasetCreator.prototype.addDataItem = function( v_nSelection, v_oItem ) { var v_nDataItem = v_nSelection.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "dataItem")); v_nDataItem.setAttribute("name", v_oItem.name); if (v_oItem.aggregate) { v_nDataItem.setAttribute("aggregate", v_oItem.aggregate); } if (v_oItem.rollupAggregate) { v_nDataItem.setAttribute("rollupAggregate", v_oItem.rollupAggregate); } var expression = v_nDataItem.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "expression")); expression.appendChild(this.v_nDoc.createTextNode(v_oItem.expression)); }; C_DatasetCreator.prototype.addStyle = function( v_nParent, v_sRefStyle ) { var v_nStyle = v_nParent.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "style")); var v_nDefaultStyles = v_nStyle.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "defaultStyles")); var v_nDefaultStyle = v_nDefaultStyles.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "defaultStyle")); v_nDefaultStyle.setAttribute("refStyle", v_sRefStyle); }; C_DatasetCreator.prototype.addDataSource = function( v_nParent, v_sDataItemName, v_sName ) { var v_nContents = v_nParent.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "contents")); var v_nTextItem = v_nContents.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "textItem")); var v_nDataSource = v_nTextItem.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "dataSource")); var v_nDataItem = v_nDataSource.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, v_sDataItemName)); v_nDataItem.setAttribute("refDataItem", v_sName); }; C_DatasetCreator.prototype.addTitle = function( v_nListColumn, v_sName ) { var v_nListColumnTitle = v_nListColumn.appendChild( this.v_nDoc.createElementNS(this.m_sNamespace, "listColumnTitle")); this.addStyle(v_nListColumnTitle, "lt"); this.addDataSource(v_nListColumnTitle, "dataItemLabel", v_sName); }; C_DatasetCreator.prototype.addBody = function( v_nListColumn, v_oItem ) { var v_nListColumnBody = v_nListColumn.appendChild( this.v_nDoc.createElementNS(this.m_sNamespace, "listColumnBody")); this.addStyle(v_nListColumnBody, v_oItem.measure ? "lm" : "lc"); this.addDataSource(v_nListColumnBody, "dataItemValue", v_oItem.name); }; C_DatasetCreator.prototype.addColumn = function( v_nListColumns, v_oItem ) { var v_nListColumn = v_nListColumns.appendChild( this.v_nDoc.createElementNS(this.m_sNamespace, "listColumn")); this.addTitle(v_nListColumn, v_oItem.name); this.addBody(v_nListColumn, v_oItem); }; C_DatasetCreator.prototype.getSpecVersion = function() { return this._glassContext.services.ajax.ajax({ type : 'GET', url : '../schemas/rspec/version.json' }).then(function(v_oResponse){ return v_oResponse.version; }); }; C_DatasetCreator.prototype.getCMInfo = function( v_sID ) { return this._glassContext.services.ajax.ajax({ type : 'GET', url : "v1/objects/" + v_sID + "?fields=searchPath,type" }).then( function(v_oResponse) { return v_oResponse.data[0]; }); }; C_DatasetCreator.prototype.raiseError = function( v_sMsg ) { console.log("rsDatasetService.createDataset: " + v_sMsg); this._deferred.reject( new Error(v_sMsg) ); }; C_DatasetCreator.prototype.setUpdateAction = function( v_sUpdateAction ) { switch (v_sUpdateAction) { case 'fail': case 'replace': case 'update': case null: case undefined: this.m_sUpdateAction = v_sUpdateAction; break; default: delete this.m_sUpdateAction; } }; C_DatasetCreator.prototype.setNames = function( v_sName, v_sQueryName ) { this.m_sName = v_sName; this.m_sQueryName = v_sQueryName || v_sName || 'Query1'; }; C_DatasetCreator.prototype.loadItems = function( v_aItems ) { // Create a map of existing names var v_oSpecifiedNames = {}; v_aItems.forEach( function(v_oItem) { if (v_oItem.name) { if (v_oSpecifiedNames[v_oItem.name]) { // Duplicate name this.raiseError( "Duplicate item name " + v_oItem.name); return this._deferred.promise; } v_oSpecifiedNames[v_oItem.name] = true; } }.bind(this)); // Assign unique name if none specified var i = 0; v_aItems.forEach( function(v_oItem) { if (!v_oItem.name) { var v_sName = 'Data Item' + (++i); while (v_oSpecifiedNames[v_sName]) { v_sName = 'Data Item' + (++i); } v_oItem.name = v_sName; } }); this.m_aItems = v_aItems; return null; }; C_DatasetCreator.prototype.generateSpecification = function(v_oMetadata, v_bExclude, v_bSummarize) { // Remove top level comments (template copyright) for (var v_nNode = this.v_nDoc.firstChild; v_nNode != null; ) { var v_nNext = v_nNode.nextSibling; if (v_nNode.nodeType == Node.COMMENT_NODE) { this.v_nDoc.removeChild(v_nNode); } v_nNode = v_nNext; } var v_nReport = this.v_nDoc.documentElement; if (this.m_sName) { var v_nReportName = v_nReport.appendChild(this.v_nDoc.createElementNS(this.m_sNamespace, "reportName")); v_nReportName.appendChild(this.v_nDoc.createTextNode(this.m_sName)); } // set refQuery in list var v_nList = v_nReport.querySelector("list"); v_nList.setAttribute("refQuery", this.m_sQueryName); v_nList.setAttribute("name", "List1"); // rename query var v_nQuery = v_nReport.querySelector("query"); v_nQuery.setAttribute("name", this.m_sQueryName); // set modelPath var v_nModelPath = v_nReport.querySelector("modelPath"); var v_sSearchPath = v_oMetadata.searchPath; switch (v_oMetadata.type) { case "module": v_nModelPath.setAttribute("type", "module"); break; case "package": v_sSearchPath += "/model[last()]"; break; case "model": break; default: this.raiseError( 'Metadata ID references invalid object of type ' + v_oMetadata.type ); return; } v_nModelPath.appendChild(this.v_nDoc.createTextNode(v_oMetadata.searchPath)); // set autoSummary=false on query/selection var v_nSelection = v_nQuery.querySelector("selection"); if (!v_bSummarize) { v_nSelection.setAttribute("autoSummary", "false"); } // iterate over items var v_nListColumns = v_nList.appendChild( this.v_nDoc.createElementNS(this.m_sNamespace, "listColumns")); this.m_aItems.forEach( function(v_oItem) { this.addColumn(v_nListColumns, v_oItem); this.addDataItem(v_nSelection, v_oItem); }.bind(this)); // set listSupress if (v_bExclude) { v_nList.appendChild( this.v_nDoc.createElementNS(this.m_sNamespace, "listSuppress")); } }; C_DatasetCreator.prototype.create = function( v_sParentId, v_sMetadataId, v_bExclude, v_bSummarize, v_aParameters ) { this.getSpecVersion().then(function(v_sVersion){ this.m_sNamespace = 'http://developer.cognos.com/schemas/report/' + v_sVersion + '/'; this.getCMInfo(v_sMetadataId).then( function(v_oMetadata) { // Retrieve dataset list template and parse var v_sTemplate = rsLaunchParameters.GetTemplate( 'DatasetList' ); // Inject namespace attribute into template v_sTemplate = v_sTemplate.replace( /