diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java index 7a5072204bcbbe838cfe6b9711cb83e211a53663..84812cea30e599019edb59005f893ff0e5e0513d 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/querylog/QueryLogViewer.java @@ -18,8 +18,6 @@ package org.jkiss.dbeaver.ui.controls.querylog; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; @@ -51,20 +49,20 @@ import org.jkiss.dbeaver.core.CoreCommands; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.core.DBeaverUI; -import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.preferences.DBPPreferenceListener; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.model.qm.*; import org.jkiss.dbeaver.model.qm.meta.*; -import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.runtime.load.AbstractLoadService; import org.jkiss.dbeaver.model.sql.SQLConstants; import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.runtime.qm.DefaultEventFilter; import org.jkiss.dbeaver.ui.*; +import org.jkiss.dbeaver.ui.controls.ProgressLoaderVisualizer; import org.jkiss.dbeaver.ui.controls.TableColumnSortListener; import org.jkiss.dbeaver.ui.dialogs.sql.BaseSQLDialog; import org.jkiss.dbeaver.ui.editors.sql.handlers.OpenHandler; @@ -72,6 +70,7 @@ import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.LongKeyMap; +import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -124,7 +123,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere } private LogColumn COLUMN_TIME = new LogColumn("time", CoreMessages.controls_querylog_column_time_name, CoreMessages.controls_querylog_column_time_tooltip, 80) { - private final DateFormat timeFormat = new SimpleDateFormat(DBConstants.DEFAULT_TIME_FORMAT, Locale.getDefault()); //$NON-NLS-1$ + //private final DateFormat timeFormat = new SimpleDateFormat(DBConstants.DEFAULT_TIME_FORMAT, Locale.getDefault()); //$NON-NLS-1$ private final DateFormat timestampFormat = new SimpleDateFormat("MMM-dd HH:mm:ss", Locale.getDefault()); //$NON-NLS-1$ @Override String getText(QMMetaEvent event) @@ -619,6 +618,7 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere log.debug("Event reload is in progress. Skip"); return; } + reloadInProgress = true; DBPPreferenceStore store = DBeaverCore.getGlobalPreferenceStore(); this.entriesPerPage = Math.max(MIN_ENTRIES_PER_PAGE, store.getInt(QMConstants.PROP_ENTRIES_PER_PAGE)); @@ -627,34 +627,12 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere clearLog(); // Extract events - reloadInProgress = true; - AbstractJob reloadJob = new AbstractJob("Read meta events") { - @Override - protected IStatus run(DBRProgressMonitor monitor) { - final List events = new ArrayList<>(); - QMEventBrowser eventBrowser = QMUtils.getEventBrowser(); - if (eventBrowser != null) { - QMEventCriteria criteria = new QMEventCriteria(); - criteria.setSearchString(CommonUtils.isEmptyTrimmed(searchString) ? null : searchString.trim()); - try (QMEventCursor cursor = eventBrowser.getQueryHistoryCursor(monitor, criteria)) { - while (events.size() < entriesPerPage && cursor.hasNextEvent(monitor)) { - events.add(cursor.nextEvent(monitor)); - } - } catch (DBException e) { - return GeneralUtils.makeExceptionStatus(e); - } - } - DBeaverUI.asyncExec(() -> updateMetaInfo(events)); - return Status.OK_STATUS; - } - }; - reloadJob.addJobChangeListener(new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent event) { - reloadInProgress = false; - } - }); - reloadJob.schedule(); + + EventHistoryReadService loadingService = new EventHistoryReadService(searchString); + LoadingJob.createService( + loadingService, + new EvenHistoryReadVisualizer(loadingService)) + .schedule(); } @Override @@ -1090,4 +1068,73 @@ public class QueryLogViewer extends Viewer implements QMMetaListener, DBPPrefere } } + class EventHistoryReadService extends AbstractLoadService> { + + @Nullable + private String searchString; + + protected EventHistoryReadService(@Nullable String searchString) { + super("Load query history"); + this.searchString = searchString; + } + + @Override + public List evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + final List events = new ArrayList<>(); + QMEventBrowser eventBrowser = QMUtils.getEventBrowser(); + if (eventBrowser != null) { + QMEventCriteria criteria = new QMEventCriteria(); + criteria.setSearchString(CommonUtils.isEmptyTrimmed(searchString) ? null : searchString.trim()); + monitor.beginTask("Load query history", 1); + if (!CommonUtils.isEmpty(searchString)) { + monitor.subTask("Search queries: " + searchString); + } else { + monitor.subTask("Load all queries"); + } + try (QMEventCursor cursor = eventBrowser.getQueryHistoryCursor(monitor, criteria)) { + while (events.size() < entriesPerPage && cursor.hasNextEvent(monitor)) { + if (monitor.isCanceled()) { + break; + } + events.add(cursor.nextEvent(monitor)); + monitor.subTask(events.get(events.size() - 1).toString()); + } + } catch (DBException e) { + throw new InvocationTargetException(e); + } + monitor.done(); + } + return events; + } + + @Override + public Object getFamily() { + return QueryLogViewer.class; + } + + } + + private class EvenHistoryReadVisualizer extends ProgressLoaderVisualizer> { + public EvenHistoryReadVisualizer(EventHistoryReadService loadingService) { + super(loadingService, logTable); + } + + @Override + public void visualizeLoading() { + reloadInProgress = true; + super.visualizeLoading(); + } + + @Override + public void completeLoading(List result) { + try { + super.completeLoading(result); + super.visualizeLoading(); + updateMetaInfo(result); + } finally { + reloadInProgress = false; + } + } + } + } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java index c50194af2db977de8242aad8c1bac8a3af3695af..6593b38644eae6784ecc3da52e7218858a9e3a6b 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/entity/ProgressEditorPart.java @@ -18,8 +18,6 @@ package org.jkiss.dbeaver.ui.editors.entity; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; @@ -95,12 +93,8 @@ public class ProgressEditorPart extends EditorPart { private void createProgressPane(final Composite parent) { progressCanvas = new Canvas(parent, SWT.NONE); - progressCanvas.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - e.gc.drawText("Connecting to datasource '" + getEditorInput().getDatabaseObject().getName() + "'...", 5, 5, true); - } - }); + progressCanvas.addPaintListener(e -> + e.gc.drawText("Connecting to datasource '" + getEditorInput().getDatabaseObject().getName() + "'...", 5, 5, true)); InitNodeService loadingService = new InitNodeService(); LoadingJob loadJob = LoadingJob.createService( @@ -163,12 +157,8 @@ public class ProgressEditorPart extends EditorPart { initEntityEditor(result); if (result == null) { // Close editor - DBeaverUI.asyncExec(new Runnable() { - @Override - public void run() { - entityEditor.getSite().getWorkbenchWindow().getActivePage().closeEditor(entityEditor, false); - } - }); + DBeaverUI.asyncExec(() -> + entityEditor.getSite().getWorkbenchWindow().getActivePage().closeEditor(entityEditor, false)); } } }