package fr.opensagres.nosql.ide.mongodb.core.model;
import java.net.UnknownHostException;
import java.util.List;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.MongoURI;
import fr.opensagres.nosql.ide.core.model.AbstractServer;
import fr.opensagres.nosql.ide.core.model.IDatabase;
import fr.opensagres.nosql.ide.core.model.ServerState;
import fr.opensagres.nosql.ide.mongodb.core.internal.Trace;
import fr.opensagres.nosql.ide.mongodb.core.shell.MongoShellCommandManager;
public class MongoServer extends AbstractServer {
public static final String TYPE_ID = "fr.opensagres.nosql.ide.mongodb.core";
private MongoURI mongoURI;
private String host;
private Integer port;
private Mongo mongo;
public MongoServer(String id, String name, MongoURI mongoURI) {
super(TYPE_ID, id, name);
this.mongoURI = mongoURI;
}
public MongoServer(String name, MongoURI mongoURI) {
super(TYPE_ID, name);
this.mongoURI = mongoURI;
}
public MongoURI getMongoURI() {
return mongoURI;
}
public String getHost() {
computeHostAndPortIfNeeded();
return host;
}
public Integer getPort() {
computeHostAndPortIfNeeded();
return port;
}
public String getDatabaseName() {
return mongoURI.getDatabase();
}
private void computeHostAndPortIfNeeded() {
if (host == null) {
// host + port
String hostAndPort = mongoURI.getHosts().get(0);
int index = hostAndPort.indexOf(":");
if (index > 0) {
host = hostAndPort.substring(0, index);
try {
port = Integer.parseInt(hostAndPort.substring(index + 1,
hostAndPort.length()));
} catch (Throwable e) {
Trace.trace(Trace.STRING_SEVERE, "Error parsing port", e);
}
} else {
host = hostAndPort;
port = null;
}
}
}
public String getUsername() {
return mongoURI.getUsername();
}
public void setUsername(String username) {
// TODO
}
public String getPassword() {
char[] password = mongoURI.getPassword();
if (password != null) {
return String.valueOf(password);
}
return null;
}
public void setPassword(char[] password) {
// TODO
}
public String getLabel() {
return getName() + " [" + mongoURI + "] - " + getServerState();
}
public String getURL() {
return getMongoURI().toString();
}
@Override
public void setServerState(ServerState serverState) {
super.setServerState(serverState);
if (serverState == ServerState.Stopped
|| serverState == ServerState.Disconnected) {
// close mongo.
disposeMongo();
}
}
@Override
protected void loadDatabases() throws Exception {
// Server connection doesn't contains database in the MongoURI
// Display list of DB (works only if there is admin privilege
// for this DB).
Mongo mongo = getMongo();
List<String> names = MongoShellCommandManager.getInstance().showDbs(
this, mongo);
for (String name : names) {
Database database = new Database(name);
super.addNode(database);
}
}
@Override
protected void loadDatabase(String databaseName) throws Exception {
// Display just the database.
Database database = new Database(databaseName);
database.setParent(this);
database.getDB().getCollectionNames();
super.addNode(database);
}
@Override
protected IDatabase doCreateDatabase(String databaseName) throws Exception {
Database database = new Database(databaseName);
database.setParent(this);
// call get collection names to register the database.
database.getDB().getCollectionNames();
return database;
}
@Override
protected void doDropDatabase(IDatabase database) throws Exception {
MongoShellCommandManager.getInstance().dropDatabase(this,
((Database) database).getDB());
}
public Mongo getMongo() throws UnknownHostException, MongoException {
if (mongo == null) {
mongo = MongoShellCommandManager.getInstance().connect(this,
mongoURI);
}
return mongo;
}
public void dispose() {
disposeMongo();
}
public void disposeMongo() {
MongoShellCommandManager.getInstance().disconnect(this, mongo);
mongo = null;
}
public char[] getPasswordAsCharArray() {
return mongoURI.getPassword();
}
public String getMongoServerCommand(boolean withBaseDir) {
StringBuilder connection = new StringBuilder("");
if (!withBaseDir) {
connection.append("mongod");
} else {
// mongo.exe
MongoServerRuntime runtime = (MongoServerRuntime) getRuntime();
connection.append(runtime.getMongodProcessLocation().toFile()
.toString());
}
return connection.toString();
}
}