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