Eclipse扩展点评估变得容易

对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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断js中数据类型 的最短代码

判断字符串类型的&#xff1a;function isString(obj) {return obj "" obj;}判断bool类型的&#xff1a;function isBool(obj){return obj !!obj;}判断数字类型的&#xff1a;function isNumber(obj){return obj -obj;} 更多专业前端知识&#xff0c;请上 【猿2048…

python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记

python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记 此篇为上一篇pyqt5图像压缩小工具改良版。因为比较简单&#xff0c;下面直接贴上代码。 效果图&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file hellopyqt5.ui # # Crea…

c++面试题(1)

1. 构造函数与析构函数是否可以被重载&#xff0c;为什么&#xff1f; 2. 指针和引用的区别。 3. malloc和new的区别。 4. 字符串反转。用两种方法&#xff0c;第二种方法只用一个数串&#xff0c;直接互换。 5. 一个time类&#xff0c;包含minu…

开发人员需要了解的有关xPaaS的一切

最近&#xff0c;我一直在阅读有关Red Hat产品的很多文章&#xff0c;并且对云等也很感兴趣&#xff0c;对于我来说&#xff0c;更详细地研究Red Hat的云产品是很明显的。 Arun在今年4月对JBoss xPaaS进行了很好的概述&#xff0c;我认为可能不但应该给您一个概述&#xff0c;而…

Mybatis与Spring整合

Mybatis与Spring整合 既然我们已经学了Mybatis的基本开发了&#xff0c;接下来就是Mybatis与Spring的整合了&#xff01; 以下使用的是Oracle数据库来进行测试 导入jar包 aopalliance.jarasm-3.3.1.jaraspectjweaver.jarc3p0-0.9.1.2.jarcglib-2.2.2.jarcommons-logging.ja…

算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

堆基础 堆(Heap)是具有这样性质的数据结构&#xff1a;1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值&#xff1a; 图片来源&#xff1a;这里 堆可以用数组存储&#xff0c;插入、删除会触发节点shift_down、shift_up操作&#xff0c;时间复杂度O(logn)&#xff…

C++静态数据成员和静态成员函数

在C面向对象编程过程当中&#xff0c;对象与对象之间的数据不是共享&#xff0c;在设计类的时候&#xff0c;有时候需要一些对象之间共享的数据&#xff0c;除了把所要共享的数据设置为全局数据或者函数之外&#xff0c;还可以利用C的静态机制。 1、静态数据成员 class 类名 {…

带有AOP和注释的Java方法记录

有时&#xff0c;我想记录&#xff08;通过slf4j和log4j &#xff09;方法的每次执行&#xff0c;查看其接收的参数&#xff0c;返回的内容以及每次执行需要多少时间。 这是我在AspectJ &#xff0c; jcabi-aspects和Java 6注释的帮助下进行的操作&#xff1a; public class F…

JDBC【介绍JDBC、使用JDBC连接数据库、简单的工具类】

什么是JDBC JDBC全称为&#xff1a;Java Data Base Connectivity,它是可以执行SQL语句的Java API 为什么我们要用JDBC 市面上有非常多的数据库&#xff0c;本来我们是需要根据不同的数据库学习不同的API&#xff0c;sun公司为了简化这个操作&#xff0c;定义了JDBC API【接口…

mysql binlog空间维护

默认情况下&#xff0c;mysql主从同步的binlog日志&#xff0c;会一直保存。 对于如果已同步好的数据&#xff0c;这显然比较浪费资源。 且如果生产环境磁盘太小&#xff0c;随时还会爆掉&#xff0c;所以很有必要作好binlog的空间维护。 以下操作&#xff0c;直接在master上操…

UVA 10604 Chemical Reaction

UVA_10604 一开始看错题了&#xff0c;以为化学物质最多会有10个&#xff0c;所以定义不了10维的去跑&#xff0c;便用了类似状态压缩的方式&#xff0c;把化学物质的状态压缩成一个整数&#xff0c;然后用哈希表建立一个索引&#xff0c;再用记忆化搜素去处理就可以了。 之所以…

一键发布到Maven Central的方法

当我向Maven Central发布Java开源库jcabi-aspects的新版本时&#xff0c;我花费了30秒钟的时间。 甚至更少。 最近&#xff0c;我发布了0.17.2版本。 您可以在Github第80期中看到所有情况&#xff1a; 如您所见&#xff0c;我向Rultor发出了命令&#xff0c;它向Maven Central…

vue组件详解(一)——组件与复用

一、什么是组件 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。 二、组件用法 组件需要注册后才可以使用&#xff0c;注册有全局注册和局部注册两种方式。 2.1 全局注册后&#xff0c;任何V ue 实例都可以使用。如&am…

fatal error LNK1120: 1 unresolved externals

出现这个错误可能原因很多&#xff0c;我的问题是来自于把template写在了cpp文件中template 有弊端 就是 他的实现部分必须和声明部分在一起 你声明在一个头文件 定义在另一个头文件 编译器好笨!!!!!!!!!,它根本就找不到 ///只要你把实现部分拷贝到你声明的头文件,就没有错…

sed命令学习

sed编辑器&#xff0c;处理文本过程如下&#xff1a; sed把当前处理的行保存在一个临时缓冲区中&#xff0c;然后处理缓冲区中的行&#xff0c;完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除&#xff0c;然后下一行读入&#xff0c;处理和显示。处理完输入…

在Spring Boot应用程序中测试邮件代码

在构建Spring Boot应用程序时&#xff0c;您可能会需要添加邮件配置。 实际上&#xff0c;在Spring Boot中配置邮件与在Spring Bootless应用程序中配置邮件没有太大区别。 但是&#xff0c;如何测试邮件配置和提交工作正常&#xff1f; 我们来看一下。 我假设我们有一个引导的…

CSS基础语法(三) CSS的6种特性

样式表常用写法及特性&#xff08;组合、继承、关联性、权值性、层叠性、重要性&#xff09; 1.样式的组合&#xff1a;把具有相同声明定义的选择符组合在一起&#xff0c;并用逗号隔开。&#xff0d;例如&#xff1a;段落元素p、单元格元素td和类c1可以使用相同样式&#xff…

卷积,DFT,FFT,图像FFT,FIR 和 IIR 的物理意义

卷积&#xff1a; 冲击信号会对线性系统产生冲击响应。 冲击信号可分解为平移度和幅度。其对线性系统的冲击响应可以分解为点点间的经平移和缩放的各个冲击响应的累加&#xff0c;通过卷积的表达式表示。 所谓的冲击响应&#xff0c;就是线性系统对任何输入信号的响应&#xff…

洛谷P2822 组合数问题

分析&#xff1a; 首先预处理出来&#xff0c;杨辉三角二维前缀和 代码&#xff1a; #include<cstdio> using namespace std; long long f[2005][2005],sum[2005][2005]; int main() {long long T,k;scanf("%lld%lld",&T,&k);for(long long i0;i<20…

es6笔记

es6对象浅复制&#xff1a; 字符串大小比较&#xff1a; 如果是汉字&#xff1a;a.charCodeAt() > b.charCodeAt() //使用carCodeAt将器转为asci码&#xff0c;在进行比较 如果是非汉字的字符串&#xff1a;直接比较或者使用上面的转码比较都可以。 如果是日期比较&#xff…