Das Paket org.eclipse.core.runtime.content bietet eine Unterstützung für die Definition von Inhaltstypen für Datenströme. Inhaltstypen werden von mehreren kontextbezogenen Komponenten von Eclipse verwendet, z.B. automatische Codierungsbestimmung, Vergleichseditorauswahl oder Menüergänzungen. Über eine zentrale, durch einen IContentTypeManager verwaltete Inhalts-Registrierungsdatenbank können Plug-ins Inhaltstypen definieren und eine Klasse angeben, die den Inhalt lesen und beschreiben kann. Für die Ergänzung von Inhaltstypen ist ein Grundverständnis des Inhaltsgerüsts notwendig.
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 Inhaltstypen, die durch das Ressourcen-Plug-in der Plattform ergänzt werden.
Die Plattform definiert einige fundamentale Inhaltstypen, wie z.B. Textdateien oder XML-Datenströme. Diese Inhaltstypen werden auf die gleiche Art definiert wie diejenigen, die von anderen Plug-ins ergänzt werden. Um ein besseres Verständnis des Inhaltstypgerüsts zu bekommen, wird im Folgenden untersucht, wie die Plattform den Textinhaltstyp definiert.
Plug-ins definieren Inhaltstypen, indem sie eine Erweiterung für den Erweiterungspunkt org.eclipse.core.runtime.contentTypes ergänzen. In dieser Erweiterung bestimmt ein Plug-in eine ID und einen Namen für den Inhaltstyp, sowie eine Funktion IContentDescriber, die einen Eingabedatenstrom lesen und eine Beschreibung des Inhalts bereitstellen kann. Im folgenden Ausschnitt ergänzt das Laufzeit-Plug-in den Textinhaltstyp:
<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> ...
Die Funktion TextContentDescriber liest den Eingabedatenstrom und bestimmt schnell, ob der gelieferte Inhalt eine gültige Textprobe ist. Die Methode describe(inputStream, description) wird immer dann aufgerufen, wenn die Plattform den Inhalt eines bestimmten Datenstroms bestimmen muss. Die Funktion IContentDescriber bestimmt schnell, ob die Inhalte eine gültige Probe des entsprechenden Inhaltstyps sind und gibt eine Konstante zurück, die angibt, ob der Inhalt mit seinem Typ übereinstimmt. Wenn der Inhalt mit dem entsprechenden Typ übereinstimmt, füllt die Beschreibungsfunktion außerdem die Beschreibung IContentDescription mit Informationen über die Daten.
IContentDescription speichert inhaltsbezogene Attribute in Schlüssel/Wert-Paaren. Diese Attribute beziehen sich auf den bestimmten Inhaltstyp. Die Plattform bestimmt Attribute für den Zeichensatz und die Byteanordnung einer Textdatei. Es können aber auch andere definiert werden.
IContentTypeManager definiert das Protokoll für die Inhalts-Registrierungsdatenbank. Clients können über diese Klasse einen Inhaltsdatenstrom testen oder Informationen über andere Inhaltstypen im System sammeln.
Inhaltstyp werden durch IContentType dargestellt. Diese Klasse 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.
<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>
Auf diese Art können neue Inhaltstypen die Attribute oder das Verhalten allgemeinerer Inhaltstypen nutzen.
Der Textinhaltstyp der Plattform definiert keinen Zeichensatz für Textinhalte. Untergeordnete Elemente des Textinhaltstyps können bei Bedarf verschiedene Standardzeichensätze frei definieren, ebenso wie es beim XML-Inhaltstyp der Fall ist. Der Standardzeichensatz für XML-Datenströme ist UTF-8. Dies bedeutet, dass eine Codierung UTF-8 angenommen wird, wenn in den Inhalten der XML-Datei nicht explizit eine andere Codierung angegeben ist.
Es ist denkbar, dass zwei unabhängige Plug-ins einen Inhaltstyp für die gleiche Art von Inhalt ergänzen. In diesem Fall wählt die Plattform nur eine Inhaltsbeschreibungsfunktion für den Inhalt aus. Die ausgewählte Beschreibungsfunktion wird über ein Attribut priority bestimmt, dass in der Erweiterung 'contentTypes' angegeben werden kann. Wenn zwei Plug-ins einen Inhaltstyp für den gleichen Inhalt mit der gleichen Priorität ergänzen, ist es nicht eindeutig, welche Beschreibungsfunktion ausgewählt werden wird. Sobald aber einmal eine Beschreibungsfunktion ausgewählt wird, erhalten alle Verweise in der Registrierungsdatenbank auf die "verlierende" Inhaltsbeschreibungsfunktion einen Aliasnamen der ausgewählten Funktion.