分析eclipse的marker實現機制


*概述

Eclipse的Resource代表了文件系統的資源,這些資源全部在一個Workspace中維護,所以Workspace就是整個資源系統的控制中心.

Eclipse對Resource提供各種功能,常用的如增加,刪除,移動等,特別有鏈接,和下面將介紹的標記(Marker).

在Workspace里有一個MarkerManager,負責管理所有資源的Marker,是整個Marker體系的控制中心,Marker的持久化存儲和讀取,創建,刪除,修改等,都由它負責.

 

*創建Marker

Resource.createMarker(String type),生成MarkerInfo->MarkerManager.add(),將MarkerInfo和ResourceInfo關聯,創建Marker的ID.

 

*獲取Marker

簡單查找Resource.findMarker(),從ResourceInfo中查找獲取指定的MarkerInfo.

復雜查找Resource.findMarkers(),這個功能更加強大,能夠獲取一組Marker.MarkerManager通過擴展點的定義的type繼承關系和這個方法的其他參數篩選.

 

*擴展點org.eclipse.core.resources.markers

---通過擴展點定義一種Marker類型

---定義的內容,<!ELEMENT extension (super* , persistent? , attribute*)>

1)super,type的父類型,可以多繼承

2)persistent,type是否持久化,在Workspace啟動/關閉時,由MarkerManager讀寫.

注,對於persistent=true的情況,還可以通過一個隱含的屬性名transient去修改

MarkerTypeDefinitionCache

 

3)attribute,定義這類marker包含的標准屬性,可以說反應了這種類型Marker的功能,方便查找和規范的使用這個Marker.

注意,1)通過代碼可以往Map中放入任意內容.2)IMarker中定義了一些通用的屬性名稱

---通過擴展點方式,定義Marker類型是配置Marker特性(繼承,持久化)的唯一途徑.

 

*Marker構造

---Marker是負責對外提供接口,其實質內容都在MarkerInfo中.

---有一個ID號,它是Marker的唯一標示.

從代碼看在並發時不能保證createMarker時每個Marker的ID唯一,因為ID是全局Workspace的nextMarkerId++獲得,無法保證原子性操作.

但是其中有些代碼又考慮了並發的情況,所以這個實現還是有問題的,不推薦在並發中創建Marker.

---Marker都有類型,String getType(),

1)用於創建和查詢Marker.Eclipse就是通過type來分類Marker

Resource.createMarker(String type);

Resource.findMarkers(String type, boolean includeSubtypes, int depth)

2)通過MarkerManager的MarkerTypeDefinitionCache類管理Marker的類型關系.類型是有繼承關系的,並且是多繼承.

 

*題外,設計思路

---可以發現,eclipse對一些資源都采用類似*Info的實現方式,如

Resource->Workspace(維護)->ResourceInfo

Marker->Workspace.markerMananger(維護)->MarkerInfo

---將對象的一部分或實質的內部內容分離開,這將有利於類接口的分離實現,同時是否有利更加方便的操作,或者管理資源呢?

 

*總結

---Marker自身只是一種持久化的存儲機制,與UI無關,它的作用就是為Resource提供記錄其額外信息的方式.

至於如何將這種機制和UI(如錯誤視圖,書簽,斷點),或者其他功能關聯就看具體情況.

---它的局限就是不能支持自定義保存路徑(我還沒看到)

---它的缺點就是不支持並發創建Marker,當然在Eclipse的RCP中並發屬於少數現象,但我覺的可以改進而且對代碼的改動不會太大.

 

*參考資料

http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2FresAdv_markers.htm(關於如何使用Marker)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM