/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.datasource.mongodb;
import java.io.Serializable;
import java.net.URI;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import org.obiba.magma.MagmaRuntimeException;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoException;
import com.mongodb.gridfs.GridFS;
public class MongoDBFactory implements Serializable {
private static final long serialVersionUID = 2264861208658330136L;
@NotNull
private final String connectionURI;
@Nullable
private transient MongoClientURI mongoClientURI;
@Nullable
private transient MongoClient mongoClient;
public MongoDBFactory(@NotNull URI uri) {
this(uri.toString());
}
public MongoDBFactory(@NotNull String connectionURI) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(connectionURI), "connectionURI cannot be null or empty");
this.connectionURI = connectionURI;
}
@NotNull
public String getConnectionURI() {
return connectionURI;
}
@NotNull
public MongoClientURI getMongoClientURI() {
if(mongoClientURI == null) {
mongoClientURI = new MongoClientURI(connectionURI);
}
return mongoClientURI;
}
@NotNull
public MongoClient getMongoClient() {
if(mongoClient == null) {
try {
mongoClient = new MongoClient(getMongoClientURI());
} catch(MongoException e) {
throw new MagmaRuntimeException(e);
}
}
return mongoClient;
}
public void close() {
if(mongoClient != null) {
mongoClient.close();
mongoClient = null;
}
}
@NotNull
public GridFS getGridFS() {
return execute(new MongoDBCallback<GridFS>() {
@Override
public GridFS doWithDB(DB db) {
return new GridFS(db);
}
});
}
public <T> T execute(MongoDBCallback<T> callback) {
return callback.doWithDB(getMongoClient().getDB(getMongoClientURI().getDatabase()));
}
public interface MongoDBCallback<T> {
T doWithDB(DB db);
}
}