Inhoudtypen gebruiken

Opmerking:  In deze bespreking vermijden we het woord bestand als we het over content hebben. De runtime-contentenigine gaat er niet van uit dat de content is opgenomen in een bestand in het bestandssysteem. De engine kent echter wel een protocol waarmee inhoudtypen gekoppeld kunnen worden aan patronen voor bestandsnaamgeving. In de praktijk worden deze namen gebruikt voor bestanden in het bestandsysteem, maar de implementatie van het contentsysteem gaat er niet van uit dat de content zich in het bestandsysteem bevindt. In Bestandscodering en inhoudtypen wordt besproken welke bestandsgeoriënteerde mogelijkheden voor inhoudtypen door de platformresourcesplugin worden aangeleverd. Dit is verplichte kost voor ontwikkelaars met interesse in het gebruik van de inhoudtype-API in die context.

Meer over inhoudtypen

Inhoudtypen worden aangegeven met IContentType. Deze interface vertegenwoordigt een uniek inhoudtype dat de gegevensstroom kan lezen en informatie interpreteren die specifiek voor inhoudtypen is. Inhoudtypen zijn van nature hiërarchisch. Een inhoudtype voor XML-gegevens wordt bijvoorbeeld beschouwd als onderliggend item van het tekstinhoudtype. Hierdoor kunnen nieuwe inhoudtypen kenmerken of gedragsinstellingen van algemenere inhoudtypen overnemen.

De IContentTypeManager is een ingangspunt dat toegang geeft tot het grootste deel van de inhoudtype-API van de platformruntime. Om een verwijzing naar de IContentTypeManager van het platform te krijgen, kunnen clients de API Platform gebruiken:

IContentTypeManager contentTypeManager = Platform.getContentTypeManager();

Clients kunnen de platform-IContentTypeManager gebruiken om informatie over de inhoudtypen in het systeem op te halen.

Het inhoudtype voor een gegevensstroom detecteren

Het is mogelijk om het gegevenstype van een bepaalde gegevensstroom vast te stellen door als volgt de IContentTypeManager-API aan te roepen:

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

Hierdoor wordt de meest geschikte IContentType geretourneerd of null als deze niet wordt gevonden. Er kunnen meerder inhoudtypen geschikt worden geacht voor een bepaalde gegevensstroom. In dit geval gebruikt het platform enige heuristische gegevens om te bepalen welke geselecteerd moet worden. Het eerste criterium waarop inhoudtypen worden geselecteerd, is de bestandsnaam. Deze kan worden weggelaten, maar hierbij ontstaan twee problemen. Ten eerste zijn de resultaten mogelijk niet correct, omdat veel niet-gerelateerde inhoudtypen dezelfde invoer zouden kunnen accepteren. Ten tweede ontstaat een groot prestatieprobleem, omdat alle inhoudtypen in het platform de kans moeten hebben om de stroom te analyseren. Clients moeten dus altijd een bestandsnaam opgeven samen met de stroom, tenzij deze niet beschikbaar is.

Een gegevensstroom beschrijven

Een andere interessante mogelijkheid bij de ondersteuning van inhoudtypen in het platform is het beschrijven van de content van een binaire stroom of tekenstroom. In het volgende codefragment ziet u hoe u dit doet:

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

In de geretourneerde IContentDescription-instance wordt het inhoudtype beschreven en verdere relevante informatie die uit de beschikbare content wordt opgehaald. De beschrijving bevat contentspecifieke eigenschappen in de vorm van sleutel/waarde-paren. Het platform zelf kan eigenschappen als de tekenset en de bytevolgorde van tekststromen beschrijven, maar andere kunnen worden gedefinieerd op inhoudtypeproviders.

Contentgevoelige features aanbieden

Nieuwe inhoudtypen worden vaak gedefinieerd als gespecialiseerde vormen van bestaande typen. Door deze hiërarchie ontstaat een "familierelatie" tussen een afgeleid inhoudtype en het basistype. Pluginontwikkelaars moeten hiermee rekening houden als ze contentsgevoelige features implementeren. Als een bepaalde feature geschikt is voor een bepaald inhoudtype, moet de feature ook geschikt zijn voor afgeleide inhoudtypen. Met de methode IContentType.isKindOf(IContentType superType) kan worden vastgesteld of twee IContentTypen gerelateerd zijn. Met de methode IContentType.getBaseType() kan het basistype van een IContentType worden vastgesteld.