对Eclipse扩展点进行编码的评估有些冗长,而且很少能自我解释。 最近,我开始忙于处理这个主题,我写了一个小助手,目的是减少通用编程步骤的样板代码,同时增加开发指导和可读性。

它原来是不容易找到一个表现的解决方案,其中所有的使用情况下,我可以从目前的项目中提取匹配。 因此,我认为分享我的发现并看看别人对它的看法是一个好主意。

Eclipse扩展点评估

考虑一个简单的扩展点定义,该定义支持扩展的无限贡献。 这些贡献中的每一个都应该提供Runnable实现来执行某种操作:

通常的评估任务是检索所有贡献,创建可执行扩展并调用以下每个扩展

public class ContributionEvaluation {private static final String EP_ID= "com.codeaffine.post.contribution";public void evaluate() {IExtensionRegistry registry = Platform.getExtensionRegistry();IConfigurationElement[] elements= registry.getConfigurationElementsFor( EP_ID );Collection<Runnable> contributions = new ArrayList<Runnable>();for( IConfigurationElement element : elements ) {Object extension;try {extension = element.createExecutableExtension( "class" );} catch( CoreException e ) {throw new RuntimeException( e );}contributions.add( ( Runnable )extension );}for( Runnable runnable : contributions ) {runnable.run();}}
}

尽管可以将evaluate分成较小的方法来阐明其职责,但该类也将填充更多的粘合代码。 当我发现这些部分难以阅读且难以编写时,我正在思考一种流畅的界面方法,该方法应指导开发人员完成各个实现步骤。

结合Java 8 lambda表达式,我可以创建一个辅助工具,将evaluate功能归结为:

public void evaluate() {new RegistryAdapter().createExecutableExtensions( EP_ID, Runnable.class ).withConfiguration( ( runnable, extension ) -> runnable.run() ).process();
}

诚然,我作弊了一点,因为通过使用java 8 Collection#forEach功能而不是显式循环,可以对第一个示例进行一些改进。 但是我认为这仍然不能使代码真正出色!

有关如何使用扩展点机制扩展Eclipse的一般信息,您可以参考在线文档的《 插件开发环境指南 》。

注册表适配器

辅助实现的主要类是RegistryAdapter ,它封装了系统的IExtensionRegistry实例,并提供了一组方法来定义针对特定扩展点应执行的操作 。 目前,适配器允许读取贡献配置或创建可执行扩展。

如上所示,使用多个表示的方法对多个贡献进行评估–为了精确评估一个贡献元素,以单数表示的方法是合适的。 这意味着对特定运行的贡献,你会用操作createExecutableExtension而不是createExecutableExtension s

根据选择的操作,可以使用不同的配置选项。 由于流畅的API实施了一种语法以提高指导和编程安全性,因此这成为可能。 例如, readExtension操作不允许注册ExecutableExtensionConfigurator ,因为这将是一个无效的组合。

withConfiguration方法允许在每个可执行扩展名创建后对其进行配置或初始化。 但是,如上面的示例所示,它也可以用于直接调用可运行扩展。 由于createExecutableExtension(s)的类型安全实现,因此可以在lambda表达式中访问扩展实例而无需强制转换。

最后,方法process()执行指定的操作,并在需要进一步处理的情况下返回所创建元素的类型化Collection

Collection<Extension> extensions= new RegistryAdapter().readExtensions( EP_ID ).process();

谓语

但是,如何通过适配器选择单个蚀扩展点贡献元素呢? 假设我们在上面的贡献定义中添加了一个属性IDRegistryAdapter的流利API允许指定可用于选择特定贡献的Predicate

public void evaluate() {new RegistryAdapter().createExecutableExtension( EP_ID, Runnable.class ).withConfiguration( ( runnable, extension ) -> runnable.run() ).thatMatches( attribute( "id", "myContribution" ) ).process();
}

有一个实用程序类Predicates ,它提供一组预定义的实现,以简化诸如属性选择之类的常见用例。 上面的代码是使用静态导入实现的快捷方式:

.thatMatches( Predicates.attribute( "id", "myContribution" ) )

