net.tooan.ynpay.third.mongodb.BuguConnection.java Source code

Java tutorial

Introduction

Here is the source code for net.tooan.ynpay.third.mongodb.BuguConnection.java

Source

/*
 * Copyright (c) www.bugull.com
 * 
 * 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.
 */

package net.tooan.ynpay.third.mongodb;

import com.mongodb.*;
import net.tooan.ynpay.third.jfinal.log.Logger;
import net.tooan.ynpay.third.mongodb.exception.DBConnectionException;
import net.tooan.ynpay.third.mongodb.mapper.CascadeDeleteExecutor;
import net.tooan.ynpay.third.mongodb.mapper.StringUtil;

import java.net.UnknownHostException;
import java.util.List;
import java.util.concurrent.ExecutorService;

/**
 * The connection to MongoDB.
 * <p/>
 * <p>Singleton Pattern is used here. An application should use only one BuguConnection.</p>
 *
 * @author Frank Wen(xbwen@hotmail.com)
 */
public class BuguConnection {

    private final static Logger logger = Logger.getLogger(BuguConnection.class);

    private static BuguConnection instance;

    private String host;
    private int port;
    private List<ServerAddress> replicaSet;
    private ReadPreference readPreference;
    private MongoClientOptions options;
    private String database;
    private String username;
    private String password;
    private MongoClient mc;
    private DB db;

    private BuguConnection() {

    }

    public static BuguConnection getInstance() {
        if (instance == null) {
            instance = new BuguConnection();
        }
        return instance;
    }

    public void connect(String host, int port, String database) {
        this.host = host;
        this.port = port;
        this.database = database;
        connect();
    }

    public void connect(String host, int port, String database, String username, String password) {
        this.host = host;
        this.port = port;
        this.database = database;
        this.username = username;
        this.password = password;
        connect();
    }

    public void connect(List<ServerAddress> replicaSet, String database, String username, String password) {
        this.replicaSet = replicaSet;
        this.database = database;
        this.username = username;
        this.password = password;
        connect();
    }

    public void connect() {
        try {
            doConnect();
        } catch (UnknownHostException ex) {
            logger.error("Can not connect to host " + host, ex);
        } catch (DBConnectionException ex) {
            logger.error(ex.getMessage(), ex);
        }
        if (username != null && password != null) {
            try {
                auth();
            } catch (DBConnectionException ex) {
                logger.error(ex.getMessage(), ex);
            }
        }
    }

    private void doConnect() throws UnknownHostException, DBConnectionException {
        if (host != null && port != 0) {
            ServerAddress sa = new ServerAddress(host, port);
            if (options != null) {
                mc = new MongoClient(sa, options);
            } else {
                mc = new MongoClient(sa);
            }
        } else if (replicaSet != null) {
            if (options != null) {
                mc = new MongoClient(replicaSet, options);
            } else {
                mc = new MongoClient(replicaSet);
            }
            if (readPreference != null) {
                mc.setReadPreference(readPreference);
            }
        }
        if (mc != null) {
            if (!StringUtil.isEmpty(database)) {
                db = mc.getDB(database);
            }
        } else {
            throw new DBConnectionException(
                    "Can not get database instance! Please ensure connected to mongoDB correctly.");
        }
    }

    public void close() {
        ExecutorService executor = CascadeDeleteExecutor.getInstance().getExecutor();
        if (executor != null) {
            executor.shutdown();
        }
        if (mc != null) {
            mc.close();
        }
    }

    private void auth() throws DBConnectionException {
        boolean auth = db.authenticate(username, password.toCharArray());
        if (auth) {
            logger.info("Connected to mongodb successfully!");
        } else {
            db = null;
            throw new DBConnectionException("Can not connect to mongoDB. Failed to authenticate!");
        }
    }

    public BuguConnection setHost(String host) {
        this.host = host;
        return this;
    }

    public BuguConnection setPort(int port) {
        this.port = port;
        return this;
    }

    public BuguConnection setDatabase(String database) {
        this.database = database;
        return this;
    }

    public BuguConnection setUsername(String username) {
        this.username = username;
        return this;
    }

    public BuguConnection setPassword(String password) {
        this.password = password;
        return this;
    }

    public BuguConnection setOptions(MongoClientOptions options) {
        this.options = options;
        return this;
    }

    public BuguConnection setReplicaSet(List<ServerAddress> replicaSet) {
        this.replicaSet = replicaSet;
        return this;
    }

    public BuguConnection setReadPreference(ReadPreference readPreference) {
        this.readPreference = readPreference;
        return this;
    }

    public DB getDB() throws DBConnectionException {
        if (db == null) {
            throw new DBConnectionException(
                    "Can not get database instance! Please ensure connected to mongoDB correctly.");
        } else {
            return db;
        }
    }

    public DB getDB(String dbname) throws DBConnectionException {
        if (mc == null) {
            throw new DBConnectionException(
                    "Can not get database instance! Please ensure connected to mongoDB correctly.");
        } else {
            if (StringUtil.isEmpty(dbname)) {
                return getDB();
            }
            return mc.getDB(dbname);
        }
    }

}