Inhaltstypen ergänzen

Einen neuen Inhaltstyp bereitstellen

Die Plattform definiert einige fundamentale Inhaltstypen, wie z.B. Textdateien oder XML. 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 seine Inhaltstypen definiert.

Plug-ins definieren Inhaltstypen, indem sie eine Erweiterung für den Erweiterungspunkt org.eclipse.core.runtime.contentTypes ergänzen. In dieser Erweiterung gibt ein Plug-in eine einfache ID und einen Namen für den Inhaltstyp an (die vollständige ID ist stets die einfache ID mit dem aktuellen Namensbereich als Präfix. Der folgende Codeausschnitt zeit eine vereinfachte Version der Inhaltstypergänzung 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>
		...

Das Attribut file-extensions definiert, welche Dateierweiterungen dem Inhaltstyp zugeordnet sind (in diesem Beispiel ".txt"). Das Attribut file-names (in diesem Fall nicht verwendet) erlaubt die Zuordnung vollständiger Namen. Beide Attribute werden bei der Bestimmung und Beschreibung des Inhaltstyps berücksichtigt (wenn der Client einen Dateinamen bestimmt).

Das Element describer wird verwendet, um einen content describer (Inhaltsbeschreibungsfunktion) für den Inhaltstyp zu definieren.

Inhalt bestimmen und beschreiben

Ein Inhaltstyp sollte eine Inhaltsbeschreibungsfunktion bereitstellen, wenn keine identifizierbaren Merkmale, die eine automatische Inhaltstypbestimmung ermöglichen, bzw. keine anderen interessanten Eigenschaften in Daten, die dem Inhaltstyp zugeordnet sind, vorliegen. Im Fall von org.eclipse.core.runtime.text, ist durch eine reine Betrachtung der Inhalte eine Bestimmung des Inhaltstyps nicht möglich. An Textströme können jedoch byte order marks (Byteanordnungsmarkierungen) vorne angehängt werden. Dieses Merkmal könnte für Clients interessant sein, so dass eine Inhaltsbeschreibungsfunktion gewährleistet ist.

Die Beschreibungsfunktion ist eine Implementierung von IContentDescriber oder ITextContentDescriber. Letzteres ist eine spezialisierte Version des ersteren, die von Beschreibungsfunktionen von textorientierten Inhaltstypen implementiert werden muss. Unabhängig von der Art des Inhaltstyps hat die Beschreibungsfunktion zwei Aufgaben: bei der Bestimmung helfen, ob der entsprechende Inhaltstyp für einen bestimmten Datenstrom angemessen ist, und interessante Merkmale aus einem Datenstrom, von dem angenommen wird, dass er zu dem entsprechenden Inhaltstyp gehört, extrahieren.

Die Methode describe(stream, description) wird immer dann aufgerufen, wenn die Plattform den Inhaltstyp eines bestimmten Datenstroms bestimmen bzw. dessen Inhalte beschreiben muss. Die Beschreibung ist null, wenn nur eine Erkennung angefordert wird. Ansonsten sollte die Inhaltsfunktion versuchen, die Inhaltsbeschreibung ausschließlich mit anderen Merkmalen, die durch Lesen des Datenstroms gefunden wurden, auszuschließen. Die Formatierungssteuerzeichen des Inhaltstyp sollten verwendet werden, um Merkmale mit Standardwerten zu deklarieren (org.eclipse.core.runtime.xml deklariert beispielsweise UTF-8 als Standardzeichensatz).

Es wird erwartet, dass die Inhaltsbeschreibungsfunktion bei der Ausführung seiner Aufgaben so schnell wie möglich ausgeführt wird. Je weniger der Datenstrom lesen muss, desto besser. Darüber hinaus wird erwartet, dass die Implementierung der Inhaltsbeschreibungsfunktion in einem Paket deklariert wird, das von der Plug-in-Aktivierung ausgeschlossen ist (siehe Manifestheader des Eclipse-AutoStart-Pakets). Da bei Initialisierung des Inhaltstypgerüsts ein Exemplar aller Inhaltsbeschreibungsfunktionen erstellt wird, führt eine Nichterfüllung dieser Anforderung zu vorzeitiger Aktivierung. Dies sollte vermieden werden. Zukünftige Implementierungen der Plattform könnten sich weigern, ein Exemplar von Beschreibungsfunktionen zu erstellen, wenn dies eine Aktivierung des jeweiligen Plug-ins auslösen würde.

Vorhandenen Inhaltstyp erweitern

Inhaltstypen sind hierarchisch strukturiert. Auf diese Art können neue Inhaltstypen die Attribute oder das Verhalten allgemeinerer Inhaltstypen nutzen. Ein Inhaltstyp für XML-Daten wird beispielsweise als untergeordnetes Element eines Textinhaltstyps angesehen:

<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>

Eine XML-Datei wird als eine Art Textdatei angesehen. Daher sollten alle Features, die auf letztere anwendbar sind, auch auf erstere anwendbar sein.

Beachten Sie, dass der XML-Inhaltstyp mehrere Inhaltstypattribute überschreibt, die ursprünglich im Textinhaltstyp definiert wurden, wie z.B. die Dateizuordnungen und die Implementierungen der Beschreiberfunktion. Dieser Inhaltstyp deklariert außerdem einen Standardmerkmalwert für das Merkmal charset. Dies bedeutet, dass bei der Inhaltsbeschreibung eines Datenstroms, der als XML-Inhaltstyp angesehen wird, die Plattform auf "UTF-8" gesetzt wird, wenn die Beschreibungsfunktion das Merkmal 'Zeichensatz' nicht ausfüllt.

Ein weiteres Beispiel: Der Inhaltstyp org.eclipse.ant.core.antBuildFile (für Ant Build Scripts) erweitert den XML-Inhaltstyp:

<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>

Beachten Sie, dass der Standardwert für das Merkmal 'Zeichensatz' übernommen wird. Es ist möglich, eine übernommene Eigenschaft oder Beschreibungsfunktion zu stornieren, indem sie mit einer leeren Zeichenfolge als Wert erneut deklariert werden.

Zusätzliche Dateizuordnungen

Neue Dateizuordnungen können zu bestehenden Inhaltstypen hinzugefügt werden. Das Ressourcen-Plug-in ordnet beispielsweise org.eclipse.core.runtime.xml Dateien des Typs ".project" zu:

	<extension point="org.eclipse.core.runtime.contentTypes">
	<file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/>
	...

Aliasing für Inhaltstypen

Aufgrund der erweiterbaren Natur von Eclipse kann es vorkommen, dass ein Inhaltstyp, von dem ein Plug-in abhängt, in einer bestimmten Produktkonfiguration nicht verfügbar ist. Dies kann durch Aliasing für Inhaltstypen umgangen werden. E Alias eines Inhaltstyps ist ein Platzhalter für einen anderen bevorzugten Inhaltstyp, dessen Verfügbarkeit nicht garantiert ist. Die Laufzeit deklariert beispielsweise ein Alias (org.eclipse.core.runtime.properties) für den Inhaltstyp 'Java-Eigenschaften', der von Java Development Tooling (org.eclipse.jdt.core.javaProperties) bereitgestellt wird:

<!-- ein Platzhalter für Einstellungen, in denen der offizielle Typ von JDT nicht verfügbar ist -->			
<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>

Hierdurch wird Plug-ins ein Platzhalter geboten, auf den sie verweisen können, ganz gleich ob der bevorzugte Inhaltstyp verfügbar ist oder nicht. Ist dieser verfügbar, so wird der Aliasinhaltstyp vom Inhaltstypkatalog unterdrückt, und Verweise hierauf werden als Verweise auf den Zielinhaltstyp interpretiert. Ist er nicht verfügbar, so wird der Aliasname als normaler Inhaltstyp verwendet.