其中“ myContribution”代表扩展贡献中声明的唯一ID值:

<extension point="com.codeaffine.post.contribution"><contribution id="myContribution" class="com.codeaffine.post.MyContribution"></contribution>
</extension>

当然,在预设不足的情况下,可以实现自定义谓词:

public void evaluate() {Collection<Extension> extensions = new RegistryAdapter().readExtensions( EP_ID, Description.class ).thatMatches( (extension) -> extension.getValue() != null ).process();
}

延期

通常,Eclipse扩展点评估大部分时间在IConfigurationElement 。 适配器API在区分扩展点和配置元素方面不够清晰,并提供了一个称为Extension的简单封装。 但是对于更复杂的任务, Extension实例使基础配置元素可访问。

通常, Extension为属性值,贡献名称,贡献值,嵌套贡献提供访问器,并允许创建可执行扩展。 引入此抽象的主要原因之一是拥有一个API,该API将检查后的CoreException隐式转换为运行时异常,因为我习惯于使用Fail Fast方法而无需进行大量检查后的异常处理。

异常处理

但是,如果在插件启动时调用Eclipse扩展评估或在后台执行Eclipse扩展评估,则不能选择“快速失败”。 并且,在特定贡献引起问题之后,忽略剩余的贡献肯定是不合理的。 因此,适配器API允许使用显式异常处理替换Fail Fast机制:

public void evaluate() {Collection<Runnable> contributions = new RegistryAdapter().createExecutableExtensions( EP_ID, Runnable.class ).withExceptionHandler( (cause) -> handle( cause ) ).process();[...]
}private void handle( CoreException cause ) {// do what you gotta do
}

注意,返回的贡献集合当然只包含那些没有遇到任何麻烦的元素。

在哪里得到的?

对于那些想要签出的人,这里有一个P2存储库,其中包含com.codeaffine.eclipse.core.runtime功能,提供RegistryAdapter及其随附的类。 该存储库位于:

  • http://fappel.github.io/xiliary/

源代码和问题跟踪器托管在:

  • https://github.com/fappel/xiliary

尽管此时文档已完全丢失,但应该很容易开始使用本文给出的说明。 但是请记住,这个小工具还处于早期状态,可能会进行一些API更改。 特别是在循环贡献时仅处理CoreException仍然有点太弱。

结论

以上各节介绍了RegistyAdapter的基本功能,并重点介绍了它如何简化Eclipse扩展点评估。 我用适配器替换了当前项目中的旧实现,并且没有遇到任何麻烦,这意味着到目前为止,该解决方案对我来说很有希望……

但是,除了眼神之外,还有更多。 有了这个小帮手,再加上其他自定义断言类型,为扩展点的评估功能编写集成测试确实很容易。

但是,该主题超出了本文的范围,下一次将涉及该主题。 因此,请保持关注,不要忘记分享知识,以防您发现上述方法有用–谢谢!

翻译自: https://www.javacodegeeks.com/2014/10/eclipse-extension-point-evaluation-made-easy.html

