Inhaltstypen verwenden

Hinweis:  In dieser Betrachtung wird ganz bewusst der Ausdruck Datei für Inhalt vermieden. Die Laufzeit-Steuerkomponente für Inhalt nimmt nicht an, dass Inhalte in einer Datei im Dateisystem enthalten sind. Es enthält jedoch ein Protokoll, über das Dateibenennungsmuster Inhaltstypen zugeordnet werden können. In der Praxis stellen diese Dateinamen Dateien im Dateisystem dar, aber bei der Implementierung des Inhaltssystems wird niemals davon ausgegangen, dass sich Inhalte im Dateisystem befinden müssen. Der Abschnitt Dateicodierung und Inhaltstypen beschreibt datei-orientierte Inhaltstypfunktionalität, die durch das Ressourcen-Plug-in der Plattform ergänzt wird und sollte von allen Entwicklern gelesen werden, die ein Interesse daran haben, die Inhaltstyp-API in diesem Kontext zu verwenden.

Informationen über Inhaltstypen sammeln

Inhaltstypen werden durch IContentType dargestellt. Diese Schnittstelle stellt einen eindeutigen Inhaltstyp dar, der einen Datenstrom lesen und inhaltstyp-spezifische Informationen interpretieren kann. Inhaltstypen sind hierarchisch strukturiert. Ein Inhaltstyp für XML-Daten wird beispielsweise als untergeordnetes Element eines Textinhaltstyps angesehen. Auf diese Art können neue Inhaltstypen die Attribute oder das Verhalten allgemeinerer Inhaltstypen nutzen.

Der IContentTypeManager ist der Eingangspunkt, der Zugriff auf einen Großteil der inhaltstypbezogenen APIs bietet, die von der Plattformlaufzeit bereitgestellt wird. Um einen Verweis auf den IContentTypeManager der Plattform zu erhalten, können Clients die API Platform verwenden:

IContentTypeManager contentTypeManager = Platform.getContentTypeManager();

Clients können den IContentTypeManager der Plattform verwenden, um Informationen über die Inhaltstypen im System zu sammeln.

Den Inhaltstyp für einen Datenstrom erkennen

Über den Aufruf der API IContentTypeManager ist es möglich, den Inhaltstyp eines bestimmten Datenstroms zu bestimmen. Dies wird folgendermaßen erreicht:

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

Dies wird den angemessensten IContentType für die bereitgestellte Eingabe zurückgeben, bzw. null, wenn keiner entdeckt werden kann. Mehrere Inhaltstypen können für einen Datenstrom als angemessen erachtet werden. In diesem Fall verwendet die Plattform heuristische Methoden, um zu bestimmen, welcher dieser Typen auszuwählen ist. Der Dateiname ist das erste Kriterium, nach dem Inhaltstypen ausgewählt werden. Er kann ausgelassen werden, aber dies kann zu zwei Problemen führen: die Ergebnisse könnten weniger zutreffend sein, da viele anderweitige Inhaltstypen die gleiche Eingabe annehmen könnten; der Einfluss auf die Leistung ist ebenfalls erheblich, da allen Inhaltstypen auf der Plattform die Möglichkeit gewährt werden muss, den Datenstrom zu analysieren. Daher sollten Clients zusammen mit dem Datenstrom stets einen Dateinamen bereitstellen, sofern dieser zur Verfügung steht.

Einen Datenstrom beschreiben

Eine andere interessante Funktion der Unterstützung von Inhaltstypen in der Plattform ist die Möglichkeit, die Inhalte eines binären bzw. Zeichendatenstroms zu beschreiben. Der folgende Codeausschnitt zeigt, wie dies erreicht werden kann:

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

Das zurückgegebene Exemplar vonIContentDescription beschreibt den Inhaltstyp, sowie zusätzliche relevante Informationen, die aus den bereitgestellten Inhalten extrahiert wurden. Die Inhaltsbeschreibung speichert inhaltsspezifische Merkmale als Schlüssel/Wert-Paare. Die Plattform selbst ist in der Lage, Merkmale wie z.B. den Zeichensatz und die Byteanordnung textbasierter Datenströme zu beschreiben. Weitere Merkmale können jedoch über Bereitsteller von Inhaltstypen definiert werden.

Inhaltssensitive Merkmale bereitstellen

Neue Inhaltstypen werden oft als spezialisierte Version bestehender Typen definiert. Diese Hierarchie etabliert eine"ist ein"-Beziehung zwischen einem abgeleiteten Inhaltstyp und seinem Basistyp. Plug-in-Entwickler müssen dies bei der Implementierung inhaltssensitiver Funktionen berücksichtigen. Wenn eine bestimmte Funktion auf einen bestimmten Inhaltstyp anwendbar ist, muss die Funktion ebenfalls auf abgeleitete Inhaltstypen anwendbar sein. Die Methode IContentType.isKindOf(IContentType superType) ermöglicht eine Bestimmung, ob zweiIContentTypen zusammengehörig sind. Die Methode IContentType.getBaseType() ermöglicht die Bestimmung des Basistyps eines bestimmten IContentTypes.