La plate-forme définit quelques types de contenu fondamentaux, comme le 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 certains de ses types de contenu 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 une ID simple et un nom pour le type de contenu (l'ID complète est toujours l'ID simple préfixée par l'espace nom actuel).
Le fragment suivant montre une version coupée vers le bas de la contribution du type de contenu org.eclipse.core.runtime.text
:
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
L'attribut file-extensions
définit les extensions de fichiers associées au type de contenu (dans cet exemple, ".txt"). L'attribut file-names
(non utilisé dans ce cas) permet d'associer les noms complets. Les deux attributs sont pris en compte par la plate-forme lors de la description et de la détection du type de contenu (si le client fournit un nom de fichier).
L'élément describer
est utilisé pour définir un descripteur de contenu
pour le type de contenu.
Un type de contenu doit fournir un descripteur de contenu s'il existe des caractéristiques identifiables permettant la détection automatique du type de contenu ou toutes propriétés intéressantes dans les données appartenant au type de contenu. Dans le cas de org.eclipse.core.runtime.text
,
il est impossible d'évaluer le type de contenu en regardant simplement son contenu.
Cependant, les flux de texte peuvent être ajoutés initialement par une marque d'ordre d'octets, qui est une propriété que les clients pourraient vouloir connaître, de sorte qu'un descripteur de contenu soit garanti.
Le descripteur est une implémentation de IContentDescriber ou de ITextContentDescriber. Le dernier est une spécialisation du premier qui doit être implémenté par les descripteurs de types de contenu orientés sur le texte. Quelque soit la nature du type de contenu, le descripteur a deux responsabilités : aider à déterminer si le type de contenu est approprié pour un flux de données donné et extraire les propriétés intéressantes d'un flux de données qui est supposé appartenir à son type de contenu.
La méthode describe(stream, description) est appelée lorsque la plate-forme tente de déterminer le type de contenu d'un flux de données en particulier ou de décrire son contenu. La description est null
lorsque seule la détection est demandée.
Sinon, le descripteur doit tenter de remplir la description du contenu avec les propriétés qui peuvent être trouvées en lisant le flux et uniquement celles-ci.
Le marquage du type de contenu doit être utilisé pour déclarer les propriétés qui ont des valeurs par défaut (par exemple, org.eclipse.core.runtime.xml
déclare UTF-8
comme la série de caractères par défaut).
Lorsqu'il effectue son travail, le descripteur de contenu doit s'exécuter aussi rapidement que possible. Moins le flux de données est lu, mieux c'est. Il est également prévu que l'implémentation du descripteur de données soit déclarée dans un package qui ne fait pas partie de l'activation des plug-ins (voir l'en-tête du manifesteEclipse-AutoStart). Etant donné que tous les descripteurs sont instanciés lorsque la structure du type de contenu est initialisée, le manque de compatibilité avec cette configuration provoque une activation prématurée, qui doit être évitée. Les futures implémentations de la plate-forme peuvent refuser d'instancier les descripteurs si cela devait déclencher l'activation du plug-in correspondant.
Les types de contenu sont hiérarchiques par nature. Cela permet à de nouveaux types de contenu de réutiliser les attributs ou le comportement de types e contenu plus généraux. Par exemple, un type de contenu pour les données XML est considéré comme un enfant du type de contenu du texte :
<content-type id="xml" name="%xmlContentTypeName" base-type="org.eclipse.core.runtime.text" file-extensions="xml"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> <property name="charset" default="UTF-8"/> </content-type>
Un fichier XML est une sorte de fichier texte, donc tous les fonctions applicables au dernier seront également applicables au premier.
Notez que le type de contenu XML chevauche plusieurs attributs de types de contenu initialement définis dans le type de contenu Texte comme les associations de fichier et l'implémentation du descripteur. Ce type de contenu déclare également une valeur de propriété par défaut pour la propriété
charset
. Cela signifie que lors de la description du contenu pour un flux de données considéré comme appartenant au type de contenu XML, si le descripteur ne remplit pas la propriété charset, la plate-forme le définira comme "UTF-8".
Un autre exemple, le type de contenu de org.eclipse.ant.core.antBuildFile
(pour les scripts de construction Ant) s'étend au type de contenu XML :
<content-type
id="antBuildFile"
name="%antBuildFileContentType.name"
base-type="org.eclipse.core.runtime.xml"
file-names="build.xml"
file-extensions="macrodef,ent,xml">
<describer
class="org.eclipse.ant.internal.core.contentDescriber.AntBuildfileContentDescriber">
</describer>
</content-type>
Notez que la valeur par défaut pour la propriété charset est héréditaire. Il est possible d'annuler une propriété héréditaire ou un descripteur en les redéclarant avec la chaîne vide comme valeur.
Les nouvelles associations de fichiers peuvent être ajoutées à des types de contenu existants. Par exemple,
le plug-in Ressources associe le org.eclipse.core.runtime.xml
aux fichiers ".project" :
<extension point="org.eclipse.core.runtime.contentTypes"> <file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/> ...
Etant donnée la nature extensible d'Eclipse, un type de contenu sur lequel s'appuie un plug-in peut être indisponible dans une configuration de produit donnée. Ceci peut-être remplacé par l'utilisation d'une dénomination de type de contenu. Un alias de type de contenu est un paramètre fictif pour un autre type de contenu préféré dont la disponibilité n'est pas garantie. Par exemple, le Runtime déclare un alias (org.eclipse.core.runtime.properties
)
pour le type de contenu des propriétés Java fourni par le Java Development Tooling
(org.eclipse.jdt.core.javaProperties
) :
<!-- a placeholder for setups where JDT's official type is not available -->
<content-type id="properties" name="%propertiesContentTypeName"
base-type="org.eclipse.core.runtime.text"
alias-for="org.eclipse.jdt.core.javaProperties"
file-extensions="properties">
<property name="charset" default="ISO-8859-1"/>
</content-type>
Ceci fournit des plug-ins avec un paramètre fictif auquel ils peuvent faire référence que le type de contenu préféré soit disponible ou non. Si c'est le cas, le type de contenu d'alias est supprimé du catalogue de type de contenu et toutes les références à ce dernier sont interprétées comme les références au type de contenu cible. Sinon, l'alias sera utilisé comme un type de contenu ordinaire.