コンテンツ・タイプの使用

注:  ここでは、コンテンツについて説明するときにファイルという用語を使用しません。 ランタイム・コンテンツ・エンジンでは、コンテンツがファイル・システムのファイルに含まれていることが想定されていません。ただし、このエンジンには、コンテンツ・タイプをファイル命名パターンに関連付けることができるプロトコルが含まれています。実際には、このファイル名は、ファイル・システムのファイルを表していますが、コンテンツ・システムの実装では、コンテンツがファイル・システムに配置されているとは前提されていません。『ファイル・エンコードおよびコンテンツ・タイプ』では、プラットフォーム・リソース・プラグインによってコントリビュートされているファイル指向コンテンツ・タイプの機能について説明しています。このコンテキストでコンテンツ・タイプ 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 の基本型を判別できます。