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/31 14:03:33 UTC

incubator-ignite git commit: IGNITE-1121 Fix minor problems.

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-1155_1 e3162d203 -> 4ce209256


IGNITE-1121 Fix minor problems.


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

Branch: refs/heads/ignite-1155_1
Commit: 4ce209256b37817620ff2b018194f8a904594e6e
Parents: e3162d2
Author: sevdokimov <se...@gridgain.com>
Authored: Fri Jul 31 15:02:50 2015 +0300
Committer: sevdokimov <se...@gridgain.com>
Committed: Fri Jul 31 15:02:50 2015 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/agent/AgentSocket.java    |  35 ++--
 .../java/org/apache/ignite/agent/Utils.java     |  41 -----
 .../ignite/agent/handlers/DBExtractor.java      |  45 +++++
 .../ignite/agent/handlers/RestExecutor.java     | 166 +++++++++++++++++++
 .../ignite/agent/remote/RemoteHandler.java      |  55 +++---
 .../src/main/js/agents/agent-manager.js         |  14 +-
 6 files changed, 252 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/4ce20925/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentSocket.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentSocket.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentSocket.java
index 9370160..935f417 100644
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentSocket.java
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentSocket.java
@@ -18,15 +18,13 @@
 package org.apache.ignite.agent;
 
 import com.google.gson.*;
+import org.apache.ignite.agent.handlers.*;
 import org.apache.ignite.agent.remote.*;
-import org.apache.ignite.schema.parser.*;
 import org.eclipse.jetty.websocket.api.*;
 import org.eclipse.jetty.websocket.api.annotations.*;
 
 import java.io.*;
 import java.net.*;
-import java.sql.*;
-import java.util.*;
 import java.util.concurrent.*;
 import java.util.logging.*;
 
