分析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// XXX: legacy code for support of <transient> tag. remove later.
if (elementName.equalsIgnoreCase("transient")) { //$NON-NLS-1$
	String bool = element.getAttribute("value"); //$NON-NLS-1$
	if (bool != null)
		this.isPersistent = !Boolean.valueOf(bool).booleanValue();
}

 

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)

转载于:https://www.cnblogs.com/bronte/articles/2409194.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值