/* * DBeaver - Universal Database Manager * Copyright (C) 2017 Andrew Khitrin (ahitrin@gmail.com) * * 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 org.jkiss.dbeaver.ext.ui.locks.manage; import java.util.Collection; import java.util.Map; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.viewers.*; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchSite; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.ext.ui.locks.graph.LockGraphicalView; import org.jkiss.dbeaver.ext.ui.locks.table.LockTable; import org.jkiss.dbeaver.ext.ui.locks.table.LockTableDetail; import org.jkiss.dbeaver.model.admin.locks.DBAServerLock; import org.jkiss.dbeaver.model.admin.locks.DBAServerLockItem; import org.jkiss.dbeaver.model.admin.locks.DBAServerLockManager; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; /** * LockManagerViewer */ public class LockManagerViewer { public static final String keyType = "type"; public static final String typeWait = "wait"; public static final String typeHold = "hold"; private Font boldFont; private LockListControl lockTable; private LockTableDetail blockedTable; private LockTableDetail blockingTable; private Label blockedLabel; private Label blockingLabel; private DBAServerLock<?> curLock; private LockGraphManager<?, ?> graphManager; private LockGraphicalView gv; @SuppressWarnings("unused") private final DBAServerLockManager<DBAServerLock<?>, DBAServerLockItem> lockManager; private Action killAction = new Action("Kill waiting session", UIUtils.getShardImageDescriptor(ISharedImages.IMG_ELCL_STOP)) { @Override public void run() { DBAServerLock<?> root = graphManager.getGraph(curLock).getLockRoot(); alterSession(); refreshLocks(root); setTableLockSelect(root); } }; public LockGraphManager<?, ?> getGraphManager() { return graphManager; } public void dispose() { lockTable.disposeControl(); UIUtils.dispose(boldFont); } protected LockManagerViewer(IWorkbenchPart part, Composite parent, final DBAServerLockManager<DBAServerLock<?>, DBAServerLockItem> lockManager) { this.graphManager = (LockGraphManager<?, ?>) lockManager; boldFont = UIUtils.makeBoldFont(parent.getFont()); Composite composite = UIUtils.createPlaceholder(parent, 1); SashForm sashMain = UIUtils.createPartDivider(part, composite, SWT.HORIZONTAL | SWT.SMOOTH); sashMain.setLayoutData(new GridData(GridData.FILL_BOTH)); SashForm sash = UIUtils.createPartDivider(part, sashMain, SWT.VERTICAL | SWT.SMOOTH); sash.setLayoutData(new GridData(GridData.FILL_BOTH)); this.lockManager = lockManager; lockTable = new LockListControl(sash, part.getSite(), lockManager, lockManager.getLocksType()); lockTable.createProgressPanel(composite); lockTable.getItemsViewer().addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { onLockSelect(getSelectedLock()); } }); lockTable.loadData(); SashForm infoSash = UIUtils.createPartDivider(part, sash, SWT.HORIZONTAL | SWT.SMOOTH); infoSash.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite cBlocked = UIUtils.createPlaceholder(infoSash, 1, 5); blockedLabel = new Label(cBlocked, SWT.NULL); blockedLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); blockedLabel.setFont(boldFont); blockedTable = new LockTableDetail(cBlocked, SWT.SHEET, part.getSite(), lockManager); blockedTable.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite cBlocking = UIUtils.createPlaceholder(infoSash, 1, 5); blockingLabel = new Label(cBlocking, SWT.NULL); blockingLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); blockingLabel.setFont(boldFont); blockingTable = new LockTableDetail(cBlocking, SWT.SHEET, part.getSite(), lockManager); blockingTable.setLayoutData(new GridData(GridData.FILL_BOTH)); gv = new LockGraphicalView(this); gv.createPartControl(sashMain); sashMain.setWeights(new int[]{3, 1}); sash.setWeights(new int[]{4, 1}); } protected void onLockSelect(DBAServerLock<?> lock) { curLock = lock; refreshGraph(curLock); } public void setTableLockSelect(DBAServerLock<?> lock) { ColumnViewer itemsViewer = lockTable.getItemsViewer(); itemsViewer.getControl().setRedraw(false); try { itemsViewer.setSelection(new StructuredSelection(lock), true); } finally { itemsViewer.getControl().setRedraw(true); } curLock = lock; } protected void contributeToToolbar(DBAServerLockManager<DBAServerLock<?>, DBAServerLockItem> sessionManager, IContributionManager contributionManager) { } public Action getKillAction() { return killAction; } private DBAServerLock<?> getSelectedLock() { ISelection selection = lockTable.getSelectionProvider().getSelection(); if (selection instanceof IStructuredSelection && !selection.isEmpty()) { return (DBAServerLock<?>) ((IStructuredSelection) selection).getFirstElement(); } else { return null; } } private void refreshGraph(DBAServerLock<?> selected) { gv.drawGraf(selected); } public void refreshLocks(DBAServerLock<?> selected) { lockTable.loadData(false); gv.drawGraf(selected); } public void refreshDetail(Map<String, Object> options) { StringBuilder sb = new StringBuilder("Wait - "); sb.append(curLock.getTitle()); blockedLabel.setText(sb.toString()); blockedTable.getOptions().putAll(options); blockedTable.getOptions().put(keyType, typeWait); blockedTable.loadData(false); sb.setLength(0); if (curLock.getHoldBy() != null) { sb.append("Hold - "); sb.append(curLock.getHoldBy().getTitle()); blockingLabel.setText(sb.toString()); } blockingTable.getOptions().putAll(options); blockingTable.getOptions().put(keyType, typeHold); blockingTable.loadData(); } public void alterSession() { if (UIUtils.confirmAction( "Terminate", NLS.bind("Teminate session?", "Terminate"))) { lockTable.createAlterService(curLock, null).schedule(); } } private class LockListControl extends LockTable { private Class<DBAServerLock<?>> locksType; LockListControl(SashForm sash, IWorkbenchSite site, DBAServerLockManager<DBAServerLock<?>, DBAServerLockItem> lockManager, Class<DBAServerLock<?>> locksType) { super(sash, SWT.SHEET, site, lockManager); this.locksType = locksType; } @Nullable @Override protected Class<?>[] getListBaseTypes(Collection<DBAServerLock<?>> items) { return new Class[] { locksType }; } @Override protected void fillCustomActions(IContributionManager contributionManager) { contributeToToolbar(getLockManager(), contributionManager); contributionManager.add(new Action("Refresh locks", DBeaverIcons.getImageDescriptor(UIIcon.REFRESH)) { @Override public void run() { refreshLocks(curLock); } }); contributionManager.add(killAction); } } }