本文介紹如何開(kāi)發(fā)將 HSQLDB 純 Java 關(guān)系數據庫服務(wù)器集成到 Eclipse Workbench 中的插件。盡管不如 DB2 功能強大,也不如 MySQL 流行,但 HSQLDB(超音速 SQL 數據庫)可以滿(mǎn)足很大范圍內 Java 應用程序的需要,因為它具有可擴展性,而且對內存/處理器的要求不高。
超音速 SQL 數據庫后來(lái)正式更名為 HSQLDB,它是一類(lèi)純 Java 撰寫(xiě)的嵌入式關(guān)系數據庫服務(wù)器,您可以在單機模式(使用直接文件訪(fǎng)問(wèn))或客戶(hù)機/服務(wù)器模式中使用它,它支持大量的并發(fā)用戶(hù)。盡管不如 DB2 功能強大,也不如 MySQL 流行,但 HSQLDB(超音速SQL數據庫)可以滿(mǎn)足很大范圍內 Java 應用程序的需要,因為它具有可擴展性,而且對內存/處理器的要求不高。
HSQLDB 是一類(lèi)使用方便的 Java 開(kāi)發(fā)數據庫,因為它支持 Structured Query Language(SQL)的豐富子集,并且 Java 程序員根本不需要在他們的開(kāi)發(fā)工作站上安裝嚴重消耗處理器、內存和磁盤(pán)空間的數據庫服務(wù)器。它對于集成到 Eclipse IDE 中來(lái)說(shuō)是一種很理想的工具,既能為新手也能為經(jīng)驗豐富的開(kāi)發(fā)人員提供有用的工具。
本文及同一系列的后續文章將向您展示如何構建一組 Eclipse 插件,以將 HSQLDB 嵌入到 Eclipse Workbench 中。您將看到一個(gè)現實(shí)世界中的例子,目的是說(shuō)明如何在考慮到 API 和用戶(hù)接口(UI)的情況下開(kāi)發(fā)這類(lèi)插件,以及如何評估可供選擇的方法以給用戶(hù)帶來(lái)所需要的功能。本文假定您使用的是 Eclipse SDK 分布,而不是 Platform Runtime-Binary 加上 JDT。但如果只是為了開(kāi)發(fā)常規 Java 應用程序,則后者更加適合。
在這個(gè)系列中,我們將根據“Levels of Integration” 一文中描述的基本原理(請參閱本文后面的 參考資料 中給出的鏈接),使用三個(gè)步驟創(chuàng )建并擴展插件組:
了解 HSQLDB
您可以從 SourceForge(hsqldb.sourceforge.net; 請參閱 參考資料 中給出的鏈接)下載 HSQLDB,其中包括源代碼和文檔。這里注意不要與已經(jīng)被凍結的原始 SourceForge 項目( hsql.sourceforge.net )相混淆。
二進(jìn)制分布是一個(gè)標準的 ZIP 文件,而您要做的就是把這個(gè) ZIP 文件解壓縮到您硬盤(pán)上的某個(gè)地方。所有 HSQLDB 組件 ——數據庫引擎、服務(wù)器進(jìn)程、JDBC 驅動(dòng)程序、文檔以及一些實(shí)用工具——都放在一個(gè)單獨的 JAR 包中,這個(gè)包安裝在 lib/hsqldb.jar 中,大小在 260 KB 左右。運行數據庫引擎只需 170 KB 的 RAM,這即使是 PDA (如 Sharp 生產(chǎn)的 Zaurus)也能夠滿(mǎn)足,而且包括源文件和文檔在內的整個(gè)下載文件小到可以放到一張標準的 1.44 MB 軟盤(pán)上。
您可以從命令行啟動(dòng)數據庫服務(wù)器和實(shí)用工具,具體方法是調用像 org.hsqldb.Server 和 org.hsqldb.util.DatabaseManager 這樣的方便的類(lèi),這兩個(gè)類(lèi)均可以接受為數不多的一組命令行選項,如“-url”(用于遠程連接)、“-database”(用于直接文件訪(fǎng)問(wèn))和“-user”。還有一種“-?”選項也可以被接受,其作用是提供關(guān)于有效命令行語(yǔ)法的幫助。
造成 HSQLDB 簡(jiǎn)單性的關(guān)鍵因素是SQL語(yǔ)句執行的順序化。也就是說(shuō),盡管許多并發(fā)用戶(hù)可以連接到數據庫上(當數據庫以服務(wù)器模式運行時(shí)),但是所有 SQL 語(yǔ)句都被放到一個(gè)隊列中,然后一次執行一條。因此不需要實(shí)現復雜的鎖定及同步算法。盡管如此,HSQLB 還是實(shí)現了 ACID(Atomicity, Consistency, Isolation, and Durability,即原子性、一致性、隔離性和持久性) 語(yǔ)義。換句話(huà)說(shuō),它是一個(gè)事務(wù)性的數據庫,但僅僅處于讀未提交級別,還不具備事務(wù)隔離功能。HSQLDB 實(shí)際上是為嵌入式應用程序而不是為共同數據中心而創(chuàng )建的。
如果您想要使用觸發(fā)器、聚合函數、外部聯(lián)接、視圖以及其他 SQL 功能,HSQLB 都可以滿(mǎn)足您的需要(大部分輕量級關(guān)系數據庫無(wú)法做到這一點(diǎn))。通過(guò)把您的 Java 類(lèi)添加到 HSQLB 的類(lèi)路徑中,您可以實(shí)現存儲過(guò)程。然后您發(fā)出一條 CREATE FUNCTION 語(yǔ)句即可大功告成。事實(shí)上,像 SQRT 和 ABS 之類(lèi)的許多標準 SQL 函數都被實(shí)現為到標準 Java 類(lèi)(比如 java.lang.Math)的直接映射 。
HSQLDB 的運行模式
HSQLDB 引擎可以以多種模式運行,以適應不同的應用場(chǎng)合:
駐留內存模式
所有數據庫表和索引都放在內存中,而且永遠不會(huì )保存到磁盤(pán)上。在您發(fā)出為什么有人想要使用在應用程序終止時(shí)就會(huì )丟失的數據庫這樣的疑問(wèn)之前,請先考慮為您可以使用標準 SQL 語(yǔ)句進(jìn)行查詢(xún)、排序、分組和更新的數據庫數據擁有一塊本地高速緩存。
單機模式
應用程序使用 JDBC 創(chuàng )建一個(gè)數據庫連接,并且 HSQLDB 引擎運行在該應用程序中,這時(shí)允許直接訪(fǎng)問(wèn)數據庫文件。不能存在并發(fā)用戶(hù)(應用程序獨占地訪(fǎng)問(wèn)數據庫文件),但因此也沒(méi)有額外的線(xiàn)程和 TCP 連接開(kāi)銷(xiāo)。單機模式是許多嵌入式應用程序的首選模式。
服務(wù)器模式
這是類(lèi)似于其他關(guān)系數據庫的標準客戶(hù)機/服務(wù)器數據庫配置,允許出現使用 TCP 套接字的并發(fā)連接。大部分開(kāi)發(fā)人員喜歡這種模式,因為它允許任何 JDBC 客戶(hù)機在主應用程序仍在運行的情況下連接并查詢(xún)/更新表。
Web服務(wù)器模式
HSQLDB 可以用作 Web 服務(wù)器,可以通過(guò) HTTP 接受 SQL 查詢(xún);也能作為任何標準 Web 容器中的 servlet 來(lái)運行,可以穿過(guò)防火墻或者安裝在 Web 宿主服務(wù)上,而不用涉及到提供者支持小組(和昂貴的數據庫宿主選項)。由于 HTTP 是無(wú)狀態(tài)的,所以本模式中不存在事務(wù)。
HSQLDB 數據庫文件結構
HSQLDB 將所有表和索引數據放在內存中, 將所有發(fā)出的 SQL 語(yǔ)句保存到一個(gè)名為 database.script 的文件中,該文件同時(shí)也充當著(zhù)事務(wù)日志的角色。初始化引擎之后,該文件被讀取,然后其中所有的 SQL 語(yǔ)句都被運行,從而完成整個(gè)數據庫的重建。停機期間,HSQLDB 引擎將生成一個(gè)新的 database.script 文件,其中只包含最少的語(yǔ)句,目的是讓數據庫可以快速啟動(dòng)。
除了默認放在內存中的表之外,HSQLDB 還支持“緩存”表和“文本”表。所有緩存表的數據放在一個(gè)名為 database.data 的文件中,而文本表的數據則放在由 set table source 非標準 SQL 語(yǔ)句命名的任意分隔文本文件(像 CSV 文件)中。緩存表支持比可用 RAM 大的數據集,而文本表則可以作為一種導入導出數據的方便手段。
除了 database.script 和 database.data 文件之外,任何 HSQLDB 數據庫還可能包含一個(gè) database.properties 文件,管理員可以在該文件中設置許多影響到 ANSI SQL 兼容性的參數。所有數據庫文件(文本表數據文件除外)必須放在同一個(gè)目錄中。
不存在創(chuàng )建 HSQLDB 數據庫的顯式方法。如果您要求引擎打開(kāi)一個(gè)目前不存在的數據庫文件(使用服務(wù)器模式的 -database 選項或單機模式的 JDBC URL),就會(huì )創(chuàng )建該文件及其所在目錄。所以,如果您肯定那個(gè)空數據庫中存在數據,請檢查是否有錄入錯誤。
現在讓我們開(kāi)始開(kāi)發(fā)插件!
創(chuàng )建 HSQLDB Eclipse 插件組
把現有的應用程序放到 Eclipse 這樣功能強大的工具中去并不是一件容易的事情。值得慶幸的是,HSQLDB 和 Eclipse 均降低了上述任務(wù)的難度,因為 HSQLDB 本身可以嵌入到其他應用程序中,而 Eclipse 提供了清晰而且易于理解的插件基礎設施以及用于創(chuàng )建新插件的健壯的開(kāi)發(fā)環(huán)境 PDE。即使您以前從未接觸過(guò) Eclipse 插件開(kāi)發(fā),PDE 也可以讓您很容易上手。請參閱本文后面 參考資料 部分中講述 Eclipse 基礎知識的文章。
這些指導性?xún)热菁俣褂玫氖?Eclipse SDK 分布,而不是 Platform Runtime-Binary 加 JDT。但如果您只是要開(kāi)發(fā)常規 Java 應用程序,則后者更加適合。您可以使用您最喜歡的操作系統,因為我們將只使用 Java 代碼,而根本不會(huì )用到本機代碼。
為了創(chuàng )建有用的插件組并盡可能地少書(shū)寫(xiě)代碼,我們將從最不費力的工作開(kāi)始。稍后,在這個(gè)系列的下一部分內容中,我們將看到如何利用 Eclipse 功能為 HSQLDB 提供增值。
在本文中,我們將集中講述我們代碼的下列功能:
如何才能使得這些函數可以為 Workbench 所用呢?完成前面三步最容易的方式是提供一個(gè) actionSet,它被添加到新的頂級菜單中并且可從它自己的工具欄訪(fǎng)問(wèn)。運行 SQL 腳本文件的操作必須只被綁定到擴展名為“*.sql” 的文件上,所以這將是一個(gè) objectContribution, 它被 Workbench 添加到顯示這些文件的任意視圖上的彈出式菜單中。最后,連接參數要能很好地符合插件的參數選擇頁(yè)面,從 Workbench Window 菜單中可以訪(fǎng)問(wèn)這個(gè)頁(yè)面。
圖 1 顯示了新的菜單和工具欄,而圖 2 顯示了 Navigator 視圖的彈出式菜單中的新項,圖 3 則顯示了屬性頁(yè)面,這樣您就可以看到我們的插件組的第一個(gè)版本是什么樣子。



