Obs! I den här diskussionen kommer vi att undvika ordet fil när vi talar om innehåll. Innehållsmotorn för runtime-miljön förutsätter inte att innehållet finns i en fil i filsystemet. Däremot ingår protokoll som gör att innehållstyper kan associeras till namngivningsmönster för filer. I praktiken representerar de här filnamnen filer i filsystemet, men ingenting i implementeringen av innehållssystemet förutsätter att innehållet finns i filsystemet. I Filkodning och innehållstyper diskuteras den funktionalitet för innehållstyper som plattformsresursens insticksprogram bidrar med. Det är viktigt att utvecklare läser det avsnittet om de är intresserade av att använda APIt för innehållstyper i det sammanhanget.
Innehållstyper representeras av IContentType. Det här gränssnittet representerar en unik innehållstyp som kan läsa en dataström och tolka information som är specifik för innehållstyper. Innehållstyper är hierarkiskt uppbyggda. En innehållstyp för XML-data betraktas till exempel som underordnat objekt till innehållstypen för text. Det innebär att nya innehållstyper kan utnyttja attributen eller beteendet hos mer allmänna innehållstyper.
IContentTypeManager är startpunkten som ger access till större delen av det innehållstyprelaterade API som tillhandahålls av plattformens runtime-miljö. Klienter som behöver en referens till IContentTypeManager kan använda APIt Platform:
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
Klienter kan använda plattformen IContentTypeManager för att ta reda på vilka innehållstyper som finns i systemet.
Om vi har en ström av byte kan vi avgöra innehållstypen genom att anropa APIt IContentTypeManager enligt följande:
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Då returneras det mest lämpliga IContentType
utifrån angivna indata, eller null
om inga hittas. Eventuellt kan flera innehållstyper anses lämpliga för en viss dataström. I så fall använder plattformen vissa heuristiska data till att fastställa vilken som ska väljas.
Det första villkoret för att välja innehållstyper är filnamnet. Det kan utelämnas, men det innebär två problem: Resultatet kanske inte blir riktigt eftersom många innehållstyper som inte är relaterade kan acceptera samma indata. Det påverkar dessutom prestanda i hög grad eftersom alla innehållstyper på plattformen måste få möjlighet att analysera strömmen. Om det finns ett filnamn tillgängligt bör klienter alltså alltid ange det tillsammans med strömmen.
En annan intressant funktion när det gäller innehållstyper på plattformen är möjligheten att beskriva innehållet i en binär ström eller teckenström. Det visas i följande kodexempel:
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
Förekomsten IContentDescription som returneras beskriver innehållstypen och annan relevant information som extraheras från det tillhandahållna innehållet. I innehållsbeskrivningen lagras innehållsspecifika egenskaper i form av nyckel-/värdepar. Genom själva plattformen kan vissa egenskaper beskrivas, till exempel teckentabell och byteordning för textbaserade strömmar, medan andra egenskaper definieras genom innehållstypprovider.
Nya innehållstyper definieras ofta som en specialisering av befintliga typer. Den här hierarkin skapar relationen "is a" mellan en härledd innehållstyp och dess bastyp. De som utvecklar insticksprogram måste tänka på det när de implementerar innehållsberoende funktioner. Om en viss funktion kan tillämpas på en viss innehållstyp måste den också kunna tillämpas på alla härledda innehållstyper. Med metoden IContentType.isKindOf(IContentType superType) går det att avgöra om två IContentType är relaterade eller inte. Med metoden IContentType.getBaseType() går det att fastställa bastypen för en viss IContentType.