/* * 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.HashMap; import java.util.List; import java.util.Map; /** * Lock detail table */ public class LockTableDetail extends DatabaseObjectListControl<DBAServerLockItem> { private DBAServerLockManager<DBAServerLock<?>,DBAServerLockItem> lockManager; Map<String, Object> options = new HashMap<String, Object>(1); public Map<String, Object> getOptions() { return options; } public LockTableDetail(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 "LocksDetail/" + lockManager.getDataSource().getContainer().getDriver().getId(); } @Override protected LoadingJob<Collection<DBAServerLockItem>> createLoadService() { return LoadingJob.createService( new LoadLockDetailService(), new ObjectsLoadVisualizer()); } 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 LoadLockDetailService extends DatabaseLoadService<Collection<DBAServerLockItem>> { protected LoadLockDetailService() { super(String.format("Load lock details"), lockManager.getDataSource()); } @Override public Collection<DBAServerLockItem> evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { try (DBCExecutionContext isolatedContext = lockManager.getDataSource().openIsolatedContext(monitor, "View Lock item")) { try (DBCSession session = isolatedContext.openSession(monitor, DBCExecutionPurpose.UTIL, "Retrieve server lock detail")) { return lockManager.getLockItems(session, options); } } } catch (Throwable ex) { throw new InvocationTargetException(ex); } } } }