把 HSQLDB 變成一個(gè) Eclipse 插件
構建我們的插件組的第一步是把 HSQLDB 本身包裝成一個(gè) Eclipse 插件。這個(gè)插件將只包含 hsqldb.jar 和 Workbench 要求的必要的plugin.xml 文件。如果您已經(jīng)瀏覽了標準 Eclipse 插件目錄,那么您可能已經(jīng)發(fā)現,JUnit, Xerces, Tomcat,以及其他常見(jiàn)的 Java 包被隔離在它們各自的插件中,未曾改變,而且所有的 Eclipse 細節都被封裝在其他插件中。這種劃分方式使得這些第三方工具易于更新,而不一定要求改變 Eclipse 本身。另外一個(gè)好處就是與許多插件共享這些常見(jiàn)的庫很容易。
打開(kāi)您的 Eclipse SDK 安裝,并創(chuàng )建一個(gè)新的插件項目;將其命名為 hsqldb.core(我知道推薦使用的名稱(chēng)是 org.hsqldb.core,但是我不愿意假裝使用了 HSQLDB 名稱(chēng)空間?;蛟S HSQLDB 開(kāi)發(fā)人員閱讀至此會(huì )贊同這個(gè)想法,并推薦它為“正式的”Eclipse 集成插件;這樣的話(huà)該名稱(chēng)極有可能被改掉)。確保選中的是“Empty Plugin” 選項, 而不是任何插件模板;否則,您將得到一個(gè)毫無(wú)用處的頂級插件類(lèi),如果您創(chuàng )建了該類(lèi)之后希望刪掉它,那么它可以被安全地刪除。把 hsqldb.jar 從您的 HSQLDB 安裝拷貝到項目目錄中,并將其添加到項目的 Runtime。您可以使用 PDE Plugin Manifest Editor或者簡(jiǎn)單地拷貝清單 1 中的內容來(lái)完成這項工作。
清單 1. 用于 hsqldb.core 插件的 plugin.xml 清單文件 |
添加 Workbench 擴展
接下來(lái),創(chuàng )建名為 hsqldb.ui 的第二個(gè)插件項目。這個(gè)項目將為插件組的第一修訂本包含所有的 Eclipse 擴展:包含三個(gè)操作的一個(gè)操作集、與 *.sql 文件相關(guān)的對象作用,以及一個(gè)屬性頁(yè)面。將其主類(lèi)(Plugin 類(lèi))命名為 PluginUi,并接受包的默認名稱(chēng) hsqldb.ui。
使用 Plugin Manifest Editor 打開(kāi) plugin.xml 文件,并選擇 Extensions 選項卡。將所分配菜單更名為 HSQLDB 并改變示范操作,使其顯示標簽“Runs HSQLDB Database Manager”。向帶有標簽“Stops HSQLDB database server” 和“Starts HSQLDB database server”的同一個(gè) actionSet 添加另外兩個(gè)操作,并為每個(gè)操作提供惟一的操作 ID 和實(shí)現類(lèi)。請注意,上述操作將以與創(chuàng )建時(shí)相反的順序(即與在插件清單文件中出現的順序相反)顯示在菜單和工具欄中。
單擊 Add 按鈕,從而使用 Extension 模板、彈出式菜單和屬性頁(yè)面添加兩個(gè)新的擴展。彈出式菜單應該與 *.sql 文件模式相關(guān)聯(lián),但是屬性頁(yè)面字段應該通過(guò)編程進(jìn)行設置。
圖 4 顯示了 Plugin Manifest 編輯器的最終外觀(guān),并顯示了所有的插件擴展;圖 5 顯示了對象分配的屬性(注意針對 *.sql 文件的過(guò)濾器),而圖 6 顯示了文件資源彈出式菜單中的“Run SQL Script”操作的屬性。 圖標在本文的源代碼中給出(請參閱 參考資料),但是我敢肯定您認識有比這畫(huà)得更好的圖形專(zhuān)家!


