com.edgytech.umongo.ServerPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.edgytech.umongo.ServerPanel.java

Source

/**
 * 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.ConfirmDialog;
import com.edgytech.swingfast.EnumListener;
import com.edgytech.swingfast.InfoDialog;
import com.edgytech.swingfast.Menu;
import com.edgytech.swingfast.Text;
import com.edgytech.swingfast.XmlComponentUnit;
import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.ServerAddress;
import javax.swing.JPanel;
import com.edgytech.umongo.ServerPanel.Item;
import com.mongodb.*;
import java.io.IOException;
import java.util.logging.Level;

/**
 *
 * @author antoine
 */
public class ServerPanel extends BasePanel implements EnumListener<Item> {

    enum Item {

        icon, host, address, maxObjectSize, journaling, replication, clientPorts, rsConfig, rsStatus, rsOplogInfo, refresh, rsStepDown, rsFreeze, rsFreezeTime, initiate, initConfig, rsRemove, rsReconfigure, isMaster, serverStatus, serverBuildInfo, currentOps, currentOpsQuery, killOp, killOpId, getParameter, getParameterValue, setParameter, setParameterValue, setLogLevel, setLogLevelValue, getLog, getLogType, logRotate, replica, shutdown, shutdownForce, shutdownTimeout, shutdownConfirm, fsync, fsyncAndLock,
    }

    public ServerPanel() {
        setEnumBinding(Item.values(), this);
    }

    public ServerNode getServerNode() {
        return (ServerNode) getNode();
    }

    @Override
    protected void updateComponentCustom(JPanel comp) {
        try {
            ServerNode node = getServerNode();
            if (node.isConfig) {
                ((Menu) getBoundUnit(Item.replica)).enabled = false;
            }

            MongoClient svrMongo = node.getServerMongoClient();
            ServerAddress addr = getServerNode().getServerAddress();
            if (addr != null) {
                setStringFieldValue(Item.host, addr.toString());
                setStringFieldValue(Item.address, addr.getSocketAddress().toString());
            }

            CommandResult res = svrMongo.getDB("local").command("isMaster");
            boolean master = res.getBoolean("ismaster");
            String replication = MongoUtils.makeInfoString("master", master, "secondary",
                    res.getBoolean("secondary"), "passive", res.getBoolean("passive"));
            setStringFieldValue(Item.replication, replication);
            ((Text) getBoundUnit(Item.replication)).showIcon = master;

            setStringFieldValue(Item.maxObjectSize, String.valueOf(svrMongo.getMaxBsonObjectSize()));

            //            ((CmdField) getBoundUnit(Item.serverStatus)).updateFromCmd(svrMongo);
            //
            //            DBObject svrStatus = ((DocField) getBoundUnit(Item.serverStatus)).getDoc();
            //            boolean dur = svrStatus.containsField("dur");
            //            ((Text)getBoundUnit(Item.journaling)).setStringValue(dur ? "On" : "Off");
            //            ((Text)getBoundUnit(Item.journaling)).showIcon = dur;
        } catch (Exception e) {
            UMongo.instance.showError(this.getClass().getSimpleName() + " update", e);
        }
    }

