IGNITE-1184 control-center-agent: User should be able to store JDBC drivers to specified folder
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/c64d4af9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/c64d4af9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/c64d4af9 Branch: refs/heads/ignite-843 Commit: c64d4af96276a6bb3b0e060fa4efcea27a3a6620 Parents: 4ea5f07 Author: sevdokimov <sevdoki...@gridgain.com> Authored: Fri Jul 31 18:02:44 2015 +0300 Committer: sevdokimov <sevdoki...@gridgain.com> Committed: Fri Jul 31 18:02:44 2015 +0300 ---------------------------------------------------------------------- .../apache/ignite/agent/AgentConfiguration.java | 21 ++++++++ .../org/apache/ignite/agent/AgentSocket.java | 2 +- .../ignite/agent/LoggingConfigurator.java | 18 ++----- .../java/org/apache/ignite/agent/Utils.java | 56 ++++++++++++++++++++ .../ignite/agent/handlers/DBExtractor.java | 53 ++++++++++++++++++ .../main/resources/default.config.properties | 3 ++ .../src/main/js/agents/agent-manager.js | 16 ++++++ 7 files changed, 153 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c64d4af9/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 4ac3072..769c53a 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 @@ -48,6 +48,10 @@ public class AgentConfiguration { @Parameter(names = {"-c", "--config"}, description = "Path to configuration file") private String cfgPath; + /** */ + @Parameter(names = {"-drv", "--driver-folder"}, description = "Path to drivers folder") + private String driversFolder; + /** * @return Login. */ @@ -119,6 +123,20 @@ public class AgentConfiguration { } /** + * @return Configured drivers folder. + */ + public String getDriversFolder() { + return driversFolder; + } + + /** + * @param driversFolder Driver folder. + */ + public void setDriversFolder(String driversFolder) { + this.driversFolder = driversFolder; + } + + /** * @param cfgUrl URL. */ public void load(URL cfgUrl) throws IOException { @@ -167,5 +185,8 @@ public class AgentConfiguration { if (cmd.getConfigPath() != null) setNodeUri(cmd.getNodeUri()); + + if (cmd.getDriversFolder() != null) + setDriversFolder(cmd.getDriversFolder()); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c64d4af9/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 935f417..e34972c 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 @@ -88,7 +88,7 @@ public class AgentSocket implements WebSocketSender { this.ses = ses; - remote = RemoteHandler.wrap(this, this, restExecutor, new DBExtractor()); + remote = RemoteHandler.wrap(this, this, restExecutor, new DBExtractor(cfg)); JsonObject authMsg = new JsonObject(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c64d4af9/modules/control-center-agent/src/main/java/org/apache/ignite/agent/LoggingConfigurator.java ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/LoggingConfigurator.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/LoggingConfigurator.java index 93cc8a9..5fb2c6e 100644 --- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/LoggingConfigurator.java +++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/LoggingConfigurator.java @@ -18,7 +18,6 @@ package org.apache.ignite.agent; import java.io.*; -import java.net.*; import java.util.logging.*; /** @@ -44,21 +43,10 @@ public class LoggingConfigurator { return; } - URL jarLogCfgUrl = AgentLauncher.class.getResource("/logging.properties"); + File agentHome = Utils.getAgentHome(); - String path = jarLogCfgUrl.getFile(); - - int jarSeparatorIdx = path.lastIndexOf("!/"); - - if (jarSeparatorIdx != -1) { - path = path.substring(0, jarSeparatorIdx); - - if (path.startsWith("file:")) - path = path.substring("file:".length()); - - File jarFile = new File(path); - - File logCfg = new File(jarFile.getParentFile(), "logging.properties"); + if (agentHome != null) { + File logCfg = new File(agentHome, "logging.properties"); if (logCfg.isFile()) { readConfiguration(logCfg); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c64d4af9/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 new file mode 100644 index 0000000..30661ea --- /dev/null +++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/Utils.java @@ -0,0 +1,56 @@ +/* + * 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 java.io.*; +import java.net.*; + +/** + * Utility methods. + */ +public class Utils { + /** + * Default constructor. + */ + private Utils() { + // No-op. + } + + /** + * @return Folder where agent.jar is located. + */ + public static File getAgentHome() { + URL jarLogCfgUrl = AgentLauncher.class.getResource("/logging.properties"); + + String path = jarLogCfgUrl.getFile(); + + int jarSeparatorIdx = path.lastIndexOf("!/"); + + if (jarSeparatorIdx == -1) + return null; + + path = path.substring(0, jarSeparatorIdx); + + if (path.startsWith("file:")) + path = path.substring("file:".length()); + + File jarFile = new File(path); + + return jarFile.getParentFile(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c64d4af9/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 index 676e900..1288848 100644 --- 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 @@ -17,9 +17,11 @@ package org.apache.ignite.agent.handlers; +import org.apache.ignite.agent.*; import org.apache.ignite.agent.remote.*; import org.apache.ignite.schema.parser.*; +import java.io.*; import java.sql.*; import java.util.*; @@ -27,6 +29,30 @@ import java.util.*; * Remote API to extract DB metadata. */ public class DBExtractor { + /** */ + private final AgentConfiguration cfg; + + /** */ + private final String driversFolder; + + /** + * @param cfg Config. + */ + public DBExtractor(AgentConfiguration cfg) { + this.cfg = cfg; + + String driversFolder = cfg.getDriversFolder(); + + if (driversFolder == null) { + File agentHome = Utils.getAgentHome(); + + if (agentHome != null) + driversFolder = agentHome + "/drivers"; + } + + this.driversFolder = driversFolder; + } + /** * @param jdbcDriverJarPath JDBC driver JAR path. * @param jdbcDriverCls JDBC driver class. @@ -38,8 +64,35 @@ public class DBExtractor { @Remote public Collection<DbTable> extractMetadata(String jdbcDriverJarPath, String jdbcDriverCls, String jdbcUrl, Properties jdbcInfo, boolean tblsOnly) throws SQLException { + if (!new File(jdbcDriverJarPath).isAbsolute() && driversFolder != null) + jdbcDriverJarPath = new File(driversFolder, jdbcDriverJarPath).getPath(); + Connection conn = DBReader.getInstance().connect(jdbcDriverJarPath, jdbcDriverCls, jdbcUrl, jdbcInfo); return DBReader.getInstance().extractMetadata(conn, tblsOnly); } + + /** + * @return Drivers in drivers folder + * @see AgentConfiguration#driversFolder + */ + @Remote + public List<String> availableDrivers() { + if (driversFolder == null) + return Collections.emptyList(); + + String[] list = new File(driversFolder).list(); + + if (list == null) + return Collections.emptyList(); + + List<String> res = new ArrayList<>(); + + for (String fileName : list) { + if (fileName.endsWith(".jar")) + res.add(fileName); + } + + return res; + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c64d4af9/modules/control-center-agent/src/main/resources/default.config.properties ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/resources/default.config.properties b/modules/control-center-agent/src/main/resources/default.config.properties index 631e811..0162a8c 100644 --- a/modules/control-center-agent/src/main/resources/default.config.properties +++ b/modules/control-center-agent/src/main/resources/default.config.properties @@ -19,6 +19,9 @@ serverURI=wss://localhost:3001 # Default Ignite node server URI. nodeURI=http://localhost:8080 +# Folder with available JDBC drivers +# driverFolder=/home/user/drivers + # User's login (email) on Ignite Control Center # login=ivan.iva...@gmail.com http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c64d4af9/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 875cdab..12d9f4b 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 @@ -187,11 +187,20 @@ Client.prototype.authResult = function(error) { * @param {Object} jdbcInfo * @param {Boolean} tablesOnly * @param {Function} cb Callback. Take 3 arguments: {String} error, {Object} exception, {Object} result. + * @return {Array} List of tables (see org.apache.ignite.schema.parser.DbTable java class) */ Client.prototype.extractMetadata = function(jdbcDriverJarPath, jdbcDriverClass, jdbcUrl, jdbcInfo, tablesOnly, cb) { this._invokeRmtMethod('extractMetadata', arguments) }; +/** + * @param {Function} cb Callback. + * @return {Array} List of jars from driver folder. + */ +Client.prototype.availableDrivers = function(cb) { + this._invokeRmtMethod('availableDrivers', arguments) +}; + Client.prototype._invokeRmtMethod = function(methodName, args) { var cb = null; @@ -200,6 +209,13 @@ Client.prototype._invokeRmtMethod = function(methodName, args) { if (m.length > 0 && typeof m[m.length - 1] == 'function') cb = m.pop(); + if (this._ws.readyState != 1) { + if (cb) + cb({type: 'org.apache.ignite.agent.AgentException', message: 'Connection is closed'}); + + return + } + var msg = { mtdName: methodName, args: m