圖 6. 清單編輯器上的 Run SQL Script 操作

在能夠給我們的操作添加代碼之前,我們需要將這種 UI 插件與相應的核心插件區別開(kāi)來(lái),否則它將不能訪(fǎng)問(wèn) HSQLDB 類(lèi)。轉到 Plugin Manifest Editor 上的“Dependencies” 頁(yè)面,并添加一個(gè)插件依賴(lài)性,如圖 7 所示。某些依賴(lài)性,像“eclipse.ui”,由 PDE 自動(dòng)進(jìn)行配置,而其他依賴(lài)性,像 “org.eclipse.debug.core”,則在對操作進(jìn)行編碼時(shí)添加。如果您情愿直接編輯 XML 代碼,清單 2 顯示了 hsqldb.ui 插件的完整 plugin.xml 文件。
要完成插件的安裝工作,請添加一個(gè)新類(lèi)到 hsqldb.ui 包中,然后將其命名為 HsqldbUtil。這個(gè)類(lèi)將包含所有直接處理 HSQLDB 的代碼,并使分配的擴展代碼保持簡(jiǎn)單。

|
啟動(dòng) HSQLDB使用類(lèi) org.hsqldb.Server 以服務(wù)器模式啟動(dòng) HSQLDB 引擎相當容易。以HSQLDB 數據庫名稱(chēng)(路徑+數據庫文件的基本名稱(chēng))、用于監聽(tīng)連接請求的TCP 端口以及一個(gè)用于判別停機時(shí)它是否應該調用 System.exit() 的標志作為命令行參數。下面的命令行是運行 HSQLDB 時(shí)的典型情況:
java -cp /opt/hsqldb/hsqldb.jar org.hsqldb.Server -database /tmp/bd -port 9001 -system_exit=true
上面這一行命令創(chuàng )建了 /tmp/db.script、 /tmp/db.properties 和 /tmp/db.data 三個(gè)數據庫文件。
我們可以使用 Server 類(lèi)主方法并傳遞一個(gè)字符串數組作為其參數。但是我們必須在一個(gè)新線(xiàn)程中做這項工作;否則,我們將鎖定整個(gè) Workbench。惟一的插件類(lèi)維持一個(gè)到這個(gè)線(xiàn)程的引用,這樣它就能夠在連接到某臺服務(wù)器之前檢查該服務(wù)器是否已經(jīng)啟動(dòng),并且還可以檢查它是否正在運行,因為任何客戶(hù)機均可連接到這臺服務(wù)器上,然后提交 SHUTDOWN 語(yǔ)句終止它的運行。
清單 3 中的代碼顯示了 hsqldb.ui.actions.HsqldbStartAction 的 run 方法,而清單 4 顯示了 hsqldb.ui.HsqldbUtil 中的 startHsqldb 的代碼,這些代碼實(shí)際上啟動(dòng)了服務(wù)器。稍后我們將討論管理用戶(hù)反饋的技術(shù)。
上述代碼最有趣的部分是我們如何找到一個(gè)位置來(lái)放置數據庫文件。一個(gè)名為 .hsqldb 的項目如果不存在就會(huì )被創(chuàng )建,而在該項目中引擎將查找 database.script 和其他數據庫文件。
Eclipse 在一個(gè)可以保存任何配置文件的標準目錄中提供了所有插件??梢酝ㄟ^(guò)調用 plugin.getStateLocation 來(lái)得到這樣一個(gè)目錄,但是我并不覺(jué)得數據庫文件實(shí)際上是插件配置文件。它們看起來(lái)更像是用戶(hù)數據文件,而且照此說(shuō)來(lái),它們應該位于開(kāi)發(fā)人員工作區中的項目?jì)取?/font>
|
|
停止 HSQLDB
要停止 HSQLDB 服務(wù)器,所需要的只是一個(gè)作為 SQL 語(yǔ)句的 SHUTDOWN 命令。如清單 5 所示,來(lái)自 hsqldb.ui.HsqldbUtil 的 stopHsqldb 方法完成了這個(gè)任務(wù)。相應操作對應的代碼和啟動(dòng)服務(wù)器時(shí)描述的代碼幾乎完全相同,所以這里沒(méi)有列出。清單 5 中拋出了 ClassNotFoundException (來(lái)自 Class.forName)和 SQLException 異常,所以操作代碼能夠提供足夠的反饋給用戶(hù)。
|
運行 HSQL Database Manager
運行 HSQLDB 中的 Database Manager 實(shí)用工具比運行服務(wù)器本身還要棘手一點(diǎn)。因為服務(wù)器被創(chuàng )建為可以嵌入到其他應用程序中,而上述實(shí)用工具則計劃作為單機應用程序或 Java applet 來(lái)運行。盡管兩種模式均接受命令行參數(或 applet 參數),我們還是不希望僅僅為了得到一個(gè)用戶(hù)可以在其中輸入 SQL 語(yǔ)句的窗口,就需要額外增加啟動(dòng)一個(gè)新的 Java VM 的開(kāi)銷(xiāo)。直接調用類(lèi) static void main(String[] args) 不會(huì )如預期一樣工作,因為它將調用 System.exit() 終止 Workbench。
瀏覽 org.hsqldb.util.DatabaseManager 源代碼之后,我們發(fā)現實(shí)例化和初始化一個(gè) JDBC 連接很容易,但是所必需的方法不是公共的。所以我們可以在 HSQLDB 源樹(shù)中創(chuàng )建一個(gè)名為 org.hsqldb.util.PatchedDatabaseManager 的類(lèi),然后使用所提供的 Ant 構建腳本生成一個(gè)新的 hsqldb.jar,其中包含我們打過(guò)補丁的 Database Manager。只有兩個(gè)方法的可見(jiàn)性需要改為 public:void main() 和 void connect(Connection con)。清單 6 顯示了插件如何使用這兩個(gè)方法運行補丁類(lèi)。
Database Manager 是一個(gè) AWT 應用程序 (參見(jiàn)圖 8), 它將創(chuàng )建自己的事件線(xiàn)程(獨立于 Eclipse SWT 線(xiàn)程),并且在調用 System.exit() 關(guān)閉 Workbench 之后就會(huì )終止??梢赃\行該實(shí)用程序的多個(gè)實(shí)例而不會(huì )導致問(wèn)題,除非沒(méi)有 Workbench 窗口可以依靠。對于我們的 HSQLDB 插件的第一修訂本來(lái)說(shuō),這很好,但是在這個(gè)系列結束之前,我們必須將其改為一個(gè) SWT 應用程序,就像 Eclipse 視圖那樣嵌入其中。

