Repository: incubator-ignite Updated Branches: refs/heads/ignite-1155_1 c64d4af96 -> 1ac8b1ab7
IGNITE-1155 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/1ac8b1ab Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/1ac8b1ab Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/1ac8b1ab Branch: refs/heads/ignite-1155_1 Commit: 1ac8b1ab7738d12434b93fa6ca52eec98138840a Parents: c64d4af Author: AKuznetsov <akuznet...@gridgain.com> Authored: Tue Aug 4 09:59:26 2015 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Tue Aug 4 09:59:26 2015 +0700 ---------------------------------------------------------------------- modules/control-center-agent/README.txt | 26 +-- modules/control-center-agent/pom.xml | 12 +- .../org/apache/ignite/agent/AgentLauncher.java | 7 +- .../ignite/agent/AgentLoggingConfigurator.java | 82 +++++++++ .../org/apache/ignite/agent/AgentSocket.java | 2 +- .../org/apache/ignite/agent/AgentUtils.java | 56 +++++++ .../ignite/agent/LoggingConfigurator.java | 77 --------- .../org/apache/ignite/agent/RestExecutor.java | 165 ------------------- .../java/org/apache/ignite/agent/Utils.java | 56 ------- .../ignite/agent/handlers/DBExtractor.java | 98 ----------- .../handlers/DatabaseMetadataExtractor.java | 98 +++++++++++ .../ignite/agent/handlers/RestExecutor.java | 2 +- .../org/apache/ignite/agent/remote/Remote.java | 6 +- .../apache/ignite/schema/parser/DBReader.java | 127 -------------- .../ignite/schema/parser/DbMetadataReader.java | 127 ++++++++++++++ .../schema/parser/DatabaseMetadataParser.java | 2 +- .../ignite/schema/ui/SchemaImportApp.java | 4 +- 17 files changed, 398 insertions(+), 549 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/control-center-agent/README.txt ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/README.txt b/modules/control-center-agent/README.txt index 99d14a8..2db8031 100644 --- a/modules/control-center-agent/README.txt +++ b/modules/control-center-agent/README.txt @@ -1,13 +1,19 @@ -Apache Ignite Control Center Agent ---------------------------- -Apache Ignite Control Center Agent is a java standalone application that allow to connect grid to control center. -Control Center Agent communicates with grid nodes via REST interface and connects to Control Center via web-socket. +Ignite Control Center Agent +====================================== +Ignite Control Center Agent is a java standalone application that allow to connect grid to Ignite Web Control Center. +Control Center Agent communicates with grid nodes via REST interface and connects to Web Control Center via web-socket. + +Two main functions of Control Center Agent: + 1. Proxy between Ignite Web Control Center and Ignite Grid to execute SQL statements and collect metrics for monitoring. + 2. Proxy between Ignite Web Control Center and user RDBMS to collect database metadata for later CacheTypeMetadata configuration. + + +Usage example +====================================== ---------------------------- -Usage example: agent.sh -l john.sm...@gmail.com -p qwerty -s wss://control-center.gridgain.com -Command line arguments: +Main command line arguments: -l User's login (email) on web-control-center -p User's password -s Link to Ignite Control Center web-socket server. @@ -15,6 +21,6 @@ Command line arguments: -c Configure agent using configuration file. Configuration file is a properties file, see /control-center-agent/src/main/resources/config.properties as example. ---------------------------- -Building module: -to build module run "mvn package" +Ignite Control Center Agent Build Instructions +====================================== + mvn clean package -DskipTests http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/control-center-agent/pom.xml ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/pom.xml b/modules/control-center-agent/pom.xml index c40b4756..733c00e 100644 --- a/modules/control-center-agent/pom.xml +++ b/modules/control-center-agent/pom.xml @@ -39,6 +39,12 @@ <dependencies> <dependency> + <groupId>org.apache.ignite</groupId> + <artifactId>ignite-schema-import-db</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-client</artifactId> <version>${jetty.version}</version> @@ -61,12 +67,6 @@ <artifactId>httpclient</artifactId> <version>4.5</version> </dependency> - - <dependency> - <groupId>org.apache.ignite</groupId> - <artifactId>ignite-schema-import-db</artifactId> - <version>${project.version}</version> - </dependency> </dependencies> <build> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/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 5404448..3f04c80 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 @@ -18,6 +18,7 @@ package org.apache.ignite.agent; import com.beust.jcommander.*; +import org.apache.ignite.agent.handlers.*; import org.eclipse.jetty.util.ssl.*; import org.eclipse.jetty.websocket.client.*; @@ -26,12 +27,12 @@ import java.net.*; import java.util.logging.*; /** - * Main class. + * Control Center Agent launcher. */ public class AgentLauncher { /** Static initializer. */ static { - LoggingConfigurator.configure(); + AgentLoggingConfigurator.configure(); } /** */ @@ -77,6 +78,8 @@ public class AgentLauncher { * @param args Args. */ public static void main(String[] args) throws Exception { + log.log(Level.INFO, "Starting Apache Ignite Control Center Agent..."); + AgentConfiguration cfg = getConfiguration(args); RestExecutor restExecutor = new RestExecutor(cfg); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLoggingConfigurator.java ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLoggingConfigurator.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLoggingConfigurator.java new file mode 100644 index 0000000..d0b1d2d --- /dev/null +++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentLoggingConfigurator.java @@ -0,0 +1,82 @@ +/* + * 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.util.logging.*; + +/** + * Configurator for java.util.Logger. + */ +public class AgentLoggingConfigurator { + /** */ + private static final String CFG_PATH_PROPERTY = "log.config.path"; + + private static final String PROPERTIES_FILE = "logging.properties"; + + /** + * Perform configure. + */ + public static void configure() { + try { + if (System.getProperty(CFG_PATH_PROPERTY) != null) { + File logCfg = new File(System.getProperty(CFG_PATH_PROPERTY)); + + if (!logCfg.isFile()) { + System.err.println("Failed to load logging configuration, file not found: " + logCfg); + + System.exit(1); + } + + readConfiguration(logCfg); + + return; + } + + File agentHome = AgentUtils.getAgentHome(); + + if (agentHome != null) { + File logCfg = new File(agentHome, PROPERTIES_FILE); + + if (logCfg.isFile()) { + readConfiguration(logCfg); + + return; + } + } + + LogManager.getLogManager().readConfiguration(AgentLauncher.class.getResourceAsStream("/" + PROPERTIES_FILE)); + } + catch (IOException e) { + System.err.println("Failed to load logging configuration"); + + e.printStackTrace(); + + System.exit(1); + } + } + + /** + * @param file File. + */ + private static void readConfiguration(File file) throws IOException { + try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { + LogManager.getLogManager().readConfiguration(in); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/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 e34972c..bab149f 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(cfg)); + remote = RemoteHandler.wrap(this, this, restExecutor, new DatabaseMetadataExtractor(cfg)); JsonObject authMsg = new JsonObject(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentUtils.java ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentUtils.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentUtils.java new file mode 100644 index 0000000..0675e3f --- /dev/null +++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/AgentUtils.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 AgentUtils { + /** + * Default constructor. + */ + private AgentUtils() { + // 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/1ac8b1ab/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 deleted file mode 100644 index 5fb2c6e..0000000 --- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/LoggingConfigurator.java +++ /dev/null @@ -1,77 +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 java.io.*; -import java.util.logging.*; - -/** - * Configurator for java.util.Logger. - */ -public class LoggingConfigurator { - /** - * Perform configure. - */ - public static void configure() { - try { - if (System.getProperty("log.config.path") != null) { - File logCfg = new File(System.getProperty("log.config.path")); - - if (!logCfg.isFile()) { - System.err.println("Failed to load loggin configuration, file not found: " + logCfg); - - System.exit(1); - } - - readConfiguration(logCfg); - - return; - } - - File agentHome = Utils.getAgentHome(); - - if (agentHome != null) { - File logCfg = new File(agentHome, "logging.properties"); - - if (logCfg.isFile()) { - readConfiguration(logCfg); - - return; - } - } - - LogManager.getLogManager().readConfiguration(AgentLauncher.class.getResourceAsStream("/logging.properties")); - } - catch (IOException e) { - System.err.println("Failed to load loggin configuration"); - - e.printStackTrace(); - - System.exit(1); - } - } - - /** - * @param file File. - */ - private static void readConfiguration(File file) throws IOException { - try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { - LogManager.getLogManager().readConfiguration(in); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/control-center-agent/src/main/java/org/apache/ignite/agent/RestExecutor.java ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/RestExecutor.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/RestExecutor.java deleted file mode 100644 index 6477292..0000000 --- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/RestExecutor.java +++ /dev/null @@ -1,165 +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 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.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/1ac8b1ab/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 30661ea..0000000 --- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/Utils.java +++ /dev/null @@ -1,56 +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 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/1ac8b1ab/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 deleted file mode 100644 index 1288848..0000000 --- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DBExtractor.java +++ /dev/null @@ -1,98 +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.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.*; - -/** - * 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. - * @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 { - 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/1ac8b1ab/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DatabaseMetadataExtractor.java ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DatabaseMetadataExtractor.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DatabaseMetadataExtractor.java new file mode 100644 index 0000000..183f674 --- /dev/null +++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/handlers/DatabaseMetadataExtractor.java @@ -0,0 +1,98 @@ +/* + * 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.*; +import org.apache.ignite.agent.remote.*; +import org.apache.ignite.schema.parser.*; + +import java.io.*; +import java.sql.*; +import java.util.*; + +/** + * Remote API to extract database metadata. + */ +public class DatabaseMetadataExtractor { + /** */ + private final AgentConfiguration cfg; + + /** */ + private final String driversFolder; + + /** + * @param cfg Config. + */ + public DatabaseMetadataExtractor(AgentConfiguration cfg) { + this.cfg = cfg; + + String driversFolder = cfg.getDriversFolder(); + + if (driversFolder == null) { + File agentHome = AgentUtils.getAgentHome(); + + if (agentHome != null) + driversFolder = agentHome + "/drivers"; + } + + this.driversFolder = driversFolder; + } + + /** + * @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 { + if (!new File(jdbcDriverJarPath).isAbsolute() && driversFolder != null) + jdbcDriverJarPath = new File(driversFolder, jdbcDriverJarPath).getPath(); + + Connection conn = DbMetadataReader.getInstance().connect(jdbcDriverJarPath, jdbcDriverCls, jdbcUrl, jdbcInfo); + + return DbMetadataReader.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/1ac8b1ab/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 index 8b0ae98..aec4138 100644 --- 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 @@ -81,7 +81,7 @@ public class RestExecutor { URIBuilder builder = new URIBuilder(cfg.getNodeUri()); if (path != null) { - if (!path.startsWith("/") && !cfg.getNodeUri().toString().endsWith("/")) + if (!path.startsWith("/") && !cfg.getNodeUri().endsWith("/")) path = '/' + path; builder.setPath(path); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/Remote.java ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/Remote.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/Remote.java index d7950bf..4419281 100644 --- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/Remote.java +++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/Remote.java @@ -20,15 +20,15 @@ package org.apache.ignite.agent.remote; import java.lang.annotation.*; /** - * Method annotated by this annotation can be executed remotely from NodeJS server by web-socket command. + * Use this annotation to assosiate methods with remote NodeJS server commands. */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Remote { /** * Whether or not method should be executed synchronously. - * @return {@code true} if method will be executed in separated thread, - * {@code false} if method executed in web-socket thread. + * + * @return {@code true} if method will be executed in separated thread otherwise if method will be executed in handler thread. */ boolean async() default true; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/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 deleted file mode 100644 index 9e8d236..0000000 --- a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DBReader.java +++ /dev/null @@ -1,127 +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.schema.parser; - -import org.apache.ignite.schema.parser.dialect.*; - -import java.io.*; -import java.net.*; -import java.sql.*; -import java.util.*; -import java.util.logging.*; - -/** - * Singleton to extract DataBase - */ -public class DBReader { - /** Logger. */ - private static final Logger log = Logger.getLogger(DBReader.class.getName()); - - /** */ - private static final DBReader INSTANCE = new DBReader(); - - /** */ - private final Map<String, Driver> drivers = new HashMap<>(); - - /** - * Default constructor. - */ - private DBReader() { - // No-op. - } - - /** - * Extract DB metadata. - * - * @param conn Connection. - * @param tblsOnly Tables only flag. - */ - public Collection<DbTable> extractMetadata(Connection conn, boolean tblsOnly) throws SQLException { - DatabaseMetadataDialect dialect; - - try { - String dbProductName = conn.getMetaData().getDatabaseProductName(); - - if ("Oracle".equals(dbProductName)) - dialect = new OracleMetadataDialect(); - else if (dbProductName.startsWith("DB2/")) - dialect = new DB2MetadataDialect(); - else - dialect = new JdbcMetadataDialect(); - } - catch (SQLException e) { - log.log(Level.SEVERE, "Failed to resolve dialect (JdbcMetaDataDialect will be used.", e); - - dialect = new JdbcMetadataDialect(); - } - - return dialect.tables(conn, tblsOnly); - } - - /** - * Connect to database. - * - * @param jdbcDrvJarPath Path to JDBC driver. - * @param jdbcDrvCls JDBC class name. - * @param jdbcUrl JDBC connection URL. - * @param jdbcInfo Connection properties. - * @return Connection to database. - * @throws SQLException if connection failed. - */ - public Connection connect(String jdbcDrvJarPath, String jdbcDrvCls, String jdbcUrl, Properties jdbcInfo) - throws SQLException { - Driver drv = drivers.get(jdbcDrvCls); - - if (drv == null) { - if (jdbcDrvJarPath.isEmpty()) - throw new IllegalStateException("Driver jar file name is not specified."); - - File drvJar = new File(jdbcDrvJarPath); - - if (!drvJar.exists()) - throw new IllegalStateException("Driver jar file is not found."); - - try { - URL u = new URL("jar:" + drvJar.toURI() + "!/"); - - URLClassLoader ucl = URLClassLoader.newInstance(new URL[] {u}); - - drv = (Driver)Class.forName(jdbcDrvCls, true, ucl).newInstance(); - - drivers.put(jdbcDrvCls, drv); - } - catch (Exception e) { - throw new IllegalStateException(e); - } - } - - Connection conn = drv.connect(jdbcUrl, jdbcInfo); - - if (conn == null) - throw new IllegalStateException("Connection was not established (JDBC driver returned null value)."); - - return conn; - } - - /** - * @return Instance. - */ - public static DBReader getInstance() { - return INSTANCE; - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DbMetadataReader.java ---------------------------------------------------------------------- diff --git a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DbMetadataReader.java b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DbMetadataReader.java new file mode 100644 index 0000000..31466b5 --- /dev/null +++ b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/DbMetadataReader.java @@ -0,0 +1,127 @@ +/* + * 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.schema.parser; + +import org.apache.ignite.schema.parser.dialect.*; + +import java.io.*; +import java.net.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; + +/** + * Singleton to extract database metadata. + */ +public class DbMetadataReader { + /** Logger. */ + private static final Logger log = Logger.getLogger(DbMetadataReader.class.getName()); + + /** */ + private static final DbMetadataReader INSTANCE = new DbMetadataReader(); + + /** */ + private final Map<String, Driver> drivers = new HashMap<>(); + + /** + * Default constructor. + */ + private DbMetadataReader() { + // No-op. + } + + /** + * Extract DB metadata. + * + * @param conn Connection. + * @param tblsOnly Tables only flag. + */ + public Collection<DbTable> extractMetadata(Connection conn, boolean tblsOnly) throws SQLException { + DatabaseMetadataDialect dialect; + + try { + String dbProductName = conn.getMetaData().getDatabaseProductName(); + + if ("Oracle".equals(dbProductName)) + dialect = new OracleMetadataDialect(); + else if (dbProductName.startsWith("DB2/")) + dialect = new DB2MetadataDialect(); + else + dialect = new JdbcMetadataDialect(); + } + catch (SQLException e) { + log.log(Level.SEVERE, "Failed to resolve dialect (JdbcMetaDataDialect will be used.", e); + + dialect = new JdbcMetadataDialect(); + } + + return dialect.tables(conn, tblsOnly); + } + + /** + * Connect to database. + * + * @param jdbcDrvJarPath Path to JDBC driver. + * @param jdbcDrvCls JDBC class name. + * @param jdbcUrl JDBC connection URL. + * @param jdbcInfo Connection properties. + * @return Connection to database. + * @throws SQLException if connection failed. + */ + public Connection connect(String jdbcDrvJarPath, String jdbcDrvCls, String jdbcUrl, Properties jdbcInfo) + throws SQLException { + Driver drv = drivers.get(jdbcDrvCls); + + if (drv == null) { + if (jdbcDrvJarPath.isEmpty()) + throw new IllegalStateException("Driver jar file name is not specified."); + + File drvJar = new File(jdbcDrvJarPath); + + if (!drvJar.exists()) + throw new IllegalStateException("Driver jar file is not found."); + + try { + URL u = new URL("jar:" + drvJar.toURI() + "!/"); + + URLClassLoader ucl = URLClassLoader.newInstance(new URL[] {u}); + + drv = (Driver)Class.forName(jdbcDrvCls, true, ucl).newInstance(); + + drivers.put(jdbcDrvCls, drv); + } + catch (Exception e) { + throw new IllegalStateException(e); + } + } + + Connection conn = drv.connect(jdbcUrl, jdbcInfo); + + if (conn == null) + throw new IllegalStateException("Connection was not established (JDBC driver returned null value)."); + + return conn; + } + + /** + * @return Instance. + */ + public static DbMetadataReader getInstance() { + return INSTANCE; + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java ---------------------------------------------------------------------- diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java index 22cb5ba..b94ace9 100644 --- a/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java +++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java @@ -44,7 +44,7 @@ public class DatabaseMetadataParser { Map<String, Collection<PojoDescriptor>> childrens = new HashMap<>(); - for (DbTable tbl : DBReader.getInstance().extractMetadata(conn, tblsOnly)) { + for (DbTable tbl : DbMetadataReader.getInstance().extractMetadata(conn, tblsOnly)) { String schema = tbl.schema(); PojoDescriptor parent = parents.get(schema); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ac8b1ab/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java ---------------------------------------------------------------------- diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java index d85922a..67890fb 100644 --- a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java +++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java @@ -342,7 +342,7 @@ public class SchemaImportApp extends Application { @Override protected Void call() throws Exception { long started = System.currentTimeMillis(); - try (Connection conn = DBReader.getInstance().connect(jdbcDrvJarPath, jdbcDrvCls, jdbcUrl, jdbcInfo)) { + try (Connection conn = DbMetadataReader.getInstance().connect(jdbcDrvJarPath, jdbcDrvCls, jdbcUrl, jdbcInfo)) { pojos = DatabaseMetadataParser.parse(conn, tblsOnly); } @@ -1321,7 +1321,7 @@ public class SchemaImportApp extends Application { if (customPrefsFile == null) log.log(Level.WARNING, "Failed to resolve path to file with custom preferences: " + - customPrefsFile); + customPrefsFileName); else { Properties customPrefs = new Properties();