You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/12/30 15:24:52 UTC

[3/3] ignite git commit: ignite-961

ignite-961


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

Branch: refs/heads/ignite-961
Commit: 012485b4619af67fd28f8b97324c7d651584161f
Parents: 54908b3
Author: sboikov <sb...@gridgain.com>
Authored: Wed Dec 30 13:28:25 2015 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Dec 30 17:24:40 2015 +0300

----------------------------------------------------------------------
 .../client/ClientDefaultCacheSelfTest.java      |  51 ++----
 .../JettyRestProcessorAbstractSelfTest.java     |  47 +++++-
 .../IgniteCacheObjectProcessorImpl.java         |   2 +-
 .../scripting/IgniteScriptingProcessor.java     |   6 +-
 .../ignite/internal/NodeJsAbstractTest.java     |   8 +-
 modules/nodejs/src/test/js/test-ignite.js       |   2 +-
 modules/nodejs/src/test/js/test-runner.js       |   2 +-
 .../http/jetty/GridJettyRestHandler.java        |  32 ++--
 .../jetty/RestGlassFishScriptingConverter.java  | 155 -------------------
 .../http/jetty/ScriptingConverter.java          | 135 ++++++++++++++++
 10 files changed, 226 insertions(+), 214 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java
index f910b7d..7c3dd07 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientDefaultCacheSelfTest.java
@@ -23,9 +23,6 @@ import java.io.InputStreamReader;
 import java.net.URL;
 import java.net.URLConnection;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.UUID;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.configuration.CacheConfiguration;
