Plattformen definierar vissa grundläggande innehållstyper, till exempel oformaterad text och XML. De innehållstyperna definieras på samma sätt som innehållstyper från andra insticksprogram. Vi ska se på hur plattformen definierar en del av sina innehållstyper så att vi får en bättre insikt i ramverket för innehållstyper.
Insticksprogrammen definierar innehållstyper genom att bidra med en utökning för utökningspunkten org.eclipse.core.runtime.contentTypes.
I den här utökningen anger ett insticksprogram ett enkelt ID och ett namn för innehållstypen (det fullständiga IDt är alltid det enkla IDt med aktuellt namnområde som prefix).
I följande kodexempel visas en mindre version av innehållstypbidraget 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> ...
Attributet file-extensions
definierar vilka filtillägg som är associerade till innehållstypen (i det här exemplet ".txt"). Med attributet file-names
(används inte i det här fallet) går det att associera fullständiga namn. Båda attributen tas med i beräkningen när plattformen upptäcker och beskriver en innehållstyp (om klienten tillhandahåller ett filnamn).
Elementet describer
används till att definiera en innehållsbeskrivning
av innehållstypen.
En innehållstyp bör tillhandahålla en innehållsbeskrivningsfunktion om det finns några identifierbara kännetecken som gör att det går att upptäcka innehållstypen automatiskt, eller om det finns andra intressanta egenskaper i de data som tillhör innehållstypen. I fallet med org.eclipse.core.runtime.text
går det inte att avgöra innehållstypen endast genom innehållet.
Men textströmmarna kan föregås av en markering för byteordning, vilket är en egenskap som klienter kan ha nytta av att känna till, och det säkerställer en beskrivningsfunktion för innehållet.
Beskrivningsfunktionen är en implementering av IContentDescriber eller ITextContentDescriber. Det senare är en specialisering av det förstnämnda, som måste implementeras av beskrivningsfunktioner för textorienterade innehållstyper. Oberoende av innehållstypens natur har beskrivningsfunktionen två uppgifter: den ska hjälpa till att bestämma om innehållstypen är lämplig eller inte för en viss dataström, och den ska extrahera intressanta egenskaper från en dataström som antas höra till innehållstypen.
Metoden describe(stream, description) anropas alltid när plattformen gör ett försök att avgöra innehållstyp för en viss dataström eller beskriva innehållet. Beskrivningen är null
om endast upptäckt begärs.
I annat fall ska beskrivningsfunktionen fylla innehållsbeskrivningen med alla egenskaper som kan hittas genom läsning av strömmen, och endast dessa.
Innehållstypens märkordsspråk ska användas till att deklarera eventuella egenskaper som kan ha standardvärden (org.eclipse.core.runtime.xml
deklarerar till exempel UTF-8
som standardteckentabell).
När uppgiften utförs förväntas beskrivningsfunktionen köras så snabbt som möjligt. Ju mindre dataströmmen behöver läsas, desto bättre är det. Dessutom förväntas implementeringen av innehållsbeskrivningsfunktionen deklareras i ett paket som undantas från aktivering av insticksprogram (se samlingsmanifestrubriken Eclipse-AutoStart). Eftersom det skapas förekomster av alla beskrivningsfunktioner när innehållstypens ramverk initialiseras innebär bristande uppfyllelse av de här kraven för tidig aktivering, vilket måste undvikas. I framtida implementeringar av plattformen kanske det inte skapas förekomster av beskrivningsfunktioner om det skulle innebära aktivering av motsvarande insticksprogram.
Innehållstyper är hierarkiskt uppbyggda. Det innebär att nya innehållstyper kan utnyttja attributen eller beteendet hos mer allmänna innehållstyper. En innehållstyp för XML-data betraktas till exempel som underordnat objekt till innehållstypen för text:
<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>
En XML-fil anses som en typ av textfil vilket gör till att alla funktioner som gäller för textfiler också gäller för XML-filer.
Lägg märke till att XML-innehållstypen åsidosätter flera attribut för innehållstyper som ursprungligen definierades i innehållstypen Text, till exempel filassociationer och implementeringen av beskrivningsfunktion. Dessutom deklarerar den här innehållstypen en standardvärde för egenskapen charset
. Om innehållsbeskrivningen för en dataström anses höra till innehållstypen XML och beskrivningsfunktionen inte anger egenskapen för teckentabell kommer den därför att anges som "UTF-8" av plattformen.
Ett annat exempel: Innehållstypen org.eclipse.ant.core.antBuildFile
(för Ant Build Scripts) utökar innehållstypen XML:
<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>
Lägga märke till att standardvärdet för teckentabellegenskapen ärvs. Det går att avbryta en ärvs egenskap eller beskrivningsfunktion genom att deklarera om dem med en tom sträng som värde.
Det går att lägga till nya filassociationer till befintliga innehållstyper. Insticksprogrammet Resurser associerar till exempel org.eclipse.core.runtime.xml
till ".project"-filer:
<extension point="org.eclipse.core.runtime.contentTypes"> <file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/> ...
På grund av utökningsmöjligheterna i Eclipse kan det hända att en innehållstyp som ett insticksprogram är beroende av inte är tillgängligt i en viss produktkonfiguration. Det går att komma runt det problemet genom att skapa alias för innehållstyper. Ett innehållstypalias är en platshållare för en annan rekommenderad innehållstyp som kanske inte är tillgänglig. Runtime-miljön deklarerar till exempel ett alias (org.eclipse.core.runtime.properties
)
för innehållstypen Java-egenskaper som tillhandahålls av Java Development Tooling
(org.eclipse.jdt.core.javaProperties
):
<!-- en platshållare för konfigurationer där JDTs officiella typ inte är tillgänglig-->
<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>
På så sätt tillhandahålls insticksprogram med en platshållare som de kan referera till oavsett om den rekommenderade innehållstypen är tillgänglig eller inte. Om den är tillgänglig utelämnas aliasinnehållstypen från innehållstypkatalogen, och eventuella referenser till den tolkas som referenser till målinnehållstypen. Om den inte är tillgänglig kommer aliaset att användas som en vanlig innehållstyp.