com.hangum.tadpole.mongodb.core.connection.MongoConnectionManager.java Source code

Java tutorial

Introduction

Here is the source code for com.hangum.tadpole.mongodb.core.connection.MongoConnectionManager.java

Source

/*******************************************************************************
 * Copyright (c) 2013 hangum.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v2.1
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     hangum - initial API and implementation
 ******************************************************************************/
package com.hangum.tadpole.mongodb.core.connection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.hangum.tadpole.cipher.core.manager.CipherManager;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;

/**
 * mongo db connection
 * 
 * @author hangum
 *
 */
public class MongoConnectionManager {
    private static final Logger logger = Logger.getLogger(MongoConnectionManager.class);

    private static Map<String, MongoClient> dbManager = null;
    private static MongoConnectionManager mongodbConnectionManager = null;

    static {
        if (mongodbConnectionManager == null) {
            mongodbConnectionManager = new MongoConnectionManager();
            dbManager = new HashMap<String, MongoClient>();
        }
    }

    private MongoConnectionManager() {
    }

    /**
     * 
     * @param userDB
     * @return
     * @throws Exception
     */
    public static DB getInstance(UserDBDAO userDB) throws MongoDBNotFoundException, Exception {
        DB db = null;

        /*
         * https://mongodb.github.io/casbah/guide/connecting.html
         */
        synchronized (dbManager) {
            String searchKey = getKey(userDB);
            try {
                MongoClient mongoDB = dbManager.get(searchKey);

                if (mongoDB == null) {
                    MongoClientOptions clientOptions = MongoClientOptions.builder().connectionsPerHost(200)
                            .connectTimeout(5000).socketTimeout(5000).build();

                    List<MongoCredential> listCredential = new ArrayList<>();
                    if (!"".equals(userDB.getUsers())) { //$NON-NLS-1$
                        // pass change
                        String passwdDecrypt = "";
                        try {
                            passwdDecrypt = CipherManager.getInstance().decryption(userDB.getPasswd());
                        } catch (Exception e) {
                            passwdDecrypt = userDB.getPasswd();
                        }

                        MongoCredential mongocredintial = MongoCredential.createCredential(userDB.getUsers(),
                                userDB.getDb(), passwdDecrypt.toCharArray());
                        listCredential.add(mongocredintial);
                    }

                    String strReplcaSet = userDB.getExt1();
                    if (strReplcaSet == null | "".equals(strReplcaSet)) {
                        if (!listCredential.isEmpty()) {
                            ServerAddress sa = new ServerAddress(userDB.getHost(),
                                    Integer.parseInt(userDB.getPort()));
                            mongoDB = new MongoClient(sa, listCredential, clientOptions);
                        } else {
                            mongoDB = new MongoClient(new MongoClientURI(userDB.getUrl()));
                        }

                    } else {
                        List<ServerAddress> listServerList = new ArrayList<ServerAddress>();
                        listServerList.add(new ServerAddress(userDB.getHost(), Integer.parseInt(userDB.getPort())));

                        String[] urls = StringUtils.split(strReplcaSet, ",");
                        for (String ipPort : urls) {
                            String[] strIpPort = StringUtils.split(ipPort, ":");

                            listServerList.add(new ServerAddress(strIpPort[0], Integer.parseInt(strIpPort[1])));
                        }

                        if (!listCredential.isEmpty()) {
                            mongoDB = new MongoClient(listServerList, listCredential, clientOptions);
                        } else {
                            mongoDB = new MongoClient(listServerList, clientOptions);
                        }
                    }

                    // db map? .
                    dbManager.put(searchKey, mongoDB);
                }
                db = mongoDB.getDB(userDB.getDb());

            } catch (Exception e) {
                logger.error("mongodb connection error", e);
                dbManager.remove(searchKey);

                throw e;
            }
        }

        return db;

    }

    /**
     * map?  .
     * @param userDB
     * @return
     */
    private static String getKey(UserDBDAO userDB) {
        return userDB.getDbms_type() + userDB.getUrl() + userDB.getUsers() + userDB.getPasswd()
                + userDB.getDisplay_name();
    }
}