有關(guān)另外一個(gè)WTP重要的數(shù)據(jù)模型IStructuredDocument已經(jīng)在前面介紹過(guò)了,今天我們看一下另外一個(gè)核心的數(shù)據(jù)模型IStructuredModel。在繼續(xù)下面的內(nèi)容之前,請(qǐng)確保當(dāng)前工作區(qū)中已經(jīng)導(dǎo)入(無(wú)論是源碼方式導(dǎo)入還是二進(jìn)制方式導(dǎo)入)了如下工程: org.eclipse.jst.jsp.core org.eclipse.jst.jsp.ui org.eclipse.wst.css.core org.eclipse.wst.css.ui org.eclipse.wst.html.core org.eclipse.wst.html.ui org.eclipse.wst.javascript.core org.eclipse.wst.javascript.ui org.eclipse.wst.sse.core org.eclipse.wst.sse.ui org.eclipse.wst.xml.core org.eclipse.wst.xml.ui 在前面介紹IStructuredDocument的時(shí)候,我們知道IStructuredDocument的具體實(shí)現(xiàn)其實(shí)就是JFace Text Framework中IDocument接口的具體實(shí)現(xiàn),其核心作用也集中在將特定文本按照特定的語(yǔ)法規(guī)則進(jìn)行區(qū)域劃分,提供相應(yīng)的位置信息,這為WTP頁(yè)面資源編輯器建立了核心數(shù)據(jù)模型。但是,單純擁有偏重于語(yǔ)法的IStrucuturedDocument是不夠的,我們同時(shí)還需要另外一套偏重于語(yǔ)義的數(shù)據(jù)模型,這就是IStructuredModel和其背后的WTP xml DOM實(shí)現(xiàn)(說(shuō)明:對(duì)于CSS模型,是完全由WTP自己實(shí)現(xiàn)的,和本系列文章關(guān)系不大,本篇中不做詳細(xì)介紹)。 注意:IStructuredModel以IStrucuturedDocument為基礎(chǔ)構(gòu)建,IStructuredDocument并不知道IStructuredModel,但是IStructuredModel知道該模型對(duì)應(yīng)的IStrucuturedDocument!!! 現(xiàn)在先大致猜測(cè)一下原因,如果是直接將特定頁(yè)面資源的內(nèi)容直接轉(zhuǎn)換為IStructuredModel肯定不容易,因?yàn)槲覀冺?yè)面資源中的內(nèi)容往往不是那么規(guī)則,那轉(zhuǎn)化的過(guò)程中肯定避免不了自己去做大量的解析,導(dǎo)致構(gòu)建IStructuredModel構(gòu)建過(guò)程異常復(fù)雜;如果利用已有的IStrucuturedDocument構(gòu)建機(jī)制,先將特定的內(nèi)容解析為IStrucuturedDocument完成語(yǔ)法劃分,再基于高度結(jié)構(gòu)化的IStrucuturedDocument去構(gòu)建IStrucuturedModel,那肯定會(huì)大大簡(jiǎn)化構(gòu)建過(guò)程,某種程度上就可以將構(gòu)建過(guò)程理解為把IStrucuturedDocument中節(jié)點(diǎn)列表轉(zhuǎn)換為IStrucuturedModel持有的Document對(duì)應(yīng)的節(jié)點(diǎn)列表了。IStructuredModel構(gòu)建過(guò)程大致示意如下: 【IStructuredModel:句柄】 為什么說(shuō)IStucturedModel是句柄呢,其實(shí)模型本身的信息并不是IStucturedModel角色在承擔(dān),而是每個(gè)IStructuredModel都持有對(duì)應(yīng)的一個(gè)document。上圖顯示了IStrucuturedModel有兩種實(shí)現(xiàn):IDOMModel和ICSSModel,IDOMModel持有的是一個(gè)IDOMDocument,而ICSSModel持有的是一個(gè)ICSSDocument。真正持有模型節(jié)點(diǎn)信息的是IDOMDocument或者ICSSDocument,所以很大程度上我們可以將IStucturedModel理解為句柄(也不完全是這樣,大致這么理解是為了更好的搞清楚這幾者之間的關(guān)系^_^)。 【IStructuredModel構(gòu)建過(guò)程進(jìn)一步分析】 有了上面的解釋我們應(yīng)該清楚了,我們是基于IStructuredDocument語(yǔ)法劃分的基礎(chǔ)上建立起了對(duì)應(yīng)的IDOMDocument或者ICSSDoucment,IStructuredModel持有對(duì)應(yīng)的IDOMDocument或者ICSSDocument(當(dāng)然,同時(shí)也會(huì)持有對(duì)應(yīng)的IStructuredDocument)。所以到這里,我們可以稍微修正一下上面IStructuredModel構(gòu)造流程圖: 通過(guò)上面兩幅圖,語(yǔ)法Document(IStructuredDocument)、語(yǔ)義Document(IDOMDocument或者ICSSDocument)、WTP模型(IStructuredModel)三者的關(guān)系應(yīng)該更加清楚了吧^_^,后門我會(huì)再抽一節(jié)來(lái)總結(jié)和分析一下之間的關(guān)系。在我們的真是應(yīng)用中,語(yǔ)義Document(IDOMDocument或者ICSSDocument)一般在分析模型信息的時(shí)候才會(huì)用到,平時(shí)不會(huì)直接接觸到,所以我前面將IStructuredDocument稱之為WTP Document,將IStructuredModel稱之為WTP Model,壓根就沒提IDOMDocument或者ICSSDocument。 【IStructuredModel提供的核心操作】 1、模型管理相關(guān)的操作(十分重要): getModelManager:獲取模型管理器(關(guān)于這個(gè)概念的信息闡述,到會(huì)放到后門的章節(jié)中) getReferenceCount:獲取被模型的引用計(jì)數(shù)(和IModelManager的引用計(jì)數(shù)管理相關(guān)) getReferenceCountForEdit:獲取可寫方式的引用計(jì)數(shù) getReferenceCountForRead:獲取只讀方式的引用計(jì)數(shù) isShared:判斷該模型是否被IModelManager托管了,就是是否共享了 isSharedForEdit:本質(zhì)上是判斷該模型的只讀引用計(jì)數(shù)是否為零,是否被以只讀方式引用了 isSharedForRead:本質(zhì)上是判斷該模型的可寫引用計(jì)數(shù)是否為零,是否被以可寫方式引用了 releaseFromRead:減少只讀方式的引用計(jì)數(shù) releaseFromEdit:減少可寫方式的引用計(jì)數(shù) 以上這些操作都是和一個(gè)重要的角色I(xiàn)ModelManger相關(guān),后門的章節(jié)中會(huì)詳細(xì)闡述!!! 2、相關(guān)監(jiān)聽器操作(IModelStateListener非常常用): addModelLifecycleListener:我們使用較少,處理模型生命周期事件,詳細(xì)信息參見org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent和org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener addModelStateListener:我們使用較多,用于模型狀態(tài)變化監(jiān)聽,我們下一節(jié)在開發(fā)Structured Model分析視圖時(shí)候就會(huì)用到。詳細(xì)信息參加org.eclipse.wst.sse.core.internal.provisional.IModelStateListener 3、訪問語(yǔ)法Document和語(yǔ)義Document(很常用!!!): IStructuredDocument getStructuredDocument:獲取語(yǔ)法Document IDOMDocument getDocument:定義在IStructuredModel的子類型IDOMModel中 ICSSDocument getDocument:定義在IStructuredModel的子類型ICSSModel中 IndexedRegion getIndexedRegion(int offset):根據(jù)位置定位對(duì)應(yīng)語(yǔ)義Document(IDOMDocument或者ICSSDocument)中對(duì)應(yīng)的節(jié)點(diǎn),返回結(jié)果是一個(gè)IDOMNode或者ICSSNode 4、自身狀態(tài)相關(guān)操作(也較為常用): isDirty() isSaveNeeded() save() save(EncodingRule encodingRule) save(IFile iFile) save(IFile iFile, EncodingRule encodingRule) save(OutputStream outputStream) IStructuredModel reinit() IStructuredModel reload(InputStream inputStream) 5、其他幾個(gè)重要操作 String getBaseLocation():獲取本模型對(duì)應(yīng)資源的位置信息。注意:某種程度上,IStructuredModel是面向資源文件的,而語(yǔ)法Doucment或者語(yǔ)義Document則不是,要注意其中的區(qū)別!!! ...其他的幾個(gè)以后用到的時(shí)候再說(shuō)!!! 6、recording相關(guān)操作,我們后面不會(huì)直接用到此特性,不做闡述 【IDOMModel核心操作】 IDOMDocument getDocument就是它的核心操作,上面已經(jīng)說(shuō)過(guò)。 【IndexedRegion:WTP語(yǔ)義Document的Node】 如果將IStructuredDocument視為WTP的語(yǔ)法Document,則可以將IStructuredModel視為WTP模型,IDOMDocument或ICSSDocument視為WTP語(yǔ)義Document。而這個(gè)語(yǔ)義Document的中節(jié)點(diǎn)的超類型則就是IndexedRegion(org.eclipse.wst.sse.core.internal.provisional.IndexedRegion),IDOMDocument或ICSSDocument不過(guò)是其中兩種節(jié)點(diǎn)類型(這個(gè)熟悉xml的朋友肯定知道了,xml Document本身就是一個(gè)xml Node)。首先來(lái)看一下IndexedRegion的類型體系圖: 說(shuō)明:IDOMNode繼承自IndexedRegion接口,而ICSSNode并不是,看起來(lái)有點(diǎn)不自然^_^。那我們就把他們合并起來(lái)吧,來(lái)個(gè)全家福: 從上面的類型體系我們可以看的出來(lái),IndexedRegion主要分為兩類:一類是dom node(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode),另一類是css node(org.eclipse.wst.css.core.internal.provisional.document.ICSSNode,這邊用接口更舒服點(diǎn)^_^)。WTP在實(shí)現(xiàn)dom node系列時(shí),借助于org.w3c.dom節(jié)點(diǎn)體系,這也是我們后面接觸最多的;WTP在實(shí)現(xiàn)css node的時(shí)候,則和org.w3c.dom沒有任何關(guān)系,完全是自己構(gòu)建節(jié)點(diǎn)體系。 【IndexedRegion接口主要操作】 上面看了IndexedRegion主要分為兩類,那么我們?cè)倩剡^(guò)頭看一下IndexedRegion提供的核心操作: 我們看到IndexedRegion提供的核心操作都是關(guān)于位置信息的。這可能會(huì)產(chǎn)生一些疑問,例如位置信息的計(jì)算是不是挺繁瑣的呢?怎么實(shí)現(xiàn)的呢? 我們回顧一下前面在分析IStructuredDocument的時(shí)候,我們ITextRegion接口(IStructuredDocument中節(jié)點(diǎn)的超類型)提供的核心操作之一就是提供位置信息。如果我們的每個(gè)IndexRegion節(jié)點(diǎn)都持有相關(guān)的ITextRegion節(jié)點(diǎn)不就可以了???確實(shí)是這么做的。這和我們這篇文章開頭說(shuō)的是一直的,基于語(yǔ)義的IStructuredModel(實(shí)際上是構(gòu)造背后的IDOMDocument和ICSSDocument)構(gòu)建的基礎(chǔ)是基于語(yǔ)法的IStructuredDocument。 那么現(xiàn)在如果我們有了位置信息(例如編輯器中的光標(biāo)的offset),我們就可以把WTP Doucment中的ITextRegion和WTP Model中的IndexedRegion(IDOMNode、ICSSNode)聯(lián)系起來(lái)了。 【IDOMNode:IndexRegion的XML DOM實(shí)現(xiàn)】 絕大部分頁(yè)面資源的語(yǔ)義Document都是基于IDOMNode的,我們就介紹它^_^。首先來(lái)看一副圖片,可以和前面第三節(jié)介紹IStructuredDocument時(shí)用的圖片做一個(gè)比較: 可以看到,IStructuredDocument的text region的劃分是基于語(yǔ)法的,只要是一個(gè)閉合區(qū)域就是一個(gè)IStructuredDocumentRegion;IDOMDocument中的indexed region是基于語(yǔ)義劃分的,看上圖就可以看的出來(lái),element之間都是有父子掛系的,再看一下一個(gè)dom attr區(qū)域是由三個(gè)text region組成的。 具體差異,后門的章節(jié)中會(huì)分析。 前面說(shuō)過(guò)了,WTP model中的節(jié)點(diǎn)IndexedRegion有兩種實(shí)現(xiàn):一種是基于xml dom的IDOMNode,另外一種是WTP完全自己實(shí)現(xiàn)的ICSSNode,這里重點(diǎn)介紹IDOMNode(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode)。有一點(diǎn)一定要記住:IDOMNode同時(shí)是一個(gè)w3c xml Node。 說(shuō)明:既然遵守了w3c xml dom協(xié)議,那么我們的一個(gè)IDOMDocument本質(zhì)上就是一個(gè)dom document,那這個(gè)dom對(duì)象肯定非常耗內(nèi)存了。是的,IDOMDocument絕對(duì)是個(gè)重量級(jí)對(duì)象,但是選擇dom還是有原因的:一可以提供較為豐富的語(yǔ)義;再者,一個(gè)頁(yè)面資源的大小通常不會(huì)太大,也就是說(shuō)一般不會(huì)產(chǎn)生非常巨大的DOM對(duì)象(例如大于10M)。 這其實(shí)和我們?cè)谌粘?yīng)用中選擇基于DOM的還是基于流的XML解析技術(shù)一樣,要求語(yǔ)義是否豐富、對(duì)應(yīng)的xml對(duì)象內(nèi)存占用是兩個(gè)重要的考慮。 為了dom對(duì)象耗內(nèi)存的缺點(diǎn)降低到最低,和通常的解決辦法一樣,WTP也提供了模型緩存管理功能,也就是后面我們要說(shuō)的IModelManager,對(duì)IStructuredModel進(jìn)行引用計(jì)數(shù)管理(我們的IDOMDocument這個(gè)大dom對(duì)象會(huì)被IStructuredModel持有)。 【IDOMNode核心操作】 圖中可以看的出來(lái),我們的IDOMNode有兩個(gè)超類型:IndexedRegion和org.w3c.dom.Node,我們的IDOMNode就提供了三類主要的操作: 1、IndexedRegion相關(guān)操作:提供位置相關(guān)信息的操作 2、org.w3c.dom.Node相關(guān)的操作:dom node相關(guān)操作(注意:有些dom node中規(guī)定的部分操作,WTP并沒有實(shí)現(xiàn),這些操作對(duì)WTP來(lái)說(shuō)意義不大,畢竟一個(gè)頁(yè)面資源并不完全是一個(gè)xml文件哈^_^) 3、IDOMNode接口自身定義的操作。這又可以大致分為三類: A、語(yǔ)法Document(IStructuredDocument)相關(guān)操作 IStructuredDocument getStructuredDocument IStructuredDocumentRegion getStartStructuredDocumentRegion IStructuredDocumentRegion getEndStructuredDocumentRegion IStructuredDocumentRegion getFirstStructuredDocumentRegion IStructuredDocumentRegion getLastStructuredDocumentRegion 有了以上操作,我們就可以從語(yǔ)法和語(yǔ)義兩個(gè)層面來(lái)綜合分析一個(gè)節(jié)點(diǎn)了 B、獲取WTP 模型(IDOMModel) IDOMModel getModel() C、內(nèi)容設(shè)置相關(guān)操作 getSource:獲取節(jié)點(diǎn)內(nèi)容 setSource:設(shè)置節(jié)點(diǎn)內(nèi)容 getValueSource:獲取value內(nèi)容 setValueSource:設(shè)置value內(nèi)容 setEditable setDataEditable setChildEditable isDataEditable isChildEditable D、其他操作,不常用,就不列舉了 【···說(shuō)明···】 IDOMNode相關(guān)的子接口類型也是常用的,里面都有對(duì)應(yīng)的操作,可以幫助我們更好地操作語(yǔ)義Document,進(jìn)行語(yǔ)義層面的分析。相關(guān)要熟練了解使用的接口為: org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement org.eclipse.wst.xml.core.internal.provisional.document.IDOMText 如果不了解XML DOM的,最好也稍微了解一下,對(duì)操作語(yǔ)義Document有很大幫助。 【ICSSNode:IndexRegion的CSS實(shí)現(xiàn)】 我們后面基本用不到,因?yàn)槲覀兓旧喜蝗为?dú)分析css資源,就不在本系列文章中去講了。如果要分析ICSSNode,則可以參照分析IDOMNode的實(shí)現(xiàn),祝好運(yùn)^_^ 【后記】 我們這一節(jié)分析了WTP語(yǔ)義Document(IDOMDocument)和WTP模型(IStructuredModel),下一節(jié)會(huì)首先來(lái)開發(fā)一個(gè)類似于上一節(jié)中的分析視圖:DOM Document分析視圖。然后會(huì)單獨(dú)拿出一節(jié)來(lái)分析這些重要概念之間的關(guān)系,同時(shí)會(huì)突出強(qiáng)調(diào)org.eclipse.wst.sse.core.internal.provisional.IModelManager. 到這里,WTP最重要的數(shù)據(jù)模型已經(jīng)介紹完畢了,如下: 語(yǔ)法Document:IStructuredDocument 語(yǔ)義Document:重點(diǎn)介紹了IDOMDocument WTP模型:IStructuredModel(重點(diǎn)介紹了IDOMModel) 【模塊關(guān)系】 借住于上面的分析過(guò)程,到現(xiàn)在我們對(duì)開頭提到的幾個(gè)插件的體系結(jié)構(gòu)應(yīng)該有了一定的認(rèn)識(shí)了: WTP我們常接觸的是WST、JST、RDB三個(gè)組成部分,RDB是專門來(lái)處理數(shù)據(jù)庫(kù)相關(guān)的,本系列文章中不做討論。JST的基礎(chǔ)是WST,看上圖中就可以發(fā)現(xiàn),JSP類型的模型都需要基于WST中各種類型的模型,能不是基礎(chǔ)嗎。從語(yǔ)義上也講的通哈,沒有css、html、javascript、xml這些東東,怎么能建立起jsp呢??? 再回顧文章開頭我們列舉的12個(gè)插件工程,結(jié)合Eclipse的“分層法則”,12個(gè)插件工程之間的關(guān)系應(yīng)該很清楚了吧...
本博客中的所有文章、隨筆除了標(biāo)題中含有引用或者轉(zhuǎn)載字樣的,其他均為原創(chuàng)。轉(zhuǎn)載請(qǐng)注明出處,謝謝!
posted on 2008-09-09 18:03 zhuxing 閱讀(2939) 評(píng)論(3) 編輯 收藏 所屬分類: Eclipse Plug-in & OSGI 、WTP(Web Tools Platform)
Powered by: BlogJava Copyright © zhuxing