All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.washingtonpost.mongo.dropwizard.MongoFactory Maven / Gradle / Ivy

There is a newer version: 4.0.7
Show newest version
package com.washingtonpost.mongo.dropwizard;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Preconditions;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.washingtonpost.mongo.dropwizard.exceptions.NullDBNameException;
import java.net.UnknownHostException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;

/**
 * An object of this class creates a single instance of the MongoClient object.
 * 

* To use this class add it as a field with getters and setters to your Configuration class and call the buildClient * method in your applications run method. The resulting MongoClient can then be passed to your Resources. *

* An example of the yaml configuration: *

 *     mongoClient:
 *         user: yourUser
 *         pass: yourPassword
 *         hosts: localhost:27017,192.168.1.12:27017
 *         dbName: foo
 *     
*/ public class MongoFactory { /** * Optional Username used to connect; if provided with a non-null password, an attempt to authenticate * to the provided {@code dbName} will be made. */ @JsonProperty private String user; /** * Optional Password associated with the user; if provided with a non-null user, an attempt to authenticate * to the provided {@code dbName} will be made. */ @JsonProperty private String pass; /** * At least one, but possibly many comma-separated (server:port) pairs to which the user/pass should connect * See http://docs.mongodb.org/manual/reference/connection-string/ */ @JsonProperty private String hosts; /** * Optional name of the database. This property is required to use the dbBuild method. */ @JsonProperty private String dbName; /** * Optional "?options" string to append to the end of the connection URI. * See http://docs.mongodb.org/manual/reference/connection-string/ */ @JsonProperty private String options; /** * Optional flag that prevents any actual connections to the Mongo DB */ @JsonProperty private boolean disabled; /** * The mongo API documentation for * MongoClient states that there should only be one object per JVM, so this property is only set once. */ private MongoClient mongoClient; public String getUser() { return this.user; } public void setUser(String user) { this.user = user; } public String getPass() { return this.pass; } public void setPass(String pass) { this.pass = pass; } public String getHosts() { return this.hosts; } public void setHosts(String hosts) { this.hosts = hosts; } public String getOptions() { return this.options; } public void setOptions(String options) { this.options = options; } public String getDbName() { return dbName; } public void setDbName(String dbName) { this.dbName = dbName; } public boolean isDisabled() { return disabled; } public void setDisabled(boolean disabled) { this.disabled = disabled; this.dbName = "foo"; // to avoid an NPE when guice calls "buildDB()"... it doesn't matter what this is } /** *

Builds the MongoClient from a set of connections specified in the configuration file.

*

If both the {@code user} and {@code pass} are non-null and non-empty, the {@code MongoClient} that this * method returns will attempt to authenticate against the Mongo DB.

* @return A Mongo API {@code MongoClient} object. * @throws UnknownHostException Thrown if the server can not be found. */ public MongoClient buildClient() throws UnknownHostException { if (this.disabled) { return new MongoClient(); } if (this.mongoClient != null) { return mongoClient; } this.mongoClient = new MongoClient(buildMongoClientURI()); return this.mongoClient; } /** * Builds a Mongo {@code DB} object from connection and db info set in a configuration file. * @return A Mongo Java API {@code DB} object. * @throws java.net.UnknownHostException if the host is unknown */ public DB buildDB() throws UnknownHostException { return buildDB(this.dbName); } /** * Builds a Mongo {@code DB} object from connection and db info set in a configuration file, but against whatever DB is * provided in the {@code dbName} argument. * @param dbName The name of the mongo DB to connect to. * @return A Mongo Java API {@code DB} object. * @throws java.net.UnknownHostException if the host is unknown */ public DB buildDB(String dbName) throws UnknownHostException { if (dbName == null && !this.disabled) { throw new NullDBNameException(); } Mongo client = buildClient(); return client.getDB(dbName); } // Visible for testing MongoClientURI buildMongoClientURI() { Preconditions.checkState((StringUtils.isEmpty(this.user) && StringUtils.isEmpty(this.pass)) || (!StringUtils.isEmpty(this.user) && !StringUtils.isEmpty(this.pass)), "If you define a Mongo user, you must also define a Mongo pass, and vice-versa"); Preconditions.checkNotNull(this.hosts, "Must define Mongo 'hosts' property"); StringBuilder uriString = new StringBuilder("mongodb://"); if (!StringUtils.isEmpty(this.user)) { uriString.append(this.user) .append(":") .append(this.pass) .append("@"); } uriString.append(this.hosts); if (!StringUtils.isEmpty(this.dbName)) { uriString.append("/") .append(this.dbName); } if (!StringUtils.isEmpty(this.options)) { if (StringUtils.isEmpty(this.dbName)) { // If we didn't slap a "/" at the end of the hosts because there's no DBName defined, // we need to do that here before sticking the "?options" in the connection URI uriString.append("/"); } uriString.append("?") .append(this.options); } return new MongoClientURI(uriString.toString()); } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy