You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2015/07/17 15:05:42 UTC
[03/14] incubator-ignite git commit: #ignite-961: use glassfish
parser for JSON request.
#ignite-961: use glassfish parser for JSON request.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/18a3e05a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/18a3e05a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/18a3e05a
Branch: refs/heads/ignite-1121
Commit: 18a3e05af2ae3886603e705ae6ce469cbb36486f
Parents: e1aca64
Author: ivasilinets <iv...@gridgain.com>
Authored: Fri Jul 17 11:16:24 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Fri Jul 17 11:16:24 2015 +0300
----------------------------------------------------------------------
.../scripting/IgniteScriptingConverter.java | 44 ++++++++++++++++++++
.../scripting/IgniteScriptingProcessor.java | 41 +++++++++++++++---
.../org/apache/ignite/json/JSONCacheObject.java | 2 +-
modules/rest-http/pom.xml | 6 +++
.../http/jetty/GridJettyRestHandler.java | 31 +++++---------
5 files changed, 98 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/18a3e05a/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingConverter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingConverter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingConverter.java
new file mode 100644
index 0000000..bc52d58
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptingConverter.java
@@ -0,0 +1,44 @@
+/*
+ * 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.scripting;
+
+import org.apache.ignite.json.*;
+
+/**
+ * Convert json object ot java objects.
+ */
+public class IgniteScriptingConverter {
+ /**
+ * @param o Object.
+ * @return Object for Ignite cache.
+ */
+ public Object toJavaObject(Object o) {
+ return JSONCacheObject.toSimpleObject(o);
+ }
+
+ /**
+ * @param o Object from script.
+ * @return Object to store in cache.
+ */
+ public Object getField(String key, Object o) {
+ if (o instanceof JSONCacheObject)
+ return ((JSONCacheObject)o).getField(key);
+
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/18a3e05a/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 b38c4c3..db283b8 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
@@ -35,9 +35,16 @@ public class IgniteScriptingProcessor extends GridProcessorAdapter {
/** Javascript engine name. */
public static final String JAVA_SCRIPT_ENGINE_NAME = "JavaScript";
+ /** Rest converter. */
+ private static final String REST_CONV_CLS =
+ "org.apache.ignite.internal.processors.rest.protocols.http.jetty.GlassFishScriptingConverter";
+
/** Javascript engine. */
private ScriptEngine jsEngine;
+ /** Ignite scripting converter. */
+ IgniteScriptingConverter converter;
+
/**
* @param ctx Kernal context.
*/
@@ -47,6 +54,8 @@ public class IgniteScriptingProcessor extends GridProcessorAdapter {
/** {@inheritDoc} */
@Override public void start() throws IgniteCheckedException {
+ initializeConverter();
+
ScriptEngineManager factory = new ScriptEngineManager();
jsEngine = factory.getEngineByName(JAVA_SCRIPT_ENGINE_NAME);
@@ -153,7 +162,7 @@ public class IgniteScriptingProcessor extends GridProcessorAdapter {
* @return Object for Ignite cache.
*/
public Object toJavaObject(Object o) {
- return JSONCacheObject.toSimpleObject(o);
+ return converter.toJavaObject(o);
}
/**
@@ -161,10 +170,7 @@ public class IgniteScriptingProcessor extends GridProcessorAdapter {
* @return Object to store in cache.
*/
public Object getField(String key, Object o) {
- if (o instanceof JSONCacheObject)
- return ((JSONCacheObject)o).getField(key);
-
- return null;
+ return converter.getField(key, o);
}
/**
@@ -177,6 +183,31 @@ public class IgniteScriptingProcessor extends GridProcessorAdapter {
}
/**
+ * Initialize rest converter if it is available.
+ *
+ * @throws IgniteCheckedException If no constructor found for converter.
+ */
+ private void initializeConverter() throws IgniteCheckedException {
+ try {
+ Class<?> cls = Class.forName(REST_CONV_CLS);
+
+ Constructor<?> ctor = cls.getConstructor();
+
+ converter = (IgniteScriptingConverter)ctor.newInstance();
+ }
+ catch (ClassNotFoundException ignored) {
+ if (log.isDebugEnabled())
+ log.debug("Failed to initialize HTTP REST protocol (consider adding ignite-rest-http " +
+ "module to classpath).");
+
+ converter = new IgniteScriptingConverter();
+ }
+ catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
+ throw new IgniteCheckedException("Failed to initialize HTTP REST protocol.", e);
+ }
+ }
+
+ /**
* Scripting cache entry.
*/
public static class ScriptingCacheEntry {
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/18a3e05a/modules/core/src/main/java/org/apache/ignite/json/JSONCacheObject.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/json/JSONCacheObject.java b/modules/core/src/main/java/org/apache/ignite/json/JSONCacheObject.java
index fd4359e..13c9321 100644
--- a/modules/core/src/main/java/org/apache/ignite/json/JSONCacheObject.java
+++ b/modules/core/src/main/java/org/apache/ignite/json/JSONCacheObject.java
@@ -29,7 +29,7 @@ public class JSONCacheObject extends HashMap<Object, Object> {
/**
* Empty constructor.
*/
- private JSONCacheObject() {
+ public JSONCacheObject() {
// No-op.
}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/18a3e05a/modules/rest-http/pom.xml
----------------------------------------------------------------------
diff --git a/modules/rest-http/pom.xml b/modules/rest-http/pom.xml
index 4ce41ae..c301aa6 100644
--- a/modules/rest-http/pom.xml
+++ b/modules/rest-http/pom.xml
@@ -35,6 +35,12 @@
<dependencies>
<dependency>
+ <groupId>org.glassfish</groupId>
+ <artifactId>javax.json</artifactId>
+ <version>1.0.4</version>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>${project.version}</version>
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/18a3e05a/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 577a5e5..c2e6885 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
@@ -30,6 +30,7 @@ import org.apache.ignite.lang.*;
import org.apache.ignite.plugin.security.*;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.*;
+import org.glassfish.json.*;
import org.jetbrains.annotations.*;
import javax.servlet.*;
@@ -578,8 +579,8 @@ public class GridJettyRestHandler extends AbstractHandler {
restReq0.script((String)params.get("func"));
- JSONObject o = parseRequest(req);
- restReq0.argument(o.get("arg"));
+ Map o = parseRequest(req);
+ restReq0.argument(ctx.scripting().toJavaObject(o.get("arg")));
restReq = restReq0;
@@ -592,8 +593,8 @@ public class GridJettyRestHandler extends AbstractHandler {
restReq0.script((String)params.get("func"));
restReq0.cacheName((String) params.get("cacheName"));
- JSONObject o = parseRequest(req);
- restReq0.argument(o.get("arg"));
+ Map o = parseRequest(req);
+ restReq0.argument(ctx.scripting().toJavaObject(o.get("arg")));
Object cacheObj = ctx.scripting().toJavaObject(o.get("key"));
restReq0.affinityKey(cacheObj);
@@ -608,8 +609,8 @@ public class GridJettyRestHandler extends AbstractHandler {
restReq0.mapFunction((String) params.get("map"));
- JSONObject o = parseRequest(req);
- restReq0.argument(o.get("arg"));
+ Map o = parseRequest(req);
+ restReq0.argument(ctx.scripting().toJavaObject(o.get("arg")));
restReq0.reduceFunction((String) params.get("reduce"));
@@ -624,9 +625,8 @@ public class GridJettyRestHandler extends AbstractHandler {
restReq0.sqlQuery((String)params.get("qry"));
- JSONObject o = parseRequest(req);
-
- List args = (List)o.get("arg");
+ Map o = parseRequest(req);
+ List args = (List)ctx.scripting().toJavaObject(o.get("arg"));
restReq0.arguments(args.toArray());
restReq0.typeName((String)params.get("type"));
@@ -851,21 +851,12 @@ public class GridJettyRestHandler extends AbstractHandler {
* @return JSON object.
* @throws IgniteCheckedException If failed.
*/
- private JSONObject parseRequest(HttpServletRequest req) throws IgniteCheckedException{
- StringBuilder builder = new StringBuilder();
-
- Scanner reader;
-
+ private Map parseRequest(HttpServletRequest req) throws IgniteCheckedException{
try {
- reader = new Scanner(req.getInputStream());
+ return new JsonProviderImpl().createReader(req.getInputStream()).readObject();
}
catch (IOException e) {
throw new IgniteCheckedException(e);
}
-
- while (reader.hasNext())
- builder.append(reader.nextLine() + "\n");
-
- return JSONObject.fromObject(builder.toString());
}
}