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, podrá 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.
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 las naturalezas se añaden y eliminan de un proyecto. Puede implementar el método configure() para añadir un constructor a un proyecto, tal como se ha mostrado en el tema Constructores.
Que la naturaleza esté definida no es suficiente para que esté asociada a un proyecto. Deberá asignar una naturaleza a un proyecto actualizando la descripción del proyecto de tal manera que incluya la naturaleza. Esto suele producirse cuando el usuario crea un proyecto nuevo con un asistente especializado en el proyecto nuevo que asigna la naturaleza. El siguiente fragmento de código muestra cómo se asigna nuestra 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 }
Las naturalezas no se asignan (ni se configuran) realmente al proyecto mientras no establezca la descripción del 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 las dos formas, la API del área de trabajo le permitirá comprobar la validez de las combinaciones de naturalezas propuestas del proyecto.
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 }
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");
Puede asismismo obtener una matriz de los descriptores de todas las naturalezas instaladas:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();