/*******************************************************************************
* Copyright 2013 Open mHealth
*
* 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.openmhealth.reference.data.mongodb;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import org.openmhealth.reference.data.Dao;
import org.openmhealth.reference.exception.OmhException;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
/**
* <p>
* The data access class for all MongoDB data access objects.
* </p>
*
* @author John Jenkins
*/
public class MongoDao extends Dao {
/**
* The default server address.
*/
public static final String DEFAULT_SERVER_ADDRESS = "localhost";
/**
* The default server port.
*/
public static final int DEFAULT_SERVER_PORT = 27017;
/**
* The default name for the database.
*/
public static final String DEFAULT_DATABASE_NAME = "omh";
/**
* The connection to the database.
*/
private final MongoClient mongo;
/**
* Default constructor, which will create the connection to the MongoDB.
*
* @param properties
* The user-defined properties to use to setup the connection.
*
* @throws OmhException
* There was a problem setting up the connection to the database.
*/
public MongoDao(final Properties properties) throws OmhException {
super(properties);
// Create the singular Mongo instance.
try {
// Create the empty list of credentials.
List<MongoCredential> credentials =
new LinkedList<MongoCredential>();
// If a username and password were given, use them.
if(
(MongoDao.getInstance().getDatabaseUsername() != null) &&
(MongoDao.getInstance().getDatabasePassword() != null)) {
credentials
.add(
MongoCredential
.createMongoCRCredential(
MongoDao.getInstance().getDatabaseUsername(),
MongoDao.getInstance().getDatabaseName(),
MongoDao
.getInstance()
.getDatabaseUsername()
.toCharArray()));
}
// Create the MongoClient.
mongo =
new MongoClient(
new ServerAddress(getDatabaseAddress(), getDatabasePort()),
credentials);
}
catch(UnknownHostException e) {
throw new OmhException("The database could not setup.", e);
}
// Instantiate the specific components.
new MongoAuthenticationTokenBin();
new MongoAuthorizationCodeBin();
new MongoAuthorizationCodeResponseBin();
new MongoAuthorizationTokenBin();
new MongoDataSet();
new MongoRegistry();
new MongoThirdPartyBin();
new MongoUserBin();
}
/**
* Returns the database connection to MongoDB.
*
* @return The database to MongoDB.
*/
public DB getDb() {
// Get the connection to the database.
return mongo.getDB(getDatabaseName());
}
/**
* Shuts the DAO down.
*/
@Override
public void shutdown() {
mongo.close();
}
/**
* Returns the instance of this DAO as a MongoDao.
*
* @return The instance of this DAO as a MongoDao.
*
* @throws IllegalStateException
* The DAO was not built with a MongoDao.
*/
public static MongoDao getInstance() {
try {
return (MongoDao) Dao.getInstance();
}
catch(ClassCastException e) {
throw new IllegalStateException("The DAO is not a MongoDB DAO.");
}
}
/*
* (non-Javadoc)
* @see org.openmhealth.reference.data.Dao#getDefaultServerAddress()
*/
@Override
protected String getDefaultServerAddress() {
return DEFAULT_SERVER_ADDRESS;
}
/*
* (non-Javadoc)
* @see org.openmhealth.reference.data.Dao#getDefaultServerPort()
*/
@Override
protected int getDefaultServerPort() {
return DEFAULT_SERVER_PORT;
}
/*
* (non-Javadoc)
* @see org.openmhealth.reference.data.Dao#getDefaultDatabaseName()
*/
@Override
protected String getDefaultDatabaseName() {
return DEFAULT_DATABASE_NAME;
}
}