プラットフォームは、プレーン・テキストや XML などの基本的なコンテンツ型をいくつか定義します。 これらのコンテンツ型は、他のプラグインによってコントリビュートされるコンテンツ型と同様に定義されます。コンテンツ型のフレームワークが理解できるように、プラットフォームが一部のコンテンツ型を どのように定義するのかについて説明します。
プラグインは、拡張ポイント org.eclipse.core.runtime.contentTypes の拡張をコントリビュートして、コンテンツ型を定義します。
この拡張では、プラグインはコンテキスト型の単純な ID および名前を指定します (完全な ID は単純な ID であり、前に常に現在の名前空間が付加されます)。
次の断片は、org.eclipse.core.runtime.text
コンテキスト型コントリビューションを切り取ったバージョンです。
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
file-extensions
属性は、コンテンツ型に関連付けられるファイル拡張子を定義します (この例では「.txt」)。file-names
属性 (この例では使用しない) を使用すると、絶対パス名を関連付けることができます。
コンテンツ型の検出および記述を実行する場合 (クライアントが絶対パス名を提供する場合)、プラットフォームは両方の属性を考慮します。
describer
エレメントは、コンテンツ型の コンテンツ・ディスクライバー を定義する場合に使用します。
コンテンツ型の自動検出を許可する識別可能な特性がある場合、またはコンテンツ型に属するデータ内に目的のプロパティーが存在する場合、コンテンツ型はコンテンツ・ディスクライバーを提供する必要があります。
org.eclipse.core.runtime.text
の場合、コンテンツを調べただけでは、コンテンツ型を判別できません。
ただし、テキスト・ストリームの前に、クライアントが情報を必要としているプロパティーである バイト・オーダー・マークを付加して、コンテンツ・ディスクライバーを保証することができます。
ディスクライバーは IContentDescriber または ITextContentDescriber のインプリメンテーションです。後者は、テキスト指向コンテンツ型のディスクライバーによってインプリメントする必要がある前者を特殊化したものです。 コンテンツ型の性質に関係なく、ディスクライバーには 2 つの役割があります。1 つは、コンテンツ型が所定のデータ・ストリームに適切かどうかを判別すること、もう 1 つは、コンテンツ型に属すると思われるデータ・ストリームから目的のプロパティーを抽出することです。
プラットフォームが特定のデータ・ストリームのコンテンツ型を判別したり、そのコンテンツを記述しようとすると、メソッド describe(stream, description) が呼び出されます。検出のみが必要な場合、記述は null
になります。
それ以外の場合、ディスクライバーはコンテンツ記述を、ストリームの読み取りによって検出できるプロパティーのみで埋める必要があります。
デフォルト値を持つ任意のプロパティーを宣言する場合は、コンテンツ型のマークアップを使用する必要があります (例えば、org.eclipse.core.runtime.xml
はデフォルト文字セットとして UTF-8 を宣言します)。
役割を実行する場合、コンテンツ・ディスクライバーはできるだけ短時間で実行すると予測されます。 データ・ストリームの読みとり量が少ないほど、処理は向上します。また、コンテンツ・ディスクライバーのインプリメンテーションは、プラグイン活動化が免除されたパッケージ内で宣言されると予測されます (Eclipse-AutoStart バンドル・マニフェスト・ヘッダーを参照)。 コンテンツ型のフレームワークが初期化されると、すべてのディスクライバーがインスタンス化されるため、この要件に適合しない場合は、活動化が早期に行われます。この事態は回避する必要があります。 プラットフォームの今後のインプリメンテーションでは、ディスクライバーのインスタンス化によって対応するプラグインが活動化される場合、このインスタンス化が拒否される可能性があります。
コンテンツ型は、階層の性質を持ちます。これにより、新規コンテンツ型は、より一般的なコンテンツ型の属性や振る舞いを利用することができます。 例えば、XML データのコンテンツ型は、テキスト・コンテンツ型の子と見なされます。
<content-type id="xml" name="%xmlContentTypeName" base-type="org.eclipse.core.runtime.text" file-extensions="xml"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> <property name="charset" default="UTF-8"/> </content-type>
XML ファイルは 1 種のテキスト・ファイルであると見なされるため、テキスト・ファイルに適用できるすべての機能は、XML ファイルに適用できる必要があります。
XML コンテンツ型は、ファイルの関連付けやディスクライバーのインプリメンテーションなど、Text コンテンツ型で本来定義された複数のコンテンツ型属性をオーバーライドします。
また、このコンテンツ型は、charset
プロパティーのデフォルト・プロパティー値を宣言します。つまり、XML コンテンツ型に属すると見なされるデータ・ストリームのコンテンツ記述中に、ディスクライバーが文字セット・プロパティーを設定しない場合、プラットフォームはこのプロパティーを「UTF-8」に設定します。
その他に、org.eclipse.ant.core.antBuildFile
コンテンツ型 (Ant ビルド・スクリプト) が XML コンテンツ型を拡張する例があります。
<content-type
id="antBuildFile"
name="%antBuildFileContentType.name"
base-type="org.eclipse.core.runtime.xml"
file-names="build.xml"
file-extensions="macrodef,ent,xml">
<describer
class="org.eclipse.ant.internal.core.contentDescriber.AntBuildfileContentDescriber">
</describer>
</content-type>
文字セット・プロパティーのデフォルト値は継承されます。継承されたプロパティーまたはディスクライバーは、空ストリング値を使用して宣言し直すことにより、キャンセルすることができます。
既存のコンテンツ型に、新規のファイル関連付けを追加できます。例えば、リソース・プラグインは org.eclipse.core.runtime.xml
を「.project」ファイルに関連付けます。
<extension point="org.eclipse.core.runtime.contentTypes"> <file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/> ...
Eclipse は本来拡張可能であるため、プラグインが使用するコンテンツ型を所定の製品構成で使用できない場合があります。
この事態を回避するには、コンテンツ型の別名を使用します。
コンテンツ型の別名は、可用性が保証されていない別の推奨コンテンツ型のプレースホルダーです。
例えば、ランタイムは Java 開発ツール (org.eclipse.jdt.core.javaProperties
) が提供する Java プロパティー・コンテンツ型の別名 (org.eclipse.core.runtime.properties
) を宣言します。
<!-- a placeholder for setups where JDT's official type is not available -->
<content-type id="properties" name="%propertiesContentTypeName"
base-type="org.eclipse.core.runtime.text"
alias-for="org.eclipse.jdt.core.javaProperties"
file-extensions="properties">
<property name="charset" default="ISO-8859-1"/>
</content-type>
これにより、推奨コンテンツ型が使用できるかどうかに関係なく参照可能なプレースホルダーがプラグインに提供されます。 推奨コンテンツ型を使用できる場合、コンテンツ型カタログでコンテンツ型の別名が抑制され、それに対する参照はターゲット・コンテンツ型への参照として解釈されます。 推奨コンテンツ型を使用できない場合は、別名が通常のコンテンツ型として使用されます。