|
運行 SQL 腳本
HSQLDB Script Tool 讀取純文本文件,并依靠一個(gè)給定的 JDBC URL 執行文件中包含的 SQL 語(yǔ)句。SQL 語(yǔ)句批處理由 go 命令進(jìn)行分隔, 而且腳本也可以使用 print 命令在腳本中書(shū)寫(xiě)消息。
熟悉其他數據庫系統的開(kāi)發(fā)人員創(chuàng )建的腳本可能僅僅包含由分號(;)分隔開(kāi)的 SQL 語(yǔ)句,但是這使得 HSQLDB 可以在單個(gè)批處理中運行所有腳本,而只返回最后一條語(yǔ)句的結果。您需要在 SQL 語(yǔ)句之間包含 go 命令,以接受每一條語(yǔ)句的結果。
讓用戶(hù)瀏覽腳本結果最容易的方法是把它們放入一個(gè)控制臺視圖中,就像從 Workbench 調用的 Java 應用程序和 Ant 構建腳本一樣。這要求創(chuàng )建一個(gè) Java Launch 配置,而該配置又會(huì )創(chuàng )建另一個(gè) Java VM。因為 SQL 腳本存在時(shí)間較短,所以我們可以認為其開(kāi)銷(xiāo)是可以接受的,而且如果您認為 Database Manager 也應該在它自己的 VM 中被調用,您可以使用清單 7中給出的 runScriptTool 方法作為一個(gè)例子。
清單 7 是本文(這個(gè)系列的第一篇)中最長(cháng)的清單,其中大部分內容是關(guān)于建立一個(gè)包含正確的 JRE 自舉類(lèi)(必須被顯式設定)和 hsqldb.core 插件中的 hsqldb.jar 的類(lèi)路徑。查閱本文末尾的 參考資料 部分可以獲得更多關(guān)于運行由 Eclipse 提供的框架以及由 JDT 提供的擴展的信息。
對于熟悉其他 GUI 工具包的開(kāi)發(fā)人員來(lái)說(shuō),如何獲取被選中 SQL 腳本文件的路徑并不是一件顯而易見(jiàn)的事情。IObjectActionDelegate 接口由擴展資源彈出式菜單的對象分配實(shí)現,調用它的 run 方法后收到的只是一個(gè)到操作本身的引用,就像一個(gè)頂級菜單操作一樣,沒(méi)有包含與被選中的資源或始發(fā)控件有關(guān)的信息。資源引用實(shí)際上被提供給 selectionChanged 方法,而且必須被保存為一個(gè)實(shí)例變量,以備稍后使用——請參見(jiàn)清單 8。
|
|
HSQLDB 屬性
現在我們的插件的大部分功能都已經(jīng)就位,僅僅缺少配置服務(wù)器連接參數的方法:它監聽(tīng)的 TCP 端口、管理員用戶(hù)名稱(chēng)以及管理員用戶(hù)密碼。TCP 端口可能必須要改變,從而避免與安裝在開(kāi)發(fā)人員機器上的其他應用程序發(fā)生沖突;用戶(hù)及密碼可以從任意客戶(hù)機上使用 SQL 語(yǔ)句來(lái)改變。這些參數可以被放入一個(gè)類(lèi)似 C 結構(或類(lèi)似 pascal 記錄)的名為 HsqldbParams 的類(lèi)中, 如清單 9 所示。它也聲明了由 Plugin Preferences Store 和 Property Page 使用的常量來(lái)取得并保存參數(引用)值。
|
不幸的是,由 PDE New Extension Wizard 生成的參數選擇頁(yè)面類(lèi)起了一點(diǎn)誤導作用,它包括一個(gè)方法,用于設置不會(huì )被插件參數選擇存儲使用的默認參數選擇值。初始化默認值的正確位置應該是主要的 Plugin 類(lèi)本身。否則,所有使用默認值的參數選擇將被參數選擇存儲返回為 0 或 null。
因此,參數選擇頁(yè)面類(lèi)變得簡(jiǎn)單多了,如清單 10 所示,并且方法 initializeDefaultPreferences 被添加到 PluginUi 類(lèi)中,如清單 11 所示。注意,每個(gè)參數選擇的默認值均由參數選擇結構定義,而不是由插件類(lèi)或參數選擇頁(yè)面類(lèi)來(lái)定義。
|
|
提供反饋給用戶(hù)
由于插件組既沒(méi)有提供視圖也沒(méi)有提供編輯器給 Workbench,所以只有幾種有限的方法可以為用戶(hù)提供操作方面的反饋。我們可以使用 Workbench 窗口的狀態(tài)欄以及一個(gè) SWT MessageDialog ,這樣用戶(hù)就不會(huì )錯過(guò)重要的事件(通常是錯誤)。
Workbench 操作的可見(jiàn)性及實(shí)現模型主要集中在工作區資源選擇方面,但是大部分插件操作(啟動(dòng)及停止 HSQLDB 服務(wù)器,還包括啟動(dòng)Database Manager)并不依賴(lài)于資源選擇,而是依賴(lài)于服務(wù)器是否正在運行——這個(gè)條件必須由每個(gè)操作的 run 方法進(jìn)行顯式檢查。
警告: 插件類(lèi)與操作類(lèi)直到絕對需要降低 Workbench 對內存的需求時(shí)才會(huì )被初始化。清單文件內容被用于表示菜單選擇和啟用/禁用它們, 但是由于 HSQLDB 服務(wù)器不屬于工作區資源,所以它不能啟用操作。正如清單 2 中的清單代碼所描述的那樣,您可以(請參見(jiàn) <enablement> 元素)在激活插件的基礎之上啟用/禁用一項操作,所以在啟動(dòng)時(shí)只有“Start HSQLDB server” 操作可以被啟用,但在這之后如果服務(wù)器已經(jīng)處于運行狀態(tài),則不存在容易的方法來(lái)禁用這項操作以及當其停止后重新啟用它。
注意,用于在 Workbench 窗口上放置一個(gè)沙漏狀光標的代碼,以及用于設置狀態(tài)欄消息的代碼不易在 PDE 文檔或 Eclipse.org 文章中找到。
最后一步
插件類(lèi)重寫(xiě)了 shutdown 方法,所以當 Workbench 被關(guān)閉時(shí)它能夠干凈利落地關(guān)閉服務(wù)器,這時(shí)我們就結束了整個(gè)過(guò)程。當然,要得到一個(gè)完整的插件組還需要完成這里沒(méi)有講到的額外任務(wù),比如:
結束語(yǔ)
本文介紹如何創(chuàng )建可將 HSQLDB 數據庫引入到 Eclipse Workbench 中的一組插件,以增添啟動(dòng)和停止服務(wù)器以及運行 SQL 語(yǔ)句和腳本的能力。我們已經(jīng)了解到 PDE 是如何使這類(lèi)插件的創(chuàng )建工作變得容易的,即對大多數任務(wù)使用向導和編輯器,而留給開(kāi)發(fā)人員的任務(wù)不過(guò)是創(chuàng )建真正實(shí)現所需功能的代碼。
在這個(gè)系列的下一個(gè)部分中,您將了解到如何利用 Workbench 的功能向 HSQLDB 開(kāi)發(fā)添加值,而不僅僅是簡(jiǎn)單地運行預先存在的工具。
聯(lián)系客服