/* * DBeaver - Universal Database Manager * Copyright (C) 2017 Andrew Khitrin (ahitrin@gmail.com) * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License (version 2) * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.jkiss.dbeaver.ext.ui.locks.table; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchSite; import org.jkiss.code.NotNull; 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.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService; import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.List; import java.util.Map; /** * Session table */ public class LockTable extends DatabaseObjectListControl<DBAServerLock<?>> { private DBAServerLockManager<DBAServerLock<?>,DBAServerLockItem> lockManager; public LockTable(Composite parent, int style, IWorkbenchSite site, DBAServerLockManager<DBAServerLock<?>,DBAServerLockItem> lockManager) { super(parent, style, site, CONTENT_PROVIDER); this.lockManager = lockManager; } public DBAServerLockManager<DBAServerLock<?>,DBAServerLockItem> getLockManager() { return lockManager; } @NotNull @Override protected String getListConfigId(List<Class<?>> classList) { return "Locks/" + lockManager.getDataSource().getContainer().getDriver().getId(); } @Override protected int getDataLoadTimeout() { return 20000; } @Override protected LoadingJob<Collection<DBAServerLock<?>>> createLoadService() { return LoadingJob.createService( new LoadLocksService(), new ObjectsLoadVisualizer()); } public LoadingJob<Void> createAlterService(DBAServerLock<?> lock, Map<String, Object> options) { return LoadingJob.createService( new KillSessionByLockService(lock, options), new ObjectActionVisualizer()); } public void init(DBAServerLockManager<DBAServerLock<?>,DBAServerLockItem> lockManager) { this.lockManager = lockManager; } private static IStructuredContentProvider CONTENT_PROVIDER = new IStructuredContentProvider() { @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Collection) { return ((Collection<?>)inputElement).toArray(); } return null; } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }; private class LoadLocksService extends DatabaseLoadService<Collection<DBAServerLock<?>>> { protected LoadLocksService() { super("Load locks", lockManager.getDataSource()); } @Override public Collection<DBAServerLock<?>> evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { try (DBCExecutionContext isolatedContext = lockManager.getDataSource().openIsolatedContext(monitor, "View Locks")) { try (DBCSession session = isolatedContext.openSession(monitor, DBCExecutionPurpose.UTIL, "Retrieve server locks")) { return lockManager.getLocks(session, null).values(); } } } catch (Throwable ex) { throw new InvocationTargetException(ex); } } } private class KillSessionByLockService extends DatabaseLoadService<Void> { private final DBAServerLock<?> lock; private final Map<String, Object> options; protected KillSessionByLockService(DBAServerLock<?> lock, Map<String, Object> options) { super("Kill session by lock", lockManager.getDataSource()); this.lock = lock; this.options = options; } @Override public Void evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { try (DBCExecutionContext isolatedContext = lockManager.getDataSource().openIsolatedContext(monitor, "View locks")) { try (DBCSession session = isolatedContext.openSession(monitor, DBCExecutionPurpose.UTIL, "Kill server session by lock")) { lockManager.alterSession(session, this.lock, options); return null; } } } catch (Throwable ex) { throw new InvocationTargetException(ex); } } } }