*概述
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)
