/** * Copyright (C) 2010 EdgyTech LLC. * * 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.edgytech.umongo; import com.edgytech.swingfast.ButtonBase; import com.edgytech.swingfast.EnumListener; import com.edgytech.swingfast.XmlComponentUnit; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.ServerAddress; import java.io.IOException; import java.util.List; import javax.swing.JPanel; import com.edgytech.umongo.MongoPanel.Item; import com.mongodb.MongoClient; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author antoine */ public class MongoPanel extends BasePanel implements EnumListener<Item> { enum Item { icon, version, connectPoint, masterServer, seedServers, activeServers, queryOptions, writeConcern, readPreference, serverStatus, readWriteOptions, refresh, close, createDB, createDbName, authenticate, authUser, authPassword, maxObjectSize, cloneDB, cloneDBHost, cloneDBFrom, cloneDBTo, cloneDBSlaveOk, currentOps, currentOpsQuery, killOp, killOpId, isMaster, summarizeData } public MongoPanel() { setEnumBinding(Item.values(), this); } public MongoNode getMongoNode() { return (MongoNode) node; } private String getServerAddressString(ServerAddress addr) { String ip = "unknown"; try { ip = addr.getSocketAddress().getAddress().toString(); } catch (UnknownHostException ex) { Logger.getLogger(MongoPanel.class.getName()).log(Level.WARNING, null, ex); } return addr.getHost() + ":" + addr.getPort() + " (" + ip + ")"; } @Override protected void updateComponentCustom(JPanel old) { try { MongoClient mongo = getMongoNode().getMongoClient(); setStringFieldValue(Item.version, mongo.getVersion()); ServerAddress master = mongo.getAddress(); if (master != null) { setStringFieldValue(Item.masterServer, getServerAddressString(master)); } List<ServerAddress> addrs = mongo.getAllAddress(); String html = "<html>"; for (ServerAddress addr : addrs) { html += getServerAddressString(addr) + "<br/>"; } html += "</html>"; setStringFieldValue(Item.seedServers, html); addrs = mongo.getServerAddressList(); html = "<html>"; for (ServerAddress addr : addrs) { // String ports = MongoUtils.makeInfoString("used", mongo.getConnector().getDBPortPool(addr).inUse(), // "available", mongo.getConnector().getDBPortPool(addr).available(), // "created", mongo.getConnector().getDBPortPool(addr).everCreated()); String txt = getServerAddressString(addr); html += txt + "<br/>"; } setStringFieldValue(Item.activeServers, html); setStringFieldValue(Item.queryOptions, MongoUtils.queryOptionsToString(mongo.getOptions())); ((DocField) getBoundUnit(Item.writeConcern)).setDoc(mongo.getWriteConcern().getCommand()); ((DocField) getBoundUnit(Item.readPreference)).setDoc(mongo.getReadPreference().toDBObject()); setStringFieldValue(Item.maxObjectSize, String.valueOf(mongo.getMaxBsonObjectSize())); } catch (Exception e) { UMongo.instance.showError(this.getClass().getSimpleName() + " update", e); } } public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) { } public void close(ButtonBase button) { UMongo.instance.disconnect(getMongoNode()); } public void readWriteOptions(ButtonBase button) { MongoClient mongo = getMongoNode().getMongoClient(); OptionDialog od = UMongo.instance.getGlobalStore().getOptionDialog(); od.update(mongo.getOptions(), mongo.getWriteConcern(), mongo.getReadPreference()); if (!od.show()) { return; } mongo.setOptions(od.getQueryOptions()); mongo.setWriteConcern(od.getWriteConcern()); mongo.setReadPreference(od.getReadPreference()); refresh(); } public void createDB(ButtonBase button) { final String name = getStringFieldValue(Item.createDbName); final MongoClient mongo = getMongoNode().getMongoClient(); // need to do a command to actually create on server final DB db = mongo.getDB(name); new DbJob() { @Override public Object doRun() throws IOException { db.getStats(); return new BasicDBObject("ok", 1); } @Override public String getNS() { return db.getName(); } @Override public String getShortName() { return "Create DB"; } @Override public DBObject getRoot(Object result) { return new BasicDBObject("name", name); } @Override public void wrapUp(Object res) { super.wrapUp(res); getMongoNode().structureComponent(); } }.addJob(); } public void authenticate(final ButtonBase button) { final MongoClient mongo = getMongoNode().getMongoClient(); final String user = getStringFieldValue(Item.authUser); final String passwd = getStringFieldValue(Item.authPassword); new DbJob() { @Override public Object doRun() throws IOException { mongo.getDB("admin").authenticateCommand(user, passwd.toCharArray()); return null; } @Override public String getNS() { return "Mongo"; } @Override public String getShortName() { return "Auth"; } @Override public void wrapUp(Object res) { super.wrapUp(res); if (res == null) { // need to refresh tree refresh(); } } @Override public ButtonBase getButton() { return button; } }.addJob(); } public void serverStatus(ButtonBase button) { new DbJobCmd(getMongoNode().getMongoClient().getDB("admin"), "serverStatus").addJob(); } public void showLog(ButtonBase button) { new DbJobCmd(getMongoNode().getMongoClient().getDB("admin"), new BasicDBObject("getLog", "global")).addJob(); } public void cloneDB(ButtonBase button) { final MongoClient mongo = getMongoNode().getMongoClient(); final String host = getStringFieldValue(Item.cloneDBHost); final String from = getStringFieldValue(Item.cloneDBFrom); final String to = getStringFieldValue(Item.cloneDBTo); final boolean slaveOk = getBooleanFieldValue(Item.cloneDBSlaveOk); final BasicDBObject cmd = new BasicDBObject("copydb", 1); cmd.put("fromhost", host); cmd.put("fromdb", from); if (!to.isEmpty()) { cmd.put("todb", to); } if (slaveOk) { cmd.put("slaveOk", slaveOk); } new DbJobCmd(mongo.getDB("admin"), cmd, this, null).addJob(); } public void currentOps(ButtonBase button) { final MongoClient mongo = getMongoNode().getMongoClient(); final DBObject query = ((DocBuilderField) getBoundUnit(Item.currentOpsQuery)).getDBObject(); CollectionPanel.doFind(mongo.getDB("admin").getCollection("$cmd.sys.inprog"), query); } public void killOp(ButtonBase button) { final MongoClient mongo = getMongoNode().getMongoClient(); final int opid = getIntFieldValue(Item.killOpId); final DBObject query = new BasicDBObject("op", opid); CollectionPanel.doFind(mongo.getDB("admin").getCollection("$cmd.sys.killop"), query); } public void isMaster(ButtonBase button) { new DbJobCmd(getMongoNode().getMongoClient().getDB("admin"), "isMaster").addJob(); } public void summarizeData(final ButtonBase button) { final MongoNode mnode = getMongoNode(); new DbJob() { @Override public Object doRun() throws IOException { return mnode.summarizeData(); } @Override public String getNS() { return "Mongo"; } @Override public String getShortName() { return "Summarize Data"; } }.addJob(); } }