org.eobjects.analyzer.connection.MongoDbDatastore.java Source code

Java tutorial

Introduction

Here is the source code for org.eobjects.analyzer.connection.MongoDbDatastore.java

Source

/**
 * AnalyzerBeans
 * Copyright (C) 2014 Neopost - Customer Information Management
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package org.eobjects.analyzer.connection;

import java.util.List;

import org.eobjects.analyzer.util.StringUtils;
import org.apache.metamodel.UpdateableDataContext;
import org.apache.metamodel.mongodb.MongoDbDataContext;
import org.apache.metamodel.util.SimpleTableDef;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mongodb.DB;
import com.mongodb.Mongo;

public class MongoDbDatastore extends UsageAwareDatastore<UpdateableDataContext>
        implements UpdateableDatastore, UsernameDatastore {

    private static final long serialVersionUID = 1L;

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

    private final String _hostname;
    private final int _port;
    private final String _databaseName;
    private final String _username;
    private final char[] _password;
    private final SimpleTableDef[] _tableDefs;

    public MongoDbDatastore(String name, String databaseName) {
        this(name, null, null, databaseName);
    }

    public MongoDbDatastore(String name, String hostname, Integer port, String databaseName) {
        this(name, hostname, port, databaseName, null, (char[]) null);
    }

    public MongoDbDatastore(String name, String hostname, Integer port, String databaseName, String username,
            String password) {
        this(name, hostname, port, databaseName, username, password == null ? null : password.toCharArray());
    }

    public MongoDbDatastore(String name, String hostname, Integer port, String databaseName, String username,
            char[] password) {
        this(name, hostname, port, databaseName, username, password, null);
    }

    public MongoDbDatastore(String name, String hostname, Integer port, String databaseName, String username,
            String password, SimpleTableDef[] tableDefs) {
        this(name, hostname, port, databaseName, username, password == null ? null : password.toCharArray(),
                tableDefs);
    }

    public MongoDbDatastore(String name, String hostname, Integer port, String databaseName, String username,
            char[] password, SimpleTableDef[] tableDefs) {
        super(name);
        if (StringUtils.isNullOrEmpty(databaseName)) {
            throw new IllegalArgumentException("Database name cannot be null");
        }
        if (StringUtils.isNullOrEmpty(hostname)) {
            // default Mongo host
            hostname = "localhost";
        }
        if (port == null) {
            // default Mongo port
            port = 27017;
        }
        _hostname = hostname;
        _port = port;
        _databaseName = databaseName;
        _username = username;
        _password = password;
        _tableDefs = tableDefs;
    }

    @Override
    public PerformanceCharacteristics getPerformanceCharacteristics() {
        return new PerformanceCharacteristicsImpl(true, false);
    }

    @Override
    protected UsageAwareDatastoreConnection<UpdateableDataContext> createDatastoreConnection() {
        try {
            Mongo mongo = new Mongo(_hostname, _port);
            DB mongoDb = mongo.getDB(_databaseName);
            if (_username != null && _password != null) {
                boolean authenticated = mongoDb.authenticate(_username, _password);
                if (!authenticated) {
                    logger.warn("Autheticate returned false!");
                }
            }

            final UpdateableDataContext dataContext;
            if (_tableDefs == null || _tableDefs.length == 0) {
                dataContext = new MongoDbDataContext(mongoDb);
            } else {
                dataContext = new MongoDbDataContext(mongoDb, _tableDefs);
            }
            return new UpdateableDatastoreConnectionImpl<UpdateableDataContext>(dataContext, this);
        } catch (Exception e) {
            if (e instanceof RuntimeException) {
                throw (RuntimeException) e;
            }
            throw new IllegalStateException("Failed to connect to MongoDB instance: " + e.getMessage(), e);
        }
    }

    @Override
    public UpdateableDatastoreConnection openConnection() {
        DatastoreConnection connection = super.openConnection();
        return (UpdateableDatastoreConnection) connection;
    }

    public String getHostname() {
        return _hostname;
    }

    public int getPort() {
        return _port;
    }

    public String getDatabaseName() {
        return _databaseName;
    }

    @Override
    public String getUsername() {
        return _username;
    }

    public char[] getPassword() {
        return _password;
    }

    public SimpleTableDef[] getTableDefs() {
        return _tableDefs;
    }

    @Override
    protected void decorateIdentity(List<Object> identifiers) {
        super.decorateIdentity(identifiers);
        identifiers.add(_databaseName);
        identifiers.add(_hostname);
        identifiers.add(_port);
        identifiers.add(_username);
        identifiers.add(_password);
        identifiers.add(_tableDefs);
    }
}