FileSpray.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. /*##############################################################################
  2. # HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. ############################################################################## */
  16. define([
  17. "dojo/_base/declare",
  18. "dojo/_base/lang",
  19. "dojo/_base/array",
  20. "dojo/_base/Deferred",
  21. "dojo/store/util/QueryResults",
  22. "dojo/store/JsonRest",
  23. "dojo/store/Memory",
  24. "dojo/store/Cache",
  25. "dojo/store/Observable",
  26. "dojox/xml/parser",
  27. "hpcc/ESPBase",
  28. "hpcc/ESPRequest"
  29. ], function (declare, lang, arrayUtil, Deferred, QueryResults, JsonRest, Memory, Cache, Observable,
  30. parser,
  31. ESPBase, ESPRequest) {
  32. var FileListStore = declare([ESPRequest.Store], {
  33. service: "FileSpray",
  34. action: "FileList",
  35. responseQualifier: "FileListResponse.files.PhysicalFileStruct",
  36. idProperty: "calculatedID",
  37. create: function (id) {
  38. var retVal = {
  39. lfEncode: function(path) {
  40. var retVal = "";
  41. for (var i = 0; i < path.length; ++i) {
  42. switch (path[i]) {
  43. case "/":
  44. case "\\":
  45. retVal += "::";
  46. break;
  47. case "A":
  48. case "B":
  49. case "C":
  50. case "D":
  51. case "E":
  52. case "F":
  53. case "G":
  54. case "H":
  55. case "I":
  56. case "J":
  57. case "K":
  58. case "L":
  59. case "M":
  60. case "N":
  61. case "O":
  62. case "P":
  63. case "Q":
  64. case "R":
  65. case "S":
  66. case "T":
  67. case "U":
  68. case "V":
  69. case "W":
  70. case "X":
  71. case "Y":
  72. case "Z":
  73. retVal += "^" + path[i];
  74. break;
  75. default:
  76. retVal += path[i];
  77. }
  78. }
  79. return retVal;
  80. },
  81. getLogicalFile: function () {
  82. //var filePath = this.DropZone.Path + "/" +
  83. return "~file::" + this.DropZone.NetAddress + this.lfEncode(this.fullPath);
  84. }
  85. };
  86. retVal[this.idProperty] = id;
  87. return retVal;
  88. },
  89. preProcessRow: function (row) {
  90. var partialPath = this.parent.partialPath + row.name + (row.isDir ? "/" : "");
  91. var fullPath = this.parent.fullPath + row.name + (row.isDir ? "/" : "");
  92. lang.mixin(row, {
  93. calculatedID: this.parent.DropZone.NetAddress + fullPath,
  94. partialPath: partialPath,
  95. fullPath: fullPath,
  96. DropZone: this.parent.DropZone,
  97. displayName: row.name,
  98. type: row.isDir ? "folder" : "file"
  99. });
  100. },
  101. postProcessResults: function (items) {
  102. items.sort(function (l, r) {
  103. if (l.isDir === r.isDir) {
  104. if (l.displayName === r.displayName)
  105. return 0;
  106. else if (l.displayName < r.displayName)
  107. return -1;
  108. return 1;
  109. } else if (l.isDir) {
  110. return -1;
  111. }
  112. return 1;
  113. });
  114. }
  115. });
  116. var LandingZonesStore = declare([ESPRequest.Store], {
  117. service: "FileSpray",
  118. action: "DropZoneFiles",
  119. responseQualifier: "DropZoneFilesResponse.DropZones.DropZone",
  120. idProperty: "calculatedID",
  121. constructor: function (options) {
  122. if (options) {
  123. declare.safeMixin(this, options);
  124. }
  125. },
  126. preProcessRow: function (row) {
  127. lang.mixin(row, {
  128. OS: row.Linux === "true" ? 2 : 0
  129. });
  130. lang.mixin(row, {
  131. calculatedID: row.NetAddress,
  132. displayName: row.Name,
  133. type: "dropzone",
  134. partialPath: "",
  135. fullPath: row.Path + "/",
  136. DropZone: row
  137. });
  138. },
  139. mayHaveChildren: function (item) {
  140. switch (item.type) {
  141. case "dropzone":
  142. case "folder":
  143. return true;
  144. }
  145. return false;
  146. },
  147. getChildren: function (parent, options) {
  148. var store = Observable(new FileListStore({
  149. parent: parent
  150. }));
  151. return store.query({
  152. Netaddr: parent.DropZone.NetAddress,
  153. Path: parent.fullPath,
  154. Mask: "",
  155. OS: parent.DropZone.OS
  156. });
  157. }
  158. });
  159. return {
  160. States: {
  161. 0: "unknown",
  162. 1: "scheduled",
  163. 2: "queued",
  164. 3: "started",
  165. 4: "aborted",
  166. 5: "failed",
  167. 6: "finished",
  168. 7: "monitoring",
  169. 8: "aborting"
  170. },
  171. isComplete: function (state) {
  172. switch (state) {
  173. case 4:
  174. case 5:
  175. case 6:
  176. return true;
  177. }
  178. return false;
  179. },
  180. OS_TYPE:
  181. {
  182. OS_WINDOWS: 0,
  183. OS_SOLARIS: 1,
  184. OS_LINUX: 2
  185. },
  186. CommandMessages: {
  187. 1: "Copy",
  188. 2: "Remove",
  189. 3: "Move",
  190. 4: "Rename",
  191. 5: "Replicate",
  192. 6: "Spray (Import)",
  193. 7: "Despray (Export)",
  194. 8: "Add",
  195. 9: "Transfer",
  196. 10: "Save Map",
  197. 11: "Add Group",
  198. 12: "Server",
  199. 13: "Monitor",
  200. 14: "Copy Merge",
  201. 15: "Super Copy"
  202. },
  203. FormatMessages: {
  204. 0: "fixed",
  205. 1: "csv",
  206. 2: "utf8",
  207. 3: "utf8n",
  208. 4: "utf16",
  209. 5: "utf16le",
  210. 6: "utf16be",
  211. 7: "utf32",
  212. 8: "utf32le",
  213. 9: "utf32be",
  214. 10: "variable",
  215. 11: "recfmvb",
  216. 12: "recfmv",
  217. 13: "variablebigendian"
  218. },
  219. CreateLandingZonesStore: function (options) {
  220. var store = new LandingZonesStore(options);
  221. return Observable(store);
  222. },
  223. CreateFileListStore: function (options) {
  224. var store = new FileListStore(options);
  225. return Observable(store);
  226. },
  227. GetDFUWorkunits: function (params) {
  228. return ESPRequest.send("FileSpray", "GetDFUWorkunits", params);
  229. },
  230. DFUWorkunitsAction: function (workunits, actionType, callback) {
  231. var request = {
  232. wuids: workunits,
  233. Type: actionType
  234. };
  235. ESPRequest.flattenArray(request, "wuids", "ID");
  236. return ESPRequest.send("FileSpray", "DFUWorkunitsAction", {
  237. request: request,
  238. load: function (response) {
  239. arrayUtil.forEach(workunits, function (item, index) {
  240. item.refresh();
  241. });
  242. /* TODO: Revisit after HPCC-9241 is fixed
  243. if (lang.exists("DFUWorkunitsActionResponse.ActionResults.WUActionResult", response)) {
  244. arrayUtil.forEach(response.WUActionResponse.ActionResults.WUActionResult, function (item, index) {
  245. if (item.Result.indexOf("Failed:") === 0) {
  246. dojo.publish("hpcc/brToaster", {
  247. message: "<h4>" + item.Action + " " + item.Wuid + "</h4>" + "<p>" + item.Result + "</p>",
  248. type: "error",
  249. duration: -1
  250. });
  251. } else {
  252. dojo.publish("hpcc/brToaster", {
  253. message: "<h4>" + item.Action + " " + item.Wuid + "</h4>" + "<p>" + item.Result + "</p>",
  254. type: "message"
  255. });
  256. }
  257. });
  258. }
  259. */
  260. if (callback && callback.load) {
  261. callback.load(response);
  262. }
  263. },
  264. error: function (err) {
  265. if (callback && callback.error) {
  266. callback.error(err);
  267. }
  268. }
  269. });
  270. },
  271. SprayFixed: function (params) {
  272. return ESPRequest.send("FileSpray", "SprayFixed", params);
  273. },
  274. SprayVariable: function (params) {
  275. return ESPRequest.send("FileSpray", "SprayVariable", params);
  276. },
  277. Despray: function (params) {
  278. return ESPRequest.send("FileSpray", "Despray", params);
  279. },
  280. Copy: function (params) {
  281. return ESPRequest.send("FileSpray", "Copy", params);
  282. },
  283. Rename: function (params) {
  284. return ESPRequest.send("FileSpray", "Rename", params);
  285. },
  286. GetDFUWorkunit: function (params) {
  287. return ESPRequest.send("FileSpray", "GetDFUWorkunit", params);
  288. },
  289. UpdateDFUWorkunit: function (params) {
  290. return ESPRequest.send("FileSpray", "UpdateDFUWorkunit", params);
  291. },
  292. DFUWUFile: function (params) {
  293. lang.mixin(params, {
  294. handleAs: "text"
  295. });
  296. return ESPRequest.send("FileSpray", "DFUWUFile", params);
  297. },
  298. FileList: function (params) {
  299. return ESPRequest.send("FileSpray", "FileList", params);
  300. },
  301. DropZoneFiles: function (params) {
  302. return ESPRequest.send("FileSpray", "DropZoneFiles", params);
  303. },
  304. DeleteDropZoneFile: function (params) {
  305. // Single File Only
  306. return ESPRequest.send("FileSpray", "DeleteDropZoneFiles", params).then(function (response) {
  307. if (lang.exists("DFUWorkunitsActionResponse.DFUActionResults.DFUActionResult", response)) {
  308. var resultID = response.DFUWorkunitsActionResponse.DFUActionResults.DFUActionResult[0].ID;
  309. var resultMessage = response.DFUWorkunitsActionResponse.DFUActionResults.DFUActionResult[0].Result;
  310. if (resultMessage.indexOf("Success") === 0) {
  311. dojo.publish("hpcc/brToaster", {
  312. Severity: "Message",
  313. Source: "FileSpray.DeleteDropZoneFiles",
  314. Exceptions: [{ Source: "Delete " + resultID, Message: resultMessage }]
  315. });
  316. } else {
  317. dojo.publish("hpcc/brToaster", {
  318. Severity: "Error",
  319. Source: "FileSpray.DeleteDropZoneFiles",
  320. Exceptions: [{ Source: "Delete " + resultID, Message: resultMessage }]
  321. });
  322. }
  323. }
  324. return response;
  325. });
  326. }
  327. };
  328. });