You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2015/08/05 03:15:04 UTC

[13/50] incubator-ignite git commit: ignite-1155 Fix problems found on review.

ignite-1155 Fix problems found on review.


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

Branch: refs/heads/ignite-843
Commit: e3162d203e89457f8e94658709476d5b29362990
Parents: ae97de8
Author: sevdokimov <se...@jetbrains.com>
Authored: Fri Jul 31 12:11:04 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Fri Jul 31 12:11:04 2015 +0300

----------------------------------------------------------------------
 modules/control-center-agent/README.txt         |   4 +-
 .../apache/ignite/agent/AgentCommandLine.java   | 116 ---------
 .../ignite/agent/AgentCommandLineOptions.java   | 116 +++++++++
 .../apache/ignite/agent/AgentConfiguration.java |   2 +-
 .../org/apache/ignite/agent/AgentLauncher.java  |   4 +-
 .../org/apache/ignite/agent/AgentSocket.java    |   6 +-
 .../apache/ignite/agent/WebSocketSender.java    |  39 ---
 .../ignite/agent/remote/RemoteCallable.java     | 248 -------------------
 .../ignite/agent/remote/RemoteHandler.java      | 248 +++++++++++++++++++
 .../ignite/agent/remote/WebSocketSender.java    |  39 +++
 .../apache/ignite/schema/parser/DBReader.java   |   2 +-
 11 files changed, 412 insertions(+), 412 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/README.txt
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/README.txt b/modules/control-center-agent/README.txt
index 29abc2f..99d14a8 100644
--- a/modules/control-center-agent/README.txt
+++ b/modules/control-center-agent/README.txt
@@ -5,7 +5,7 @@ Control Center Agent communicates with grid nodes via REST interface and connect
 
 ---------------------------
 Usage example:
-agent.sh -l ivan.ivanov@gmail.com -p qwerty -s wss://control-center.gridgain.com
+agent.sh -l john.smith@gmail.com -p qwerty -s wss://control-center.gridgain.com
 
 Command line arguments:
     -l User's login (email) on web-control-center
@@ -17,4 +17,4 @@ Command line arguments:
 
 ---------------------------
 Building module:
