Natures de projet

org.eclipse.core.resources.natures

L'espace de travail supporte la notion de natures de projet (ou simplement "natures"). Une nature associe le comportement d'un cycle de vie à un projet. Les natures sont installées sur la base d'une par projet au moyen de la méthode setDescription définie dans org.eclipse.core.resources.IProject. Elles sont configurées automatiquement lorsqu'elles sont ajoutées à un projet et déconfigurées lorsqu'elles sont supprimées d'un projet. Par exemple, la nature Java peut installer un générateur Java et effectuer une autre configuration de projet lorsqu'elle est ajoutée à un projet.

Le point d'extension des natures permet aux éditeurs de nature d'enregistrer leur implémentation de nature sous un nom symbolique qui est ensuite utilisé dans l'espace de travail pour trouver et configurer les natures. Ce nom symbolique est l'ID de l'extension de nature. Lors de la définition d'une extension de nature, les utilisateurs sont encouragés à inclure une valeur lisible pour l'homme pour l'attribut "name" qui identifie sa signification et qui peut être potentiellement présenté aux utilisateurs.

Les natures peuvent spécifier des contraintes de relation avec d'autres natures. La contrainte "one-of-nature" spécifie qu'une seule nature appartenant à un ensemble donné peut exister dans un projet, à un moment donné. L'exclusion mutuelle des natures qui ne sont pas compatibles les unes avec les autres est ainsi mise en oeuvre. La contrainte "requires-nature" spécifie une dépendance vis à vis d'une autre nature. Lorsqu'une nature est ajoutée à un projet, toutes les natures requises doivent également être ajoutées. Les natures sont configurées et déconfigurées, de manière à ce que les natures requises qui leur sont propres soient toujours configurées avant elles et déconfigurées après. Pour cette raison, les dépendances cycliques entre les natures ne sont pas autorisées.

Les natures ne peuvent être ni ajoutées ni supprimées d'un projet lorsqu'un tel changement enfreint une quelconque contrainte préalablement respectée. Si une nature est configurée dans un projet, et qu'il s'avère ultérieurement que les contraintes qui y sont associées ne sont pas respectées, ladite nature ainsi que toutes celles qui sont requises sont marquées comme étant désactivées, mais sont maintenues dans le projet. Ce cas de figure peut se présenter lorsque, par exemple, une nature requise n'apparaît pas dans le répertoire d'installation. Les natures absentes du répertoire d'installation ainsi que celles qui sont impliquées dans des cycles de dépendance sont également marquées comme étant désactivées.

Les natures peuvent également spécifier les éventuels générateurs de projets incrémentiels qu'elles configurent. Ces informations permettent à l'espace de travail de s'assurer que les générateurs sont uniquement exécutés lorsque la nature correspondante est présente et activée dans le projet généré. Si une nature est supprimée d'un projet, mais que la méthode de déconfiguration de la nature ne parvient pas à supprimer les générateurs correspondants, l'espace de travail supprime automatiquement ces générateurs de la spécification de génération. Deux natures ne peuvent pas spécifier le même générateur de projet incrémentiel dans leur marque.

Les natures ont également la possibilité d'interdire la création de ressources liées sur des projets auxquelles elles sont associées. En définissant l'attribut allowLinking à "false", une nature peut déclarer qu'il est interdit de créer des ressources liées. Il s'agit d'une nouvelle fonction de la version 2.1.

Au démarrage de la version 3.1, les natures peuvent déclarer une affinité avec des types de contenu arbitraires, ce qui affecte la manière dont la détermination du type de contenu a lieu pour les fichiers dans l'espace de travail. Dans le cas de conflits (lorsque plusieurs types de contenu conviennent pour un fichier donné), c'est le type de contenu ayant une affinité avec l'une des natures configurées pour le projet correspondant qui sera choisi.

<!ELEMENT extension (runtime , (one-of-nature | requires-nature | builder | content-type)* , options?)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #REQUIRED

name  CDATA #IMPLIED>


<!ELEMENT runtime (run)>



<!ELEMENT run (parameter*)>

<!ATTLIST run

class CDATA #REQUIRED>


<!ELEMENT parameter EMPTY>

<!ATTLIST parameter

name  CDATA #REQUIRED

value CDATA #REQUIRED>


<!ELEMENT one-of-nature EMPTY>

<!ATTLIST one-of-nature

id CDATA #REQUIRED>


<!ELEMENT requires-nature EMPTY>

<!ATTLIST requires-nature

id CDATA #REQUIRED>


<!ELEMENT builder EMPTY>

<!ATTLIST builder

id CDATA #REQUIRED>


<!ELEMENT options EMPTY>

<!ATTLIST options

allowLinking (true | false) >


<!ELEMENT content-type EMPTY>

<!ATTLIST content-type

id CDATA #REQUIRED>


L'exemple ci-dessous illustre trois configurations de natures. Les natures waterNature et fireNature appartiennent au même ensemble exclusif, de sorte qu'elles ne peuvent pas coexister dans le même projet. La nature snowNature requiert la nature waterNature, de sorte que la nature snowNature est désactivée dans un projet qui ne contient pas la nature waterNature. Il en découle que snowNature ne peut pas être activé dans un projet contenant la nature fireNature. fireNature n'autorise pas non plus la création de ressources liées.

 
   

<extension id=

"fireNature"

name=

"Fire Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Fire"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

<options allowLinking=

"false"

/>

</extension>

<extension id=

"waterNature"

name=

"Water Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Water"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

</extension>

<extension id=

"snowNature"

name=

"Snow Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Snow"

>

<parameter name=

"installBuilder"

value=

"true"

/>

</run>

</runtime>

<requires-nature id=

"com.xyz.coolplugin.waterNature"

/>

<builder id=

"com.xyz.snowMaker"

/>

</extension>

Si ces extensions étaient définies dans un plug-in avec l'ID "com.xyz.coolplugin", le nom qualifié complet de ces natures seraient "com.xyz.coolplugin.fireNature", "com.xyz.coolplugin.waterNature" et "com.xyz.coolplugin.snowNature".

La valeur de l'attribut class doit correspondre à une implémentation de org.eclipse.core.resources.IProjectNature. Les définitions de natures peuvent être consultées dans l'interface org.eclipse.core.resources.IProjectNatureDescriptor. Les objets du descripteur peuvent être obtenus au moyen des méthodes getNatureDescriptor(String) et getNatureDescriptors() dans org.eclipse.core.resources.IWorkspace.

La plateforme de comporte aucune nature prédéfinie. Les installations d'un produit particulier peuvent inclure les natures requises.