Inhoudtypen toevoegen

Een nieuw inhoudtype aanleveren

Het platform definieert enige fundamentele inhoudtypen, bijvoorbeeld platte tekst en XML. Deze inhoudtypen worden op dezelfde manier gedefinieerd als degene die worden aangeleverd door een andere plugin. We kijken naar de manier waarop het platform sommige van de inhoudtypen definieert, zodat u een beter beeld krijgt van het kader waarin u met inhoudtypen werkt.

In plugins worden inhoudtypen gedefinieerd door een extensie aan te leveren voor het extensiepunt org.eclipse.core.runtime.contentTypes. In deze extensie geeft een plugin een eenvoudig ID en een naam op voor het inhoudtype (het volledige ID is altijd het eenvoudige ID voorafgegaan door de huidige naamruimte). In het volgende codefragment ziet u een afgeslankte versie van de aanlevering van het inhoudtype 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>				...

Het attibuut file-extensions definieert welke bestandsextensies aan het inhoudtype zijn gekoppeld (in het voorbeeld ".txt"). Met het kenmerk file-names (in dit geval niet gebruikt) is koppelen aan volledige namen mogelijk. Het platform houdt rekening met beide kenmerken bij het uitvoeren van inhoudtypedetectie en -beschrijving (als de client een volledige naam opgeeft).

Het element describer wordt gebruikt om een contentdescriber voor het inhoudtype te definiëren.

Content herkennen en beschrijven

Een inhoudtype moet een contentdescriber leveren als er geen identificeerbare eigenschappen zijn, waarmee de automatische inhoudtypeherkenning wordt gestart, of of interessante eigenschappen van gegevens die tot het inhoudtype behoren. In het geval van org.eclipse.core.runtime.text is het niet mogelijk om het inhoudtype te bepalen door alleen naar de inhoud te kijken. Tekststromen kunnen echter wel worden voorafgegaan door een bytesorteerteken, een eigenschap waarin clients geïnteresseerd zijn, dus dit maakt een contentdescriber nuttig.

De describer is een implementatie van IContentDescriber of ITextContentDescriber. De laatste is een specialisatie van de eerste, die moet worden geïmplementeerd door describers van tekstgeoriënteerde inhoudtypen. Ongeacht het soort inhoudtype heeft de describer twee verantwoordelijkheden: het helpen bij het vaststellen of het inhoudtype geschikt is voor een bepaalde gegevensstroom en het ophalen van interessante eigenschappen uit een gegevensstroom die vermoedelijk tot het inhoudtype behoort.

De methode describe(stream, description) wordt aangeroepen zodra het platform het inhoudtype van een bepaalde gegevensstroom probeert vast te stellen of de content te beschrijven. De beschrijving heeft de waarde null als alleen detectie is aangevraagd. Anders moet de describer proberen de contentbeschrijving te vullen met eigenschappen die zijn gevonden door de stroom te lezen en verder geen andere. U moet de inhoudtypemarkup gebruiken om eigenschappen te declareren die standaardwaarden hebben (org.eclipse.core.runtime.xml declareert bijvoorbeeld UTF-8 als standaardtekenset).

De contentdescriber wordt tijdens het uitvoeren van zijn taak geacht zo snel mogelijk uitgevoerd te worden. Hoe minder van de gegevensstroom gelezen hoeft te worden, hoe beter. Verder wordt verwacht dat de implementatie van de contentdescriber wordt gedeclareerd in een pakket dat niet bij de pluginactivering is betrokken (zie de Eclipse-AutoStart-bundelmanifestheader). Alle describers worden geïnstantieerd bij het initialiseren van het inhoudtypeframework. Als u niet aan dit vereiste voldoet, kan vroegtijdige activering het gevolg zijn, wat voorkomen moet worden. Toekomstige implementaties van het platform weigeren mogelijk om describers te instantiëren als hierdoor de corresponderende plugin wordt geactiveerd.

Een bestaand inhoudtype uitbreiden

Inhoudtypen zijn van nature hiërarchisch. Hierdoor kunnen nieuwe inhoudtypen kenmerken of gedragsinstellingen van algemenere inhoudtypen overnemen. Een inhoudtype voor XML-gegevens wordt bijvoorbeeld beschouwd als onderliggend item van het tekstinhoudtype:

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

Een XML-bestand wordt beschouwd als een soort tekstbestand, dus alle beschikbare functies horen ook voor een XML-bestand beschikbaar te zijn.

Het XML-inhoudtype negeert verscheidene inhoudtypekenmerken die oorspronkelijk in het tekstinhoudtype zijn gedefinieerd, bijvoorbeeld bestandskoppelingen en de implementatie van de describer. In dit inhoudtype wordt verder een standaardwaarde gedeclareerd voor de eigenschap charset. Als de contentbeschrijving van een gegevensstroom als XML-inhoudtype wordt beschouwd en de describer geen tekenset opgeeft, wordt het platform ingesteld op "UTF-8".

In het volgende voorbeeld breidt het inhoudtype org.eclipse.ant.core.antBuildFile (voor Ant-buildscripts) het XML-inhoudtype uit:

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

De standaardwaarde voor de tekenset wordt overgenomen. Het is mogelijk om een overgenomen eigenschap of describer te annuleren door deze opnieuw te declareren met een lege tekenreeks als waarde.

Extra bestandskoppelingen

U kunt nieuwe bestandkoppelingen toevoegen aan bestaande inhoudtypen. De resourcesplugin koppelt bijvoorbeeld org.eclipse.core.runtime.xml aan ".project"-bestanden:

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

Inhoudtypen en aliassen

Vanwege het uitbreidbare karakter van Eclipse is er mogelijk geen inhoudtype voor een plugin beschikbaar in een bepaalde productconfiguratie. Dit is op te lossen door een alias voor het inhoudtype te gebruiken. Een inhoudtypealias is is een plaatshouder voor een ander inhoudtype, waarvan de beschikbaarheid niet is gegarandeerd. In de runtime wordt bijvoorbeeld een alias gedeclareerd (org.eclipse.core.runtime.properties) voor het inhoudtype voor Java-eigenschappen dat wordt geleverd door Java Development Tooling (org.eclipse.jdt.core.javaProperties):

<!-- een plaatshouder voor setups waarin officiële type van JDT niet beschikbaar is -->			
<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>

Hierdoor beschikken plugins over een plaatshouder om naar te verwijzen, ongeacht de beschikbaarheid van het voorkeursinhoudtype. Als het wel beschikbaar is, wordt het aliasinhoudtype geweerd uit de catalogus en worden verwijzingen ernaar geïnterpreteerd als verwijzingen naar het doelinhoudtype. Als dit niet het geval is, wordt de alias gebruikt als gewoon inhoudtype.