You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by iv...@apache.org on 2015/07/01 12:14:00 UTC

[24/39] incubator-ignite git commit: #ignite-964: nodejs cache works with json objects and strings.

#ignite-964: nodejs cache works with json objects and strings.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/b963d033
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/b963d033
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/b963d033

Branch: refs/heads/ignite-964
Commit: b963d033922fa712ddb11fd3542468af802ea91f
Parents: 80bd452
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 01:14:44 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 01:14:44 2015 +0300

----------------------------------------------------------------------
 modules/nodejs/src/main/js/apache-ignite.js     |   1 +
 modules/nodejs/src/main/js/cache.js             |  71 +++++++++++--
 .../ignite/internal/NodeJsCacheApiSelfTest.java |   7 ++
 modules/nodejs/src/test/js/test-cache-api.js    | 100 ++++++++++++++-----
 modules/nodejs/src/test/js/test-utils.js        |  11 +-
 .../http/jetty/GridJettyRestHandler.java        |  91 ++++++++++++++---
 .../protocols/http/jetty/JSONCacheObject.java   |   8 ++
 7 files changed, 240 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b963d033/modules/nodejs/src/main/js/apache-ignite.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/main/js/apache-ignite.js b/modules/nodejs/src/main/js/apache-ignite.js
index af86916..82aa5ca 100644
--- a/modules/nodejs/src/main/js/apache-ignite.js
+++ b/modules/nodejs/src/main/js/apache-ignite.js
@@ -17,6 +17,7 @@
 
 module.exports = {
     Cache : require('./cache.js').Cache,
+    Entry : require('./cache.js').Entry,
     Ignition : require('./ignition.js').Ignition,
     Server : require('./server.js').Server,
     Ignite : require('./ignite.js').Ignite,

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b963d033/modules/nodejs/src/main/js/cache.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/main/js/cache.js b/modules/nodejs/src/main/js/cache.js
index e0ed505..3eaadb4 100644
--- a/modules/nodejs/src/main/js/cache.js
+++ b/modules/nodejs/src/main/js/cache.js
@@ -41,7 +41,9 @@ function Cache(server, cacheName) {
  * @param {onGet} callback Called on finish
  */
 Cache.prototype.get = function(key, callback) {
-    this._server.runCommand(this._createCommand("get").addParam("key", key), callback);
+    this._server.runCommand(this._createCommand("get").
+        setPostData(JSON.stringify({"key": key})),
+        callback);
 };
 
 /**
@@ -53,7 +55,8 @@ Cache.prototype.get = function(key, callback) {
  * @param {noValue} callback Called on finish
  */
 Cache.prototype.put = function(key, value, callback) {
-    this._server.runCommand(this._createCommand("put").addParam("key", key).addParam("val", value),
+    this._server.runCommand(this._createCommand("put").
+        setPostData(JSON.stringify({"key": key, "val" : value})),
         callback);
 }
 
@@ -65,7 +68,9 @@ Cache.prototype.put = function(key, value, callback) {
  * @param {noValue} callback Called on finish
  */
 Cache.prototype.remove = function(key, callback) {
-    this._server.runCommand(this._createCommand("rmv").addParam("key", key), callback);
+    this._server.runCommand(this._createCommand("rmv").
+        setPostData(JSON.stringify({"key": key})),
+        callback);
 }
 
 /**
@@ -76,18 +81,21 @@ Cache.prototype.remove = function(key, callback) {
  * @param {noValue} callback Called on finish
  */
 Cache.prototype.removeAll = function(keys, callback) {
-    this._server.runCommand(this._createCommand("rmvall").addParams("k", keys), callback);
+    this._server.runCommand(this._createCommand("rmvall").
+        setPostData(JSON.stringify({"keys" : keys})),
+        callback);
 }
 
 /**
  * Put keys to cache
  *
  * @this {Cache}
- * @param {Object.<string, string>} map collection of entries to put in the cache
+ * @param {Entry[]} List of entries to put in the cache
  * @param {noValue} callback Called on finish
  */
-Cache.prototype.putAll = function(map, callback) {
-    this._server.runCommand(this._createCommand("putall").setPostData(JSON.stringify(map)), callback);
+Cache.prototype.putAll = function(entries, callback) {
+    this._server.runCommand(this._createCommand("putall").setPostData(
+        JSON.stringify({"entries" : entries})), callback);
 }
 
 /**
@@ -106,7 +114,25 @@ Cache.prototype.putAll = function(map, callback) {
  * @param {Cache~onGetAll} callback Called on finish
  */
 Cache.prototype.getAll = function(keys, callback) {
-    this._server.runCommand(this._createCommand("getall").addParams("k", keys), callback);
+    function onGetAll(callback, err, res) {
+        if (err) {
+            callback.call(null, err, null);
+
+            return;
+        }
+
+        var result = [];
+
+        for (var key of res) {
+            result.push(new Entry(key["key"], key["value"]));
+        }
+
+        callback.call(null, null, result);
+    }
+
+    this._server.runCommand(this._createCommand("getall").setPostData(
+        JSON.stringify({"keys" : keys})),
+        onGetAll.bind(null, callback));
 }
 
 /**
@@ -182,4 +208,31 @@ Cache.prototype._createQueryCommand = function(name, qry) {
     return command.addParam("psz", qry.pageSize());
 }
 
-exports.Cache = Cache
\ No newline at end of file
+/**
+ * @this{Entry}
+ * @param key Key
+ * @param val Value
+ */
+function Entry(key, val) {
+    this._key = key;
+    this._val = val;
+}
+
+/**
+ * @this{Entry}
+ * @returns Key
+  */
+Entry.prototype.key = function() {
+    return this._key;
+}
+
+/**
+ * @this{Entry}
+ * @returns Value
+ */
+Entry.prototype.val = function() {
+    return this._val;
+}
+
+exports.Cache = Cache
+exports.Entry = Entry
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b963d033/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java
index 1a9293c..d8f3859 100644
--- a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java
+++ b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java
@@ -91,4 +91,11 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     public void testPutAllObjectGetAll() throws Exception {
         runJsScript("testPutAllObjectGetAll");
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testRemoveAllObjectGetAll() throws Exception {
+        runJsScript("testRemoveAllObjectGetAll");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b963d033/modules/nodejs/src/test/js/test-cache-api.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/test/js/test-cache-api.js b/modules/nodejs/src/test/js/test-cache-api.js
index 6e660b1..fa3f6cc 100644
--- a/modules/nodejs/src/test/js/test-cache-api.js
+++ b/modules/nodejs/src/test/js/test-cache-api.js
@@ -17,45 +17,71 @@
 
 var TestUtils = require("./test-utils").TestUtils;
 
+var Ignite = require(TestUtils.scriptPath());
+var Entry = Ignite.Entry;
+
 var assert = require("assert");
 
 testPutGet = function() {
-    startTest("mycache", {trace: [put, getExist], entry: "6"});
+    startTest("mycache", {trace: [put, getExist], entry: ["key" , "6"]});
 }
 
 testRemove = function() {
-    startTest("mycache", {trace: [put, getExist, remove, getNonExist], entry: "6"});
+    startTest("mycache", {trace: [put, getExist, remove, getNonExist], entry: ["key" , "6"]});
 }
 
 testRemoveNoKey = function() {
-    startTest("mycache", {trace: [remove, getNonExist], entry: "6"});
+    startTest("mycache", {trace: [remove, getNonExist], entry: ["key" , "6"]});
 }
 
 testPutAllGetAll = function() {
-    startTest("mycache", {trace: [putAll, getAll], entry: {"key1": "val1", "key2" : "val2"}});
+    entries = [];
+
+    entries.push(new Entry("key1", "val1"));
+    entries.push(new Entry("key2", "val2"));
+
+    startTest("mycache", {trace: [putAll, getAll], entry: entries});
 }
 
 testPutAllObjectGetAll = function() {
-    var params = {}
+    entries = [];
+
+    var key1 = {"name" : "Ann"};
+    var key2 = {"name" : "Paul"};
+    var val1 = {"age" : 12, "books" : ["1", "Book"]};
+    var val2 = {"age" : 13, "books" : ["1", "Book"]};
+
+    entries.push(new Entry(key1, val1));
+    entries.push(new Entry(key2, val2));
+
+    startTest("mycache", {trace: [putAll, getAll], entry: entries});
+}
+
+testRemoveAllObjectGetAll = function() {
+    entries = [];
+
     var key1 = {"name" : "Ann"};
     var key2 = {"name" : "Paul"};
     var val1 = {"age" : 12, "books" : ["1", "Book"]};
     var val2 = {"age" : 13, "books" : ["1", "Book"]};
 
-    params["k1"] = key1;
-    params["k2"] = key2;
-    params["val1"] = val1;
-    params["val2"] = val2;
+    entries.push(new Entry(key1, val1));
+    entries.push(new Entry(key2, val2));
 
-    startTest("mycache", {trace: [putAll, getAll], entry: params});
+    startTest("mycache", {trace: [putAll, getAll, removeAll, getNone], entry: entries});
 }
 
 testRemoveAll = function() {
-    startTest("mycache", {trace: [putAll, getAll, removeAll, getNone], entry: {"key1": "val1", "key2" : "val2"}});
+    entries = [];
+
+    entries.push(new Entry("key1", "val1"));
+    entries.push(new Entry("key2", "val2"));
+
+    startTest("mycache", {trace: [putAll, getAll, removeAll, getNone], entry: entries});
 }
 
 testIncorrectCacheName = function() {
-    startTest("mycache1", {trace: [incorrectPut], entry: "6"});
+    startTest("mycache1", {trace: [incorrectPut], entry: ["key", "6"]});
 }
 
 function startTest(cacheName, testDescription) {
@@ -77,25 +103,27 @@ function onStart(cacheName, testDescription, error, ignite) {
 }
 
 function put(cache, entry, next) {
-    cache.put("key", entry, next);
+    cache.put(entry[0], entry[1], next);
 }
 
 function getExist(cache, entry, next) {
-    cache.get("key", onGet);
+    var key = Object.keys(entry)[0];
+
+    cache.get(entry[0], onGet);
 
     function onGet(error, value) {
         assert(!error);
-        assert(value === entry);
+        assert(value === entry[1]);
         next();
     }
 }
 
 function remove(cache, entry, next) {
-    cache.remove("key", next);
+    cache.remove(entry[0], next);
 }
 
 function getNonExist(cache, entry, next) {
-    cache.get("key", onGet);
+    cache.get(entry[0], onGet);
 
     function onGet(error, value) {
         assert(!error);
@@ -109,21 +137,47 @@ function putAll(cache, entries, next) {
 }
 
 function getAll(cache, entries, next) {
-    cache.getAll(Object.keys(entries), onGetAll);
+    var keys = []
+
+    for (var entry of entries) {
+        keys.push(entry.key());
+    }
+
+    cache.getAll(keys, onGetAll.bind(null, keys));
+
     var expected = entries;
 
-    function onGetAll(error, values) {
+    function onGetAll(keys, error, values) {
         assert(!error, error);
 
-        var keys = Object.keys(expected);
+        assert(values.length === keys.length, "Values length is incorrect "
+            + "[expected=" + keys.length + ", real=" + values.length + "]");
 
         for (var i = 0; i < keys.length; ++i) {
             var key = keys[i];
 
-            assert(!!values[key], "Cannot find key. [key=" + key + "].");
+            var foundVal = null;
+
+            for (var j = 0; j < values.length; ++j) {
+                if (TestUtils.compareObject(key, values[j].key())) {
+                    foundVal = values[j];
+                }
+            }
+
+            var foundExp = null;
 
-            TestUtils.compareObject(expected[key], values[key]);
+            for (var j = 0; j < expected.length; ++j) {
+                if (TestUtils.compareObject(key, expected[j].key())) {
+                    foundExp = expected[j];
+                }
+            }
+
+            assert(foundVal !== null, "Cannot find key. [key=" + key + "].");
+            assert(foundExp !== null, "Cannot find key. [key=" + key + "].");
+
+            assert(TestUtils.compareObject(foundExp, foundVal), "Incorrect value");
         }
+
         next();
     }
 }
@@ -144,7 +198,7 @@ function getNone(cache, entries, next) {
 }
 
 function incorrectPut(cache, entry, next) {
-    cache.put("key", entry, callback);
+    cache.put(entry[0], entry[1], callback);
 
     function callback(error) {
         assert(!!error, "Do not get error for not exist cache");

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b963d033/modules/nodejs/src/test/js/test-utils.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/test/js/test-utils.js b/modules/nodejs/src/test/js/test-utils.js
index 1ec5ab7..8beb3dc 100644
--- a/modules/nodejs/src/test/js/test-utils.js
+++ b/modules/nodejs/src/test/js/test-utils.js
@@ -53,15 +53,20 @@ TestUtils.sep = function() {
 
 TestUtils.compareObject = function(o1, o2) {
     if (typeof o1 !== 'object') {
-        assert(o1 === o2, "Incorrect value. [expected=" + o1 + ", val= " + o2 + "].");
+        return o1 === o2;
     }
     else {
-        assert(Object.keys(o1).length === Object.keys(o2).length, "Incorrect key set")
+        if (Object.keys(o1).length !== Object.keys(o2).length)
+            return false;
 
         for (var keyObj of Object.keys(o2)) {
-            TestUtils.compareObject(o1[keyObj], o2[keyObj]);
+            if (!TestUtils.compareObject(o1[keyObj], o2[keyObj])) {
+                return false;
+            }
         }
     }
+
+    return true;
 }
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b963d033/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
----------------------------------------------------------------------
diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
index f7b1db8..55fe156 100644
--- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
+++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
@@ -291,6 +291,8 @@ public class GridJettyRestHandler extends AbstractHandler {
         JSON json;
 
         try {
+            createResponse(cmd, cmdRes);
+
             json = JSONSerializer.toJSON(cmdRes, cfg);
         }
         catch (JSONException e) {
@@ -313,6 +315,54 @@ public class GridJettyRestHandler extends AbstractHandler {
         }
     }
 
+    private void createResponse(GridRestCommand cmd, GridRestResponse cmdRes) {
+        if (cmd == CACHE_GET_ALL) {
+            if (cmdRes.getResponse() == null) {
+                return;
+            }
+
+            Map o = (Map)cmdRes.getResponse();
+
+            List<RestEntry> res = new ArrayList<>();
+
+            for (Object k : o.keySet())
+                res.add(new RestEntry(k, o.get(k)));
+
+            cmdRes.setResponse(res);
+        }
+    }
+
+    public static class RestEntry {
+        private Object key;
+        private Object value;
+        public RestEntry(Object key, Object value) {
+            if (key instanceof JSONCacheObject)
+                this.key = ((JSONCacheObject)key).getFields();
+            else
+                this.key = key;
+
+            if (value instanceof JSONCacheObject)
+                this.value = ((JSONCacheObject)value).getFields();
+            else
+                this.value = value;
+        }
+        public Object getKey() {
+            return key;
+        }
+
+        public void setKey(Object key) {
+            this.key = key;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public void setValue(Object value) {
+            this.value = value;
+        }
+    }
+
     /**
      * Creates REST request.
      *
@@ -357,35 +407,48 @@ public class GridJettyRestHandler extends AbstractHandler {
                 String cacheName = (String)params.get("cacheName");
 
                 if (req.getHeader("JSONObject") != null) {
+                    JSONObject o = parseRequest(req);
+
+                    Map<Object, Object> map = U.newHashMap(o.keySet().size());
+
                     if (cmd == CACHE_PUT_ALL) {
-                        JSONObject o =parseRequest(req);
+                        List entries = (List)o.get("entries");
 
-                        int i = 1;
+                        for (Object entry : entries) {
+                            JSONCacheObject cacheEntry = new JSONCacheObject((JSONObject)entry);
 
-                        Map<Object, Object> map = U.newHashMap(o.keySet().size());
+                            Object key = cacheEntry.getField("_key");
+                            Object val = cacheEntry.getField("_val");
 
-                        while (o.get("k" + i) != null) {
-                            Object key = o.get("k" + i);
+                            map.put(key, val);
+                        }
 
-                            Object val = o.get("val" + i);
+                        restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);
 
-                            if (key instanceof JSONObject)
-                                key = new JSONCacheObject((JSONObject)key);
+                        restReq0.values(map);
+                    }
+                    else if (cmd == CACHE_GET_ALL || cmd == CACHE_REMOVE_ALL) {
+                        JSONCacheObject cacheObj = new JSONCacheObject(o);
 
-                            if (val instanceof JSONObject)
-                                val = new JSONCacheObject((JSONObject)val);
+                        List keys = (List)cacheObj.getField("keys");
 
-                            map.put(key, val);
-                            i++;
-                        }
+                        for (Object key : keys)
+                            map.put(key, null);
 
                         restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);
 
                         restReq0.values(map);
                     }
+                    else if (cmd == CACHE_GET || cmd == CACHE_PUT || cmd == CACHE_REMOVE) {
+                        JSONCacheObject cacheObj = new JSONCacheObject(o);
+
+                        restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);
+
+                        restReq0.key(cacheObj.getField("key"));
+                        restReq0.value(cacheObj.getField("val"));
+                    }
                 }
                 else {
-
                     restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);
                     restReq0.key(params.get("key"));
                     restReq0.value(params.get("val"));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/b963d033/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/JSONCacheObject.java
----------------------------------------------------------------------
diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/JSONCacheObject.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/JSONCacheObject.java
index 9bcd419..67f2430 100644
--- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/JSONCacheObject.java
+++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/JSONCacheObject.java
@@ -32,6 +32,14 @@ public class JSONCacheObject {
 
     }
 
+    public void setFields(Map<Object, Object> fields) {
+        this.fields = fields;
+    }
+
+    public Map<Object, Object> getFields() {
+        return fields;
+    }
+
     public JSONCacheObject(JSONObject o) {
         for (Object key : o.keySet())
             addField(toSimpleObject(key), toSimpleObject(o.get(key)));