This is an automated email from the ASF dual-hosted git repository.
peacewong pushed a commit to branch dev-1.3.2
in repository https://gitbox.apache.org/repos/asf/incubator-linkis.git
The following commit(s) were added to refs/heads/dev-1.3.2 by this push:
new 6dc07c3bc [Feature] Mongodb datasource module (#3764)
6dc07c3bc is described below
commit 6dc07c3bc384eecc395e947d5128cca97a552119
Author: FinalTarget <[email protected]>
AuthorDate: Wed Nov 16 20:39:29 2022 +0800
[Feature] Mongodb datasource module (#3764)
* Add mongodb data source module
---
.../licenses/LICENSE-mongo-java-driver.txt | 202 ++++++++++++++++
.../linkis-metadata-query/service/mongodb/pom.xml | 113 +++++++++
.../mongodb/src/main/assembly/distribution.xml | 57 +++++
.../metadata/query/service/MongoDbConnection.java | 258 +++++++++++++++++++++
.../query/service/MongoDbParamsMapper.java | 41 ++++
.../metadata/query/service/MongodbMetaService.java | 97 ++++++++
.../linkis-datasource/pom.xml | 1 +
tool/dependencies/known-dependencies.txt | 1 +
8 files changed, 770 insertions(+)
diff --git a/linkis-dist/release-docs/licenses/LICENSE-mongo-java-driver.txt
b/linkis-dist/release-docs/licenses/LICENSE-mongo-java-driver.txt
new file mode 100644
index 000000000..7a4a3ea24
--- /dev/null
+++ b/linkis-dist/release-docs/licenses/LICENSE-mongo-java-driver.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
\ No newline at end of file
diff --git
a/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/pom.xml
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/pom.xml
new file mode 100644
index 000000000..844ed5e27
--- /dev/null
+++
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.linkis</groupId>
+ <artifactId>linkis</artifactId>
+ <version>1.3.1</version>
+ <relativePath>../../../../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>linkis-metadata-query-service-mongodb</artifactId>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <es.version>6.7.1</es.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.linkis</groupId>
+ <artifactId>linkis-metadata-query-common</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.linkis</groupId>
+ <artifactId>linkis-module</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.mongodb</groupId>
+ <artifactId>mongo-java-driver</artifactId>
+ <version>3.12.7</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}-${project.version}</finalName>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <inherited>false</inherited>
+ <configuration>
+ <skipAssembly>false</skipAssembly>
+ <finalName>out</finalName>
+ <appendAssemblyId>false</appendAssemblyId>
+ <attach>false</attach>
+ <descriptors>
+ <descriptor>src/main/assembly/distribution.xml</descriptor>
+ </descriptors>
+ </configuration>
+ <executions>
+ <execution>
+ <id>make-assembly</id>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <descriptors>
+ <descriptor>src/main/assembly/distribution.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git
a/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/assembly/distribution.xml
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/assembly/distribution.xml
new file mode 100644
index 000000000..9498662cd
--- /dev/null
+++
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/assembly/distribution.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+
+<assembly
+
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.3"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.3
http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+ <id>linkis-metadata-query-service-mongodb</id>
+ <formats>
+ <format>zip</format>
+ <format>dir</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+ <baseDirectory>linkis-metadata-query-service-mongodb</baseDirectory>
+
+ <dependencySets>
+ <dependencySet>
+ <!-- Enable access to all projects in the current multimodule
build! <useAllReactorProjects>true</useAllReactorProjects> -->
+ <!-- Now, select which projects to include in this module-set. -->
+ <outputDirectory>lib</outputDirectory>
+ <useProjectArtifact>true</useProjectArtifact>
+ <useTransitiveDependencies>true</useTransitiveDependencies>
+ <unpack>false</unpack>
+ <useStrictFiltering>false</useStrictFiltering>
+ <useTransitiveFiltering>true</useTransitiveFiltering>
+ </dependencySet>
+ </dependencySets>
+
+ <fileSets>
+ <fileSet>
+ <directory>${basedir}/src/main/resources</directory>
+ <includes>
+ <include>*</include>
+ </includes>
+ <fileMode>0777</fileMode>
+ <outputDirectory>conf</outputDirectory>
+ <lineEnding>unix</lineEnding>
+ </fileSet>
+ </fileSets>
+
+</assembly>
+
diff --git
a/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongoDbConnection.java
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongoDbConnection.java
new file mode 100644
index 000000000..7a5292852
--- /dev/null
+++
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongoDbConnection.java
@@ -0,0 +1,258 @@
+/*
+ * 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.linkis.metadata.query.service;
+
+import org.apache.linkis.common.conf.CommonVars;
+import org.apache.linkis.metadata.query.common.domain.MetaColumnInfo;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.mongodb.*;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoCursor;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.MongoIterable;
+import org.bson.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.mongodb.client.model.Sorts.descending;
+
+public class MongoDbConnection implements Closeable {
+ private static final Logger LOG =
LoggerFactory.getLogger(MongoDbConnection.class);
+
+ private static final CommonVars<Integer> CONNECTIONS_PER_HOST =
+ CommonVars.apply("wds.linkis.server.mdm.service.mongo.driver", 5);
+
+ private static final CommonVars<Integer> CONNECT_TIMEOUT =
+ CommonVars.apply("wds.linkis.server.mdm.service.mongo.connect.timeout",
3000);
+
+ private static final CommonVars<Integer> SOCKET_TIMEOUT =
+ CommonVars.apply("wds.linkis.server.mdm.service.mongo.socket.timeout",
6000);
+
+ private static final int DOC_FETCH_LIMIT = 100;
+
+ private static final String DEFAULT_PRIMARY_KEY = "_id";
+
+ /** Define the default options */
+ private static final MongoClientOptions CLIENT_SERVICE_OPTIONS =
+ MongoClientOptions.builder()
+ .connectionsPerHost(5)
+ .socketTimeout(6000)
+ .connectTimeout(3000)
+ .serverSelectionTimeout(50)
+ .build();
+
+ private MongoClient conn;
+
+ private ConnectMessage connectMessage;
+
+ public MongoDbConnection(
+ String host,
+ Integer port,
+ String username,
+ String password,
+ String database,
+ Map<String, Object> extraParams)
+ throws ClassNotFoundException, Exception {
+ connectMessage = new ConnectMessage(host, port, username, password,
database, extraParams);
+ conn = getDBConnection(connectMessage, database);
+ }
+
+ public List<String> getAllDatabases() throws Exception {
+ LOG.info("start to get database");
+ List<String> databases = new ArrayList<>();
+ MongoIterable<String> databaseNamesIter = this.conn.listDatabaseNames();
+ for (String databaseName : databaseNamesIter) {
+ databases.add(databaseName);
+ }
+ return databases;
+ }
+
+ public List<String> getAllTables(String database) throws Exception {
+ List<String> collectionNames = new ArrayList<>();
+ MongoDatabase mdb = this.conn.getDatabase(database);
+ MongoIterable<String> collections = mdb.listCollectionNames();
+ for (String cname : collections) {
+ collectionNames.add(cname);
+ }
+ return collectionNames;
+ }
+
+ public List<MetaColumnInfo> getColumns(String database, String collection)
+ throws Exception, ClassNotFoundException {
+ List<MetaColumnInfo> metaColumnInfo = new ArrayList<>();
+ MongoDatabase mdb = this.conn.getDatabase(database);
+ MongoCollection<Document> collection1 = mdb.getCollection(collection);
+ MongoCursor<Document> dbCursor =
+ collection1
+ .find()
+ .sort(descending("_id"))
+ .batchSize(DOC_FETCH_LIMIT)
+ .limit(DOC_FETCH_LIMIT)
+ .iterator();
+ int maxFieldSize = Integer.MIN_VALUE;
+ Document maxDocument = null;
+ while (dbCursor.hasNext()) {
+ Document document = dbCursor.next();
+ if (document.keySet().size() > maxFieldSize) {
+ maxDocument = document;
+ maxFieldSize = document.keySet().size();
+ }
+ }
+ if (Objects.nonNull(maxDocument)) {
+ AtomicInteger index = new AtomicInteger(0);
+ maxDocument.forEach(
+ (colName, colValue) -> {
+ MetaColumnInfo info = new MetaColumnInfo();
+ // Index
+ info.setIndex(index.getAndIncrement());
+ // Field name
+ info.setName(colName);
+ // Field type
+ info.setType(Objects.nonNull(colValue) ?
colValue.getClass().getSimpleName() : "Null");
+ if (info.getName().equals(DEFAULT_PRIMARY_KEY)) {
+ info.setPrimaryKey(true);
+ }
+ metaColumnInfo.add(info);
+ });
+ }
+ return metaColumnInfo;
+ }
+
+ /**
+ * Get primary keys
+ *
+ * @param connection connection
+ * @return
+ * @throws Exception
+ */
+ private List<String> getPrimaryKeys(MongoClient connection, String database,
String collection)
+ throws Exception {
+ List<String> primaryKeys = new ArrayList<>();
+ primaryKeys.add(DEFAULT_PRIMARY_KEY);
+ return primaryKeys;
+ }
+
+ /**
+ * close database resource
+ *
+ * @param connection connection
+ */
+ private void closeResource(MongoClient connection) {
+ if (null != connection) {
+ connection.close();
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ closeResource(conn);
+ }
+
+ /**
+ * @param connectMessage
+ * @param database
+ * @return
+ * @throws ClassNotFoundException
+ */
+ private MongoClient getDBConnection(ConnectMessage connectMessage, String
database)
+ throws Exception {
+
+ LOG.info(
+ "mongo information is database:{}, username:{}, passwordd:{} ",
+ database,
+ connectMessage.username,
+ connectMessage.password);
+
+ MongoClient client = null;
+ try {
+ MongoCredential credential =
+ MongoCredential.createCredential(
+ connectMessage.username, database,
connectMessage.password.toCharArray());
+ ServerAddress address = new ServerAddress(connectMessage.host,
connectMessage.port);
+ client = new MongoClient(address, credential, CLIENT_SERVICE_OPTIONS);
+ MongoDatabase mdb = client.getDatabase(database);
+ MongoIterable<String> collectionname = mdb.listCollectionNames();
+ collectionname.first();
+ return client;
+ // return new MongoClient(address, credential, CLIENT_SERVICE_OPTIONS);
+ } catch (MongoSocketException e) {
+ throw new RuntimeException(
+ "Fail in building socket connection to Mongo server: [ host: "
+ + connectMessage.host
+ + ", port: "
+ + connectMessage.port
+ + "]",
+ e);
+ } catch (MongoSecurityException e) {
+ throw new RuntimeException(
+ "Fail to authenticate to Mongo server: [ host: "
+ + connectMessage.host
+ + ", port: "
+ + connectMessage.port
+ + ", username: "
+ + connectMessage.username
+ + "]",
+ e);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException(e);
+ } catch (Exception e) {
+ LOG.error("exchange.mongodb.obtain.data_source.info.failed" +
e.getMessage());
+ throw new Exception();
+ }
+ }
+
+ /** Connect message */
+ private static class ConnectMessage {
+ private String host;
+
+ private Integer port;
+
+ private String username;
+
+ private String password;
+
+ private String database;
+
+ private Map<String, Object> extraParams;
+
+ public ConnectMessage(
+ String host,
+ Integer port,
+ String username,
+ String password,
+ String database,
+ Map<String, Object> extraParams) {
+ this.host = host;
+ this.port = port;
+ this.username = username;
+ this.password = password;
+ this.database = database;
+ if (extraParams != null) {
+ this.extraParams = extraParams;
+ }
+ this.extraParams = extraParams;
+ this.extraParams.put("connectTimeout", CONNECT_TIMEOUT.getValue());
+ this.extraParams.put("socketTimeout", SOCKET_TIMEOUT.getValue());
+ }
+ }
+}
diff --git
a/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongoDbParamsMapper.java
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongoDbParamsMapper.java
new file mode 100644
index 000000000..ef5a364da
--- /dev/null
+++
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongoDbParamsMapper.java
@@ -0,0 +1,41 @@
+/*
+ * 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.linkis.metadata.query.service;
+
+import org.apache.linkis.common.conf.CommonVars;
+
+/** Configuration */
+public class MongoDbParamsMapper {
+ public static final CommonVars<String> PARAM_MONGO_HOST =
+ CommonVars.apply("wds.linkis.server.mdm.service.mongo.host", "host");
+
+ public static final CommonVars<String> PARAM_MONGO_PORT =
+ CommonVars.apply("wds.linkis.server.mdm.service.mongo.port", "port");
+
+ public static final CommonVars<String> PARAM_MONGO_USERNAME =
+ CommonVars.apply("wds.linkis.server.mdm.service.mongo.username",
"username");
+
+ public static final CommonVars<String> PARAM_MONGO_PASSWORD =
+ CommonVars.apply("wds.linkis.server.mdm.service.mongo.password",
"password");
+
+ public static final CommonVars<String> PARAM_MONGO_DATABASE =
+ CommonVars.apply("wds.linkis.server.mdm.service.MONGO.params",
"database");
+
+ public static final CommonVars<String> PARAM_MONGO_EXTRA_PARAMS =
+ CommonVars.apply("wds.linkis.server.mdm.service.MONGO.params", "params");
+}
diff --git
a/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongodbMetaService.java
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongodbMetaService.java
new file mode 100644
index 000000000..c4d81f64d
--- /dev/null
+++
b/linkis-public-enhancements/linkis-datasource/linkis-metadata-query/service/mongodb/src/main/java/org/apache/linkis/metadata/query/service/MongodbMetaService.java
@@ -0,0 +1,97 @@
+/*
+ * 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.linkis.metadata.query.service;
+
+import org.apache.linkis.datasourcemanager.common.util.json.Json;
+import org.apache.linkis.metadata.query.common.domain.MetaColumnInfo;
+import org.apache.linkis.metadata.query.common.service.AbstractDbMetaService;
+import org.apache.linkis.metadata.query.common.service.MetadataConnection;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MongodbMetaService extends
AbstractDbMetaService<MongoDbConnection> {
+ @Override
+ public MetadataConnection<MongoDbConnection> getConnection(
+ String operator, Map<String, Object> params) throws Exception {
+ String host =
+
String.valueOf(params.getOrDefault(MongoDbParamsMapper.PARAM_MONGO_HOST.getValue(),
""));
+ // After deserialize, Integer will be Double, Why?
+ Integer port =
+ (Double.valueOf(
+ String.valueOf(
+
params.getOrDefault(MongoDbParamsMapper.PARAM_MONGO_PORT.getValue(), 0))))
+ .intValue();
+ String username =
+ String.valueOf(
+
params.getOrDefault(MongoDbParamsMapper.PARAM_MONGO_USERNAME.getValue(), ""));
+ String password =
+ String.valueOf(
+
params.getOrDefault(MongoDbParamsMapper.PARAM_MONGO_PASSWORD.getValue(), ""));
+ String database =
+ String.valueOf(
+
params.getOrDefault(MongoDbParamsMapper.PARAM_MONGO_DATABASE.getValue(), ""));
+ Map<String, Object> extraParams = new HashMap<>();
+ Object sqlParamObj =
params.get(MongoDbParamsMapper.PARAM_MONGO_EXTRA_PARAMS.getValue());
+ if (null != sqlParamObj) {
+ if (!(sqlParamObj instanceof Map)) {
+ String paramStr = String.valueOf(sqlParamObj);
+ if (StringUtils.isNotBlank(paramStr)) {
+ extraParams = Json.fromJson(paramStr, Map.class, String.class,
Object.class);
+ }
+
+ } else {
+ extraParams = (Map<String, Object>) sqlParamObj;
+ }
+ }
+ assert extraParams != null;
+ return new MetadataConnection<>(
+ new MongoDbConnection(host, port, username, password, database,
extraParams));
+ }
+
+ @Override
+ public List<String> queryDatabases(MongoDbConnection connection) {
+ try {
+ return connection.getAllDatabases();
+ } catch (Exception e) {
+ throw new RuntimeException("Fail to get Sql databases(获取数据库列表失败)", e);
+ }
+ }
+
+ @Override
+ public List<String> queryTables(MongoDbConnection connection, String
database) {
+ try {
+ return connection.getAllTables(database);
+ } catch (Exception e) {
+ throw new RuntimeException("Fail to get Sql tables(获取表列表失败)", e);
+ }
+ }
+
+ @Override
+ public List<MetaColumnInfo> queryColumns(
+ MongoDbConnection connection, String database, String table) {
+ try {
+ return connection.getColumns(database, table);
+ } catch (Exception e) {
+ throw new RuntimeException("Fail to get Sql columns(获取字段列表失败)", e);
+ }
+ }
+}
diff --git a/linkis-public-enhancements/linkis-datasource/pom.xml
b/linkis-public-enhancements/linkis-datasource/pom.xml
index c62763532..ac6f88ea0 100644
--- a/linkis-public-enhancements/linkis-datasource/pom.xml
+++ b/linkis-public-enhancements/linkis-datasource/pom.xml
@@ -35,6 +35,7 @@
<module>linkis-metadata-query/service/kafka</module>
<module>linkis-metadata-query/service/jdbc</module>
<module>linkis-metadata-query/service/hdfs</module>
+ <module>linkis-metadata-query/service/mongodb</module>
<module>linkis-metadata-query/server</module>
<module>linkis-datasource-client</module>
</modules>
diff --git a/tool/dependencies/known-dependencies.txt
b/tool/dependencies/known-dependencies.txt
index a1c1c9961..7ba4f097f 100644
--- a/tool/dependencies/known-dependencies.txt
+++ b/tool/dependencies/known-dependencies.txt
@@ -576,5 +576,6 @@ zstd-jni-1.4.5-6.jar
commons-pool2-2.8.1.jar
jedis-2.9.2.jar
dss-gateway-support-1.1.0.jar
+mongo-java-driver-3.12.7.jar
clickhouse-jdbc-0.3.2-patch11.jar
postgresql-42.3.1.jar
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]