Plattformen definerer noen grunnleggende innholdstyper, for eksempel ren tekst og XML. Disse innholdstypene defineres på samme måte som de som oppgis av andre plugin-moduler. Vi skal se hvordan plattformen definerer noen av innholdstypene for å få bedre forståelse for innholdstyperammeverket.
Plugin-moduler definerer innholdstyper ved å oppgi en utvidelse for utvidelsespunktet
org.eclipse.core.runtime.contentTypes.
I denne utvidelsen oppgir en plugin-modul en enkel ID og navn for innholdstypen
(den fullstendige IDen er alltid den enkle IDen med et prefiks fra det gjeldende navneområdet).
Følgende snutt viser en forenklet versjon av bidrag til innholdstype for
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> ...
Attributtet file-extensions
definerer hvilke filtyper som knyttes til
innholdstypen (".txt" i dette eksempelet). Med attributtet file-names
(brukes ikke her) kan du tilknytte fullstendige navn. Plattformen tar hensyn til begge attributter
ved lokalisering og beskrivelse av innholdstyper (hvis klienten oppgir et filnavn).
Elementet beskriver
brukes til å definere en innholdsbeskriver
for innholdstypen.
En innholdstype skal oppgi en innholdsbeskriver hvis det finnes identifiserbare
egenskaper som gjør det mulig med automatisk søking etter type eller interessante
dataegenskaper for innholdstypen. Med org.eclipse.core.runtime.text
er det ikke mulig å finne innholdstypen bare ved å se på innholdet.
Tekstdatastrømmer kan imidlertid være tilføyd av en Byte Order Mark, som kan
være en interessant egenskap og krever en innholdsbeskriver.
Beskriveren er en implementering av IContentDescriber eller ITextContentDescriber. Den siste er en spesialisering av førstnevnte som må implementeres av beskrivere av tekstorienterte innholdstyper. Uavhengig av hvilken innholdstype det dreier seg om, har beskriveren to ansvarsområder: fastsette om innholdstypen er egnet for en gitt datastrøm og trekke ut interessante egenskaper fra en datastrøm som tilhører innholdstypen.
Metoden describe(stream, description) kalles når plattformen forsøker å
fastsette innholdstypen for en bestemt datastrøm eller beskrive innholdet. Beskrivelsen er
null
når det bare er søking som er forespurt.
I motsatt fall kan beskriveren fylle ut innholdsbeskrivelsen med egenskaper
som finnes ved å lese datastrømmen, og bare dem.
Innholdstypekodetypen skal brukes til å deklarere egenskaper som har standardverdier
(for eksempel vil org.eclipse.core.runtime.xml
deklarere UTF-8
som standard tegnsett).
Når innholdsbeskriveren utfører sine oppgaver, forventes det at de utføres så raskt som mulig. Det gunstigste er å at datastrømmen som leses, er minst mulig. Det forventes også at implementeringen av innholdsbeskriveren skal deklareres i en pakke som er unntatt fra plugin-aktivering (se buntmanifeststartsekvensen i Eclipse-AutoStart). Siden det er opprettet forekomst av alle beskrivere når innholdstyperammeverket initialiseres, vil aktiveringen bli satt i gang for tidlig hvis dette kravet ikke oppfylles, noe som må unngås. Senere implementeringer av plattformen kan nekte å opprette forekomst av beskrivere hvis dette vil utløse aktivering av den tilhørende plugin-modulen.
Innholdstyper er hierarkiske typer. Dette gjør det mulig for nye innholdstyper å dra fordel av attributtene eller funksjonaliteten i mer generelle innholdstyper. For eksempel betraktes en innholdstype for XML-data som underordnet tekstinnholdstypen:
<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 slags tekstfil, derfor bør funksjoner for slike filer også gjelde for XML-filer.
Merk at XML-innholdstypen overstyrer flere innholdstypeattributter som opprinnelig
var definert i tekstinnholdstypen, for eksempel filtilknytninger og
beskriverimplementeringen. Denne innholdstypen deklarerer dessuten en standard egenskapsverdi for
egenskapen charset
. Dette betyr at hvis beskriveren ikke fyller ut
denne egenskapen ved innholdsbeskrivelsen for
en datastrøm som anses å tilhøre XML-innholdstypen, vil plattformen angi den som
"UTF-8".
Et annet eksempel er at innholdstypen for org.eclipse.ant.core.antBuildFile
(for Ant Build Scripts) utvider XML-innholdstypen:
<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>
Merk at standardverdien for tegnsettegenskapen er arvet. Det er mulig å avbryte en arvet egenskap eller beskriver ved å omdeklarere dem med den tomme strengverdien.
Nye filtilknytninger kan tilføyes eksisterende innholdstyper. For eksempel tilknytter
plugin-modulen for ressurser org.eclipse.core.runtime.xml
til ".project"-filer:
<extension point="org.eclipse.core.runtime.contentTypes"> <file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/> ...
Siden Eclipse er utvidbart, er det ikke sikkert at en innholdstype som en plugin-modul avhenger av,
er tilgjengelig i en gitt produktkonfigurasjon. Dette kan omgås ved å bruke
innholdstypealiaser. Et innholdstypealias er en plassholder for en annen foretrukket
innholdstype som ikke garanteres å være tilgjengelig. For
eksempel deklarerer kjøretiden et alias (org.eclipse.core.runtime.properties
)
for Java-egenskapsinnholdstypen som er oppgitt av Java Development Tooling
(org.eclipse.jdt.core.javaProperties
):
<!-- a placeholder for setups where JDT's official type is not available -->
<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>
Dette oppgir en plassholder for plugin-moduler som de kan referere til, uavhengig av om foretrukket innholdstype er tilgjengelig eller ikke. Hvis den er tilgjengelig, holdes aliasinnholdstypen fra innholdstypekatalogen tilbake, og eventuelle referanser til den anses som referanser til målinnholdstypen. Hvis den ikke er tilgjengelig, blir aliaset brukt som en vanlig innholdstype.