本文記錄通過Debug dbeaver 項目學習到的RCP相關零散知識點。
dbeaver 項目部署到eclipse 和 idea,並進行debug調試,查看PDF文檔
1.項目啟動
eclipse rcp應用,使用了osgi框架:equinox,那么應用啟動入口點是 org.eclipse.equinox.app.IApplication 接口類。在 dbeaver 中,額外定義了一個接口類 org.jkiss.dbeaver.model.app.DBPApplication ,該接口作用是意圖通過調用接口中的方法來重新定義 dbeaver的行為或者設置。dbeaver 定義了一個抽象類 org.jkiss.dbeaver.registry.BaseApplicationImpl 實現了上述兩個接口,最終提供了一個類 org.jkiss.dbeaver.ui.app.standalone.DBeaverApplication繼承了BaseApplicationImpl 抽象類。即dbeaver項目啟動會從DBeaverApplication 進行入口。項目入口定義在/org.jkiss.dbeaver.ui.app.standalone/plugin.xml 文件中:
以下是DBeaverApplication 類圖:
2. /org.jkiss.dbeaver.ui.app.standalone/plugin.xml
該xml文件定義了程序入口程序,下面看下程序打開主界面菜單控件的定義。
菜單定義在 <extension point="org.eclipse.ui.menus"> 節點中。看下一個編輯控件菜單定義:
以上菜單定義控件commandId 是以 org.eclipse.ui 開頭,表示這是eclipse內置的控件,該控件在應用啟動時會自動注冊commandId對應的事件行為。而我們自定義的commandId 比如 org.jkiss.dbeaver.core.new.connection,
該commandId定義方式如下:
a. 定義commandId,並定義觸發該commandId的事件處理類
b. 定義commandId的名稱,描述文字,以及類別
c. 定義commandId的顯示圖片
定義好后,就可以使用commandId對應的控件,如:
3. 點擊控件彈出對話框及界面顯示處理
以 org.jkiss.dbeaver.core.new.connection 新建連接為例
從上述分析中,可以找到該控件的點擊處理事件,org.jkiss.dbeaver.ui.actions.datasource.DataSourceCreateHandler ,可以找到這個代碼:
是打開一個對話框,對話框具體處理方法在 NewConnectionDialog.openNewConnectionDialog(window) 中,該方法中會調用NewConnectionDialog 的 open方法打開即將要打開的新建連接向導頁面。
通過debug,發現最終會調用 org.eclipse.jface.wizard.WizardDialog#createContents 方法 ,先去addPages(),然后再createContents
NewConnectionWizard 類圖
進入到NewConnectionWizard 類中將會執行org.jkiss.dbeaver.ui.dialogs.connection.NewConnectionWizard#addPages 方法,向向導頁面中添加頁面,該方法是在 org.eclipse.jface.wizard.Wizard 抽象類中進行定義,可以查看相關類注釋
4. 查詢管理器
查詢刷新按鈕事件: org.jkiss.dbeaver.ui.controls.querylog.QueryLogCommandHandler 最終在方法 org.jkiss.dbeaver.ui.controls.querylog.QueryLogViewer.EventHistoryReadService.evaluate(DBRProgressMonitor) 中進行歷史數據過濾。執行SQL歷史記錄是暫存在 org.jkiss.dbeaver.runtime.qm.QMMCollectorImpl.eventPool 這個List 數組中,因此程序重啟,原先歷史記錄就會消失。操作SQL觸發添加歷史記錄方法事件: org.jkiss.dbeaver.runtime.qm.QMMCollectorImpl.fireMetaEvent(QMMObject, Action)。
日志查詢器鼠標右擊菜單在 org.jkiss.dbeaver.ui.controls.querylog.QueryLogViewer.createFiltersMenu(IMenuManager) 該方法進行初始化