用 Java 字典和辭典 API 使 Java 用戶可以使用您的單詞參考
在本系列文章的 第 1 部分中,您學到了 JADT 的一些基礎知識,JADT 提供了透明地以 Java 為中心的訪問字典或非結構化單詞以及它 們的有關信息的方法。JADT 的主要目標是為字典提供者提供一個可以依據的標准技術,以便他們支持 Java 平台。第 1 部分從開發人員的 角度介紹了 JADT。在本文中,我要給出實現的細節,重點從字典開發商的角度考慮。我會帶您了解 JADT 以及 JADT 的體系結構的細節, 並提供 JADT 中包含的所有類和接口的信息。
在 JADT 示例驅動程序實現的幫助下,我將討論驅動程序必需的接口實現。之後,您將對 JADT 驅動程序和提供驅動程序的方法有了一 個整體的印象。
JADT 體系結構
JADT 體系結構為任何類型的後端數據提供了基於驅動程序的訪問。字典提供者實現驅動程序端接口,為字典提供一個訪問點,任何使用 這個字典的程序,將使用字典服務的用戶端接口。結果就是,您可以方便地把 JADT 體系結構與各種開發商和第三方驅動程序集成在一起。
Driver 實現與 JADT 保持分離:
JADT 開發商的角色
如果您想用 JADT 公開您的字典或辭典,那麼只需提供 JADT 的實現即可。JADT 驅動程序位於開發商數據和 Java 程序員之間,允許開 發商在不完全公開他們的數據和數據格式的情況下,對外提供服務。反過來。Java 程序員也不必深入某個開發商專用的數據和數據格式, 就可以使用開發商的數據。
JADT 驅動程序開發商可以使用 JADT 接口,並根據它們自己的習慣實現這些接口。一旦驅動程序就緒,可以訪問您的數據,那麼就可以 在您的站點啟用它了。到這個站點的鏈接,可以作為 JADT 訪問頁面中的一個線程來使用。
JADT 用一致的方式在所有數據辭典上工作,這一點很重要,所以實現所有符合 JADT 所設標准的 JADT 接口和方法,是開發商的責任。 JADT 的 JADT Javadocs 和接口定義文檔非常清楚地公開了接口和方法的目標。
JADT 實現近觀
JADT 定義了多組接口和類。有些接口是輔助性的,有些是可選的,這取決於您的驅動程序所要支持的功能。如果要完整地支持 JADT, 那麼就必須按照 Javadocs 中所定義的規范,實現所有接口。在這一節裡,我將給出所有這些接口和類實現的細節。
完整的 JADT 接口和類集,如圖 2 中的類圖所示:
圖 2. JADT 類圖
下面我要介紹各種類和接口。
JADTDriverFactoryManager
JADTDriverFactory 對象的基本控制類是 com.ibm.jadt.JADTDriverFactoryManager ,這個類就像用戶和可用的驅動程序工廠之間的連 接。可以用它取得 Driver 的實例,然後再用實例得到某個驅動程序實現的一個或多個 JADT 服務。
在 JADTDriverFactory 載入之後,由 JADTDriver 提供者負責注冊 JADTDriverFactory ,所以 JADT 用戶還可以在任何時候,通過調 用 Class.forName(Driver_factory_class); ,顯式地裝入 JADTDriver 。
驅動程序工廠類的名稱應當隨 JADTDriverFactoryName 一起交給用戶,用戶使用這個類的靜態方法 getJADTDriverFactory(String factoryName) ,就可以得到 getJADTDriverFactory 。您可以調用靜態 registerJADTDriverFactory (JADTDriverFactory factory) 方法 來注冊它。
JADT 帶有下列接口,必須實現這些接口:
com.ibm.jadt. JADTDriverFactory
com.ibm.jadt.JADTDriver
JADTDriverFactory
com.ibm.jadt.JADTDriverFactory 工廠接口用於建立驅動程序實例,應當由驅動程序的實現者注冊到工廠控制器。由於 JADT 是基於驅 動程序的產品,所以 JADTDriver 的構造應當一直通過工廠。所有驅動程序實現者都應當實現這個接口。在 DriverFactory 類的靜態塊裡 ,工廠應當用 FactoryManager 注冊,如清單 1 所示:
清單 1. 注冊工廠的靜態方法
public class JADTSampleDriverFactory implements JADTDriverFactory
{
private static JADTSampleDriverFactory factory;
private Properties props;
private JADTSampleDriver driver;
static {
try{
if(factory==null)
factory=new JADTSampleDriverFactory();
JADTDriverFactoryManager.registerJADTDriverFactory(factory);
}
catch(Exception ex){
//handle exception
}
}
}
除了向管理器注冊工廠之外, JADTSampleDriverFactory 類還必須實現 createJADTDriver() 方法。可以用 createJADTDriver() 方法 把載入和數據訪問策略(或者其他任何類型的訪問屬性)分開。例如,清單 2 顯示了您如何才能設置要初始化的工廠數量,這由 loading_strategy 屬性決定:
清單 2. 載入策略示例
public JADTDriver createJADTDriver() throws JADTException{
if(this.getProperty("loading_strategy")!=null&&
this.getProperty("loading_strategy").equals("multiple")){
if(this.getProperty("JADTSampleDriverDir")==null)
return driver=new JADTSampleDriver();
else return driver=new JADTSampleDriver
(this.getProperty("JADTSampleDriverDir"));
}
return new JADTSampleDriver();
else
{
if(this.getProperty("JADTSampleDriverDir")!=null)
if(driver==null)
driver=new JADTTextDriver(this.getProperty("JADTSampleDriverDir"));
else
if(driver==null)
driver=new JADTSampleDriver();
return driver;
}
}
驅動程序使用的所有屬性,都必須編制文檔,並提供驅動程序使用指南。這個接口方法的其余部分是自解釋的,所以可以很容易地實現 。
JADTDriver 接口
com.ibm.jadt.JADTDriver 接口是所有驅動程序都必須實現的主驅動程序接口。它是由 JADTDriverFactory 建立的,是向您提供驅動程 序服務訪問的類,服務包括字典、辭典、拼寫檢查器、單詞表、翻譯器、語法檢測器,以及詞變位器。
這個接口代表具體廠商的驅動程序。除此之外,相同的驅動程序廠商還可以為不同的語言提供服務。
JADTDriver 類必須實現基本的構造函數方法,構造函數方法可以用來指定屬性,例如數據庫、目錄或者數據訪問方法。還可以用構造函 數初始化數據庫的基本連接。類的結構如清單 3 所示:
清單 3. JADTSampleDriver 基本示例代碼
public class JADTSampleDriver implements JADTDriver
{
private Properties props;
public JADTSampleDriver()
{
props=new Properties();
}
public JADTSampleDriver(String datapath)
{
props=new Properties();
setProperty("JADTSampleDriverDir",filepath);
}
/*
Rest all methods
*/
}
JADTDriver 類還提供了對各種服務的訪問,所以這個類實現了所有類都使用的公共 get>Service< 方法。 例如, getDictionary() 方法看起來會像清單 4:
清單 4. 字典服務方法實現
public Dictionary getDictionary(String langFrom,String langTo) throws JADTException
{
try{
if(getProperty("JADTSampleDriverDir")!=null){
return new SampleDictionary
(langFrom,langTo,getProperty("JADTSampleDriverDir"));
}
else return new SampleDictionary(langFrom,langTo);
}
catch(JADTException exp){
JADTException ex1=new JADTException
("DictionaryFailure","Could not create dictionary");
ex1.setNextException(exp);
throw ex1;
}
}
此外,清單 5 中顯示的方法也必須用類似的風格實現:
清單 5. 其他服務方法列表
public WordBook getWordBook
(String lang)throws JADTException;
public SpellChecker getSpellChecker
(String lang)throws JADTException;
public WordLister getWordlister
(String lang)throws JADTException;
public Translator getTranslator
(String langFrom,String langTo)throws JADTException;
public GrammarChecker getGrammarChecker
(String lang)throws JADTException;
public Anagrammizer getAnagrammizer
(String lang)throws JADTException;
使用數據結構
JADT 還提供了另外一組類和接口,用於提供組織數據的一般性方法。因為所有服務都使用數據庫結構,所以 JADT 用戶知道數據結構是 非常重要的。在下一節中,我會回顧一下數據結構。
單詞表接口
WordList 接口代表單詞的列表。因為它就是單詞的容器,所以它並不從後端資源提取數據。 WordList 一般用於傳遞、獲取、設置單詞 ,或者包含某些單詞。
WordList 類的結構如清單 6 所示:
清單 6. SampleWordlist 實現
public class SampleWordList implements WordList
{
private Vector words;
private int currentPos=0;
public TextWordList() {/*default constructor*/}
public int size(){return words.size();}
public void addWord(Word word)
{
words.addElement(word);
}
public void addWords(Vector vec)
{
words.addAll(vec);
}
public Vector getAllWords()
{
return words;
}
public void Start()
{
currentPos=0;
}
public boolean hasMoreWords()
{
if(currentPos==words.size()) return false;
else return true;
}
public WordList findWithPrefix(String find)
{
/* implementation */
}
public WordList findWithSuffix(String find)
{
/* implementation */
}
public WordList findWithSubstring(String find)
{
/* implementation */
}
}
單詞接口
Word 接口是字符的組合,代表母語使用者能夠識別的語言單元。 Word 接口包裝了單詞的有關信息。保存在 Word 接口中的信息包括: 拼寫、類型、來源、發音和記錄。
因為這個接口以真實格式表示單詞,所以實現應當提供一個容器,容器帶有必需的 get 和 set 方法。清單 7 顯示的信息對於形成單詞 是必需的:
清單 7. 示例單詞屬性
private String word;
private String type;
private DictionaryRecord meaning;
private DictionaryRecord synonym;
private DictionaryRecord antonym;
private String pronunciation;
public static final int MEANINGS=1;
public static final int SYNONYMS=2;
public static final int ANTONYMS=3;
private String source="";
這些字段可以通過它們的 get 和 set 方法來訪問。
JADT 服務
JADT 為各種服務對象定義了接口。在下一節中,我將逐一介紹當前 JADT 版本中包含的服務對象。
字典接口
Dictionary 接口代表參考書,參考書裡包含按字母順序排列的單詞表。每個條目都包含釋義、類型、發音、來源和用法。
Dictionary 的實現應當包含字典接口中的所有方法,但不包含構造函數,同時要用恰當的載入機制。載入機制可以是消極(lazy),一 次性(single shot),或者多重裝入(multiple load) 策略,具體取決於屬性,而且可以修正載入機制。
例如,構造函數應當從數據庫或文件中一次性載入數據,然後把數據保存在字典實現存儲庫中,如清單 8 所示:
清單 8. SampleDictionary 類
public class SampleDictionary implements Dictionary
{
private Hashtable words;
private String langFrom;
private String langTo;
public static final int LOADWHOLEONE=1;
public static final int LOADWHOLEMULTIPLE=2;
public static final int RUNTIME=3;
public static final int INDEXING=4;
private int technique;
public SampleDictionary(String strLangFrom,String strLangTo,
String dir,int method) throws JADTException{
/*
Load the data from storage unit, according to strategy defined.
*/
}
/*
Rest all methods
*/
}
余下的方法只是 getMeaning() 方法的變體,負責從載入的數據中提取單個或多個單詞的含義。清單 9 顯示了一個例子:
清單 9. 示例 getMeaning 方法
public com.ibm.jadt.DictionaryRecord getMeaning(Word word)
{
if(words.containsKey(word.toString().toLowerCase()))
return ((Word)words.get(word.toString().toLowerCase())).getRecord(TextWord.MEANINGS);
else return null;
}
辭典組件
WordBook 是一個服務組件,它提供所有相關單詞的信息。這些單詞可以根據用法、來源、發音等進行關聯。JADT 的當前版本提供了實 現同義詞、反義詞、上位詞、下位詞、整體名詞、部分名詞的接口,我們在 第 1 部分中已經討論過。
實現需要讓方法可以訪問所有這類數據,建立從數據源載入數據的必要機制,如清單 10 所示:
清單 10. 示例辭典實現
public class SampleWordBook implements WordBook
{
private Hashtable wordsSyn;
/* private hashtable for rest all services data, this act like a repository for data */
public SampleWordBook(){
/* loads required data into repository*/
}
public DictionaryRecord getSynonyms(Word word) throws JADTException {
WordList syn=(WordList)wordsSyn.get(word.toString());
if(syn==null||syn.size()==0)
return null;
DictionaryRecord first=null;
DictionaryRecord curr=null;
Enumeration enum=syn.getAllWords().elements();
while (enum.hasMoreElements())
{
if(first==null)
{
curr=new DictionaryRecord();first=curr;
}
else
{
curr.setNextRecord(new DictionaryRecord());
curr=curr.getNextRecord();
}
curr.setWordName(((Word)enum.nextElement()).toString());
}
return first;
}
/*
Similarly implement rest all services methods
*/
}
其他服務
其余的服務我已經在第 1 部分詳細介紹過。這裡是一個快速回顧,包括附加的實現細節。
拼寫檢查器
SpellChecker 類用於捕獲拼寫錯誤的單詞。這個類在執行方面沒有什麼新鮮東西。
它把數據保存在私有散列表中,並實現了其他方法。它還實現了檢查拼寫的算法。這個服務類與其他服務的實現方式一樣。
單詞表類
WordLister 可用於從後端資源取得單詞。JADT WordLister 還提供了一個選項,可以查找符合某個規則(例如相似前綴、相似後綴和公 共子字符串)的所有單詞。
WordLister 類把數據保存在私有散列表中,並實現了其他方法。它還實現了檢查拼寫的算法。這個服務類與其他服務的實現方式一樣。
詞變位器類
Anagrammizer 可以給出單詞或短語的所有變位形式,對於文字游戲應用程序來說會非常有用。這個類還實現了得到單詞的變位詞的算法 。
語法檢查器類
GrammarChecker 檢查單詞在句子中的排列,檢查單詞在特定上下文中的用法。它還實現了檢查語法的算法。這個服務類與其他服務的實 現方式一樣。
翻譯器類
Translator 類用於把單詞或消息從一種語言轉換成另一種語言。這個特性可以用在本地化和國際化實現上。利用這個特性,用一種語言 編寫的資源綁定文件可以被轉換成另外一種語言。
Translator 實現了把單詞和句子從一種語言翻譯成另外一種語言的算法。這個服務類與其他服務的實現方式一樣。
匯總
一旦您已經實現了所有的服務接口和驅動程序類,您就可以把所有類捆綁在一個包裡。最後的包結構看起來類似於清單 11:
清單 11. JADTDriver 包結構
com\ibm\jadt
Anagrammizer
Dictionary
DictionaryRecord
GrammarChecker
JADTDriver
JADTDriverFactory
JADTDriverFactoryManager
JADTException
SpellChecker
Translator
Word
WordBook
WordList
WordLister
com\ibm\jadtdrivers\SampleDriver
JADTSampleDriver
JADTSampleDriverFactory
SampleWord
com\ibm\jadtdrivers\SampleDriver\anagrammizer
SampleAnagrammizer
com\ibm\jadtdrivers\SampleDriver\dictionary
SampleDictionary
com\ibm\jadtdrivers\SampleDriver\spellchecker
SampleSpellChecker
com\ibm\jadtdrivers\SampleDriver\wordbook
SampleWordBook
com\ibm\jadtdrivers\SampleDriver\wordlist
SampleWordList
SampleWordLister
把這些文件捆綁成一個 JAR 文件,您就可以部署它了。
結束語
通過本系列文章,您對於 JADT 技術有了全面的了解。這篇文件介紹了基本的 JADT 結構,以及如何使用不同的 JADT 服務和組件建立 使用字典和其他與單詞有關的特性的 Java 應用程序。