/* * (C) Copyright 2017 Nuxeo (http://nuxeo.com/) and others. * * 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. * * Contributors: * Funsho David * */ package org.nuxeo.directory.mongodb; import java.util.stream.StreamSupport; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.Document; import org.nuxeo.ecm.core.api.NuxeoException; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.MongoClientURI; import com.mongodb.ServerAddress; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoIterable; /** * Helper for connection to the MongoDB server * * @since 9.1 */ public class MongoDBConnectionHelper { private static final Log log = LogFactory.getLog(MongoDBConnectionHelper.class); private static final String DB_DEFAULT = "nuxeo"; private static final int MONGODB_OPTION_CONNECTION_TIMEOUT_MS = 30000; private static final int MONGODB_OPTION_SOCKET_TIMEOUT_MS = 60000; private MongoDBConnectionHelper() { // Empty } /** * Initialize a connection to the MongoDB server * * @param server the server url * @return the MongoDB client */ public static MongoClient newMongoClient(String server) { if (StringUtils.isBlank(server)) { throw new NuxeoException("Missing <server> in MongoDB repository descriptor"); } MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder() // Can help to prevent firewall disconnects // inactive connection, option not available from URI .socketKeepAlive(true) // don't wait for ever by default, // can be overridden using URI options .connectTimeout(MONGODB_OPTION_CONNECTION_TIMEOUT_MS) .socketTimeout(MONGODB_OPTION_SOCKET_TIMEOUT_MS) .description("Nuxeo"); MongoClient client; if (server.startsWith("mongodb://")) { // allow mongodb:// URI syntax for the server, to pass everything in one string client = new MongoClient(new MongoClientURI(server, optionsBuilder)); } else { client = new MongoClient(new ServerAddress(server), optionsBuilder.build()); } if (log.isDebugEnabled()) { log.debug("MongoClient initialized with options: " + client.getMongoClientOptions().toString()); } return client; } /** * @return a database representing the specified database */ public static MongoDatabase getDatabase(MongoClient mongoClient, String dbname) { if (StringUtils.isBlank(dbname)) { dbname = DB_DEFAULT; } return mongoClient.getDatabase(dbname); } /** * Retrieve a collection from the MongoDB server */ public static MongoCollection<Document> getCollection(MongoClient mongoClient, String dbname, String collection) { MongoDatabase db = getDatabase(mongoClient, dbname); return db.getCollection(collection); } /** * Check if the collection exists and if it is not empty * * @param mongoClient the Mongo client * @param dbname the database name * @param collection the collection name * @return true if the collection exists and not empty, false otherwise */ public static boolean hasCollection(MongoClient mongoClient, String dbname, String collection) { MongoIterable<String> collections = getDatabase(mongoClient, dbname).listCollectionNames(); boolean found = StreamSupport.stream(collections.spliterator(), false).anyMatch(collection::equals); return found && getCollection(mongoClient, dbname, collection).count() > 0; } }