org.sculptor.framework.accessimpl.mongodb.DbManager.java Source code

Java tutorial

Introduction

Here is the source code for org.sculptor.framework.accessimpl.mongodb.DbManager.java

Source

/*
 * Copyright 2010 The Fornax Project Team, including the original
 * author or authors.
 *
 * 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 org.sculptor.framework.accessimpl.mongodb;

import com.mongodb.DB;
import com.mongodb.DBAddress;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;
import com.mongodb.ServerAddress;

public class DbManager implements Cloneable {

    private static ThreadLocal<DbManager> threadInstance = new ThreadLocal<DbManager>();
    private Mongo mongo;
    private DB db;
    private boolean initialized = false;

    private String dbname;
    private String dbUrl1;
    private String dbUrl2;
    private MongoOptions options = new MongoOptions();

    public DbManager() {
    }

    public static DbManager getThreadInstance() {
        return threadInstance.get();
    }

    public static void setThreadInstance(DbManager dbManager) {
        threadInstance.set(dbManager);
    }

    private boolean isAnotherThreadInstance() {
        DbManager other = getThreadInstance();
        if (other == null) {
            return false;
        }
        return (other != this);
    }

    // lazy init
    @SuppressWarnings("deprecation")
    private synchronized void init() {
        if (initialized) {
            return;
        }
        if (dbname == null) {
            throw new IllegalStateException("MongoDB dbname not defined");
        }
        try {
            if (dbUrl1 == null || dbUrl1.equals("")) {
                // default host/port, but with options
                mongo = new Mongo(new ServerAddress(), options);
            } else if (dbUrl2 != null && !dbUrl2.equals("")) {
                DBAddress left = new DBAddress(urlWithDbname(dbUrl1));
                DBAddress right = new DBAddress(urlWithDbname(dbUrl2));
                mongo = new Mongo(left, right, options);
            } else {
                DBAddress left = new DBAddress(urlWithDbname(dbUrl1));
                mongo = new Mongo(left, options);
            }
            db = mongo.getDB(dbname);
            initialized = true;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    private String urlWithDbname(String dbUrl) {
        if (dbUrl == null) {
            return null;
        }
        if (!dbUrl.endsWith(dbname)) {
            return dbUrl + "/" + dbname;
        }
        return dbUrl;
    }

    public void requestStart() {
        getDB().requestStart();
    }

    public void requestDone() {
        getDB().requestDone();
    }

    public synchronized DB getDB() {
        if (isAnotherThreadInstance()) {
            return getThreadInstance().getDB();
        }
        init();
        return db;
    }

    public DBCollection getDBCollection(String name) {
        try {
            DBCollection coll = getDB().getCollection(name);
            return coll;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    public String getDbname() {
        return dbname;
    }

    public synchronized void setDbname(String dbname) {
        this.dbname = dbname;
        initialized = false;
    }

    public String getDbUrl1() {
        return dbUrl1;
    }

    public synchronized void setDbUrl1(String dbUrl1) {
        this.dbUrl1 = dbUrl1;
        initialized = false;
    }

    public String getDbUrl2() {
        return dbUrl2;
    }

    public synchronized void setDbUrl2(String dbUrl2) {
        this.dbUrl2 = dbUrl2;
        initialized = false;
    }

    public MongoOptions getOptions() {
        return options;
    }

    public synchronized void setOptions(MongoOptions options) {
        this.options = options;
        initialized = false;
    }

    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError();
        }
    }

}