scouter.client.maria.views.DbLockListView.java Source code

Java tutorial

Introduction

Here is the source code for scouter.client.maria.views.DbLockListView.java

Source

/*
 *
 *  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 scouter.client.maria.views;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;

import scouter.client.model.TextProxy;
import scouter.client.net.TcpProxy;
import scouter.client.util.ExUtil;
import scouter.client.util.TimeUtil;
import scouter.lang.constants.StatusConstants;
import scouter.lang.pack.MapPack;
import scouter.lang.pack.Pack;
import scouter.lang.pack.StatusPack;
import scouter.lang.value.ListValue;
import scouter.net.RequestCmd;
import scouter.util.CastUtil;
import scouter.util.DateUtil;

public class DbLockListView extends ViewPart {

    public static final String ID = DbLockListView.class.getName();

    private TreeViewer viewer;
    private Tree tree;
    private TreeColumnLayout columnLayout;
    private long time;

    private int serverId;
    private int objHash;
    Map<Long, LockObject> root = new HashMap<Long, LockObject>();

    public void init(IViewSite site) throws PartInitException {
        super.init(site);
        String secId = site.getSecondaryId();
        String[] ids = secId.split("&");
        serverId = CastUtil.cint(ids[0]);
        objHash = CastUtil.cint(ids[1]);
    }

    @Override
    public void createPartControl(Composite parent) {
        this.setPartName("Lock List[" + TextProxy.object.getText(objHash) + "]");
        columnLayout = new TreeColumnLayout();
        parent.setLayout(columnLayout);
        tree = new Tree(parent, SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        viewer = new TreeViewer(tree);
        createColumns();
        viewer.setContentProvider(new LockContentProvider());
        viewer.setLabelProvider(new LockLabelProvider());
        viewer.setInput(root);
    }

    public void setInput(long time) {
        this.time = time;
        load();
    }

    private void load() {
        root.clear();
        tree.removeAll();
        ExUtil.asyncRun(new Runnable() {
            public void run() {
                TcpProxy tcpProxy = TcpProxy.getTcpProxy(serverId);
                Pack p = null;
                try {
                    MapPack param = new MapPack();
                    param.put("key", StatusConstants.LOCK_INFO);
                    param.put("objHash", objHash);
                    param.put("time", time);
                    p = tcpProxy.getSingle(RequestCmd.STATUS_AROUND_VALUE, param);
                } catch (Throwable th) {
                    th.printStackTrace();
                } finally {
                    TcpProxy.putTcpProxy(tcpProxy);
                }
                if (p != null) {
                    String date = DateUtil.yyyymmdd(TimeUtil.getCurrentTime(serverId));
                    StatusPack sp = (StatusPack) p;
                    ListValue waitStartedLv = sp.data.getList("WAIT_STARTED");
                    ListValue waitingPidLv = sp.data.getList("WAITING_PID");
                    ListValue lockedTableLv = sp.data.getList("LOCKED_TABLE");
                    ListValue lockedIndexLv = sp.data.getList("LOCKED_INDEX");
                    ListValue lockedTypeLv = sp.data.getList("LOCKED_TYPE");
                    ListValue blockingPidLv = sp.data.getList("BLOCKING_PID");
                    ListValue waitingQueryLv = sp.data.getList("WAITING_QUERY");
                    ListValue waitingLockModeLv = sp.data.getList("WAITING_LOCK_MODE");
                    ListValue blockingQueryLv = sp.data.getList("BLOCKING_QUERY");
                    ListValue blockingTrxStartedLv = sp.data.getList("BLOCKING_TRX_STARTED");
                    ListValue blockingLockModeLv = sp.data.getList("BLOCKING_LOCK_MODE");
                    for (int i = 0; i < waitStartedLv.size(); i++) {
                        long blockPid = blockingPidLv.getLong(i);
                        LockObject blockObject = root.get(blockPid);
                        if (blockObject == null) {
                            blockObject = new LockObject(blockPid);
                            blockObject.startTime = blockingTrxStartedLv.getLong(i);
                            blockObject.sql = TextProxy.maria.getLoadText(date, blockingQueryLv.getInt(i),
                                    serverId);
                            blockObject.type = lockedTypeLv.getString(i);
                            blockObject.waitingLockMode = waitingLockModeLv.getString(i);
                            blockObject.blockingLockMode = blockingLockModeLv.getString(i);
                            blockObject.index = lockedIndexLv.getString(i);
                            blockObject.table = lockedTableLv.getString(i);
                            root.put(blockPid, blockObject);
                        }

                        long waitPid = waitingPidLv.getLong(i);
                        LockObject waitObject = new LockObject(waitPid);
                        waitObject.startTime = waitStartedLv.getLong(i);
                        waitObject.sql = TextProxy.maria.getLoadText(date, waitingQueryLv.getInt(i), serverId);
                        waitObject.type = lockedTypeLv.getString(i);
                        waitObject.waitingLockMode = waitingLockModeLv.getString(i);
                        waitObject.blockingLockMode = blockingLockModeLv.getString(i);
                        waitObject.index = lockedIndexLv.getString(i);
                        waitObject.table = lockedTableLv.getString(i);
                        waitObject.parent = blockObject;
                        blockObject.addChild(waitObject);
                    }
                }
                ExUtil.exec(tree, new Runnable() {
                    public void run() {
                        viewer.refresh();
                        viewer.expandAll();
                    }
                });
            }
        });
    }

    public void setFocus() {

    }

    static class LockObject {
        long pid;
        long startTime;
        String sql;
        String type;
        String waitingLockMode;
        String blockingLockMode;
        String index;
        String table;
        LockObject parent;
        List<LockObject> childList;

        LockObject(long id) {
            this.pid = id;
        }

        public void addChild(LockObject child) {
            if (childList == null) {
                childList = new ArrayList<LockObject>();
            }
            childList.add(child);
        }
    }

    class LockContentProvider implements ITreeContentProvider {

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

        @SuppressWarnings("rawtypes")
        public Object[] getElements(Object inputElement) {
            if (inputElement instanceof Map) {
                return ((Map) inputElement).values().toArray();
            }
            return new Object[0];
        }

        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof LockObject) {
                if (((LockObject) parentElement).childList != null) {
                    return ((LockObject) parentElement).childList.toArray();
                }
            }
            return null;
        }

        public Object getParent(Object element) {
            if (element instanceof LockObject) {
                return ((LockObject) element).parent;
            }
            return null;
        }

        public boolean hasChildren(Object element) {
            if (element instanceof LockObject) {
                return ((LockObject) element).childList != null;
            }
            return false;
        }

    }

    class LockLabelProvider implements ITableLabelProvider {

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
        }

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof LockObject) {
                LockObject model = (LockObject) element;
                LockTableSchema column = columnList.get(columnIndex);
                switch (column) {
                case PID:
                    return CastUtil.cString(model.pid);
                case START:
                    return DateUtil.format(model.startTime, "HH:mm:ss");
                case SQL:
                    return model.sql;
                case TYPE:
                    return model.type;
                case MODE:
                    if (model.parent == null) {
                        return model.blockingLockMode;
                    } else {
                        return model.waitingLockMode;
                    }
                case INDEX:
                    return model.index;
                case TABLE:
                    return model.table;
                }
            }
            return null;
        }

    }

    ArrayList<LockTableSchema> columnList = new ArrayList<LockTableSchema>();

    private void createColumns() {
        columnList.clear();
        for (LockTableSchema column : LockTableSchema.values()) {
            createTreeViewerColumn(column.getTitle(), column.getWidth(), column.getAlignment(), true, true,
                    column.isNumber());
            columnList.add(column);
        }
    }

    private TreeViewerColumn createTreeViewerColumn(String title, int width, int alignment, boolean resizable,
            boolean moveable, final boolean isNumber) {
        final TreeViewerColumn viewerColumn = new TreeViewerColumn(viewer, SWT.NONE);
        final TreeColumn column = viewerColumn.getColumn();
        column.setText(title);
        column.setAlignment(alignment);
        column.setMoveable(moveable);
        columnLayout.setColumnData(column, new ColumnPixelData(width, resizable));
        return viewerColumn;
    }

    enum LockTableSchema {
        PID("PID", 100, SWT.LEFT, true), START("Start", 100, SWT.CENTER, false), SQL("SQL", 200, SWT.LEFT,
                false), TYPE("Type", 100, SWT.LEFT, false), MODE("Mode", 100, SWT.LEFT,
                        false), INDEX("Index", 100, SWT.LEFT, true), TABLE("Table", 100, SWT.LEFT, false);

        private final String title;
        private final int width;
        private final int alignment;
        private final boolean isNumber;

        private LockTableSchema(String text, int width, int alignment, boolean isNumber) {
            this.title = text;
            this.width = width;
            this.alignment = alignment;
            this.isNumber = isNumber;
        }

        public String getTitle() {
            return title;
        }

        public int getAlignment() {
            return alignment;
        }

        public int getWidth() {
            return width;
        }

        public boolean isNumber() {
            return this.isNumber;
        }
    }

}