package fr.opensagres.mongodb.ide.core.model;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import fr.opensagres.mongodb.ide.core.model.stats.CollectionListStats;
import fr.opensagres.mongodb.ide.core.model.stats.CollectionStats;
import fr.opensagres.mongodb.ide.core.utils.StringUtils;
public class Database extends TreeContainerNode<Server> {
private String name;
private String id;
private DB db;
private Object launch;
private boolean alreadyAuthenticated;
private final CollectionsCategory collectionsCategory;
public Database(String name) {
super();
this.name = name;
this.alreadyAuthenticated = false;
this.collectionsCategory = new CollectionsCategory();
// force compute of static children nodes.
getChildren();
}
@Override
protected void setParent(Server parent) {
super.setParent(parent);
this.id = computeId();
}
public static String[] getIds(String databaseId) {
int index = databaseId.lastIndexOf(SEPARATOR);
String serverId = databaseId.substring(0, index);
String databaseName = databaseId.substring(index + SEPARATOR.length(),
databaseId.length());
return new String[] { serverId, databaseName };
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
this.id = computeId();
}
@Override
public NodeType getType() {
return NodeType.Database;
}
public String getLabel() {
return getName();
}
@Override
protected void doGetChildren() throws Exception {
super.addNode(collectionsCategory);
// Collections folder
super.addNode(new StoredJavascriptCategory());
// GridFS folder
super.addNode(new GridFSCategory());
// Users
super.addNode(new Users());
}
public DB getDB() throws UnknownHostException, MongoException {
boolean databaseChanged = getParent().selectDatabase(this);
if (db == null || databaseChanged) {
db = getInternalDB();
}
return db;
}
private DB getInternalDB() throws UnknownHostException, MongoException {
Server server = getParent();
// 1) use databseName
DB db = getShellCommandManager().use(getName(), server.getMongo());
String username = server.getUsername();
// 2) authenticate if needed
if (StringUtils.isNotEmpty(username) && !alreadyAuthenticated) {
getShellCommandManager().authenticate(db, username,
server.getPassword());
alreadyAuthenticated = true;
}
return db;
}
public String getId() {
return id;
}
public Object getLaunch() {
return launch;
}
public void setLaunch(Object launch) {
this.launch = launch;
}
public boolean canStartShell() {
return getParent().hasRuntime() && launch == null;
}
public boolean canStopShell() {
return launch != null;
}
public List<DBObject> getUsers() throws UnknownHostException,
MongoException {
return getShellCommandManager().getSystemUsers(getDB());
}
public String getMongoConsoleCommand(boolean withBaseDir) {
StringBuilder connection = new StringBuilder("");
if (!withBaseDir) {
connection.append("mongo");
} else {
// mongo.exe
MongoRuntime runtime = getParent().getRuntime();
connection.append(runtime.getMongoProcessLocation().toFile()
.toString());
}
// Host+Port/Database
connection.append(" ");
connection.append(getStartMongoConsoleCommand());
// Args
List<String> args = getMongoConsoleArgs();
for (String arg : args) {
connection.append(" ");
connection.append(arg);
}
return connection.toString();
}
public List<String> getMongoConsoleArgs() {
List<String> args = new ArrayList<String>();
updateMongoConsoleArgs(args);
return args;
}
public void updateMongoConsoleArgs(List<String> args) {
// Username+password
Server server = getParent();
String username = server.getUsername();
if (StringUtils.isNotEmpty(username)) {
args.add("-u");
args.add(username);
}
char[] password = server.getPassword();
if (password != null && password.length > 0) {
args.add("-p");
args.add(String.valueOf(password));
}
}
public String getStartMongoConsoleCommand() {
StringBuilder connection = new StringBuilder();
Server server = getParent();
Integer port = server.getPort();
connection.append(server.getHost());
if (port != null) {
connection.append(":");
connection.append(port.toString());
}
// Database
connection.append("/");
connection.append(getName());
return connection.toString();
}
public List<Collection> getCollections() {
return collectionsCategory.getCollections();
}
public CollectionsCategory getCollectionsCategory() {
return collectionsCategory;
}
public List<CollectionStats> createStats() throws UnknownHostException,
MongoException {
List<Collection> collections = getCollections();
CollectionListStats collectionStats = new CollectionListStats(
collections.size());
for (Collection collection : collections) {
collectionStats.addCollection(collection);
}
return collectionStats;
}
}