org.eclipse.core.runtime.content パッケージは、データ・ストリームのコンテンツ型の定義をサポートします。 コンテンツ型は、エンコード方式の自動判別、比較エディターの選択、メニュー・コントリビューションなど、Eclipse の複数のコンテンツ依存機能で使用されます。IContentTypeManager によって管理される中央コンテンツ・レジストリーによって、プラグインがコンテンツ型を定義し、コンテンツの読み取りおよび記述方法を認識するクラスを指定できるようになります。 コンテンツ型をコントリビュートするには、コンテンツ・フレームワークの基本的な理解が必要となります。
注: ここでは、コンテンツについて説明するときにファイルという用語を使用しません。 ランタイム・コンテンツ・エンジンでは、コンテンツがファイル・システムのファイルに含まれていることが想定されていません。 ただし、このエンジンには、コンテンツ型をファイル命名パターンに関連付けることができるプロトコルが含まれています。 実際には、このファイル名は、ファイル・システムのファイルを表していますが、コンテンツ・システムの実装では、コンテンツがファイル・システムに配置されているとは前提されていません。 『ファイル・エンコードおよびコンテンツ型』では、プラットフォーム・リソース・プラグインによってコントリビュートされているファイル指向のコンテンツ型について説明しています。
プラットフォームは、プレーン・テキストや XML データ・ストリームなどの基本的なコンテンツ型をいくつか定義します。 これらのコンテンツ型は、他のプラグインによってコントリビュートされるコンテンツ型と同様に定義されます。 コンテンツ型のフレームワークが理解できるように、プラットフォームがテキスト・コンテンツ型を どのように定義するのかについて説明します。
プラグインは、拡張ポイント org.eclipse.core.runtime.contentTypes の拡張をコントリビュートして、コンテンツ型を定義します。 この拡張では、プラグインはコンテンツ型の ID と名前、および入力ストリームを読み取り、コンテンツの説明を指定できる IContentDescriber を指定します。以下のコードの断片は、テキスト・コンテンツ型に対するランタイム・プラグインのコントリビューションです。
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> priority="high" file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
TextContentDescriber は、入力ストリームを読み取り、指定されたコンテンツが有効なテキストのサンプルかどうかを即時に判別します。 プラットフォームが特定のデータ・ストリームのコンテンツを判別しようとすると、メソッド describe(inputStream, description) が呼び出されます。 IContentDescriber は、コンテンツがそのコンテンツ型の有効なサンプルを表しているかどうかを即時に判別し、コンテンツがそのコンテンツ型に一致しているかどうかを示す定数を戻します。 コンテンツがコンテンツ型と一致している場合は、ディスクライバーが、用意されている IContentDescription にデータに関する情報を書き込む必要があります。
IContentDescription は、キー/値の対にコンテンツに固有の属性を格納します。 これらの属性は、特定のコンテンツ型に固有のものです。 プラットフォームは、文字セットの属性およびテキスト・ファイルのバイト・オーダーを指定しますが、他の項目も定義できます。
IContentTypeManager は、コンテンツ・レジストリーのプロトコルを定義します。 クライアントは、このクラスを使用して、コンテンツ・ストリームをテストしたり、システム内の他のコンテンツ型に関する情報を検索することができます。
コンテンツ型は、IContentType で表されます。 このクラスは、データ・ストリームを読み取り、コンテンツ型に固有の情報を解釈する方法を認識する固有のコンテンツ型を表します。 コンテンツ型は、階層の性質を持ちます。 例えば、XML データのコンテンツ型は、テキスト・コンテンツ型の子と見なされます。
<content-type id="xml" name="%xmlContentTypeName" base-type="text" priority="high" file-extensions="xml" default-charset="UTF-8"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> </content-type>
これにより、新規コンテンツ型は、より一般的なコンテンツ型の属性や振る舞いを利用することができます。
プラットフォーム・テキスト・コンテンツ型は、テキスト・コンテンツの文字セットを定義しません。 テキスト・コンテンツ型の子は、XML コンテンツ型と同様に、必要に応じて、さまざまなデフォルトの文字セットを自由に指定することができます。 XML ストリームのデフォルトの文字セットは、UTF-8 です。 つまり、XML ファイルにコンテンツ内に明示的に表示されたエンコード方式がない場合、そのエンコード方式は UTF-8 と見なされます。
同じ種類のコンテンツに対して、2 つの独立したプラグインがコンテンツ型をコントリビュートすることがあります。 この場合、プラットフォームは、コンテンツに対して一方のコンテンツ・ディスクライバーのみを選択します。 選択されるディスクライバーは、contentTypes 拡張に指定できる priority 属性を使用して決定されます。 2 つのプラグインが同じコンテンツに対して同じ優先順位のコンテンツ型をコントリビュートした場合、選択されるコンテンツ・ディスクライバーは、不定です。 ただし、コンテンツ・ディスクライバーが選択されると、「失われる」コンテンツ・ディスクライバーを参照するすべてのレジストリーは、 選択されたコンテンツ・ディスクライバーに別名化されます。