コントリビュート・コンテンツ・タイプ

新規コンテンツ・タイプの提供

プラットフォームは、プレーン・テキストや 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>

これにより、推奨コンテンツ・タイプが使用できるかどうかに関係なく参照可能なプレースホルダーがプラグインに提供されます。推奨コンテンツ・タイプを使用できる場合、コンテンツ・タイプ・カタログでコンテンツ・タイプの別名が抑制され、それに対する参照はターゲット・コンテンツ・タイプへの参照として解釈されます。推奨コンテンツ・タイプを使用できない場合は、別名が通常のコンテンツ・タイプとして使用されます。