2011-10-28 11 views
2

拡張ポイントを提供する既存のEclipseプラグインがあります。このプラグインは標準のEclipseメカニズムを使用して拡張機能を検索します。このプラグインのコードでは、次のコードを使用して拡張機能を取得します。既存のEclipseプラグイン拡張を上書きする

IConfigurationElement[] config = Platform.getExtensionRegistry() 
      .getConfigurationElementsFor(extensionPoint); 
if (config.length > 0) { 
    return config[0]; 
} 

コードでわかるように、最初に見つかった拡張子のみが使用されています。このプラグインはすでに拡張機能を提供していますが、この拡張機能はデフォルトの場合に使用されます。

デフォルトの拡張機能の動作を変更する必要があるため、新しいプラグインを作成して同じ拡張ポイントを拡張します。しかし、デフォルトの拡張子は常にIConfigurationElement配列の最初の拡張子であることが分かります。したがって、常にそれが選択されます。

見つけたIConfigurationElementアレイに自分のプラグインを最初に表示させるにはどうしたら、デフォルトのプラグインの代わりに自分のプラグインが使用されますか?

既存のプラグインは他人によって書かれており、絶対に必要になるまで変更する必要はありません。

答えて

1

これは、どちらの方法でも拡張ポイントから拡張機能を取得するのは悪い方法だと思います。彼らが作成した特定のエクステンションをプラグインシステムでロードするだけの場合は、代わりにgetConfigurationElementsFor(String namespace, String extensionPointName, String extensionId)メソッドを使用し、他の人がエクステンションポイントを使用する可能性を排除することができます。現在のところ、どの拡張子が得られるかは分かりません。チャンスは、彼らが拡張を得ると仮定して、後でコード内にインスタンスがあり、彼らが期待する拡張を得られないときに、ClassCastExceptionがドアをノックするということです。 (システムで一度このようなバグがあった場合)

もちろん、多くの拡張機能を処理するコードを変更するのが最善の方法です!

しかし、あなたの質問には、 ExtensionRegistryが配列をどのように満たしているのかわかりませんが、APIは言いません。おそらく、配列の最初に置くことができる拡張の特定のバージョンを設定する方法があるかもしれません。 Extensionがどのように見つかったかを正確に知るためには、ExtensionRegistryのコードを調べなければなりません。私はそれがアルファベット順であるかもしれないと思うが、わからない。

もう1つの方法は、既存のプラグインをプラグインでオーバーロードして機能を置き換えることです。非常に汚いアプローチですが、場合によっては実行可能です。 See one of my questions regarding this

+2

ExtensionRegistryは、非決定的な方法で拡張を返します。つまり、別のコンピュータに異なる順序でプラグインをインストールすると、最初に上書きが返されますが、保証はありません。彼らが望む拡張機能をソート/優先順位付け/選択するのは、拡張ポイントの消費者の仕事です。 –

関連する問題