tfHelperAsync_old.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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를 추가하여 원본 instance에 append하는 함수
  96. * @param :
  97. * @return :
  98. * @-----------------------------------------------------------------------------------
  99. */
  100. function bindInstance(submitUUID, response, responseType, resultPath) {
  101. var parentNodePath = resultPath.substring(0, resultPath.lastIndexOf("/"));
  102. var lastPath = resultPath.split(/\//g).pop(); // path의 마지막 문자열을 가져온다.(결과와 맵핑할 노드명)
  103. model.removeNode(parentNodePath);
  104. model.makeNode(parentNodePath);
  105. // submit 생성시 사용된 uuid 값으로 instance를 model에 추가함.
  106. model.createChild("xforms:instance", "id:"+submitUUID);
  107. if (responseType == "xml") {
  108. // 2012.05.16 현재 gzip compression은 지원하지 않음.
  109. if(model.instances(submitUUID).loadXML(response)) {
  110. // 서로다른 instance간에 노드셋 복사가 이루어져야 한다.
  111. var targetNode = model.instances(0).selectSingleNode(parentNodePath);
  112. // parent node를 가져온다.
  113. var sourceNode = model.instances(submitUUID).selectSingleNode("//" + lastPath + "/..");
  114. if (targetNode != undefined && sourceNode != undefined) {
  115. var sourceChildNodes = sourceNode.childNodes;
  116. // 원본 instance에 결과 node를 append.
  117. while (childNode = sourceChildNodes.nextNode()) {
  118. targetNode.appendChild(childNode);
  119. }
  120. }
  121. // 임시로 추가한 instance를 제거한다.
  122. model.removeChild(submitUUID);
  123. }
  124. }
  125. model.refresh();
  126. }
  127. /**
  128. * @-----------------------------------------------------------------------------------
  129. * @desc : model의 원본 instance에 결과를 맵핑하는 함수(bindInstance 함수에 비해 속도가
  130. * 현저히 떨어짐.)
  131. * @param :
  132. * @return :
  133. * @-----------------------------------------------------------------------------------
  134. */
  135. function bindInstanceOld(submitUUID, response, responseType, resultPath) {
  136. model.removeNode(resultPath);
  137. model.makeNode(resultPath);
  138. var lastPath = resultPath.split(/\//g).pop(); // path의 마지막 문자열을 가져온다.(결과와 맵핑할 노드명)
  139. var xml;
  140. if (responseType == "xml") {
  141. xml = stringToXML(response);
  142. copyNodeToInstance(xml, resultPath, model.instances(0), resultPath);
  143. }
  144. model.refresh();
  145. }
  146. /**
  147. * @-----------------------------------------------------------------------------------
  148. * @desc : XML DOM 객체를 model의 instance에 맵핑
  149. * @param :
  150. * @return :
  151. * @-----------------------------------------------------------------------------------
  152. */
  153. function copyNodeToInstance(srcXML, srcPath, destInstance, destPath) {
  154. if (srcXML == undefined) {
  155. return;
  156. }
  157. if (destInstance == undefined) {
  158. return;
  159. }
  160. model.removeNode(destPath);
  161. model.makeNode(destPath);
  162. var lastPath = destPath.split(/\//g).pop(); // path의 마지막 문자열을 가져온다.(결과와 맵핑할 노드명)
  163. var srcNodeList = srcXML.getElementsByTagName(lastPath);
  164. for (var idx = 0 ; idx < srcNodeList.length ; idx++) {
  165. var resultPath = srcPath + "[" + idx + "]";
  166. if (idx == 0 ) {
  167. resultPath = srcPath;
  168. }
  169. model.makeNode(resultPath);
  170. var childNodes = srcNodeList[idx].childNodes;
  171. for (var cIdx = 0 ; cIdx < childNodes.length ; cIdx++) {
  172. var child = childNodes[cIdx];
  173. var childPath = resultPath + "/" + child.nodeName;
  174. model.makeNode(childPath);
  175. model.setValue(childPath, child.text);
  176. }
  177. }
  178. model.refresh();
  179. }
  180. /**
  181. * @-----------------------------------------------------------------------------------
  182. * @desc : xml string을 xml dom으로 변환
  183. * @param :
  184. * @return :
  185. * @-----------------------------------------------------------------------------------
  186. */
  187. function stringToXML(xmlStr) {
  188. if (typeof htmlwindow.DOMParser != "undefined") {
  189. return ( new htmlwindow.DOMParser() ).parseFromString(xmlStr, "text/xml");
  190. } else if (typeof htmlwindow.ActiveXObject != "undefined" && new htmlwindow.ActiveXObject("Microsoft.XMLDOM")) {
  191. var xmlDoc = new htmlwindow.ActiveXObject("Microsoft.XMLDOM");
  192. xmlDoc.async = "false";
  193. xmlDoc.loadXML(xmlStr);
  194. return xmlDoc;
  195. } else {
  196. throw new Error("No XML parser found");
  197. }
  198. return null;
  199. }
  200. /**
  201. * @-----------------------------------------------------------------------------------
  202. * @desc : Global submitArray에서 요청된 submission 정보를 반환함.
  203. * @param :
  204. * @return :
  205. * @-----------------------------------------------------------------------------------
  206. */
  207. function getSubmitItem(submitUUID) {
  208. if (submitUUID == undefined || submitUUID == "") {
  209. messageBox("submitItem 획득 실패!", "C");
  210. return;
  211. }
  212. if (submitArray.length <= 0) {
  213. messageBox("submitArray is Empty!", "C");
  214. return;
  215. }
  216. for (var idx = 0 ; idx < submitArray.length ; idx++) {
  217. var curItem = submitArray[idx];
  218. if (submitUUID == curItem.submitUUID) {
  219. submitArray[idx] = null;
  220. makeFullArray(submitArray);
  221. return curItem;
  222. }
  223. }
  224. }
  225. /**
  226. * @-----------------------------------------------------------------------------------
  227. * @desc : submitArray 정리 - 중간에 비어있는 부분을 맨 마지막 item으로 채운다.
  228. * @param :
  229. * @return :
  230. * @-----------------------------------------------------------------------------------
  231. */
  232. function makeFullArray(array) {
  233. for (var idx = 0 ; idx < array.length ; idx++) {
  234. if (array[idx] == undefined || array[idx] == null) {
  235. var lastItem = array.pop();
  236. if (lastItem != null) {
  237. array[idx] = lastItem;
  238. }
  239. }
  240. }
  241. }
  242. /**
  243. * @-----------------------------------------------------------------------------------
  244. * @desc : uuid 생성. submit 고유 id 및 instance의 id로 사용됨.
  245. * @param :
  246. * @return :
  247. * @-----------------------------------------------------------------------------------
  248. */
  249. function getRandomSubmitUUID() {
  250. var s = [], itoh = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];
  251. // Make array of random hex digits. The uuid only has 32 digits in it, but we
  252. // allocate an extra items to make room for the '-'s we'll be inserting.
  253. for (var i = 0; i <36; i++) {
  254. s[i] = Math.floor(Math.random()*0x10);
  255. }
  256. // Conform to RFC-4122, section 4.4
  257. s[14] = 4; // Set 4 high bits of time_high field to version
  258. s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence
  259. // Convert to hex chars
  260. for (var i = 0; i <36; i++) {
  261. s[i] = itoh[s[i]];
  262. }
  263. // Insert '-'s
  264. // s[8] = s[13] = s[18] = s[23] = '-';
  265. return s.join('');
  266. }