Bruke innholdstyper

Merk: I denne beskrivelsen unngår vi bevisst å bruke ordet fil når vi snakker om innhold. Kjøretidsinnholdsmotoren forventer ikke at innholdet ligger i en fil i filsystemet. Den inneholder imidlertid en protokoll som gjør det mulig å knytte innholdstyper til filnavngivningsmønstre. I praksis representerer disse filnavnene filer i filsystemet, men det er ingenting i implementeringen av innholdssystemet som tilsier at innholdet ligger i filsystemet. Filkoding og innholdstyper beskriver den filorienterte innholdstypefunksjonaliteten som er oppgitt av plattformens plugin-modul for ressurser, og bør leses av utviklere som vil bruke programmeringsgrensesnittet for innholdstypen i den konteksten.

Fastsette innholdstyper

Innholdstyper representeres av IContentType. Dette grensesnittet representerer en unik innholdstype som vet hvordan en datastrøm skal leses, og tolker informasjon som er spesifikk for innholdstyper. Innholdstyper er hierarkiske typer. For eksempel betraktes en innholdstype for XML-data som underordnet tekstinnholdstypen. Dette gjør det mulig for nye innholdstyper å dra fordel av attributtene eller funksjonaliteten i mer generelle innholdstyper.

IContentTypeManager er inngangspunktet som gir tilgang til det meste av det innholdstyperelaterte programmeringsgrensesnittet som er oppgitt av plattformkjøretiden. For å få en referanse til plattformens IContentTypeManager, kan programmeringsgrensesnittet for Platform brukes:

IContentTypeManager contentTypeManager = Platform.getContentTypeManager();

Hvis det er interessant å fastsette innholdstypene i systemet, kan plattformens IContentTypeManager brukes.

Finne innholdstypen for en datastrøm

Med en datastrøm av byte er det mulig å fastsette innholdstypen ved å kalle programmeringsgrensesnittet for IContentTypeManager på følgende måte:

InputStream stream = ...;
IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml");
stream.close();

Ut fra de oppgitte inndataene returneres en mest mulig egnet IContentType eller null hvis ingen blir funnet. Det kan hende at flere innholdstyper anses som egnede for en gitt datastrøm. I så fall bruker plattformen heuristisk metoder for å fastsette hvilken som skal velges. Filnavnet er det første kriteriet som brukes til å velge innholdstyper. Det kan utelates, men vil få konsekvenser både for resultatet som muligens ikke blir helt nøyaktig fordi mange utilknyttede innholdstyper kan godta samme inndata, og for ytelsen som belastes siden det er mulig for alle innholdstyper i plattformen å analysere datastrømmen. Så med mindre filnavnet ikke er tilgjengelig, bør det alltid oppgis sammen med datastrømmen.

Beskrive en datastrøm

En annen interessant funksjon for innholdstypestøtten i plattformen, er muligheten til å beskrive innholdet i en binær eller tegnbasert datastrøm. Følgende kodesnutt viser hvordan du gjør dette:

InputStream stream = ...; 
IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml");
stream.close();

Den returnerte forekomsten av IContentDescription beskriver innholdstypen og annen relevant informasjon som er trukket ut fra det oppgitte innholdet. Innholdsbeskrivelsen lagrer innholdsspesifikke egenskaper i form av nøkkel/verdi-par. Selve plattformen kan beskrive egenskaper, for eksempel tegnsettet og byterekkefølgen i tekstbaserte datastrømmer, mens andre kan defineres av innholdstypeleverandører.

Oppgi innholdsavhengige funksjoner

Nye innholdstyper defineres ofte som en spesialisering av eksisterende innholdstyper. Dette hierarkiet oppretter et "er et"-forhold mellom en avledet innholdstype og basistypen. Plugin-utviklere må ta hensyn til dette når de implementerer innholdsavhengige funksjoner. Hvis en gitt funksjon kan brukes i en gitt innholdstype, må funksjonen også kunne brukes i hvilke som helst avledede innholdstyper. Med metoden IContentType.isKindOf(IContentType superType) er det mulig å fastsette om to forekomster av IContentType er knyttet til hverandre. Metoden IContentType.getBaseType() gjør det mulig å fastsette basistypen til en gitt IContentType.