/*
* Copyright 2014 Thiago da Silva Gonzaga <thiagosg@sjrp.unesp.br>.
*
* 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 com.arquivolivre.mongocom.management;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import com.mongodb.MongoURI;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
/**
*
* @author Thiago da Silva Gonzaga <thiagosg@sjrp.unesp.br>
*/
public final class CollectionManagerFactory {
private static Mongo client;
private static final Logger LOG = Logger.getLogger(CollectionManagerFactory.class.getName());
private static final String[] FILES = {"application", "database"};
private static final String[] EXTENTIONS = {".conf", ".config", ".properties"};
/**
* Create a <code>CollectionManager</code>
* @return an instance of a <code>CollectionManager</code>.
*/
public static CollectionManager createCollectionManager() {
return createBaseCollectionManager("", 0, "", "", "");
}
public static CollectionManager createCollectionManager(String host) {
return createBaseCollectionManager(host, 0, "", "", "");
}
public static CollectionManager createCollectionManager(String host, int port) {
return createBaseCollectionManager(host, port, "", "", "");
}
public static CollectionManager createCollectionManager(String dbName, String user, String password) {
return createBaseCollectionManager("", 0, dbName, user, password);
}
public static CollectionManager createCollectionManager(String host, int port, String dbName, String user, String password) {
return createBaseCollectionManager(host, port, dbName, user, password);
}
private static CollectionManager createBaseCollectionManager(String host, int port, String dbName, String user, String password) {
try {
if ("".equals(host)) {
client = new MongoClient();
} else {
if (port == 0) {
client = new MongoClient(host);
} else {
client = new MongoClient(host, port);
}
}
LOG.log(Level.INFO, "Connected to {0}", client.getAddress());
if ("".equals(user)) {
return new CollectionManager(client, dbName);
}
return new CollectionManager(client, dbName, user, password);
} catch (MongoException | UnknownHostException ex) {
LOG.log(Level.SEVERE, "Unable to connect to a mongoDB instance, maybe it is not running or you do not have the right permission: ", ex);
}
return null;
}
/**
* Create an instance of <code>Mongo</code> based on the information
* provided in the configuration files, if the instance has already been
* created using the same information, so it uses the same instance.
*
* @return an instance of a <code>CollectionManager</code>.
*/
public static CollectionManager setup() {
return setup(null);
}
/**
* Create an instance of <code>Mongo</code> based on the information
* provided in the configuration files located into <code>WEB-INF/conf</code>, if the instance has already been
* created using the same information, so it uses the same instance.
*
* @param context <code>ServletContext</code> of a web application.
* @return an instance of a <code>CollectionManager</code>.
*/
public static CollectionManager setup(ServletContext context) {
try {
File props = getPropertiesFile(context);
if (props == null) {
throw new FileNotFoundException("application or database configuration file not found.");
}
InputStream in = new FileInputStream(props);
Properties properties = new Properties();
properties.load(in);
StringBuilder builder = new StringBuilder();
builder.append(MongoURI.MONGODB_PREFIX);
String user, password, host, port, dbName;
user = properties.containsKey("mongocom.user") ? properties.getProperty("mongocom.user") : "";
password = properties.containsKey("mongocom.password") ? properties.getProperty("mongocom.password") : "";
host = properties.containsKey("mongocom.host") ? properties.getProperty("mongocom.host") : "";
port = properties.containsKey("mongocom.port") ? properties.getProperty("mongocom.port") : "";
dbName = properties.containsKey("mongocom.database") ? properties.getProperty("mongocom.database") : "";
if (!user.equals("")) {
builder.append(user).append(":").append(password).append("@");
}
if (host.equals("")) {
builder.append("localhost");
} else {
builder.append(host);
}
if (!port.equals("")) {
builder.append(":");
builder.append(port);
}
builder.append("/");
if (!dbName.equals("")) {
builder.append(dbName);
}
LOG.log(Level.INFO, "Mongo URI: {0}", builder.toString());
MongoURI uri = new MongoURI(builder.toString());
client = MongoClient.Holder.singleton().connect(uri);
return new CollectionManager(client, dbName);
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
return null;
}
private static File getPropertiesFile(ServletContext context) throws FileNotFoundException {
String contextPath;
if (context != null) {
contextPath = context.getRealPath("WEB-INF");
} else {
contextPath = System.getProperty("user.dir");
}
File dir = new File(contextPath + "/conf");
LOG.log(Level.INFO, dir.getAbsolutePath());
File result = null;
if (!dir.isDirectory()) {
throw new FileNotFoundException("The \"conf/\" folder doesn't exist.");
}
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File pathname) {
String fileName = pathname.getName();
for (String extention : EXTENTIONS) {
if (fileName.endsWith(extention)) {
return true;
}
}
return false;
}
};
File[] files = dir.listFiles(filter);
for (File file : files) {
String fileName = file.getName();
if (fileName.startsWith(FILES[1])) {
return file;
} else if (fileName.startsWith(FILES[0])) {
result = file;
}
}
return result;
}
}