    public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) {
    }

    public void rsStepDown(ButtonBase button) {
        final DBObject cmd = new BasicDBObject("replSetStepDown", 1);
        final DB admin = getServerNode().getServerMongoClient().getDB("admin");

        new DbJob() {

            @Override
            public Object doRun() {
                Object res = null;
                try {
                    res = admin.command(cmd);
                } catch (MongoException.Network e) {
                    res = "Operation was likely successful, but connection error: " + e.toString();
                }

                try {
                    // sleep a bit since it takes time for driver to see change
                    Thread.sleep(6000);
                } catch (InterruptedException ex) {
                    getLogger().log(Level.WARNING, null, ex);
                }
                return res;
            }

            @Override
            public String getNS() {
                return null;
            }

            @Override
            public String getShortName() {
                return "RS Step Down";
            }

            @Override
            public DBObject getRoot(Object result) {
                return cmd;
            }
        }.addJob();
    }

    public void rsFreeze(ButtonBase button) {
        int sec = getIntFieldValue(Item.rsFreezeTime);
        DBObject cmd = new BasicDBObject("replSetFreeze", sec);
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
    }

    public void getLog(ButtonBase button) {
        final DB db = getServerNode().getServerMongoClient().getDB("admin");
        final String type = getStringFieldValue(Item.getLogType);
        final DBObject cmd = new BasicDBObject("getLog", type);
        new DbJob() {

            @Override
            public Object doRun() throws Exception {
                CommandResult res = db.command(cmd);
                res.throwOnError();
                StringBuilder sb = new StringBuilder();
                BasicDBList list = (BasicDBList) res.get("log");
                for (Object str : list) {
                    sb.append(str);
                    sb.append("\n");
                }
                return sb.toString();
            }

            @Override
            public String getNS() {
                return db.getName();
            }

            @Override
            public String getShortName() {
                return cmd.keySet().iterator().next();
            }

        }.addJob();
    }

    public void serverStatus(ButtonBase button) {
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "serverStatus").addJob();
    }

    public void serverBuildInfo(ButtonBase button) {
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "buildinfo").addJob();
    }

    public void isMaster(ButtonBase button) {
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "isMaster").addJob();
    }

    public void rsConfig(ButtonBase button) {
        final DBCollection col = getServerNode().getServerMongoClient().getDB("local")
                .getCollection("system.replset");
        CollectionPanel.doFind(col, null);
    }

    public void rsStatus(ButtonBase button) {
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "replSetGetStatus").addJob();
    }

    public void rsOplogInfo(ButtonBase button) {
        new DocView(null, "Oplog Info", null, "Oplog of " + getServerNode().getServerAddress(),
                MongoUtils.getReplicaSetInfo(getServerNode().getServerMongoClient())).addToTabbedDiv();
    }

    public void setParameter(ButtonBase button) {
        BasicDBObject cmd = new BasicDBObject("setParameter", 1);
        DBObject param = ((DocBuilderField) getBoundUnit(Item.setParameterValue)).getDBObject();
        cmd.putAll(param);
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
    }

    public void getParameter(ButtonBase button) {
        BasicDBObject cmd = new BasicDBObject("getParameter", 1);
        String param = getStringFieldValue(Item.getParameterValue);
        if ("*".equals(param))
            cmd.put("getParameter", "*");
        else
            cmd.put(param, 1);
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
    }

    public void setLogLevel(ButtonBase button) {
        BasicDBObject cmd = new BasicDBObject("setParameter", 1);
        int level = getIntFieldValue(Item.setLogLevelValue);
        cmd.put("logLevel", level);
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
    }

    public void currentOps(ButtonBase button) {
        final MongoClient mongo = getServerNode().getServerMongoClient();
        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 = getServerNode().getServerMongoClient();
        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 rsRemove(ButtonBase button) throws Exception {
        ReplSetNode replset = (ReplSetNode) getServerNode().getParentNode();
        final DBCollection col = replset.getMongoClient().getDB("local").getCollection("system.replset");
        DBObject config = col.findOne();

        BasicDBList members = (BasicDBList) config.get("members");
        int i = 0;
        String myhost = getServerNode().getServerAddress().getHost() + ":"
                + getServerNode().getServerAddress().getPort();
        for (; i < members.size(); ++i) {
            if (myhost.equals(((DBObject) members.get(i)).get("host")))
                break;
        }

        if (i == members.size()) {
            throw new Exception("No such server in configuration");
        }

        members.remove(i);
        ReplSetPanel.reconfigure(replset, config);
    }

    public void initiate(ButtonBase button) {
        DBObject config = ((DocBuilderField) getBoundUnit(Item.initConfig)).getDBObject();
        DBObject cmd = new BasicDBObject("replSetInitiate", config);
        DB admin = getServerNode().getServerMongoClient().getDB("admin");
        new DbJobCmd(admin, cmd, this, null).addJob();
    }

    public void rsReconfigure(ButtonBase button) throws Exception {
        ReplSetNode replset = (ReplSetNode) getServerNode().getParentNode();
        final DBCollection col = replset.getMongoClient().getDB("local").getCollection("system.replset");
        DBObject config = col.findOne();

        BasicDBList members = (BasicDBList) config.get("members");
        int i = 0;
        String myhost = getServerNode().getServerAddress().getHost() + ":"
                + getServerNode().getServerAddress().getPort();
        for (; i < members.size(); ++i) {
            if (myhost.equals(((DBObject) members.get(i)).get("host")))
                break;
        }

        if (i == members.size()) {
            throw new Exception("No such server in configuration");
        }

        ReplicaDialog dia = UMongo.instance.getGlobalStore().getReplicaDialog();
        BasicDBObject oldConf = (BasicDBObject) members.get(i);
        dia.updateFromReplicaConfig(oldConf);
        if (!dia.show())
            return;
        BasicDBObject conf = dia.getReplicaConfig(oldConf.getInt("_id"));
        members.put(i, conf);

        ReplSetPanel.reconfigure(replset, config);
    }

    public void shutdown(ButtonBase button) {
        BasicDBObject cmd = new BasicDBObject("shutdown", 1);
        boolean force = getBooleanFieldValue(Item.shutdownForce);
        if (force)
            cmd.put("force", force);
        int timeout = getIntFieldValue(Item.shutdownTimeout);
        if (timeout > 0)
            cmd.put("timeoutSecs", timeout);
        ConfirmDialog dia = (ConfirmDialog) getBoundUnit(Item.shutdownConfirm);
        if (!dia.show())
            return;
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), cmd).addJob();
    }

    public void logRotate(ButtonBase button) {
        new DbJobCmd(getServerNode().getServerMongoClient().getDB("admin"), "logRotate").addJob();
    }

    public void fsync(ButtonBase button) {
        DBObject cmd = new BasicDBObject("fsync", 1);
        if (false) {
            cmd.put("async", 1);
        }
        DB admin = getServerNode().getServerMongoClient().getDB("admin");
        new DbJobCmd(admin, cmd).addJob();
    }

    public void fsyncAndLock(ButtonBase button) {
        if (!UMongo.instance.getGlobalStore().confirmLockingOperation()) {
            return;
        }

        new DbJob() {

            @Override
            public Object doRun() throws IOException {
                MongoClient mongo = getServerNode().getServerMongoClient();
                boolean locked = mongo.isLocked();
                if (locked) {
                    return mongo.unlock();
                }

                return mongo.fsyncAndLock();
            }

            @Override
            public String getNS() {
                return null;
            }

            @Override
            public String getShortName() {
                return "FSync And Lock";
            }

            @Override
            public void wrapUp(Object res) {
                try {
                    // looks like the unlock doesnt take effect right away
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                }

                super.wrapUp(res);
            }
        }.addJob();
    }
}