コンテンツ型の使用

注:  ここでは、コンテンツについて説明するときにファイルという用語を使用しません。 ランタイム・コンテンツ・エンジンでは、コンテンツがファイル・システムのファイルに含まれていることが想定されていません。 ただし、このエンジンには、コンテンツ型をファイル命名パターンに関連付けることができるプロトコルが含まれています。 実際には、このファイル名は、ファイル・システムのファイルを表していますが、コンテンツ・システムの実装では、コンテンツがファイル・システムに配置されているとは前提されていません。 『ファイル・エンコードおよびコンテンツ型』では、プラットフォーム・リソース・プラグインによってコントリビュートされているファイル指向コンテンツ型の機能について説明しています。このコンテキストでコンテンツ型 API を使用する方法に関心のある開発者は、必ず一読してください。

コンテンツ型に関する情報の検出

コンテンツ型は、IContentType で表されます。 このインターフェースは、データ・ストリームを読み取り、コンテンツ型固有の情報を解釈する方法を認識する固有のコンテンツ型を表します。 コンテンツ型は、階層の性質を持ちます。 例えば、XML データのコンテンツ型は、テキスト・コンテンツ型の子と見なされます。これにより、新規コンテンツ型は、より一般的なコンテンツ型の属性や振る舞いを利用することができます。

IContentTypeManager は、プラットフォーム・ランタイムが提供するコンテンツ型関連 API のほとんどにアクセス可能なエントリー・ポイントです。 プラットフォーム IContentTypeManager への参照を取得する場合、クライアントは以下の Platform API を使用できます。

IContentTypeManager contentTypeManager = Platform.getContentTypeManager();

クライアントはプラットフォーム IContentTypeManager を使用して、システム内のコンテンツ型に関する情報を取得できます。

データ・ストリームのコンテンツ型の検出

バイト・ストリームが指定された場合、次のように IContentTypeManagerAPI を呼び出して、コンテンツ型を判別できます。

InputStream stream = ...;
IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml");
stream.close();

これにより、入力が指定された場合は、最も適した IContentType が戻されます。何も検出されなかった場合は、null が戻されます。指定されたデータ・ストリームに、複数のコンテンツ型が適していると見なされる場合があります。 この場合、プラットフォームは試行錯誤して、選択すべきコンテンツ型を決定します。 コンテンツ型を選択する場合の最初の基準は、ファイル名です。 ファイル名は省略できますが、2 つの問題点が生じます。1 つは、関係しない多くのコンテンツ型が同じ入力を受け入れることができるため、結果が不正確になる場合があることです。もう 1 つは、プラットフォーム内のすべてのコンテンツ型にストリームを分析する機会を与える必要が生じるため、パフォーマンスが著しく低下することです。 したがって、ファイル名を使用できない場合を除いて、クライアントには常にストリームと共にファイル名を指定する必要があります。

データ・ストリームの記述

プラットフォームのコンテンツ型サポートのもう 1 つの重要な機能は、バイナリーまたは文字ストリームのコンテンツ記述機能です。 次のコードの断片は、その仕組みを示します。

InputStream stream = ...;
IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml");
stream.close();

戻された IContentDescription インスタンスは、指定されたコンテンツから抽出されたコンテンツ型およびその他の関連情報を示します。 コンテンツ記述には、コンテンツ固有のプロパティーがキー/値ペアの形式で格納されます。 プラットフォーム自体に、文字セットやテキストベース・ストリームのバイト・オーダーなどのプロパティーを記述することもできますが、その他のプロパティーはコンテンツ型プロバイダーで定義できます。

コンテンツ依存機能の提供

新規のコンテンツ型は通常、既存コンテンツ型を特殊化して定義されます。この階層により、派生コンテンツ型と基本型間に「is a」の関係が確立されます。 プラグイン開発者は、コンテンツ依存機能を実装する場合、この点を考慮する必要があります。 指定された機能が指定されたコンテンツ型に適用できる場合、この機能はどんな派生コンテンツ型にも適用できる必要があります。 IContentType.isKindOf(IContentType superType) メソッドを使用すると、2 つの IContentType が関連しているかどうかを判別できます。 メソッド IContentType.getBaseType() を使用すると、指定された IContentType の基本型を判別できます。