-to build module run "mvn package"
\ No newline at end of file
+to build module run "mvn package"

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLine.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLine.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLine.java
deleted file mode 100644
index b9dfb76..0000000
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLine.java
+++ /dev/null
@@ -1,116 +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.beust.jcommander.*;
-
-/**
- * Command line bean.
- */
-public class AgentCommandLine {
-    /** */
-    @Parameter(names = {"-l", "--login"}, description = "User's login (email) on web-control-center")
-    private String login;
-
-    /** */
-    @Parameter(names = {"-p", "--password"}, description = "User's password")
-    private String pwd;
-
-    /** */
-    @Parameter(names = {"-s", "--serverUri"},
-        description = "Link to web-control-center web-socket server, for example: wss://control-center.gridgain.com")
-    private String serverUri;
-
-    /** */
-    @Parameter(names = {"-n", "--nodeUri"}, description = "ignite REST server, for example: http://localhost:8080")
-    private String nodeUri;
-
-    /** */
-    @Parameter(names = {"-c", "--config"}, description = "Path to configuration file")
-    private String cfgPath;
-
-    /**
-     * @return Login.
-     */
-    public String getLogin() {
-        return login;
-    }
-
-    /**
-     * @param login Login.
-     */
-    public void setLogin(String login) {
-        this.login = login;
-    }
-
-    /**
-     * @return Password.
-     */
-    public String getPassword() {
-        return pwd;
-    }
-
-    /**
-     * @param pwd Password.
-     */
-    public void setPassword(String pwd) {
-        this.pwd = pwd;
-    }
-
-    /**
-     * @return Server URI.
-     */
-    public String getServerUri() {
-        return serverUri;
-    }
-
-    /**
-     * @param srvUri Server uri.
-     */
-    public void setServerUri(String srvUri) {
-        serverUri = srvUri;
-    }
-
-    /**
-     * @return Node URI.
-     */
-    public String getNodeUri() {
-        return nodeUri;
-    }
-
-    /**
-     * @param nodeUri Node uri.
-     */
-    public void setNodeUri(String nodeUri) {
-        this.nodeUri = nodeUri;
-    }
-
-    /**
-     * @return Config file URL.
-     */
-    public String getConfigFile() {
-        return cfgPath;
-    }
-
-    /**
-     * @param cfgPath Config path.
-     */
-    public void setConfigPath(String cfgPath) {
-        this.cfgPath = cfgPath;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLineOptions.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLineOptions.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLineOptions.java
new file mode 100644
index 0000000..5b45f5a
--- /dev/null
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentCommandLineOptions.java
@@ -0,0 +1,116 @@
+/*
+ * 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.beust.jcommander.*;
+
+/**
+ * Command line bean.
+ */
+public class AgentCommandLineOptions {
+    /** */
+    @Parameter(names = {"-l", "--login"}, description = "User's login (email) on web-control-center")
+    private String login;
+
+    /** */
+    @Parameter(names = {"-p", "--password"}, description = "User's password")
+    private String pwd;
+
+    /** */
+    @Parameter(names = {"-s", "--serverUri"},
+        description = "Link to web-control-center web-socket server, for example: wss://control-center.gridgain.com")
+    private String serverUri;
+
+    /** */
+    @Parameter(names = {"-n", "--nodeUri"}, description = "ignite REST server, for example: http://localhost:8080")
+    private String nodeUri;
+
+    /** */
+    @Parameter(names = {"-c", "--config"}, description = "Path to configuration file")
+    private String cfgPath;
+
+    /**
+     * @return Login.
+     */
+    public String getLogin() {
+        return login;
+    }
+
+    /**
+     * @param login Login.
+     */
+    public void setLogin(String login) {
+        this.login = login;
+    }
+
+    /**
+     * @return Password.
+     */
+    public String getPassword() {
+        return pwd;
+    }
+
+    /**
+     * @param pwd Password.
+     */
+    public void setPassword(String pwd) {
+        this.pwd = pwd;
+    }
+
+    /**
+     * @return Server URI.
+     */
+    public String getServerUri() {
+        return serverUri;
+    }
+
+    /**
+     * @param srvUri Server uri.
+     */
+    public void setServerUri(String srvUri) {
+        serverUri = srvUri;
+    }
+
+    /**
+     * @return Node URI.
+     */
+    public String getNodeUri() {
+        return nodeUri;
+    }
+
+    /**
+     * @param nodeUri Node uri.
+     */
+    public void setNodeUri(String nodeUri) {
+        this.nodeUri = nodeUri;
+    }
+
+    /**
+     * @return Config file URL.
+     */
+    public String getConfigFile() {
+        return cfgPath;
+    }
+
+    /**
+     * @param cfgPath Config path.
+     */
+    public void setConfigPath(String cfgPath) {
+        this.cfgPath = cfgPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentConfiguration.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentConfiguration.java
index 9f01983..6b44086 100644
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentConfiguration.java
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentConfiguration.java
@@ -127,7 +127,7 @@ public class AgentConfiguration {
     /**
      * @param cmd Command.
      */
-    public void assign(AgentCommandLine cmd) {
+    public void assign(AgentCommandLineOptions cmd) {
         if (cmd.getLogin() != null)
             setLogin(cmd.getLogin());
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLauncher.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLauncher.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLauncher.java
index c3ba096..d45be43 100644
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLauncher.java
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLauncher.java
@@ -56,7 +56,7 @@ public class AgentLauncher {
 
         cfg.load(dfltCfgUrl);
 
-        AgentCommandLine cmdCfg = new AgentCommandLine();
+        AgentCommandLineOptions cmdCfg = new AgentCommandLineOptions();
 
         new JCommander(cmdCfg, args);
 
@@ -103,7 +103,7 @@ public class AgentLauncher {
             client.start();
 
             try {
-                while (true) {
+                while (!Thread.interrupted()) {
                     AgentSocket agentSock = new AgentSocket(cfg, restExecutor);
 
                     log.log(Level.INFO, "Connecting to: " + cfg.getServerUri());

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/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 95e499e..9370160 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
@@ -31,7 +31,7 @@ import java.util.concurrent.*;
 import java.util.logging.*;
 
 /**
- *
+ * Handler for web-socket connection.
  */
 @WebSocket
 public class AgentSocket implements WebSocketSender {
@@ -48,7 +48,7 @@ public class AgentSocket implements WebSocketSender {
     private final RestExecutor restExecutor;
 
     /** */
-    private RemoteCallable remote;
+    private RemoteHandler remote;
 
     /** */
     private Session ses;
@@ -84,7 +84,7 @@ public class AgentSocket implements WebSocketSender {
 
         this.ses = ses;
 
-        remote = RemoteCallable.wrap(this, this, restExecutor);
+        remote = RemoteHandler.wrap(this, this, restExecutor);
 
         JsonObject authMsg = new JsonObject();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/src/main/java/org/apache/ignite/agent/WebSocketSender.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/WebSocketSender.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/WebSocketSender.java
deleted file mode 100644
index 6d16c14..0000000
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/WebSocketSender.java
+++ /dev/null
@@ -1,39 +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 interface WebSocketSender {
-    /**
-     * Send message.
-     * @param msg Message.
-     * @return {@code true} if message sent successfully.
-     */
-    public boolean send(String msg);
-
-    /**
-     * Send message.
-     * @param msg Message.
-     * @return {@code true} if message sent successfully.
-     */
-    public boolean send(JsonObject msg);
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteCallable.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteCallable.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteCallable.java
deleted file mode 100644
index 6f1fb19..0000000
--- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteCallable.java
+++ /dev/null
@@ -1,248 +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.remote;
-
-import com.google.gson.*;
-import org.apache.ignite.agent.*;
-
-import java.lang.reflect.*;
-import java.util.*;
-import java.util.concurrent.*;
-import java.util.logging.*;
-
-/**
- * Allow to execute methods remotely from NodeJS server by web-socket command.
- */
-public class RemoteCallable implements AutoCloseable {
-    /** */
-    private static final Logger log = Logger.getLogger(RemoteCallable.class.getName());
-
-    /** */
-    private final WebSocketSender snd;
-
-    /** */
-    private final Map<String, MethodDescriptor> methods = new HashMap<>();
-
-    /** */
-    private final ExecutorService executorSrvc = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
-
-    /**
-     * @param snd Session.
-     * @param hnds Handlers.
-     */
-    private RemoteCallable(WebSocketSender snd, Object ... hnds) {
-        this.snd = snd;
-
-        for (Object hnd : hnds) {
-            for (Method method : hnd.getClass().getMethods()) {
-                Remote remoteAnn = method.getAnnotation(Remote.class);
-
-                if (remoteAnn != null) {
-                    MethodDescriptor old = methods.put(method.getName(), new MethodDescriptor(method, hnd, remoteAnn.async()));
-
-                    if (old != null)
-                        throw new IllegalArgumentException("Duplicated method: " + method.getName());
-                }
-            }
-        }
-
-    }
-
-    /**
-     * @param req Request.
-     */
-    public void onMessage(JsonObject req) {
-        if (log.isLoggable(Level.FINE))
-            log.fine("Message: " + req);
-
-        JsonPrimitive reqIdJson = req.getAsJsonPrimitive("reqId");
-
-        final Long reqId = reqIdJson == null ? null : reqIdJson.getAsLong();
-
-        String mtdName = req.getAsJsonPrimitive("mtdName").getAsString();
-
-        final MethodDescriptor desc = methods.get(mtdName);
-
-        if (desc == null) {
-            sendError(reqId, "Unknown method: " + mtdName);
-
-            return;
-        }
-
-        Type[] paramTypes = desc.mtd.getGenericParameterTypes();
-
-        JsonArray argsJson = req.getAsJsonArray("args");
-
-        final Object[] args;
-
-        if (paramTypes.length > 0) {
-            args = new Object[paramTypes.length];
-
-            if (argsJson == null || argsJson.size() != paramTypes.length) {
-                sendError(reqId, "Inconsistent parameters");
-
-                return;
-            }
-
-            for (int i = 0; i < paramTypes.length; i++)
-                args[i] = Utils.GSON.fromJson(argsJson.get(i), paramTypes[i]);
-        }
-        else {
-            args = Utils.EMPTY_OBJECTS;
-
-            if (argsJson != null && argsJson.size() > 0) {
-                sendError(reqId, "Inconsistent parameters");
-
-                return;
-            }
-        }
-
-        Runnable run = new Runnable() {
-            @Override public void run() {
-                final Object res;
-
-                try {
-                    res = desc.mtd.invoke(desc.hnd, args);
-                } catch (Exception e) {
-                    if (reqId != null)
-                        sendException(reqId, e);
-                    else
-                        log.log(Level.SEVERE, "Exception on execute remote method", e);
-
-                    return;
-                }
-
-                sendResponse(reqId, res, desc.returnType);
-            }
-        };
-
-        if (desc.async)
-            executorSrvc.submit(run);
-        else
-            run.run();
-    }
-
-    /**
-     * @param reqId Request id.
-     * @param ex Exception.
-     */
-    protected void sendException(Long reqId, Exception ex) {
-        if (reqId == null)
-            return;
-
-        JsonObject res = new JsonObject();
-
-        res.addProperty("type", "CallRes");
-        res.addProperty("reqId", reqId);
-
-        JsonObject exJson = new JsonObject();
-        exJson.addProperty("type", ex.getClass().getName());
-        exJson.addProperty("message", ex.getMessage());
-
-        res.add("ex", exJson);
-
-        snd.send(res);
-    }
-
-    /**
-     * @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.
-     */
-    private void sendResponse(Long reqId, Object res, Type type) {
-        if (reqId == null)
-            return;
-
-        JsonObject resp = new JsonObject();
-
-        resp.addProperty("type", "CallRes");
-
-        resp.addProperty("reqId", reqId);
-
-        JsonElement resJson;
-
-        if (type == void.class)
-            resJson = JsonNull.INSTANCE;
-        else
-            resJson = Utils.GSON.toJsonTree(res, type);
-
-        resp.add("res", resJson);
-
-        snd.send(resp);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void close() {
-        executorSrvc.shutdown();
-    }
-
-    /**
-     * @param hnds Handler.
-     * @param snd Sender.
-     */
-    public static RemoteCallable wrap(WebSocketSender snd, Object ... hnds) {
-        return new RemoteCallable(snd, hnds);
-    }
-
-    /**
-     *
-     */
-    private static class MethodDescriptor {
-        /** */
-        private final Method mtd;
-
-        /** */
-        private final Object hnd;
-
-        /** */
-        private final Type returnType;
-
-        /** */
-        private final boolean async;
-
-        /**
-         * @param mtd Method.
-         * @param hnd Handler.
-         * @param async Async.
-         */
-        MethodDescriptor(Method mtd, Object hnd, boolean async) {
-            this.mtd = mtd;
-            this.hnd = hnd;
-            this.async = async;
-
-            returnType = mtd.getGenericReturnType();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/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
new file mode 100644
index 0000000..fee5ba6
--- /dev/null
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java
@@ -0,0 +1,248 @@
+/*
+ * 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.remote;
+
+import com.google.gson.*;
+import org.apache.ignite.agent.*;
+
+import java.lang.reflect.*;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.logging.*;
+
+/**
+ * Allow to execute methods remotely from NodeJS server by web-socket command.
+ */
+public class RemoteHandler implements AutoCloseable {
+    /** */
+    private static final Logger log = Logger.getLogger(RemoteHandler.class.getName());
+
+    /** */
+    private final WebSocketSender snd;
+
+    /** */
+    private final Map<String, MethodDescriptor> methods = new HashMap<>();
+
+    /** */
+    private final ExecutorService executorSrvc = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
+
+    /**
+     * @param snd Session.
+     * @param hnds Handlers.
+     */
+    private RemoteHandler(WebSocketSender snd, Object ... hnds) {
+        this.snd = snd;
+
+        for (Object hnd : hnds) {
+            for (Method method : hnd.getClass().getMethods()) {
+                Remote remoteAnn = method.getAnnotation(Remote.class);
+
+                if (remoteAnn != null) {
+                    MethodDescriptor old = methods.put(method.getName(), new MethodDescriptor(method, hnd, remoteAnn.async()));
+
+                    if (old != null)
+                        throw new IllegalArgumentException("Duplicated method: " + method.getName());
+                }
+            }
+        }
+
+    }
+
+    /**
+     * @param req Request.
+     */
+    public void onMessage(JsonObject req) {
+        if (log.isLoggable(Level.FINE))
+            log.fine("Message: " + req);
+
+        JsonPrimitive reqIdJson = req.getAsJsonPrimitive("reqId");
+
+        final Long reqId = reqIdJson == null ? null : reqIdJson.getAsLong();
+
+        String mtdName = req.getAsJsonPrimitive("mtdName").getAsString();
+
+        final MethodDescriptor desc = methods.get(mtdName);
+
+        if (desc == null) {
+            sendError(reqId, "Unknown method: " + mtdName);
+
+            return;
+        }
+
+        Type[] paramTypes = desc.mtd.getGenericParameterTypes();
+
+        JsonArray argsJson = req.getAsJsonArray("args");
+
+        final Object[] args;
+
+        if (paramTypes.length > 0) {
+            args = new Object[paramTypes.length];
+
+            if (argsJson == null || argsJson.size() != paramTypes.length) {
+                sendError(reqId, "Inconsistent parameters");
+
+                return;
+            }
+
+            for (int i = 0; i < paramTypes.length; i++)
+                args[i] = Utils.GSON.fromJson(argsJson.get(i), paramTypes[i]);
+        }
+        else {
+            args = Utils.EMPTY_OBJECTS;
+
+            if (argsJson != null && argsJson.size() > 0) {
+                sendError(reqId, "Inconsistent parameters");
+
+                return;
+            }
+        }
+
+        Runnable run = new Runnable() {
+            @Override public void run() {
+                final Object res;
+
+                try {
+                    res = desc.mtd.invoke(desc.hnd, args);
+                } catch (Exception e) {
+                    if (reqId != null)
+                        sendException(reqId, e);
+                    else
+                        log.log(Level.SEVERE, "Exception on execute remote method", e);
+
+                    return;
+                }
+
+                sendResponse(reqId, res, desc.returnType);
+            }
+        };
+
+        if (desc.async)
+            executorSrvc.submit(run);
+        else
+            run.run();
+    }
+
+    /**
+     * @param reqId Request id.
+     * @param ex Exception.
+     */
+    protected void sendException(Long reqId, Exception ex) {
+        if (reqId == null)
+            return;
+
+        JsonObject res = new JsonObject();
+
+        res.addProperty("type", "CallRes");
+        res.addProperty("reqId", reqId);
+
+        JsonObject exJson = new JsonObject();
+        exJson.addProperty("type", ex.getClass().getName());
+        exJson.addProperty("message", ex.getMessage());
+
+        res.add("ex", exJson);
+
+        snd.send(res);
+    }
+
+    /**
+     * @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.
+     */
+    private void sendResponse(Long reqId, Object res, Type type) {
+        if (reqId == null)
+            return;
+
+        JsonObject resp = new JsonObject();
+
+        resp.addProperty("type", "CallRes");
+
+        resp.addProperty("reqId", reqId);
+
+        JsonElement resJson;
+
+        if (type == void.class)
+            resJson = JsonNull.INSTANCE;
+        else
+            resJson = Utils.GSON.toJsonTree(res, type);
+
+        resp.add("res", resJson);
+
+        snd.send(resp);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void close() {
+        executorSrvc.shutdown();
+    }
+
+    /**
+     * @param hnds Handler.
+     * @param snd Sender.
+     */
+    public static RemoteHandler wrap(WebSocketSender snd, Object ... hnds) {
+        return new RemoteHandler(snd, hnds);
+    }
+
+    /**
+     *
+     */
+    private static class MethodDescriptor {
+        /** */
+        private final Method mtd;
+
+        /** */
+        private final Object hnd;
+
+        /** */
+        private final Type returnType;
+
+        /** */
+        private final boolean async;
+
+        /**
+         * @param mtd Method.
+         * @param hnd Handler.
+         * @param async Async.
+         */
+        MethodDescriptor(Method mtd, Object hnd, boolean async) {
+            this.mtd = mtd;
+            this.hnd = hnd;
+            this.async = async;
+
+            returnType = mtd.getGenericReturnType();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/WebSocketSender.java
----------------------------------------------------------------------
diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/WebSocketSender.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/WebSocketSender.java
new file mode 100644
index 0000000..44f4147
--- /dev/null
+++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/WebSocketSender.java
@@ -0,0 +1,39 @@
+/*
+ * 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.remote;
+
+import com.google.gson.*;
+
+/**
+ * Sender for messages to web-socket.
+ */
+public interface WebSocketSender {
+    /**
+     * Send message.
+     * @param msg Message.
+     * @return {@code true} if message sent successfully.
+     */
+    public boolean send(String msg);
+
+    /**
+     * Send message.
+     * @param msg Message.
+     * @return {@code true} if message sent successfully.
+     */
+    public boolean send(JsonObject msg);
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e3162d20/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DBReader.java
----------------------------------------------------------------------
diff --git a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DBReader.java b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DBReader.java
index d220b14..9e8d236 100644
--- a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DBReader.java
+++ b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DBReader.java
@@ -26,7 +26,7 @@ import java.util.*;
 import java.util.logging.*;
 
 /**
- *
+ * Singleton to extract DataBase
  */
 public class DBReader {
     /** Logger. */