Le package org.eclipse.core.runtime.content permet la prise en charge de la définition des types de contenu pour les flux de données. Les types de contenu sont utilisés par plusieurs fonctions d'Eclipse qui dépendent du contenu, comme la détermination de l'encodage automatique, la sélection de l'éditeur de sélection et les contributions aux menus. Un registre de contenu centralisé géré par IContentTypeManager permet aux plug-ins de définir les types de contenu et de spécifier une classe qui sait lire et décrire le contenu. Pour contribuer aux types de contenu, il est nécessaire de disposer de connaissances de base de la structure de contenu.
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 types de contenu orientés fichier fournis par le plug-in de ressources de la plate-forme.
La plate-forme définit quelques types de contenu fondamentaux, comme les flux de données en texte brut et XML. Ces types de contenu sont définis de la même manière que ceux fournis par les autres plug-ins. Vous découvrirez comment la plate-forme définit le type de contenu texte afin de mieux comprendre la structure de type de contenu.
Les plug-ins définissent les types de contenu en proposent une extension pour le point d'extension org.eclipse.core.runtime.contentTypes. Dans cette extension, un plug-in spécifie un ID et un nom pour le type de contenu, ainsi qu'un protocole IContentDescriber qui peut lire un flux d'entrée et fournir une description du contenu. Le fragment de code ci-dessous est la contribution du plug-in d'exécution du type de contenu texte :
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> priority="high" file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
TextContentDescriber est chargé de lire un flux d'entrée et de déterminer rapidement si le contenu fourni est un échantillon de texte correct. La méthode describe(inputStream, description) est appelée lorsque la plate-forme tente de déterminer le contenu d'un flux de données en particulier. IContentDescriber est chargé de déterminer rapidement si le contenu représente un échantillon correct pour son type de contenu et renvoie une constante indiquant si le contenu correspondant à son type. Si le contenu correspond à son type, le descripteur doit également renseigner le protocole IContentDescription à l'aide des informations relatives aux données.
IContentDescription stocke les attributs spécifique au contenu dans des paires clé/valeur. Ces attributs sont spécifiques au type de contenu en particulier. La plate-forme spécifie les attributs pour le jeu de caractères et l'ordre des octets d'un fichier de texte, mais d'autres attributs peuvent être définis.
IContentTypeManager définit le protocole du registre de contenu. Les clients peuvent utiliser cette classe pour tester un flux de contenu ou détecter d'autres types de contenu dans le système.
Les types de contenu sont représentés par IContentType. Cette classe représente un type de contenu unique qui sait lire un flux de données et interpréter des informations spécifique 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.
<content-type id="xml" name="%xmlContentTypeName" base-type="text" priority="high" file-extensions="xml" default-charset="UTF-8"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> </content-type>
Cela permet à de nouveaux types de contenu de réutiliser les attributs ou le comportement de types e contenu plus généraux.
Le type de contenu texte de la plate-forme ne définit pas un jeu de caractères pour un contenu de texte. Les enfants du type de contenu texte sont libres de spécifier d'autres jeux de caractères par défaut lorsque cela est approprié, comme c'est le cas avec le type de contenu XML. Le jeu de caractères par défaut pour les flux XML est UTF-8, ce qui signifie que lorsque l'encodage d'un fichier XML n'est pas indiqué explicitement dans son contenu, son encodage est considéré être UTF-8.
Il est concevable que deux plug-ins indépendants fournissent un type de contenu pour le même type de contenu. En pareil cas, la plate-forme ne sélectionne qu'un seul descripteur de contenu pour le contenu. Le descripteur sélectionné est déterminé à l'aide d'un attribut priority qui peut être spécifié dans l'extension contentTypes. Si deux plug-ins fournissent un type de contenu pour le même contenu avec la même priorité, le descripteur de contenu sélectionné est indéterminé. Une fois qu'un descripteur de contenu est sélectionné, en revanche, toutes les références du registre au descripteur de contenu "non utilisé" reçoivent un alias vers le descripteur qui a été choisi.