tfHelperAsync.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /************************************************************************************************
  2. @date : 2012-07-12
  3. @author : 최병진
  4. @desc : TrustForm4.0 비동기통신 공통 JavaScript
  5. *************************************************************************************************/
  6. // submission 정보를 담고있는 Global array
  7. // callback 함수내에서 결과를 맵핑할 xpath정보를 담고있음.
  8. var submitArray = new Array();
  9. /**
  10. * @-----------------------------------------------------------------------------------
  11. * @desc : 비동기적으로 서버에 요청을 하는 함수
  12. * @param : transactionId - transaction map file id
  13. * paramPath - 서버에 요청할 데이터의 xpath
  14. * resultPath - 서버에서 전달된 데이터를 맵핑할 xpath
  15. * responseHandler - 서버의 응답을 처리할 callback 함수명.
  16. * 지정하지 않으면 defaultResponseHandler가 사용됨.
  17. * errorHandler - 서버요청 시 발생한 에러에 대한 handler 함수명.
  18. * 지정하지 않으면 defaultErrorHandler가 사용됨.
  19. * @return :
  20. * @-----------------------------------------------------------------------------------
  21. */
  22. function asyncSend(transactionId, paramPath, resultPath, responseHandler, errorHandler) {
  23. // 동일한 transactionId로 1번이상 동시에 호출할 수 있으므로 모든 호출에 대해서 유일한 키를 생성하여 처리함.
  24. var submitUUID = "" + getRandomSubmitUUID();
  25. // 비동기 통신을 위한 TFHttpService instance
  26. var submit = TFHttpService.createInstance(submitUUID);
  27. submit.url = getActionURL(transactionId); // common.js
  28. submit.mediaType = "application/x-www-form-urlencoded";
  29. submit.method = "POST";
  30. // default handler에서 사용자handler를 호출하도록 기능 변경
  31. submit.onResponse = "defualtResponseHandler";
  32. submit.onError = "defualtErrorHandler";
  33. // 현재의 호출정보를 Global 변수에 저장한다.
  34. // 저장된 object는 결과를 resultPath에 bind하기 위해서 사용된다.
  35. if (submitArray == undefined || submitArray == null) {
  36. submitArray = new Array();
  37. }
  38. // submit에 필요한 정보 백업
  39. var submitItem = new Object();
  40. submitItem.trid = transactionId;
  41. submitItem.resultPath = resultPath;
  42. submitItem.submitUUID = submitUUID;
  43. submitItem.responseHandler = responseHandler; // 사용자 지정 handler
  44. submitItem.errorHandler = errorHandler; // 사용자 지정 handler
  45. submitArray.push(submitItem);
  46. // 서비스 호출
  47. submit.send(paramPath);
  48. }
  49. /**
  50. * @-----------------------------------------------------------------------------------
  51. * @desc : default response handler
  52. * @param :
  53. * @return :
  54. * @-----------------------------------------------------------------------------------
  55. */
  56. function defualtResponseHandler(submitUUID, response, responseType) {
  57. if (submitArray == null || submitArray.length <= 0) {
  58. messageBox("submit 결과 처리 시 에러가 발생하였습니다.", "C");
  59. return;
  60. }
  61. var submitItem = getSubmitItem(submitUUID);
  62. bindInstance(submitUUID, response, responseType, submitItem.resultPath);
  63. // 사용자 지정 callback 함수 호출
  64. try {
  65. eval(submitItem.responseHandler+"()");
  66. } catch (e) {
  67. messageBox(e.message, "C");
  68. return;
  69. }
  70. //bindInstanceOld(submitUUID, response, responseType, submitItem.resultPath);
  71. }
  72. /**
  73. * @-----------------------------------------------------------------------------------
  74. * @desc : default error handler
  75. * @param :
  76. * @return :
  77. * @-----------------------------------------------------------------------------------
  78. */
  79. function defualtErrorHandler(submitUUID, errorInfo) {
  80. var submitItem = getSubmitItem(submitUUID);
  81. if (typeof(submitItem.errorHandler) != "undefined") {
  82. try {
  83. eval(submitItem.errorHandler);
  84. } catch (e) {
  85. messageBox(e.message, "C");
  86. return;
  87. }
  88. } else {
  89. messageBox(errorInfo, "C");
  90. return;
  91. }
  92. }
  93. /**
  94. * @-----------------------------------------------------------------------------------
  95. * @desc : model에 사용중인 instance에 결과 xml string을 로딩하는 기능
  96. * model.loadXmlNode 함수는 4.3001.070 버전 이상부터 가능
  97. * @param :
  98. * @return :
  99. * @-----------------------------------------------------------------------------------
  100. */
  101. function bindInstance(submitUUID, response, responseType, resultPath) {
  102. model.removeNode(resultPath);
  103. model.makeNode(resultPath);
  104. if (responseType == "xml") {
  105. model.loadXmlNode(resultPath, response, false); // xml string loading
  106. }
  107. model.refresh();
  108. }
  109. /**
  110. * @-----------------------------------------------------------------------------------
  111. * @desc : Global submitArray에서 요청된 submission 정보를 반환함.
  112. * @param :
  113. * @return :
  114. * @-----------------------------------------------------------------------------------
  115. */
  116. function getSubmitItem(submitUUID) {
  117. if (submitUUID == undefined || submitUUID == "") {
  118. messageBox("submitItem 획득 실패!", "C");
  119. return;
  120. }
  121. if (submitArray.length <= 0) {
  122. messageBox("submitArray is Empty!", "C");
  123. return;
  124. }
  125. for (var idx = 0 ; idx < submitArray.length ; idx++) {
  126. var curItem = submitArray[idx];
  127. if (submitUUID == curItem.submitUUID) {
  128. submitArray[idx] = null;
  129. makeFullArray(submitArray);
  130. return curItem;
  131. }
  132. }
  133. }
  134. /**
  135. * @-----------------------------------------------------------------------------------
  136. * @desc : submitArray 정리 - 중간에 비어있는 부분을 맨 마지막 item으로 채운다.
  137. * @param :
  138. * @return :
  139. * @-----------------------------------------------------------------------------------
  140. */
  141. function makeFullArray(array) {
  142. for (var idx = 0 ; idx < array.length ; idx++) {
  143. if (array[idx] == undefined || array[idx] == null) {
  144. var lastItem = array.pop();
  145. if (lastItem != null) {
  146. array[idx] = lastItem;
  147. }
  148. }
  149. }
  150. }
  151. /**
  152. * @-----------------------------------------------------------------------------------
  153. * @desc : uuid 생성. submit 고유 id 및 instance의 id로 사용됨.
  154. * @param :
  155. * @return :
  156. * @-----------------------------------------------------------------------------------
  157. */
  158. function getRandomSubmitUUID() {
  159. var s = [], itoh = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];
  160. // Make array of random hex digits. The uuid only has 32 digits in it, but we
  161. // allocate an extra items to make room for the '-'s we'll be inserting.
  162. for (var i = 0; i <36; i++) {
  163. s[i] = Math.floor(Math.random()*0x10);
  164. }
  165. // Conform to RFC-4122, section 4.4
  166. s[14] = 4; // Set 4 high bits of time_high field to version
  167. s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence
  168. // Convert to hex chars
  169. for (var i = 0; i <36; i++) {
  170. s[i] = itoh[s[i]];
  171. }
  172. // Insert '-'s
  173. // s[8] = s[13] = s[18] = s[23] = '-';
  174. return s.join('');
  175. }