@@ -42,7 +39,7 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_JETTY_PORT;
  * Tests that client is able to connect to a grid with only default cache enabled.
  */
 public class ClientDefaultCacheSelfTest extends GridCommonAbstractTest {
-    /** Path to jetty config configured with SSL. */
+    /** Path to jetty config. */
     private static final String REST_JETTY_CFG = "modules/clients/src/test/resources/jetty/rest-jetty.xml";
 
     /** IP finder. */
@@ -51,9 +48,6 @@ public class ClientDefaultCacheSelfTest extends GridCommonAbstractTest {
     /** Host. */
     private static final String HOST = "127.0.0.1";
 
-    /** Cached local node id. */
-    private UUID locNodeId;
-
     /** Http port. */
     private static final int HTTP_PORT = 8081;
 
@@ -81,11 +75,6 @@ public class ClientDefaultCacheSelfTest extends GridCommonAbstractTest {
     }
 
     /** {@inheritDoc} */
-    @Override protected void beforeTest() throws Exception {
-        locNodeId = grid().localNode().id();
-    }
-
-    /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(gridName);
 
@@ -103,57 +92,41 @@ public class ClientDefaultCacheSelfTest extends GridCommonAbstractTest {
 
         cfg.setDiscoverySpi(disco);
 
-        CacheConfiguration cLocal = new CacheConfiguration();
+        CacheConfiguration cLoc = new CacheConfiguration();
 
-        cLocal.setName(LOCAL_CACHE);
+        cLoc.setName(LOCAL_CACHE);
 
-        cLocal.setCacheMode(CacheMode.LOCAL);
+        cLoc.setCacheMode(CacheMode.LOCAL);
 
-        cLocal.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
+        cLoc.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
 
-        cfg.setCacheConfiguration(defaultCacheConfiguration(), cLocal);
+        cfg.setCacheConfiguration(defaultCacheConfiguration(), cLoc);
 
         return cfg;
     }
 
     /**
-     * Builds list of connection strings with few different ports.
-     * Used to avoid possible failures in case of port range active.
-     *
-     * @param startPort Port to start list from.
-     * @return List of client connection strings.
-     */
-    private Collection<String> getServerList(int startPort) {
-        Collection<String> srvs = new ArrayList<>();
-
-        for (int i = startPort; i < startPort + 10; i++)
-            srvs.add(HOST + ":" + i);
-
-        return srvs;
-    }
-
-    /*
      * Send HTTP request to Jetty server of node and process result.
      *
-     * @param query Send query parameters.
+     * @param qry Send query parameters.
      * @return Processed response string.
      */
-    private String sendHttp(String query) {
+    private String sendHttp(String qry) {
         String res = "No result";
 
         try {
-            URLConnection connection = new URL(TEST_URL + "?" + query).openConnection();
+            URLConnection conn = new URL(TEST_URL + "?" + qry).openConnection();
 
-            connection.setRequestProperty("Accept-Charset", CHARSET);
+            conn.setRequestProperty("Accept-Charset", CHARSET);
 
-            BufferedReader r = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            BufferedReader r = new BufferedReader(new InputStreamReader(conn.getInputStream()));
 
             res = r.readLine();
 
             r.close();
         }
         catch (IOException e) {
-            error("Failed to send HTTP request: " + TEST_URL + "?" + query, e);
+            error("Failed to send HTTP request: " + TEST_URL + "?" + qry, e);
         }
 
         // Cut node id from response.

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
index 6dbb296..7d70e91 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
@@ -35,6 +35,7 @@ import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
+import javax.json.JsonObject;
 import net.sf.json.JSONNull;
 import net.sf.json.JSONObject;
 import org.apache.ignite.Ignite;
@@ -1764,7 +1765,7 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro
 
         assertTrue(queryCursorFound());
 
-        U.sleep(10000);
+        U.sleep(10_000);
 
         assertFalse(queryCursorFound());
     }
@@ -1805,6 +1806,50 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     /**
      * @throws Exception If failed.
      */
+    public void testRunScriptCacheGet() throws Exception {
+        grid(0).cache(null).put("tk1", "tv1");
+
+        String f = "function(){return ignite.cache(null).get('tk1');}";
+
+        String ret = content(F.asMap("cmd", GridRestCommand.RUN_SCRIPT.key(), "func",
+            URLEncoder.encode(f, "UTF-8"), "arg", "hello"));
+
+        assertNotNull(ret);
+        assertTrue(!ret.isEmpty());
+
+        jsonEquals(ret, stringPattern("tv1", true));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testRunScriptCachePut() throws Exception {
+        String f = "function(){" +
+            "ignite.cache(null).put('tk1', 'tv1');" +
+            "ignite.cache(null).put('tk2', {'a': '1', 'b': '2'});" +
+            "return 'ok';" +
+            "}";
+
+        String ret = content(F.asMap("cmd", GridRestCommand.RUN_SCRIPT.key(), "func",
+            URLEncoder.encode(f, "UTF-8"), "arg", "hello"));
+
+        assertNotNull(ret);
+        assertTrue(!ret.isEmpty());
+
+        jsonEquals(ret, stringPattern("ok", true));
+
+        assertEquals("tv1", ignite(0).cache(null).get("tk1"));
+
+        JsonObject val = (JsonObject)ignite(0).cache(null).get("tk2");
+
+        assertNotNull(val);
+        assertEquals("1", val.getString("a"));
+        assertEquals("2", val.getString("b"));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
     public void testRunAffinityScriptPost() throws Exception {
         ClusterNode node = grid(0).affinity(null).mapKeyToNode(new IgniteJsonString("key0"));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
index 8df9c71..0642821 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
@@ -184,7 +184,7 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme
         if (obj == null || obj instanceof CacheObject)
             return (CacheObject)obj;
 
-        CacheObject cacheObj = this.ctx.json().toCacheKeyObject(ctx, obj, userObj);
+        CacheObject cacheObj = this.ctx.json().toCacheObject(ctx, obj, userObj);
 
         if (cacheObj != null)
             return cacheObj;

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingProcessor.java
index 597bfcb..44a5af7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingProcessor.java
@@ -39,13 +39,13 @@ public class IgniteScriptingProcessor extends GridProcessorAdapter {
 
     /** Rest converter. */
     private static final String REST_CONV_CLS =
-        "org.apache.ignite.internal.processors.rest.protocols.http.jetty.RestGlassFishScriptingConverter";
+        "org.apache.ignite.internal.processors.rest.protocols.http.jetty.ScriptingConverter";
 
     /** Javascript engine. */
     private ScriptEngine jsEngine;
 
     /** Ignite scripting converter. */
-    IgniteScriptingConverter converter;
+    private IgniteScriptingConverter converter;
 
     /**
      * @param ctx Kernal context.
@@ -150,7 +150,7 @@ public class IgniteScriptingProcessor extends GridProcessorAdapter {
             return invocable.invokeFunction("__internalCall", src, arg, arg2);
         }
         catch (ScriptException e) {
-            throw new IgniteCheckedException("Function evaluation failed [funcName=" + src +
+            throw new IgniteCheckedException("Function evaluation failed [func=" + src +
                 ", err= " + e.getMessage() + "].");
         }
         catch (NoSuchMethodException e) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java
index cf038d5..43ef1d8 100644
--- a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java
+++ b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsAbstractTest.java
@@ -45,7 +45,7 @@ public class NodeJsAbstractTest extends GridCommonAbstractTest {
     public static final String CACHE_NAME = "mycache";
 
     /** Failed message. */
-    public static final String SCRIPT_FAILED = "node js test failed:";
+    public static final String SCRIPT_FAILED = "node js test failed";
 
     /** Ok message. */
     public static final String SCRIPT_FINISHED = "node js test finished.";
@@ -95,7 +95,7 @@ public class NodeJsAbstractTest extends GridCommonAbstractTest {
      * @return Cache configuration.
      */
     protected CacheConfiguration cacheConfiguration() {
-        CacheConfiguration ccfg = new CacheConfiguration();
+        CacheConfiguration<Object, Object> ccfg = new CacheConfiguration<>();
 
         ccfg.setName(CACHE_NAME);
         ccfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
@@ -182,9 +182,11 @@ public class NodeJsAbstractTest extends GridCommonAbstractTest {
 
             assertTrue(readyLatch.await(60, SECONDS));
 
-            proc.getProcess().waitFor();
+            int exitCode = proc.getProcess().waitFor();
 
             assertEquals(errors.toString(), 0, errors.size());
+
+            assertEquals(0, exitCode);
         }
         finally {
             if (proc != null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/nodejs/src/test/js/test-ignite.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/test/js/test-ignite.js b/modules/nodejs/src/test/js/test-ignite.js
index e7cb604..bd48460 100644
--- a/modules/nodejs/src/test/js/test-ignite.js
+++ b/modules/nodejs/src/test/js/test-ignite.js
@@ -77,7 +77,7 @@ testDestroyCache = function() {
             cache0.put("1", "1").then(function() {
                 assert(false, "Do not get an error.");
             }).catch(function(err){
-                assert(err !== null, "Do nto get an error");
+                assert(err !== null, "Do not get an error");
                 assert(err.indexOf("Failed to find cache for given cache name") > -1, "Incorrect error message: " + err);
 
                 TestUtils.testDone();

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/nodejs/src/test/js/test-runner.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/test/js/test-runner.js b/modules/nodejs/src/test/js/test-runner.js
index 86ac082..46ac2ee 100644
--- a/modules/nodejs/src/test/js/test-runner.js
+++ b/modules/nodejs/src/test/js/test-runner.js
@@ -36,7 +36,7 @@ TestRunner.runTest = function() {
     var functionName = process.argv[3].toString().trim();
 
     if (!global[functionName]) {
-        console.log("node js test failed: function with name " + functionName + " not found");
+        console.log("Node JS test failed: function with name " + functionName + " not found");
         return;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/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 e0cbfd1..9b03a66 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
@@ -429,8 +429,7 @@ public class GridJettyRestHandler extends AbstractHandler {
      */
     private void createResponse(HttpServletRequest req, GridRestCommand cmd,
         GridRestResponse cmdRes) {
-        if (cmdRes.getResponse() == null || !(req.getHeader("Content-Type") != null &&
-            req.getHeader("Content-Type").contains("json")))
+        if (cmdRes.getResponse() == null || !jsonRequest(req))
             return;
 
         if (cmd == CACHE_GET_ALL) {
@@ -518,15 +517,15 @@ public class GridJettyRestHandler extends AbstractHandler {
 
                 String cacheName = (String)params.get("cacheName");
 
-                if (req.getHeader("Content-Type") != null && req.getHeader("Content-Type").contains("json")) {
+                if (jsonRequest(req)) {
                     Object o = ctx.scripting().toJavaObject(parseRequest(req));
 
-                    Map<Object, Object> map = new HashMap<>();
-
                     switch (cmd) {
                         case CACHE_PUT_ALL: {
                             List entries = (List)ctx.scripting().getField("entries", o);
 
+                            Map<Object, Object> map = U.newHashMap(entries.size());
+
                             for (Object entry : entries) {
                                 Object key = ctx.scripting().getField("key", entry);
                                 Object val = ctx.scripting().getField("value", entry);
@@ -548,6 +547,8 @@ public class GridJettyRestHandler extends AbstractHandler {
 
                             List keys = (List)ctx.scripting().getField("keys", cacheObj);
 
+                            Map<Object, Object> map = U.newHashMap(keys.size());
+
                             for (Object key : keys)
                                 map.put(key, null);
 
@@ -577,6 +578,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                             restReq0.key(ctx.scripting().getField("key", cacheObj));
                             restReq0.value(ctx.scripting().getField("val", cacheObj));
                             restReq0.value2(ctx.scripting().getField("oldVal", cacheObj));
+
                             break;
                         }
 
@@ -683,7 +685,7 @@ public class GridJettyRestHandler extends AbstractHandler {
 
                 restReq0.script((String)params.get("func"));
 
-                if (req.getHeader("Content-Type") != null && req.getHeader("Content-Type").contains("json")) {
+                if (jsonRequest(req)) {
                     Map o = parseRequest(req);
                     restReq0.argument(ctx.scripting().toScriptObject(o.get("arg")));
                 }
@@ -701,7 +703,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                 restReq0.script((String)params.get("func"));
                 restReq0.cacheName((String) params.get("cacheName"));
 
-                if (req.getHeader("Content-Type") != null && req.getHeader("Content-Type").contains("json")) {
+                if (jsonRequest(req)) {
                     Map o = parseRequest(req);
                     restReq0.argument(ctx.scripting().toScriptObject(o.get("arg")));
 
@@ -723,7 +725,7 @@ public class GridJettyRestHandler extends AbstractHandler {
 
                 restReq0.mapFunction((String) params.get("map"));
 
-                if (req.getHeader("Content-Type") != null && req.getHeader("Content-Type").contains("json")) {
+                if (jsonRequest(req)) {
                     Map o = parseRequest(req);
                     restReq0.argument(ctx.scripting().toScriptObject(o.get("arg")));
                 }
@@ -743,7 +745,7 @@ public class GridJettyRestHandler extends AbstractHandler {
 
                 restReq0.sqlQuery((String)params.get("qry"));
 
-                if (req.getHeader("Content-Type") != null && req.getHeader("Content-Type").contains("json")) {
+                if (jsonRequest(req)) {
                     Map o = parseRequest(req);
                     List args = (List)ctx.scripting().toScriptObject(o.get("arg"));
                     restReq0.arguments(args.toArray());
@@ -875,13 +877,23 @@ public class GridJettyRestHandler extends AbstractHandler {
     }
 
     /**
+     * @param req Request.
+     * @return {@code True} if request contains json data.
+     */
+    private static boolean jsonRequest(HttpServletRequest req) {
+        String hdr = req.getHeader("Content-Type");
+
+        return hdr != null && hdr.contains("json");
+    }
+
+    /**
      * Gets values referenced by sequential keys, e.g. {@code key1...keyN}.
      *
      * @param keyPrefix Key prefix, e.g. {@code key} for {@code key1...keyN}.
      * @param params Parameters map.
      * @return Values.
      */
-    @Nullable protected List<Object> values(String keyPrefix, Map<String, Object> params) {
+    protected List<Object> values(String keyPrefix, Map<String, Object> params) {
         assert keyPrefix != null;
 
         List<Object> vals = new LinkedList<>();

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestGlassFishScriptingConverter.java
----------------------------------------------------------------------
diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestGlassFishScriptingConverter.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestGlassFishScriptingConverter.java
deleted file mode 100644
index deed06c..0000000
--- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/RestGlassFishScriptingConverter.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.rest.protocols.http.jetty;
-
-import net.sf.json.*;
-import org.apache.ignite.*;
-import org.apache.ignite.internal.*;
-import org.apache.ignite.internal.processors.cache.*;
-import org.apache.ignite.internal.processors.json.*;
-import org.apache.ignite.internal.processors.scripting.*;
-import org.apache.ignite.json.*;
-
-import javax.cache.*;
-import javax.json.*;
-import javax.json.spi.*;
-import java.math.*;
-import java.util.*;
-
-/**
- * Converter for glassfish objects.
- */
-public class RestGlassFishScriptingConverter extends IgniteScriptingConverter {
-    /** Grid kernal context. */
-    GridKernalContext ctx;
-
-    /**
-     * @param ctx Grid context.
-     */
-    public RestGlassFishScriptingConverter(GridKernalContext ctx) {
-        this.ctx = ctx;
-    }
-
-    /** {@inheritDoc} */
-    @Override public JsonValue toJavaObject(Object o) {
-        if (o == null)
-            return null;
-
-        if (o instanceof Map) {
-            Map o1 = (Map)o;
-
-            JsonProvider provider = IgniteJson.jsonProvider(ctx.grid());
-
-            JsonObjectBuilder bld = provider.createObjectBuilder();
-
-            for (Object key : o1.keySet()) {
-                assert (key instanceof String) || (key instanceof JSONString);
-
-                if (key instanceof JSONString)
-                    bld.add(((JsonString) key).getString(), toJavaObject(o1.get(key)));
-                else
-                    bld.add((String)key, toJavaObject(o1.get(key)));
-            }
-
-            return bld.build();
-        }
-        else if (o instanceof List) {
-            List o1 = (List) o;
-
-            JsonProvider provider = IgniteJson.jsonProvider(ctx.grid());
-
-            JsonArrayBuilder bld = provider.createArrayBuilder();
-
-            for (Object v : o1)
-                bld.add(toJavaObject(v));
-
-            return bld.build();
-        }
-        else if (o instanceof JsonString)
-            return new IgniteJsonString(((JsonString) o).getString());
-        else if (o instanceof JsonNumber)
-            return new IgniteJsonNumber(((JsonNumber) o).bigDecimalValue());
-        else if (o.equals(JsonValue.FALSE))
-            return JsonValue.FALSE;
-        else if (o.equals(JsonValue.TRUE))
-            return JsonValue.TRUE;
-        else if (o.equals(JsonValue.NULL))
-            return JsonValue.NULL;
-        else if (o instanceof String)
-            return new IgniteJsonString((String)o);
-        else if (o instanceof Integer)
-            return new IgniteJsonNumber(new BigDecimal((Integer)o));
-        else if (o instanceof Long)
-            return new IgniteJsonNumber(new BigDecimal((Long)o));
-        else if (o instanceof Double)
-            return new IgniteJsonNumber(new BigDecimal((Double)o));
-
-        throw new IgniteException("Do not support type: " + o.getClass());
-    }
-
-    /** {@inheritDoc} */
-    @Override public Object toScriptObject(Object o) {
-        if (o == null)
-            return null;
-
-        if (o instanceof Map) {
-            Map o1 = (Map)o;
-
-            Map<Object, Object> res = new HashMap<>();
-
-            for (Object key : o1.keySet())
-                res.put(toScriptObject(key), toScriptObject(o1.get(key)));
-
-            return res;
-        }
-        else if (o instanceof List) {
-            List o1 = (List) o;
-
-            List<Object> res = new ArrayList<>();
-
-            for (Object v : o1)
-                res.add(toScriptObject(v));
-
-            return res;
-        }
-        else if (o instanceof Cache.Entry)
-            return new CacheEntryImpl<>(toScriptObject(((Cache.Entry) o).getKey()),
-                toScriptObject(((Cache.Entry) o).getValue()));
-        else if (o instanceof JsonString)
-            return ((JsonString) o).getString();
-        else if (o instanceof JsonNumber)
-            return ((JsonNumber) o).intValue();
-        else if (o.equals(JsonValue.FALSE))
-            return false;
-        else if (o.equals(JsonValue.TRUE))
-            return true;
-        else if (o.equals(JsonValue.NULL))
-            return null;
-
-        return o;
-    }
-
-
-    /** {@inheritDoc} */
-    @Override public Object getField(String key, Object o) {
-        if (o instanceof JsonObject)
-            return ((JsonObject)o).get(key);
-
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/012485b4/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/ScriptingConverter.java
----------------------------------------------------------------------
diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/ScriptingConverter.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/ScriptingConverter.java
new file mode 100644
index 0000000..8b18d18
--- /dev/null
+++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/ScriptingConverter.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.rest.protocols.http.jetty;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.cache.Cache;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+import javax.json.spi.JsonProvider;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.processors.cache.CacheEntryImpl;
+import org.apache.ignite.internal.processors.scripting.IgniteScriptingConverter;
+import org.apache.ignite.json.IgniteJson;
+
+/**
+ * Converter for glassfish objects.
+ */
+public class ScriptingConverter extends IgniteScriptingConverter {
+    /** Json provider */
+    private final JsonProvider provider;
+
+    /** */
+    private Class<?> scriptObjCls;
+
+    /**
+     * @param ctx Grid context.
+     */
+    public ScriptingConverter(GridKernalContext ctx) {
+        provider = IgniteJson.jsonProvider(ctx.grid());
+
+        try {
+            scriptObjCls = Class.forName("sun.org.mozilla.javascript.internal.NativeObject");
+        }
+        catch(ClassNotFoundException e) {
+            // Ignore.
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public Object toJavaObject(Object o) {
+        if (o == null)
+            return null;
+
+        // TODO IGNITE-961.
+        if (o.getClass() == scriptObjCls && (o instanceof Map)) {
+            JsonObjectBuilder bld = provider.createObjectBuilder();
+
+            Map<Object, Object> map = (Map<Object, Object>)o;
+
+            for (Map.Entry<Object, Object> e : map.entrySet()) {
+                String name = e.getKey().toString();
+
+                Object val = e.getValue();
+
+                bld.add(name, val.toString());
+            }
+
+            return bld.build();
+        }
+
+        return o;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Object toScriptObject(Object o) {
+        if (o == null)
+            return null;
+
+        if (o instanceof Map) {
+            Map o1 = (Map)o;
+
+            Map<Object, Object> res = new HashMap<>();
+
+            for (Object key : o1.keySet())
+                res.put(toScriptObject(key), toScriptObject(o1.get(key)));
+
+            return res;
+        }
+        else if (o instanceof List) {
+            List o1 = (List) o;
+
+            List<Object> res = new ArrayList<>();
+
+            for (Object v : o1)
+                res.add(toScriptObject(v));
+
+            return res;
+        }
+        else if (o instanceof Cache.Entry)
+            return new CacheEntryImpl<>(toScriptObject(((Cache.Entry) o).getKey()),
+                toScriptObject(((Cache.Entry) o).getValue()));
+        else if (o instanceof JsonString)
+            return ((JsonString) o).getString();
+        else if (o instanceof JsonNumber)
+            return ((JsonNumber) o).intValue();
+        else if (o.equals(JsonValue.FALSE))
+            return false;
+        else if (o.equals(JsonValue.TRUE))
+            return true;
+        else if (o.equals(JsonValue.NULL))
+            return null;
+
+        return o;
+    }
+
+
+    /** {@inheritDoc} */
+    @Override public Object getField(String key, Object o) {
+        if (o instanceof JsonObject)
+            return ((JsonObject)o).get(key);
+
+        return null;
+    }
+}