diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerExecutePlan.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerExecutePlan.java index 002fdd4e67f0b5e7f5cbf962cfc262200c2aa4c0..428e26729c6207bc86981f93e0b5abb49acd0936 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerExecutePlan.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerExecutePlan.java @@ -16,7 +16,8 @@ */ package org.jkiss.dbeaver.ext.oracle.model.session; -import org.jkiss.dbeaver.model.DBPObject; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.DBPObjectWithDescription; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.meta.Property; @@ -25,7 +26,7 @@ import java.sql.ResultSet; /** * Plan */ -public class OracleServerExecutePlan implements DBPObject { +public class OracleServerExecutePlan implements DBPObjectWithDescription { private String plan; @@ -38,4 +39,10 @@ public class OracleServerExecutePlan implements DBPObject { public String getPlan() { return plan; } + + @Nullable + @Override + public String getDescription() { + return plan; + } } diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerSessionManager.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerSessionManager.java index fa96d3498f694e4414815c5dc4854eef77368123..0c4df7403cfdf03b88bbb2ed506d78f576bdb85a 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerSessionManager.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/session/OracleServerSessionManager.java @@ -164,12 +164,12 @@ public class OracleServerSessionManager implements DBAServerSessionManager ExecutePlan = new ArrayList<>(); + { + List planItems = new ArrayList<>(); while (dbResult.next()) { - ExecutePlan.add(new OracleServerExecutePlan(dbResult)); + planItems.add(new OracleServerExecutePlan(dbResult)); } - return ExecutePlan; + return planItems; } } } catch (SQLException e) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/admin/sessions/DBAServerSessionDetails.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/admin/sessions/DBAServerSessionDetails.java index 219d151c66e5c313a7d5804209009903ed4ae297..f26b2f084d6b74a66a8867ac9d25465925e7ecb8 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/admin/sessions/DBAServerSessionDetails.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/admin/sessions/DBAServerSessionDetails.java @@ -37,5 +37,5 @@ public interface DBAServerSessionDetails { List getSessionDetails(DBCSession session, DBAServerSession serverSession) throws DBException; - Class getDetailsType(); + Class getDetailsType(); } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseEditorInputFactory.java b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseEditorInputFactory.java index beea171c91f08d60de4d03dd5c0daf92d6e06357..73e553e207dc010a84798ce0016f015650fee921 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseEditorInputFactory.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseEditorInputFactory.java @@ -29,6 +29,7 @@ public class DatabaseEditorInputFactory implements IElementFactory public static final String ID_FACTORY = DatabaseEditorInputFactory.class.getName(); //$NON-NLS-1$ static final String TAG_CLASS = "class"; //$NON-NLS-1$ + static final String TAG_PROJECT = "project"; //$NON-NLS-1$ static final String TAG_DATA_SOURCE = "data-source"; //$NON-NLS-1$ static final String TAG_NODE = "node"; //$NON-NLS-1$ static final String TAG_NODE_NAME = "node-name"; //$NON-NLS-1$ @@ -69,6 +70,7 @@ public class DatabaseEditorInputFactory implements IElementFactory final DBNDatabaseNode node = input.getNavigatorNode(); memento.putString(TAG_CLASS, input.getClass().getName()); + memento.putString(TAG_PROJECT, context.getDataSource().getContainer().getProject().getName()); memento.putString(TAG_DATA_SOURCE, context.getDataSource().getContainer().getId()); memento.putString(TAG_NODE, node.getNodeItemPath()); memento.putString(TAG_NODE_NAME, node.getNodeName()); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseLazyEditorInput.java b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseLazyEditorInput.java index f9308b9a698a46334b6b416dd7e76abfeb575822..fc100e25bf68ed61e60030823d321fabf56c52c4 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseLazyEditorInput.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/DatabaseLazyEditorInput.java @@ -56,6 +56,7 @@ public class DatabaseLazyEditorInput implements IDatabaseEditorInput private static final Log log = Log.getLog(DatabaseLazyEditorInput.class); private final String nodePath; + private DBPProject project; private String nodeName; private final String activePageId; private final String activeFolderId; @@ -85,6 +86,8 @@ public class DatabaseLazyEditorInput implements IDatabaseEditorInput final String inputClass = memento.getString(DatabaseEditorInputFactory.TAG_CLASS); nodePath = memento.getString(DatabaseEditorInputFactory.TAG_NODE); nodeName = memento.getString(DatabaseEditorInputFactory.TAG_NODE_NAME); + String projectName = memento.getString(DatabaseEditorInputFactory.TAG_PROJECT); + project = CommonUtils.isEmpty(projectName) ? null : DBWorkbench.getPlatform().getWorkspace().getProject(projectName); dataSourceId = memento.getString(DatabaseEditorInputFactory.TAG_DATA_SOURCE); if (nodePath == null || inputClass == null || dataSourceId == null) { log.error("Corrupted memento"); //$NON-NLS-2$ @@ -209,12 +212,19 @@ public class DatabaseLazyEditorInput implements IDatabaseEditorInput public IDatabaseEditorInput initializeRealInput(final DBRProgressMonitor monitor) throws DBException { // Get the node path. - dataSource = DBUtils.findDataSource(dataSourceId); + if (project != null) { + dataSource = project.getDataSourceRegistry().getDataSource(dataSourceId); + } + if (dataSource == null) { + dataSource = DBUtils.findDataSource(dataSourceId); + } if (dataSource == null) { log.error("Can't find data source '" + dataSourceId + "'"); //$NON-NLS-2$ return null; } - final DBPProject project = dataSource.getRegistry().getProject(); + if (project == null) { + project = dataSource.getRegistry().getProject(); + } final DBNModel navigatorModel = DBWorkbench.getPlatform().getNavigatorModel(); navigatorModel.ensureProjectLoaded(project); //dataSourceContainer, project, nodePath, nodeName, activePageId, activeFolderId diff --git a/plugins/org.jkiss.dbeaver.ui.editors.session/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java b/plugins/org.jkiss.dbeaver.ui.editors.session/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java index 9e311101b84b70d0d918226e0413be0311c6532e..82653a306d48ef27b1f9c97fd15630985ae71634 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.session/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.session/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java @@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ui.views.session; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; @@ -38,8 +39,10 @@ import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.PartInitException; +import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPObject; +import org.jkiss.dbeaver.model.DBPObjectWithDescription; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.admin.sessions.DBAServerSession; import org.jkiss.dbeaver.model.admin.sessions.DBAServerSessionDetails; @@ -59,6 +62,7 @@ import org.jkiss.dbeaver.runtime.properties.ObjectPropertyDescriptor; import org.jkiss.dbeaver.runtime.properties.PropertyCollector; import org.jkiss.dbeaver.ui.*; import org.jkiss.dbeaver.ui.controls.ListContentProvider; +import org.jkiss.dbeaver.ui.controls.ProgressLoaderVisualizer; import org.jkiss.dbeaver.ui.controls.autorefresh.AutoRefreshControl; import org.jkiss.dbeaver.ui.editors.StringEditorInput; import org.jkiss.dbeaver.ui.editors.SubEditorSite; @@ -200,8 +204,20 @@ public class SessionManagerViewer extDetailsItem.setToolTipText(detailsInfo.getDetailsTooltip()); } - DetailsListControl detailsProps = new DetailsListControl(detailsFolder, workbenchPart.getSite(), detailsInfo); - extDetailsItem.setControl(detailsProps); + Class detailsType = detailsInfo.getDetailsType(); + if (DBPObjectWithDescription.class.isAssignableFrom(detailsType)) { + StyledText text = new StyledText(detailsFolder, SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL); + text.setForeground(UIStyles.getDefaultTextForeground()); + text.setBackground(UIStyles.getDefaultTextBackground()); + text.setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT)); + text.setData(detailsInfo); + extDetailsItem.setControl(text); + } else if (DBPObject.class.isAssignableFrom(detailsType)) { + DetailsListControl detailsProps = new DetailsListControl(detailsFolder, workbenchPart.getSite(), detailsInfo); + extDetailsItem.setControl(detailsProps); + } else { + extDetailsItem.setControl(UIUtils.createLabel(detailsFolder, "Unsupported details type: " + detailsType)); + } } } } @@ -213,8 +229,14 @@ public class SessionManagerViewer CTabItem item = detailsFolder.getItem(detailsFolder.getSelectionIndex()); Object data = item.getData(); if (data instanceof DBAServerSessionDetails) { - DetailsListControl detailsViewer = (DetailsListControl) item.getControl(); - detailsViewer.loadData(); + Class detailsType = ((DBAServerSessionDetails) data).getDetailsType(); + if (DBPObjectWithDescription.class.isAssignableFrom(detailsType)) { + StyledText styledText = (StyledText) item.getControl(); + loadPlainTextDetails((DBAServerSessionDetails) data, styledText); + } else { + DetailsListControl detailsViewer = (DetailsListControl) item.getControl(); + detailsViewer.loadData(); + } } } }); @@ -226,6 +248,25 @@ public class SessionManagerViewer sashMain.setWeights(new int[]{700, 300}); } + private void loadPlainTextDetails(DBAServerSessionDetails data, StyledText styledText) { + SessionDetailsLoadService loadingService = new SessionDetailsLoadService(data); + LoadingJob.createService( + loadingService, + new ProgressLoaderVisualizer>(loadingService, styledText) { + @Override + public void completeLoading(Collection dbpObjects) { + StringBuilder text = new StringBuilder(); + for (DBPObject item : dbpObjects) { + if (item instanceof DBPObjectWithDescription) { + text.append(((DBPObjectWithDescription) item).getDescription()); + text.append(GeneralUtils.getDefaultLineSeparator()); + } + } + styledText.setText(text.toString()); + } + }).schedule(); + } + private void updatePreview() { if (previewFolder.getSelectionIndex() == 0) { // Show SQL @@ -249,8 +290,13 @@ public class SessionManagerViewer CTabItem detailsItem = detailsFolder.getItem(detailsFolder.getSelectionIndex()); Object data = detailsItem.getData(); if (data instanceof DBAServerSessionDetails) { - DetailsListControl detailsListControl = (DetailsListControl) detailsItem.getControl(); - detailsListControl.loadData(); + if (detailsItem.getControl() instanceof StyledText) { + StyledText styledText = (StyledText) detailsItem.getControl(); + loadPlainTextDetails((DBAServerSessionDetails) data, styledText); + } else { + DetailsListControl detailsListControl = (DetailsListControl) detailsItem.getControl(); + detailsListControl.loadData(); + } } } } @@ -499,11 +545,12 @@ public class SessionManagerViewer private DBAServerSessionDetails sessionDetails; - protected DetailsListControl(Composite parent, IWorkbenchSite site, DBAServerSessionDetails sessionDetails) { + DetailsListControl(Composite parent, IWorkbenchSite site, DBAServerSessionDetails sessionDetails) { super(parent, SWT.SHEET, site, new ListContentProvider()); this.sessionDetails = sessionDetails; } + @NotNull @Override protected String getListConfigId(List> classList) { return "SessionDetails/" + sessionManager.getDataSource().getContainer().getDriver().getId() + "/" + sessionDetails.getDetailsTitle(); @@ -526,7 +573,7 @@ public class SessionManagerViewer private DBAServerSessionDetails sessionDetails; - public SessionDetailsLoadService(DBAServerSessionDetails sessionDetails) { + SessionDetailsLoadService(DBAServerSessionDetails sessionDetails) { super("Load session details " + sessionDetails.getDetailsTitle(), sessionManager.getDataSource()); this.sessionDetails = sessionDetails; }