Remarque : Dans ce document, nous évitons spécifiquement d'utiliser le mot fichier pour parler du contenu. Le moteur de contenu d'exécution ne considère pas que le contenu se trouve dans un fichier du système de fichiers. Cependant, il inclut un protocole qui permet d'associer les types de contenu à des schémas de dénomination des fichiers. Dans la pratique, ces noms de fichier représentent les fichiers du système de fichiers, mais aucun élément de l'implémentation du système de contenu ne considère que le contenu se trouve dans le système de fichiers. La section Encodage des fichiers et types de contenu traite des possibilités des types de contenu orientés fichier fournis par le plug-in de ressources de la plate-forme et est à lire absolument pour les développeurs intéressés par l'utilisation de l'API de type de contenu dans ce contexte.
Les types de contenu sont représentés par IContentType. Cette interface représente un type de contenu unique qui sait lire un flux de données et interpréter des informations spécifiques au type de contenu. Les types de contenu sont hiérarchiques par nature. Par exemple, un type de contenu pour des données XML est considéré comme un enfant du type de contenu texte. Cela permet à de nouveaux types de contenu de réutiliser les attributs ou le comportement de types e contenu plus généraux.
Le IContentTypeManager est le point d'entrée qui permet d'accéder à la plupart des API liées aux types de contenu fournies par le temps d'exécution de la plate-forme. Pour obtenir une référence à la plate-forme IContentTypeManager, les clients peuvent utiliser l'API Plate-forme :
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
Les clients peuvent utiliser la plate-forme IContentTypeManager pour rechercher les types de contenu dans le système.
D'après un flux d'octets, il est possible de déterminer son type de contenu en appelant l'API IContentTypeManager de la manière suivante :
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Ceci renvoie le IContentType
le plus approprié, selon l'entrée fournie, ou null
s'il n'en existe aucun. Plusieurs types de contenu peuvent être appropriés pour un flux de données spécifié. Dans ce cas,
la plate-forme utilise une certaine heuristique pour déterminer celui que vous devez sélectionner.
Le nom du fichier est le premier critère de sélection des types de contenu. Il peut être omis, mais cela engendre deux difficultés : les résultats ne seront pas tout à fait corrects car plusieurs types de contenu non liés peuvent accepter la même entrée ; il existe également un grand classement des performances, car tous les types de contenu de la plate-forme doivent avoir une chance d'analyser le flux. Ainsi, excepté s'il est indisponible, les clients doivent toujours fournir un nom de fichier avec le flux.
Une autre fonction intéressante de la prise en charge du type de contenu dans la plate-forme est la possibilité de décrire le contenu d'un flux binaire ou de caractères. Le fragment de code suivant montre comment procéder :
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
L'instance renvoyée IContentDescription décrit le type de contenu et les informations pertinentes supplémentaires extraites du contenu fourni. La description du contenu stocke les propriétés spécifiques au contenu sous la forme de paires clé/valeur. La plate-forme elle-même est capable de décrire les propriétés comme le jeu de caractères et l'ordre des octets de flux basés sur le texte, mais d'autres peuvent être définies par les fournisseurs de types de contenu.
Les nouveaux types de contenu sont souvent définis comme une spécialisation de ceux existants. Cette hiérarchie établit une relation "est une" entre un type de contenu dérivé et son type de base. Les développeurs de plug-in doivent honorer ceci lors de l'implémentation des fonctions sensibles au contenu. Si une fonction donnée est applicable à un type de contenu donné, la fonction doit être applicable également à tous les types de contenu dérivés. La méthode IContentType.isKindOf(IContentType superType) permet de déterminer si deux IContentTypes sont liés. La méthode IContentType.getBaseType() permet de déterminer le type de base d'un IContentTypedonné.