eclipse扩展点_Eclipse扩展点评估变得容易
eclipse擴(kuò)展點(diǎn)
編碼Eclipse擴(kuò)展點(diǎn)評(píng)估有點(diǎn)冗長(zhǎng),而且很少能自我解釋。 當(dāng)我最近忙于自己忙于這個(gè)話題時(shí),我寫(xiě)了一個(gè)小助手,目的是減少通用編程步驟的樣板代碼,同時(shí)增加開(kāi)發(fā)指導(dǎo)和可讀性。
它原來(lái)是不容易找到一個(gè)表現(xiàn)的解決方案,其中所有的使用情況下,我可以從目前的項(xiàng)目中提取匹配。 因此,我認(rèn)為分享我的發(fā)現(xiàn)并看看其他人對(duì)此有何想法是一個(gè)好主意。
Eclipse擴(kuò)展點(diǎn)評(píng)估
考慮一個(gè)簡(jiǎn)單的擴(kuò)展點(diǎn)定義,該定義支持?jǐn)U展的無(wú)限貢獻(xiàn)。 這些貢獻(xiàn)中的每一個(gè)都應(yīng)該提供Runnable實(shí)現(xiàn)來(lái)執(zhí)行某種操作:
通常的評(píng)估任務(wù)是檢索所有貢獻(xiàn),創(chuàng)建可執(zhí)行擴(kuò)展并調(diào)用以下每個(gè)擴(kuò)展 :
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分為較小的方法來(lái)闡明其職責(zé),但該類(lèi)也將填充更多的粘合代碼。 當(dāng)我發(fā)現(xiàn)這些部分很難閱讀且難以編寫(xiě)時(shí),我正在思考一種流暢的界面方法,該方法應(yīng)指導(dǎo)開(kāi)發(fā)人員完成各個(gè)實(shí)現(xiàn)步驟。
結(jié)合Java 8 lambda表達(dá)式,我能夠創(chuàng)建一個(gè)輔助工具,將evaluate功能歸結(jié)為:
public void evaluate() {new RegistryAdapter().createExecutableExtensions( EP_ID, Runnable.class ).withConfiguration( ( runnable, extension ) -> runnable.run() ).process(); }誠(chéng)然,我作弊了一點(diǎn),因?yàn)橥ㄟ^(guò)使用java 8 Collection#forEach功能而不是顯式循環(huán),可以對(duì)第一個(gè)示例進(jìn)行一些改進(jìn)。 但是我認(rèn)為這仍然不能使代碼真正出色!
有關(guān)如何使用擴(kuò)展點(diǎn)機(jī)制擴(kuò)展Eclipse的一般信息,您可以參考在線文檔的《 插件開(kāi)發(fā)環(huán)境指南 》。
RegistryAdapter
助手實(shí)現(xiàn)的主要類(lèi)是RegistryAdapter ,它封裝了系統(tǒng)的IExtensionRegistry實(shí)例,并提供了一組方法來(lái)定義針對(duì)特定擴(kuò)展點(diǎn)應(yīng)執(zhí)行的操作 。 目前,適配器允許讀取貢獻(xiàn)配置或創(chuàng)建可執(zhí)行擴(kuò)展。
如上所示,使用多個(gè)表示的方法對(duì)多個(gè)貢獻(xiàn)進(jìn)行評(píng)估–為了精確地評(píng)估一個(gè)貢獻(xiàn)元素,以單數(shù)表示的方法是合適的。 這意味著對(duì)特定運(yùn)行的貢獻(xiàn),你會(huì)用操作createExecutableExtension而不是createExecutableExtension s 。
根據(jù)選擇的操作,可以使用不同的配置選項(xiàng)。 由于流暢的API實(shí)施了一種語(yǔ)法以提高指導(dǎo)和編程安全性,因此這成為可能。 例如, readExtension操作不允許注冊(cè)ExecutableExtensionConfigurator ,因?yàn)檫@將是一個(gè)無(wú)效的組合。
withConfiguration方法允許在每個(gè)可執(zhí)行擴(kuò)展名創(chuàng)建后對(duì)其進(jìn)行配置或初始化。 但是,如上面的示例所示,它也可以用于直接調(diào)用可運(yùn)行擴(kuò)展。 由于createExecutableExtension(s)的類(lèi)型安全實(shí)現(xiàn),因此可以在lambda表達(dá)式中訪問(wèn)擴(kuò)展實(shí)例而無(wú)需強(qiáng)制轉(zhuǎn)換。
最后,方法process()執(zhí)行指定的操作,并在需要進(jìn)一步處理的情況下返回創(chuàng)建的元素的類(lèi)型化Collection :
Collection<Extension> extensions= new RegistryAdapter().readExtensions( EP_ID ).process();謂詞
但是,如何通過(guò)適配器選擇單個(gè)蝕擴(kuò)展點(diǎn)貢獻(xiàn)元素呢? 假設(shè)我們?cè)谏厦娴呢暙I(xiàn)定義中添加了一個(gè)屬性ID 。 RegistryAdapter的流利API允許指定可用于選擇特定貢獻(xiàn)的Predicate :
public void evaluate() {new RegistryAdapter().createExecutableExtension( EP_ID, Runnable.class ).withConfiguration( ( runnable, extension ) -> runnable.run() ).thatMatches( attribute( "id", "myContribution" ) ).process(); }有一個(gè)實(shí)用程序類(lèi)Predicates ,它提供一組預(yù)定義的實(shí)現(xiàn),以簡(jiǎn)化諸如屬性選擇之類(lèi)的常見(jiàn)用例。 上面的代碼是使用靜態(tài)導(dǎo)入實(shí)現(xiàn)的快捷方式:
.thatMatches( Predicates.attribute( "id", "myContribution" ) )其中“ myContribution”代表在擴(kuò)展貢獻(xiàn)中聲明的唯一ID值:
<extension point="com.codeaffine.post.contribution"><contribution id="myContribution" class="com.codeaffine.post.MyContribution"></contribution> </extension>當(dāng)然,在預(yù)設(shè)不足的情況下,可以實(shí)現(xiàn)自定義謂詞:
public void evaluate() {Collection<Extension> extensions = new RegistryAdapter().readExtensions( EP_ID, Description.class ).thatMatches( (extension) -> extension.getValue() != null ).process(); }延期
通常,Eclipse擴(kuò)展點(diǎn)評(píng)估大部分時(shí)間在IConfigurationElement 。 適配器API在區(qū)分?jǐn)U展點(diǎn)和配置元素方面不夠清晰,并提供了一個(gè)稱(chēng)為Extension的簡(jiǎn)單封裝。 但是對(duì)于更復(fù)雜的任務(wù), Extension實(shí)例使基礎(chǔ)配置元素可訪問(wèn)。
通常, Extension為屬性值,貢獻(xiàn)名稱(chēng),貢獻(xiàn)值,嵌套貢獻(xiàn)提供訪問(wèn)器,并允許創(chuàng)建可執(zhí)行擴(kuò)展。 引入此抽象的主要原因之一是擁有一個(gè)API,該API將檢查后的CoreException隱式轉(zhuǎn)換為運(yùn)行時(shí)異常,因?yàn)槲伊?xí)慣于使用Fail Fast方法而無(wú)需進(jìn)行大量檢查后的異常處理。
異常處理
但是,如果在插件啟動(dòng)時(shí)調(diào)用Eclipse擴(kuò)展評(píng)估或在后臺(tái)執(zhí)行Eclipse擴(kuò)展評(píng)估,則不能選擇“快速失敗”。 而且,在特定的貢獻(xiàn)引起問(wèn)題之后,忽略剩余的貢獻(xiàn)肯定是不合理的。 因此,適配器API允許使用顯式異常處理來(lái)替換快速失敗機(jī)制:
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 }注意,返回的貢獻(xiàn)集合當(dāng)然只包含那些沒(méi)有遇到任何麻煩的元素。
在哪里得到的?
對(duì)于那些想要簽出的人,這里有一個(gè)P2存儲(chǔ)庫(kù),其中包含com.codeaffine.eclipse.core.runtime功能,提供RegistryAdapter及其隨附的類(lèi)。 該存儲(chǔ)庫(kù)位于:
- http://fappel.github.io/xiliary/
源代碼和問(wèn)題跟蹤器托管在:
- https://github.com/fappel/xiliary
盡管目前完全沒(méi)有文檔,但是應(yīng)該很容易開(kāi)始使用本文給出的解釋。 但是請(qǐng)記住,這個(gè)小工具還處于早期狀態(tài),可能會(huì)發(fā)生一些API更改。 特別是在循環(huán)貢獻(xiàn)時(shí)僅處理CoreException仍然有點(diǎn)太弱。
結(jié)論
以上各節(jié)介紹了RegistyAdapter的基本功能,并重點(diǎn)介紹了它如何簡(jiǎn)化Eclipse擴(kuò)展點(diǎn)評(píng)估。 我用適配器替換了當(dāng)前項(xiàng)目中的舊實(shí)現(xiàn),并且沒(méi)有遇到任何麻煩,這意味著到目前為止,該解決方案對(duì)我來(lái)說(shuō)很有希望……
但是,除了眼神之外,還有更多。 有了這個(gè)小幫手,再加上其他自定義斷言類(lèi)型,為擴(kuò)展點(diǎn)的評(píng)估功能編寫(xiě)集成測(cè)試確實(shí)很容易。
但是,該主題超出了本文的范圍,下一次將涉及該主題。 因此,請(qǐng)保持關(guān)注,不要忘記分享知識(shí),以防您發(fā)現(xiàn)上述方法有用–謝謝!
翻譯自: https://www.javacodegeeks.com/2014/10/eclipse-extension-point-evaluation-made-easy.html
eclipse擴(kuò)展點(diǎn)
總結(jié)
以上是生活随笔為你收集整理的eclipse扩展点_Eclipse扩展点评估变得容易的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网上预约备案(备案预约单)
- 下一篇: apache.camel_使用Apach