RemoteStore.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:9k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.data.core.RemoteStore");
  9. dojo.require("dojo.data.core.Read");
  10. dojo.require("dojo.data.core.Write");
  11. dojo.require("dojo.data.core.Result");
  12. dojo.require("dojo.experimental");
  13. dojo.require("dojo.Deferred");
  14. dojo.require("dojo.lang.declare");
  15. dojo.require("dojo.json");
  16. dojo.require("dojo.io.*");
  17. dojo.experimental("dojo.data.core.RemoteStore");
  18. dojo.lang.declare("dojo.data.core.RemoteStore", [dojo.data.core.Read, dojo.data.core.Write], {_datatypeMap:{}, _jsonRegistry:dojo.json.jsonRegistry, initializer:function (kwArgs) {
  19. if (!kwArgs) {
  20. kwArgs = {};
  21. }
  22. this._serverQueryUrl = kwArgs.queryUrl || "";
  23. this._serverSaveUrl = kwArgs.saveUrl || "";
  24. this._deleted = {};
  25. this._changed = {};
  26. this._added = {};
  27. this._results = {};
  28. this._data = {};
  29. this._numItems = 0;
  30. }, _setupQueryRequest:function (result, requestKw) {
  31. result.query = result.query || "";
  32. requestKw.url = this._serverQueryUrl + encodeURIComponent(result.query);
  33. requestKw.method = "get";
  34. requestKw.mimetype = "text/json";
  35. }, _resultToQueryMetadata:function (serverResponseData) {
  36. return serverResponseData;
  37. }, _resultToQueryData:function (serverResponseData) {
  38. return serverResponseData.data;
  39. }, _remoteToLocalValues:function (attributes) {
  40. for (var key in attributes) {
  41. var values = attributes[key];
  42. for (var i = 0; i < values.length; i++) {
  43. var value = values[i];
  44. var type = value.datatype || value.type;
  45. if (type) {
  46. var localValue = value.value;
  47. if (this._datatypeMap[type]) {
  48. localValue = this._datatypeMap[type](value);
  49. }
  50. values[i] = localValue;
  51. }
  52. }
  53. }
  54. return attributes;
  55. }, _queryToQueryKey:function (query) {
  56. if (typeof query == "string") {
  57. return query;
  58. } else {
  59. return dojo.json.serialize(query);
  60. }
  61. }, _assertIsItem:function (item) {
  62. if (!this.isItem(item)) {
  63. throw new Error("dojo.data.RemoteStore: a function was passed an item argument that was not an item");
  64. }
  65. }, get:function (item, attribute, defaultValue) {
  66. var valueArray = this.getValues(item, attribute);
  67. if (valueArray.length == 0) {
  68. return defaultValue;
  69. }
  70. return valueArray[0];
  71. }, getValues:function (item, attribute) {
  72. var itemIdentity = this.getIdentity(item);
  73. this._assertIsItem(itemIdentity);
  74. var changes = this._changed[itemIdentity];
  75. if (changes) {
  76. var newvalues = changes[attribute];
  77. if (newvalues !== undefined) {
  78. return newvalues;
  79. } else {
  80. return [];
  81. }
  82. }
  83. return this._data[itemIdentity][0][attribute];
  84. }, getAttributes:function (item) {
  85. var itemIdentity = this.getIdentity(item);
  86. if (!itemIdentity) {
  87. return undefined;
  88. }
  89. var atts = [];
  90. var attrDict = this._data[itemIdentity][0];
  91. for (var att in attrDict) {
  92. atts.push(att);
  93. }
  94. return atts;
  95. }, hasAttribute:function (item, attribute) {
  96. var valueArray = this.getValues(item, attribute);
  97. return valueArray.length ? true : false;
  98. }, containsValue:function (item, attribute, value) {
  99. var valueArray = this.getValues(item, attribute);
  100. for (var i = 0; i < valueArray.length; i++) {
  101. if (valueArray[i] == value) {
  102. return true;
  103. }
  104. }
  105. return false;
  106. }, isItem:function (something) {
  107. if (!something) {
  108. return false;
  109. }
  110. var itemIdentity = something;
  111. if (this._deleted[itemIdentity]) {
  112. return false;
  113. }
  114. if (this._data[itemIdentity]) {
  115. return true;
  116. }
  117. if (this._added[itemIdentity]) {
  118. return true;
  119. }
  120. return false;
  121. }, find:function (keywordArgs) {
  122. var result = null;
  123. if (keywordArgs instanceof dojo.data.core.Result) {
  124. result = keywordArgs;
  125. result.store = this;
  126. } else {
  127. result = new dojo.data.core.Result(keywordArgs, this);
  128. }
  129. var query = result.query;
  130. var self = this;
  131. var bindfunc = function (type, data, evt) {
  132. var scope = result.scope || dj_global;
  133. if (type == "load") {
  134. result.resultMetadata = self._resultToQueryMetadata(data);
  135. var dataDict = self._resultToQueryData(data);
  136. if (result.onbegin) {
  137. result.onbegin.call(scope, result);
  138. }
  139. var count = 0;
  140. var resultData = [];
  141. var newItemCount = 0;
  142. for (var key in dataDict) {
  143. if (result._aborted) {
  144. break;
  145. }
  146. if (!self._deleted[key]) {
  147. var values = dataDict[key];
  148. var attributeDict = self._remoteToLocalValues(values);
  149. var existingValue = self._data[key];
  150. var refCount = 1;
  151. if (existingValue) {
  152. refCount = ++existingValue[1];
  153. } else {
  154. newItemCount++;
  155. }
  156. self._data[key] = [attributeDict, refCount];
  157. resultData.push(key);
  158. count++;
  159. if (result.onnext) {
  160. result.onnext.call(scope, key, result);
  161. }
  162. }
  163. }
  164. self._results[self._queryToQueryKey(query)] = resultData;
  165. self._numItems += newItemCount;
  166. result.length = count;
  167. if (result.saveResult) {
  168. result.items = resultData;
  169. }
  170. if (!result._aborted && result.oncompleted) {
  171. result.oncompleted.call(scope, result);
  172. }
  173. } else {
  174. if (type == "error" || type == "timeout") {
  175. dojo.debug("find error: " + dojo.json.serialize(data));
  176. if (result.onerror) {
  177. result.onerror.call(scope, data);
  178. }
  179. }
  180. }
  181. };
  182. var bindKw = keywordArgs.bindArgs || {};
  183. bindKw.sync = result.sync;
  184. bindKw.handle = bindfunc;
  185. this._setupQueryRequest(result, bindKw);
  186. var request = dojo.io.bind(bindKw);
  187. result._abortFunc = request.abort;
  188. return result;
  189. }, getIdentity:function (item) {
  190. if (!this.isItem(item)) {
  191. return null;
  192. }
  193. return (item.id ? item.id : item);
  194. }, newItem:function (attributes, keywordArgs) {
  195. var itemIdentity = keywordArgs["identity"];
  196. if (this._deleted[itemIdentity]) {
  197. delete this._deleted[itemIdentity];
  198. } else {
  199. this._added[itemIdentity] = 1;
  200. }
  201. if (attributes) {
  202. for (var attribute in attributes) {
  203. var valueOrArrayOfValues = attributes[attribute];
  204. if (dojo.lang.isArray(valueOrArrayOfValues)) {
  205. this.setValues(itemIdentity, attribute, valueOrArrayOfValues);
  206. } else {
  207. this.set(itemIdentity, attribute, valueOrArrayOfValues);
  208. }
  209. }
  210. }
  211. return {id:itemIdentity};
  212. }, deleteItem:function (item) {
  213. var identity = this.getIdentity(item);
  214. if (!identity) {
  215. return false;
  216. }
  217. if (this._added[identity]) {
  218. delete this._added[identity];
  219. } else {
  220. this._deleted[identity] = 1;
  221. }
  222. if (this._changed[identity]) {
  223. delete this._changed[identity];
  224. }
  225. return true;
  226. }, setValues:function (item, attribute, values) {
  227. var identity = this.getIdentity(item);
  228. if (!identity) {
  229. return undefined;
  230. }
  231. var changes = this._changed[identity];
  232. if (!changes) {
  233. changes = {};
  234. this._changed[identity] = changes;
  235. }
  236. changes[attribute] = values;
  237. return true;
  238. }, set:function (item, attribute, value) {
  239. return this.setValues(item, attribute, [value]);
  240. }, unsetAttribute:function (item, attribute) {
  241. return this.setValues(item, attribute, []);
  242. }, _initChanges:function () {
  243. this._deleted = {};
  244. this._changed = {};
  245. this._added = {};
  246. }, _setupSaveRequest:function (saveKeywordArgs, requestKw) {
  247. requestKw.url = this._serverSaveUrl;
  248. requestKw.method = "post";
  249. requestKw.mimetype = "text/plain";
  250. var deleted = [];
  251. for (var key in this._deleted) {
  252. deleted.push(key);
  253. }
  254. var saveStruct = {"changed":this._changed, "deleted":deleted};
  255. var oldRegistry = dojo.json.jsonRegistry;
  256. dojo.json.jsonRegistry = this._jsonRegistry;
  257. var jsonString = dojo.json.serialize(saveStruct);
  258. dojo.json.jsonRegistry = oldRegistry;
  259. requestKw.postContent = jsonString;
  260. }, save:function (keywordArgs) {
  261. keywordArgs = keywordArgs || {};
  262. var result = new dojo.Deferred();
  263. var self = this;
  264. var bindfunc = function (type, data, evt) {
  265. if (type == "load") {
  266. if (result.fired == 1) {
  267. return;
  268. }
  269. var key = null;
  270. for (key in self._added) {
  271. if (!self._data[key]) {
  272. self._data[key] = [{}, 1];
  273. }
  274. }
  275. for (key in self._changed) {
  276. var existing = self._data[key];
  277. var changes = self._changed[key];
  278. if (existing) {
  279. existing[0] = changes;
  280. } else {
  281. self._data[key] = [changes, 1];
  282. }
  283. }
  284. for (key in self._deleted) {
  285. if (self._data[key]) {
  286. delete self._data[key];
  287. }
  288. }
  289. self._initChanges();
  290. result.callback(true);
  291. } else {
  292. if (type == "error" || type == "timeout") {
  293. result.errback(data);
  294. }
  295. }
  296. };
  297. var bindKw = {sync:keywordArgs["sync"], handle:bindfunc};
  298. this._setupSaveRequest(keywordArgs, bindKw);
  299. var request = dojo.io.bind(bindKw);
  300. result.canceller = function (deferred) {
  301. request.abort();
  302. };
  303. return result;
  304. }, revert:function () {
  305. this._initChanges();
  306. return true;
  307. }, isDirty:function (item) {
  308. if (item) {
  309. var identity = item.id || item;
  310. return this._deleted[identity] || this._changed[identity];
  311. } else {
  312. var key = null;
  313. for (key in this._changed) {
  314. return true;
  315. }
  316. for (key in this._deleted) {
  317. return true;
  318. }
  319. for (key in this._added) {
  320. return true;
  321. }
  322. return false;
  323. }
  324. }, createReference:function (idstring) {
  325. return {id:idstring};
  326. }, getSize:function () {
  327. return this._numItems;
  328. }, forgetResults:function (query) {
  329. var queryKey = this._queryToQueryKey(query);
  330. var results = this._results[queryKey];
  331. if (!results) {
  332. return false;
  333. }
  334. var removed = 0;
  335. for (var i = 0; i < results.length; i++) {
  336. var key = results[i];
  337. var existingValue = this._data[key];
  338. if (existingValue[1] <= 1) {
  339. delete this._data[key];
  340. removed++;
  341. } else {
  342. existingValue[1] = --existingValue[1];
  343. }
  344. }
  345. delete this._results[queryKey];
  346. this._numItems -= removed;
  347. return true;
  348. }});