RequestHandler.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. /*
  2. *+------------------------------------------------------------------------+
  3. *| Licensed Materials - Property of IBM
  4. *| IBM Cognos Products: Viewer
  5. *| (C) Copyright IBM Corp. 2013
  6. *|
  7. *| US Government Users Restricted Rights - Use, duplication or
  8. *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  9. *|
  10. *+------------------------------------------------------------------------+
  11. */
  12. function RequestHandler( oCV ) {
  13. if (oCV) {
  14. RequestHandler.baseConstructor.call(this, oCV);
  15. this.m_originalFormFields = null;
  16. this.m_forceRaiseSharePrompt = false;
  17. }
  18. }
  19. RequestHandler.prototype = new BaseRequestHandler();
  20. RequestHandler.baseConstructor = BaseRequestHandler;
  21. RequestHandler.prototype.parent = BaseRequestHandler.prototype;
  22. RequestHandler.prototype.postHttpRequest = function(response) {
  23. var oCV = this.getViewer();
  24. this.parent.postHttpRequest.call(this, response);
  25. };
  26. RequestHandler.prototype.setForceRaiseSharePrompt = function( bFlag ) {
  27. this.m_forceRaiseSharePrompt = bFlag;
  28. };
  29. RequestHandler.prototype.preHttpRequest = function(request) {
  30. var oCV = this.getViewer();
  31. var cvWidget = oCV.getViewerWidget();
  32. oCV.setCurrentNodeFocus(null);
  33. if( this.doRaiseSharePromptEvent(request) ) {
  34. if (oCV.widgetHasPromptParameters()) {
  35. // use the default request executed indicator which is a opaque background so user can't interact with
  36. // report content in the case where the prompt is on the report and not on a prompt page.
  37. this.setRequestIndicator(new BaseRequestExecutedIndicator(oCV));
  38. var cascadeParameterList = this.getListOfCascadingPromptParametersToReset(oCV, request );
  39. oCV.raisePromptEvent(oCV.envParams["reportPrompts"], request.getFormFields(), cascadeParameterList);
  40. } else {
  41. if (!(cvWidget && cvWidget.promptParametersRetrieved == true)) {
  42. //run getTransients to get the prompt parameters for this widget
  43. var getParametersAction = oCV.getAction("GetParameters");
  44. getParametersAction.isPrimaryPromptWidget = true;
  45. getParametersAction.execute();
  46. }
  47. }
  48. }
  49. oCV.resetRaiseSharePromptEventFlag();
  50. this.parent.preHttpRequest.call(this, request);
  51. };
  52. /**
  53. * Returns a list of parameter names of parameters which values have been changed.
  54. */
  55. RequestHandler.prototype.getListOfChangedPromptParameters = function(oCV, request) {
  56. var oldParams = oCV.getOldParameters();
  57. if (!oldParams) { return null; }
  58. var changedPromptParamsList = [];
  59. for ( var oldParam in oldParams) {
  60. oldParmValueItems = oldParams[oldParam].m_parmValueItems;
  61. var newParmValueItems = request.getFormFields().get('p_' + oldParam);
  62. if( !newParmValueItems ){ continue; }
  63. for ( var j = 0; j < oldParmValueItems.length; ++j) {
  64. var oldXmlEncodeParmValueItems = sXmlEncode(oldParmValueItems[j].m_useValue);
  65. if (newParmValueItems.indexOf(oldXmlEncodeParmValueItems) < 0) {
  66. //prefixing params name with
  67. changedPromptParamsList.push('p_' + oldParam);
  68. }
  69. }
  70. }
  71. return changedPromptParamsList;
  72. };
  73. /*
  74. * For cascading prompts, if a parent prompt value is changed, then all its descendants need to be cleared.
  75. * Returns a list of parameters that needs to be cleared for cascading prompts.
  76. */
  77. RequestHandler.prototype.getListOfCascadingPromptParametersToReset = function( oCV, request ) {
  78. if (!oCV.preProcessControlArray ) { return null; }
  79. var listOfChangedPrompts = this.getListOfChangedPromptParameters(oCV, request);
  80. if( !listOfChangedPrompts || !listOfChangedPrompts.length){ return null; }
  81. var promptParamsToBeReset = [];
  82. var kCount = oCV.preProcessControlArray.length;
  83. var tempList = listOfChangedPrompts.slice(); //keeps track of all the changed prompts and their dependent cascading prompts.
  84. for (var k = 0; k < kCount; k++) {
  85. var oPromptElement = (oCV.preProcessControlArray[k]);
  86. if( !oPromptElement.getCascadeOnParameter ){ return; }
  87. var oCascadedOnParentPrompt = oPromptElement.getCascadeOnParameter();
  88. if (!oCascadedOnParentPrompt) { continue; }
  89. var sParamName = oPromptElement.getParameterName();
  90. var sCascadedOnParentPromptName=oCascadedOnParentPrompt.getName();
  91. //if parent prompt had changed, then need to reset the child prompt value
  92. if (this.contains(tempList, sCascadedOnParentPromptName) && !this.contains(tempList, sParamName)) {
  93. //add this child prompt to the tempList so that if it has any child prompt, we know to reset it as well
  94. tempList.push(sParamName);
  95. promptParamsToBeReset.push(sParamName);
  96. }
  97. }
  98. return promptParamsToBeReset;
  99. };
  100. RequestHandler.prototype.contains = function(a, obj) {
  101. var i = a.length;
  102. while (i--) {
  103. if (a[i] === obj) {
  104. return true;
  105. }
  106. }
  107. return false;
  108. };
  109. RequestHandler.prototype.doRaiseSharePromptEvent = function(response) {
  110. var oCV = this.getViewer();
  111. var result = false;
  112. var action = response.getFormField("ui.action");
  113. if (( (typeof action !== "undefined" && ( action === "forward" || action === "back" ) ) && oCV.m_raiseSharePromptEvent ) ||
  114. this.m_forceRaiseSharePrompt ){
  115. result = true;
  116. var requestParam = null;
  117. var credentialParamExists = false;
  118. var promptParamsCount = 0;
  119. var params = response.getFormFields();
  120. var keys = params.keys();
  121. for(requestParam in keys) {
  122. requestParam = keys[requestParam];
  123. // don't share credential parameters or search request
  124. if( requestParam == "_promptControl" && params.get(requestParam) == "search") {
  125. result = false;
  126. break;
  127. } else if (requestParam.indexOf("p_") === 0) {
  128. if (requestParam.indexOf("p_credential:") === 0) {
  129. credentialParamExists = true;
  130. } else {
  131. promptParamsCount += 1;
  132. }
  133. }
  134. }
  135. if (result && credentialParamExists && promptParamsCount === 0) {
  136. result = false;
  137. }
  138. }
  139. return result;
  140. };
  141. RequestHandler.prototype.onComplete = function(asynchDataResponse) {
  142. var oCV = this.getViewer();
  143. if (oCV && !oCV.m_destroyed) {
  144. this.parent.onComplete.call(this, asynchDataResponse);
  145. this.processDATAReportResponse(asynchDataResponse);
  146. this.postComplete();
  147. }
  148. else if (console) {
  149. console.warn("Tried to complete a request on an invalid CCognosViewer", oCV);
  150. }
  151. };
  152. RequestHandler.prototype.onPrompting = function(asynchDataResponse) {
  153. var oCV = this.getViewer();
  154. if (oCV && !oCV.m_destroyed) {
  155. var oWidget = oCV.getViewerWidget();
  156. oWidget.hideToolbarAndContextMenu();
  157. this.onComplete(asynchDataResponse);
  158. }
  159. else if (console) {
  160. console.warn("Tried to prompt on an invalid CCognosViewer", oCV);
  161. }
  162. };
  163. /**
  164. * Fire an event to CW so they can show the http error in a modal dialog
  165. */
  166. RequestHandler.prototype.onError = function(response) {
  167. var oCV = this.getViewer();
  168. if (response && oCV) {
  169. var oWidget = oCV.getViewerWidget();
  170. if (typeof console != "undefined" && console && console.log) {
  171. console.log("Viewer http error: " + response.getResponseText() + " " + response.getStatus());
  172. }
  173. oWidget.fireEvent("com.ibm.bux.widget.action", null, { action : "httpError", responseText : response.getResponseText(), status : response.getStatus() });
  174. }
  175. };
  176. RequestHandler.prototype.onFault = function(response) {
  177. var oCV = this.getViewer();
  178. var viewerIWidget = oCV.getViewerWidget();
  179. var dispatcherEntry = oCV.getRetryDispatcherEntry();
  180. if (dispatcherEntry && dispatcherEntry.getOriginalFormFields()) {
  181. this.m_originalFormFields = dispatcherEntry.getOriginalFormFields();
  182. }
  183. else {
  184. // if we don't ahve a retryDispatcherEntry, then the fault must of happened right away (on drop).
  185. // get the retry form fields from the widget
  186. this.m_originalFormFields = viewerIWidget.getOriginalFormFields();
  187. }
  188. if(window['gReportWidgetLoadQueue']) {
  189. window['gReportWidgetLoadQueue'].widgetDoneLoading(viewerIWidget);
  190. }
  191. if( this.isGlobalPromptException() ) {
  192. this.handleGlobalPromptException();
  193. }
  194. if( this.isMissingMemberException(oCV, response) ) {
  195. this.handleMissingMemberException(oCV);
  196. }
  197. if( oCV.envParams && oCV.envParams["updateToolbar"] === "true") {
  198. viewerIWidget.savedOutputMenuUpdated = false;
  199. viewerIWidget.updateToolbar();
  200. }
  201. if( oCV.envParams && oCV.envParams["ui.action"] === "buxView" ) {
  202. viewerIWidget.setSavedOutputsCMResponse( null );
  203. }
  204. if(typeof viewerIWidget.postOnFault == "function") {
  205. viewerIWidget.postOnFault();
  206. }
  207. this.parent.onFault.call(this, response);
  208. if (dispatcherEntry && response && response.getResponseState){
  209. // as we don't reset cv statuses when onFault called from processInitialResponse
  210. // since it's done inside processInitialResponse
  211. // then we do it when it comes from dispatcherEntry
  212. // when called from processInitialResponse then dispatcherEntry and response are null
  213. var responseState = response.getResponseState();
  214. if (responseState) {
  215. this.updateViewerState(responseState);
  216. }
  217. this.onPostEntryComplete();
  218. }
  219. };
  220. RequestHandler.prototype.handleGlobalPromptException = function(){
  221. var oCV = this.getViewer();
  222. var faultDialog = new GlobalPromptFaultDialog(oCV);
  223. oCV.disableRaiseSharePromptEvent();
  224. if(this.m_originalFormFields && !this.m_originalFormFields.exists("sharedPromptRequest")) {
  225. //for report that failed immediately on drop, the request needs to be resent on OK, otherwise,
  226. //user will get a blank widget.
  227. faultDialog.setSendRequestOnOK( true );
  228. }
  229. faultDialog.setErrorMessage(RV_RES.IDS_JS_GLOBAL_PROMPTS_NOT_RESPONDING_WARNING);
  230. this.setFaultDialog(faultDialog);
  231. };
  232. RequestHandler.prototype.isGlobalPromptException = function( ) {
  233. var oCV = this.getViewer();
  234. if (this.m_originalFormFields) {
  235. if( this.m_originalFormFields.exists("sharedPromptRequest") ||
  236. ( this.m_originalFormFields.get("ui.reportDrop") === "true" && this.m_originalFormFields.exists("widget.globalPromptInfo") ) ){
  237. return true;
  238. }
  239. }
  240. return false;
  241. };
  242. RequestHandler.prototype.postComplete = function() {
  243. var oCV = this.getViewer();
  244. // Wait until all the inline scripts are done executing.
  245. if (oCV.getStatus() == "complete" && !oCV.inlineScriptsDoneExecuting) {
  246. var objRef = this;
  247. setTimeout(function() { objRef.postComplete(); }, 10);
  248. return;
  249. }
  250. this.parent.postComplete.call(this);
  251. if (oCV && oCV.m_destroyed) {
  252. if (console) {
  253. console.warn("Tried to postComplete on an invalid CCognosViewer", oCV);
  254. }
  255. return;
  256. }
  257. var viewerIWidget = oCV.getViewerWidget();
  258. if(window['gReportWidgetLoadQueue']) {
  259. window['gReportWidgetLoadQueue'].widgetDoneLoading(viewerIWidget);
  260. }
  261. this.showReport();
  262. // make sure all our selections are cleared.
  263. oCV.getSelectionController().clearSelectionData();
  264. oCV.addPageAdornments();
  265. viewerIWidget.savedOutputMenuUpdated = false;
  266. if (oCV.getStatus() != "prompting") {
  267. viewerIWidget.fetchAnnotationData();
  268. viewerIWidget.getUndoRedoQueue().add({"reportUpdated": true});
  269. }
  270. viewerIWidget.updateToolbar();
  271. oCV.m_stateSet = true;
  272. oCV.doneLoading();
  273. if(typeof viewerIWidget.postComplete == "function") {
  274. viewerIWidget.postComplete();
  275. }
  276. };
  277. RequestHandler.prototype.updateViewerState = function(oState) {
  278. var oCV = this.getViewer();
  279. if (oCV && oCV.m_destroyed) {
  280. if (console) {
  281. console.warn("Tried to update state on an invalid CCognosViewer", oCV);
  282. }
  283. return;
  284. }
  285. this.parent.updateViewerState.call(this, oState);
  286. var status = oCV.getStatus();
  287. if(status != "fault") {
  288. if (oCV.envParams["buxToolbarPayload"]) {
  289. oCV.setToolbar(eval(oCV.envParams["buxToolbarPayload"]));
  290. delete oCV.envParams["buxToolbarPayload"];
  291. }
  292. if (oCV.envParams["buxContextMenuPayload"]) {
  293. oCV.setContextMenu(eval(oCV.envParams["buxContextMenuPayload"]));
  294. delete oCV.envParams["buxContextMenuPayload"];
  295. }
  296. if(oCV.envParams.reportPrompts) {
  297. oCV.getViewerWidget().setPromptParametersRetrieved(true);
  298. }
  299. if(oCV.envParams.reRunObject) {
  300. var formWarpRequest = document.getElementById("formWarpRequest" + oCV.getId());
  301. if (formWarpRequest["reRunObj"]) {
  302. formWarpRequest["reRunObj"].value = oCV.envParams.reRunObject;
  303. }
  304. else {
  305. formWarpRequest.appendChild(createHiddenFormField('reRunObj', oCV.envParams.reRunObject));
  306. }
  307. }
  308. }
  309. };
  310. /**
  311. * Should only be called once when the Viewer first loads. This is because
  312. * the initial response from the server didn't go through the dispatcher entries,
  313. * so we need logic to handle complete, working, fault, ...
  314. */
  315. RequestHandler.prototype.processInitialResponse = function(oState) {
  316. var oCV = this.getViewer();
  317. var viewerIWidget = oCV.getViewerWidget();
  318. if(viewerIWidget != null) {
  319. if (viewerIWidget.shouldUseSavedReportInfo()) {
  320. oCV.envParams["rapReportInfo"] = viewerIWidget.getAttributeValue("rapReportInfo");
  321. }
  322. this.parent.processInitialResponse.call(this, oState);
  323. // we need to call the render.done event so that pinFreeze size calculations are done correctly
  324. // this even can be fixed for all the Viewer's status, since as soon as we get a response from the
  325. // server we want to show our UI instead of chromes.
  326. viewerIWidget.fireEvent("com.ibm.bux.widget.render.done", null, {noAutoResize:true});
  327. this.getViewer().renderTabs();
  328. oCV.getPinFreezeManager().fromJSONString(viewerIWidget.getAttributeValue("PinFreezeInfo"));
  329. // we only need the outputKey for a working response since we're
  330. // not done getting the report output
  331. var status = oCV.getStatus();
  332. if (status != "working" && status != "stillWorking") {
  333. delete oCV.envParams["cv.outputKey"];
  334. viewerIWidget.setXNodeId(null);
  335. }
  336. switch(status) {
  337. case "complete":
  338. viewerIWidget.setOriginalFormFields(null);
  339. this.postComplete();
  340. break;
  341. case "working":
  342. case "stillWorking":
  343. oCV.getWorkingDialog().show();
  344. // add a delay for this callback to allow the server request to clean up, and not block any futher server requests
  345. setTimeout(getCognosViewerObjectRefAsString(oCV.getId())+".executeCallback(\"wait\");",10);
  346. break;
  347. case "prompting":
  348. viewerIWidget.hideToolbarAndContextMenu();
  349. break;
  350. case "fault":
  351. if (this.isAuthenticationFault()) {
  352. this.onPassportTimeout();
  353. }
  354. else {
  355. this.onFault();
  356. }
  357. }
  358. this.showReport();
  359. this.onPostEntryComplete();
  360. oCV.m_stateSet = true;
  361. this.onAsynchStatusUpdate(status);
  362. }
  363. else {
  364. var objRef = this;
  365. setTimeout(function() { objRef.processInitialResponse(oState); }, 100);
  366. }
  367. };
  368. RequestHandler.prototype.onPostEntryComplete = function()
  369. {
  370. var oCV = this.getViewer();
  371. if (oCV && oCV.getViewerWidget()) {
  372. var cvWidget = oCV.getViewerWidget();
  373. cvWidget.getLoadManager().processQueue();
  374. }
  375. };
  376. RequestHandler.prototype.isMissingMemberException = function(oCV, response){
  377. if (oCV.bMissingMemberException) {
  378. return true;
  379. }
  380. if (response && response.getResponseState) {
  381. var oState = response.getResponseState();
  382. if (oState && oState.envParams && oState.envParams.bMissingMemberException) {
  383. this._populateMissingMemberDetails(oCV, oState);
  384. return true;
  385. }
  386. }
  387. return false;
  388. };
  389. RequestHandler.prototype._populateMissingMemberDetails = function(oCV, oState){
  390. if (!oCV || !oState || !oState.envParams) {
  391. return;
  392. }
  393. oCV.bCanEditContent = oState.envParams.bCanEditContent;
  394. oCV.bHasParameters = oState.envParams.bHasParameters;
  395. if (oState.envParams["ui.spec"]) {
  396. if (oCV.envParams) {
  397. if (!oCV.envParams["ui.spec"]) {
  398. oCV.envParams["ui.spec"] = xml_decode(oState.envParams["ui.spec"]);
  399. }
  400. }
  401. }
  402. };
  403. RequestHandler.prototype.handleMissingMemberException = function(oCV){
  404. var sErrorMsg = null;
  405. sErrorMsg =(oCV.bCanEditContent) ? RV_RES.IDS_JS_MISSING_MEMBER_ERROR_MSG_FOR_SPEC_PARAM : RV_RES.IDS_JS_MISSING_MEMBER_ERROR_MSG_WITH_NO_BUA;
  406. var faultDialog = new MissingMemberFaultDialog(oCV, sErrorMsg, oCV.bCanEditContent, oCV.bHasParameters);
  407. this.setFaultDialog(faultDialog);
  408. };
  409. RequestHandler.prototype.massageHtmlBeforeDisplayed = function() {
  410. var oCV = this.getViewer();
  411. if (!oCV) {
  412. return;
  413. }
  414. var oWidget = oCV.getViewerWidget();
  415. if (!oWidget) {
  416. return;
  417. }
  418. oWidget.updateDrillThroughLinks();
  419. };