Eclipse扩展点评估变得容易相关推荐

  1. eclipse扩展点_Eclipse扩展点评估变得容易

    eclipse扩展点 编码Eclipse扩展点评估有点冗长,而且很少能自我解释. 当我最近忙于自己忙于这个话题时,我写了一个小助手,目的是减少通用编程步骤的样板代码,同时增加开发指导和可读性. 它原来 ...

  2. eclipse 扩展_Eclipse扩展的轻量级集成测试

    eclipse 扩展 最近,我为Eclipse扩展点评估引入了一个小助手. 辅助程序努力减少通用编程步骤的样板代码,同时增加开发指导和可读性. 这篇文章是希望的后续文章,它显示了如何将实用程序与Ass ...

  3. Eclipse扩展的轻量级集成测试

    最近,我为Eclipse扩展点评估引入了一个小助手. 辅助程序努力减少通用编程步骤的样板代码,同时增加开发指导和可读性. 这篇文章是希望的后续文章,展示了如何将实用程序与AssertJ定制断言结合使用 ...

  4. 35 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义在产品和废品的评估变式 (目标成本)

    业务背景:定义在产品和废品的评估变式 (目标成本) 事务码: SPRO SPRO路径:SPRO->控制->产品成本控制->成本对象控制->按定单划分的产品成本->期末结算 ...

  5. 22 CO配置-控制-产品成本控制-成本对象控制-检查制造订单 (PP) 的评估变式

    业务背景:检查制造订单 (PP) 的评估变式 事务码: OPN2 SPRO路径:SPRO->控制->产品成本控制->成本对象控制->按定单划分的产品成本->制造定单-&g ...

  6. SAP中评估变式中“外协加工物料的间接费用”

    近期有接到CO用户反映在做产品成本核算时,其中某个采用外协加工的模式的下级组件没有计算间接费用的问题:由于之前并没有相关处理经验,经过反复的查找分析咨询,最后找到这个决定外协加工物料是事参与间接费用计 ...

  7. 扩展坞可以把手机投到显示器吗_你的电脑可以省了!华为Mate 30搭配绿联新一代扩展坞轻松变电脑...

    上个月华为Mate 30 系列手机发布,惊艳了很多人.随着华为Mate 30系列的上市开售,这款备受瞩目的年度旗舰手机好评不断,从环幕屏的外观,到徕卡四摄拍照.超强芯片麒麟990.无实体音量调节等都被 ...

  8. Eclipse中文注释字体变大方法

    之前写java用的都是Intellj Idea,界面和使用都挺简便的,但由于上机课统一使用的是Eclipse,故下午的时候就下载了最新的Eclicpse,默认的代码字体都是比较小的,故可以用以下方法来 ...

  9. eclipse中如何把字体变大

    这篇文章教你们如何把eclipse中的字体变大,现在请大家欣赏我的表演,当当当当. 好了,不开玩笑了,正经的开始了- 1.首先,我们肯定要把eclipse打开,哈哈哈哈 2.第二步,点击工具栏中的Wi ...

最新文章

  1. 利用Github搭建自己的图床
  2. Eclipse:定制toString()
  3. 数据结构——马踏棋盘题解(贪心算法)
  4. 08 线性回归 + 基础优化算法【动手学深度学习v2】
  5. asp.net应用程序_如何在ASP.NET中为聊天应用程序构建键入指示器
  6. MyBatis多表查询(一对一,一对多,多对多)
  7. Scrapy操作浏览器获取网易新闻数据
  8. 均方根误差RMSE 均方根值(RMS)+ 均方根误差(RMSE)+标准差(Standard Deviation)
  9. mac trace traceroute 简要使用
  10. supermicro服务器芯片,服务器厂商做的超频小板子:实在无语
  11. Direct3D透视教程,教你做出属于自己的透视
  12. 【考研数学】二. 一元函数积分学
  13. 实验十七 通信录csv文件管理
  14. 邮件系统安全篇:GCMAil邮件系统怎样利用DNS黑名单高效实现反垃圾邮件过滤
  15. 监控视频分发转发服务器性能,网络视频监控系统流媒体分发存储服务器软件设计...
  16. excel表格打印每页都有表头_Excel打印表格不再手忙脚乱
  17. 智能车图像处理22--三线的延续
  18. PS 滤镜——素描算法(一)
  19. 【算法上车②】编译打包华为摄像头yolov3 狗识别demo
  20. Unity3d轻量渲染管线(LWRP)民间文档

热门文章

  1. MyBatisPlus分页
  2. AndroidOkhttp3上传单个文件
  3. html session 登录页面跳转页面跳转页面,session失效后跳转到登陆页面
  4. oracle spacial,Oracle Spacial(空间数据库)geometry元数据结构
  5. MySQL检索数据(过滤+通配符+正则表达式)
  6. 本地方法(JNI)——访问数组元素+错误处理
  7. 程序中 设置jvm 参数_高效应用程序的7个JVM参数
  8. java类似sizeof_如何用Java编写类似C的Sizeof函数
  9. java 多线程和并行编程_Java 8中的并行和异步编程
  10. mockito 静态_在Java 8中使用不带静态导入的Mockito