@@ -39,6 +37,12 @@ public class AgentSocket implements WebSocketSender {
     private static final Logger log = Logger.getLogger(AgentSocket.class.getName());
 
     /** */
+    public static final Gson GSON = new Gson();
+
+    /** */
+    public static final JsonParser PARSER = new JsonParser();
+
+    /** */
     private final CountDownLatch closeLatch = new CountDownLatch(1);
 
     /** */
@@ -80,11 +84,11 @@ public class AgentSocket implements WebSocketSender {
      */
     @OnWebSocketConnect
     public void onConnect(Session ses) {
-        log.log(Level.INFO, "Authentication...");
+        log.log(Level.INFO, "Connection established");
 
         this.ses = ses;
 
-        remote = RemoteHandler.wrap(this, this, restExecutor);
+        remote = RemoteHandler.wrap(this, this, restExecutor, new DBExtractor());
 
         JsonObject authMsg = new JsonObject();
 
@@ -100,7 +104,7 @@ public class AgentSocket implements WebSocketSender {
      * @return Whether or not message was sent.
      */
     @Override public boolean send(JsonObject msg) {
-        return send(Utils.GSON.toJson(msg));
+        return send(GSON.toJson(msg));
     }
 
     /**
@@ -142,7 +146,7 @@ public class AgentSocket implements WebSocketSender {
      */
     @OnWebSocketMessage
     public void onMessage(String msg) {
-        JsonElement jsonElement = Utils.PARSER.parse(msg);
+        JsonElement jsonElement = PARSER.parse(msg);
 
         remote.onMessage((JsonObject)jsonElement);
     }
@@ -163,23 +167,6 @@ public class AgentSocket implements WebSocketSender {
 
     /**
      *
-     * @param jdbcDriverJarPath JDBC driver JAR path.
-     * @param jdbcDriverClass JDBC driver class.
-     * @param jdbcUrl JDBC URL.
-     * @param jdbcInfo Properties to connect to database.
-     *
-     * @return Collection of tables.
-     */
-    @Remote
-    public Collection<DbTable> extractMetadata(String jdbcDriverJarPath, String jdbcDriverClass, String jdbcUrl,
-        Properties jdbcInfo, boolean tablesOnly) throws SQLException {
-        Connection conn = DBReader.getInstance().connect(jdbcDriverJarPath, jdbcDriverClass, jdbcUrl, jdbcInfo);
-
-        return DBReader.getInstance().extractMetadata(conn, tablesOnly);
-    }
-
-    /**
-     *
      */
     public void waitForClose() throws InterruptedException {
         closeLatch.await();

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/4ce20925/modules/control-center-agent/src/main/java/org/apache/ignite/agent/Utils.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/Utils.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/Utils.java
deleted file mode 100644
index b86e1df..0000000
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/Utils.java
+++ /dev/null
@@ -1,41 +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.agent;
-
-import com.google.gson.*;
-
-/**
- *
- */
-public class Utils {
-    /** */
-    public static final Gson GSON = new Gson();
-
-    /** */
-    public static final JsonParser PARSER = new JsonParser();
-
-    /** */
-    public static final Object[] EMPTY_OBJECTS = new Object[0];
-
-    /**
-     * Default constructor.
-     */
-    private Utils() {
-        // No-op.
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/4ce20925/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DBExtractor.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DBExtractor.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DBExtractor.java
new file mode 100644
index 0000000..676e900
--- /dev/null
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DBExtractor.java
@@ -0,0 +1,45 @@
+/*
+ * 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.agent.handlers;
+
+import org.apache.ignite.agent.remote.*;
+import org.apache.ignite.schema.parser.*;
+
+import java.sql.*;
+import java.util.*;
+
+/**
+ * Remote API to extract DB metadata.
+ */
+public class DBExtractor {
+    /**
+     * @param jdbcDriverJarPath JDBC driver JAR path.
+     * @param jdbcDriverCls JDBC driver class.
+     * @param jdbcUrl JDBC URL.
+     * @param jdbcInfo Properties to connect to database.
+     *
+     * @return Collection of tables.
+     */
+    @Remote
+    public Collection<DbTable> extractMetadata(String jdbcDriverJarPath, String jdbcDriverCls, String jdbcUrl,
+        Properties jdbcInfo, boolean tblsOnly) throws SQLException {
+        Connection conn = DBReader.getInstance().connect(jdbcDriverJarPath, jdbcDriverCls, jdbcUrl, jdbcInfo);
+
+        return DBReader.getInstance().extractMetadata(conn, tblsOnly);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/4ce20925/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/RestExecutor.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/RestExecutor.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/RestExecutor.java
new file mode 100644
index 0000000..8b0ae98
--- /dev/null
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/RestExecutor.java
@@ -0,0 +1,166 @@
+/*
+ * 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.agent.handlers;
+
+import org.apache.commons.codec.*;
+import org.apache.http.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.client.utils.*;
+import org.apache.http.entity.*;
+import org.apache.http.impl.client.*;
+import org.apache.ignite.agent.*;
+import org.apache.ignite.agent.remote.*;
+
+import java.io.*;
+import java.net.*;
+import java.nio.charset.*;
+import java.util.*;
+import java.util.logging.*;
+
+/**
+ * Executor for REST requests.
+ */
+public class RestExecutor {
+    /** */
+    private static final Logger log = Logger.getLogger(RestExecutor.class.getName());
+
+    /** */
+    private final AgentConfiguration cfg;
+
+    /** */
+    private CloseableHttpClient httpClient;
+
+    /**
+     * @param cfg Config.
+     */
+    public RestExecutor(AgentConfiguration cfg) {
+        this.cfg = cfg;
+    }
+
+    /**
+     *
+     */
+    public void start() {
+        httpClient = HttpClientBuilder.create().build();
+    }
+
+    /**
+     *
+     */
+    public void stop() throws IOException {
+        if (httpClient != null)
+            httpClient.close();
+    }
+
+    /**
+     * @param path Path.
+     * @param method Method.
+     * @param params Params.
+     * @param headers Headers.
+     * @param body Body.
+     */
+    @Remote
+    public RestResult executeRest(String path, Map<String, String> params, String method, Map<String, String> headers,
+        String body) throws IOException, URISyntaxException {
+        URIBuilder builder = new URIBuilder(cfg.getNodeUri());
+
+        if (path != null) {
+            if (!path.startsWith("/") && !cfg.getNodeUri().toString().endsWith("/"))
+                path = '/' +  path;
+
+            builder.setPath(path);
+        }
+
+        if (params != null) {
+            for (Map.Entry<String, String> entry : params.entrySet())
+                builder.addParameter(entry.getKey(), entry.getValue());
+        }
+
+        HttpRequestBase httpReq;
+
+        if ("GET".equalsIgnoreCase(method))
+            httpReq = new HttpGet(builder.build());
+        else if ("POST".equalsIgnoreCase(method)) {
+            HttpPost post;
+
+            if (body == null) {
+                List<NameValuePair> nvps = builder.getQueryParams();
+
+                builder.clearParameters();
+
+                post = new HttpPost(builder.build());
+
+                if (!nvps.isEmpty())
+                    post.setEntity(new UrlEncodedFormEntity(nvps));
+            }
+            else {
+                post = new HttpPost(builder.build());
+
+                post.setEntity(new StringEntity(body));
+            }
+
+            httpReq = post;
+        }
+        else
+            throw new IOException("Unknown HTTP-method: " + method);
+
+        if (headers != null) {
+            for (Map.Entry<String, String> entry : headers.entrySet())
+                httpReq.addHeader(entry.getKey(), entry.getValue());
+        }
+
+        try (CloseableHttpResponse resp = httpClient.execute(httpReq)) {
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+            resp.getEntity().writeTo(out);
+
+            Charset charset = Charsets.UTF_8;
+
+            Header encodingHdr = resp.getEntity().getContentEncoding();
+
+            if (encodingHdr != null) {
+                String encoding = encodingHdr.getValue();
+
+                charset = Charsets.toCharset(encoding);
+            }
+
+            return new RestResult(resp.getStatusLine().getStatusCode(), new String(out.toByteArray(), charset));
+        }
+    }
+
+    /**
+     *
+     */
+    public static class RestResult {
+        /** */
+        private int code;
+
+        /** */
+        private String message;
+
+        /**
+         * @param code Code.
+         * @param msg Message.
+         */
+        public RestResult(int code, String msg) {
+            this.code = code;
+            message = msg;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/4ce20925/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java
index fee5ba6..6579578 100644
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.agent.remote;
 
 import com.google.gson.*;
-import org.apache.ignite.agent.*;
 
 import java.lang.reflect.*;
 import java.util.*;
@@ -33,6 +32,15 @@ public class RemoteHandler implements AutoCloseable {
     private static final Logger log = Logger.getLogger(RemoteHandler.class.getName());
 
     /** */
+    public static final Gson GSON = new Gson();
+
+    /** */
+    private static final String INTERNAL_EXCEPTION_TYPE = "org.apache.ignite.agent.AgentException";
+
+    /** */
+    public static final Object[] EMPTY_OBJECTS = new Object[0];
+
+    /** */
     private final WebSocketSender snd;
 
     /** */
@@ -79,7 +87,7 @@ public class RemoteHandler implements AutoCloseable {
         final MethodDescriptor desc = methods.get(mtdName);
 
         if (desc == null) {
-            sendError(reqId, "Unknown method: " + mtdName);
+            sendException(reqId, INTERNAL_EXCEPTION_TYPE, "Unknown method: " + mtdName);
 
             return;
         }
@@ -94,19 +102,19 @@ public class RemoteHandler implements AutoCloseable {
             args = new Object[paramTypes.length];
 
             if (argsJson == null || argsJson.size() != paramTypes.length) {
-                sendError(reqId, "Inconsistent parameters");
+                sendException(reqId, INTERNAL_EXCEPTION_TYPE, "Inconsistent parameters");
 
                 return;
             }
 
             for (int i = 0; i < paramTypes.length; i++)
-                args[i] = Utils.GSON.fromJson(argsJson.get(i), paramTypes[i]);
+                args[i] = GSON.fromJson(argsJson.get(i), paramTypes[i]);
         }
         else {
-            args = Utils.EMPTY_OBJECTS;
+            args = EMPTY_OBJECTS;
 
             if (argsJson != null && argsJson.size() > 0) {
-                sendError(reqId, "Inconsistent parameters");
+                sendException(reqId, INTERNAL_EXCEPTION_TYPE, "Inconsistent parameters");
 
                 return;
             }
@@ -118,9 +126,12 @@ public class RemoteHandler implements AutoCloseable {
 
                 try {
                     res = desc.mtd.invoke(desc.hnd, args);
-                } catch (Exception e) {
+                } catch (Throwable e) {
+                    if (e instanceof InvocationTargetException)
+                        e = ((InvocationTargetException)e).getTargetException();
+
                     if (reqId != null)
-                        sendException(reqId, e);
+                        sendException(reqId, e.getClass().getName(), e.getMessage());
                     else
                         log.log(Level.SEVERE, "Exception on execute remote method", e);
 
@@ -139,9 +150,10 @@ public class RemoteHandler implements AutoCloseable {
 
     /**
      * @param reqId Request id.
-     * @param ex Exception.
+     * @param exType Exception class name.
+     * @param exMsg Exception message.
      */
-    protected void sendException(Long reqId, Exception ex) {
+    protected void sendException(Long reqId, String exType, String exMsg) {
         if (reqId == null)
             return;
 
@@ -151,8 +163,8 @@ public class RemoteHandler implements AutoCloseable {
         res.addProperty("reqId", reqId);
 
         JsonObject exJson = new JsonObject();
-        exJson.addProperty("type", ex.getClass().getName());
-        exJson.addProperty("message", ex.getMessage());
+        exJson.addProperty("type", exType);
+        exJson.addProperty("message", exMsg);
 
         res.add("ex", exJson);
 
@@ -161,23 +173,6 @@ public class RemoteHandler implements AutoCloseable {
 
     /**
      * @param reqId Request id.
-     * @param err Exception.
-     */
-    protected void sendError(Long reqId, String err) {
-        if (reqId == null)
-            return;
-
-        JsonObject res = new JsonObject();
-
-        res.addProperty("type", "CallRes");
-        res.addProperty("reqId", reqId);
-        res.addProperty("error", err);
-
-        snd.send(res);
-    }
-
-    /**
-     * @param reqId Request id.
      * @param res Result.
      * @param type Type.
      */
@@ -196,7 +191,7 @@ public class RemoteHandler implements AutoCloseable {
         if (type == void.class)
             resJson = JsonNull.INSTANCE;
         else
-            resJson = Utils.GSON.toJsonTree(res, type);
+            resJson = GSON.toJsonTree(res, type);
 
         resp.add("res", resJson);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/4ce20925/modules/control-center-web/src/main/js/agents/agent-manager.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/agents/agent-manager.js b/modules/control-center-web/src/main/js/agents/agent-manager.js
index 3734c39..875cdab 100644
--- a/modules/control-center-web/src/main/js/agents/agent-manager.js
+++ b/modules/control-center-web/src/main/js/agents/agent-manager.js
@@ -163,10 +163,8 @@ Client.prototype.executeRest = function(path, params, method, headers, body, cb)
 
     var newArgs = argsToArray(arguments);
 
-    newArgs[5] = function(err, ex, res) {
-        if (err)
-            cb(err);
-        else if (ex)
+    newArgs[5] = function(ex, res) {
+        if (ex)
             cb(ex.message);
         else
             cb(null, res.code, res.message)
@@ -251,12 +249,10 @@ Client.prototype._rmtCallRes = function(msg) {
 
     delete this._cbMap[msg.reqId];
 
-    if (msg.error)
-        cb(msg.error);
-    else if (msg.ex)
-        cb(null, ex);
+    if (msg.ex)
+        cb(msg.ex);
     else
-        cb(null, null, msg.res);
+        cb(null, msg.res);
 };
 
 /**