Naturalezas de los proyectos

Las naturalezas de los proyectos permiten a un conector marcar un proyecto con un código que indica que es un tipo de proyecto específico. Por ejemplo, las herramientas de desarrollo Java (JDT) emplean una "naturaleza Java" para añadir a los proyectos un comportamiento específico de Java.  Los conectores son los que definen las naturalezas de los proyectos, y las suelen añadir o eliminar por cada proyecto individual cuando el usuario lleva a cabo una acción definida por el conector.

Un proyecto puede tener más de una naturaleza.  Sin embargo, al definir la naturaleza de un proyecto, puede definir restricciones especiales para la naturaleza:

Para implementar su propia naturaleza, debe definir una extensión y suministrar una clase que implemente la interfaz IProjectNature.

Definir una naturaleza

El punto de extensión org.eclipse.core.resources.natures permite añadir una definición de la naturaleza del proyecto. Los siguientes códigos XML añaden una naturaleza para el conector com.example.natures hipotético.

   <extension
      point="org.eclipse.core.resources.natures"
      id="mynature"
      name="Mi naturaleza">
      <runtime>
         <run class="com.example.natures.MyNature">
         </run>
      </runtime>
   </extension>

La clase identificada en la extensión debe implementar la interfaz IProjectNature de la plataforma. Cuando la naturaleza está configurada, esta clase implementa el comportamiento específico del conector para asociar información específica de la naturaleza a un proyecto.

   public class MyNature implements IProjectNature {

      private IProject project;

      public void configure() throws CoreException {
         // Añadir información específica de la naturaleza
         // para el proyecto; por ejemplo, añadir un constructor
         // a la especificación de construcción de un proyecto.
      }
public void deconfigure() throws CoreException {
         // Eliminar aquí la información específica de la naturaleza.
      }
      public IProject getProject() {
         return project;
      }
      public void setProject(IProject value) {
         project = value;
      }
   }

La plataforma envía los métodos configure() y deconfigure() cuando se añaden y eliminan naturalezas de un proyecto.  Puede implementar el método configure() para añadir un constructor a un proyecto, tal como se describe en el tema Constructores.

Asociar la naturaleza a un proyecto

Definir la naturaleza de un proyecto no es suficiente para asociarla con él.  Debe asignar una naturaleza a un proyecto actualizando la descripción del mismo para que incluya la naturaleza.  Esto generalmente se produce cuando el usuario crea un proyecto nuevo con un asistente de proyecto nuevo especializado que asigna la naturaleza.  El fragmento de código que figura a continuación muestra cómo asignar la naturaleza nueva a un proyecto dado.

try {
      IProjectDescription description = project.getDescription();
      String[] natures = description.getNatureIds();
      String[] newNatures = new String[natures.length + 1];
      System.arraycopy(natures, 0, newNatures, 0, natures.length);
      newNatures[natures.length] = "com.example.natures.mynature";
      description.setNatureIds(newNatures);
      project.setDescription(description, null);
      } catch (CoreException e) {
      // Algo no ha funcionado
   }

NOTA: El ID de naturaleza es el ID totalmente calificado de la extensión de naturaleza. El ID totalmente calificado de una extensión se crea combinando el ID del conector con el ID de extensión simple del archivo plugin.xml. Por ejemplo, una naturaleza que tenga el ID de extensión simple "mynature" en el conector "com.example.natures" tendría el nombre "com.example.natures.mynature"

Las naturalezas no se asignan (ni se configuran) realmente al proyecto mientras no establezca la descripción de proyecto en el proyecto.  También debe tener en cuenta que el identificador utilizado para la naturaleza debe ser el nombre totalmente calificado (el ID del conector + el ID de la extensión) de la extensión de la naturaleza.

Si la naturaleza se ha definido con restricciones, se puede usar la API del área de trabajo para validar la naturaleza nueva.  Supongamos, por ejemplo, una naturaleza que se haya definido con un prerrequisito:

   <extension
      point="org.eclipse.core.resources.natures"
      id="myOtherNature"
      name="Mi otra naturaleza">
      <runtime>
         <run class="com.example.natures.MyOtherNature">
         </run>
      </runtime>
   <requires-nature id="com.example.natures.mynature"/>
   </extension>

La naturaleza nueva no será valida si la primera naturaleza no existe en el proyecto.  En función del diseño del conector, podrá interesarle comprobar si la naturaleza prerrequisito está instalada o bien añadirla usted mismo.  De cualquier forma, la API del área de trabajo le permitirá comprobar la validez de las combinaciones de naturalezas de proyecto propuestas.

   try {
      IProjectDescription description = project.getDescription();
      String[] natures = description.getNatureIds();
      String[] newNatures = new String[natures.length + 1];
      System.arraycopy(natures, 0, newNatures, 0, natures.length);
      newNatures[natures.length] = "com.example.natures.myOtherNature";
      IStatus status = workspace.validateNatureSet(natures);

      // comprobar el estado y decidir qué hay que hacer
      if (status.getCode() == IStatus.OK) {
      	description.setNatureIds(newNatures);
      	project.setDescription(description, null);
         } else {
      	// activar un error del usuario
	...
      }
      } catch (CoreException e) {
      // Algo no ha funcionado
   }

Descriptores de las naturalezas

Además de trabajar con las naturalezas mediante sus ID, puede obtener el descriptor (IProjectNatureDescriptor) que describe una naturaleza, sus restricciones y su etiqueta.  Puede consultar una naturaleza concreta para obtener su descriptor, o bien obtener los descriptores a partir del área de trabajo.  El siguiente fragmento de código obtiene el descriptor de nuestra naturaleza del proyecto:

      IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");

También puede obtener una matriz de los descriptores de todas las naturalezas instaladas:

      IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();