Naturalezas de proyecto

Identificador: org.eclipse.core.resources.natures

Descripción: el área de trabajo da soporte al concepto de naturalezas de proyecto (o "naturalezas", para abreviar). Una naturaleza asocia un comportamiento de ciclo de vida con un proyecto. Las naturalezas se instalan en función del proyecto mediante el método setDescription definido en org.eclipes.core.resources.IProject. Se configuran automáticamente cuando se abre un proyecto y se desconfiguran cuando éste se cierra. Por ejemplo, la naturaleza Java puede instalar un constructor Java y realizar otra configuración de proyecto cuando se añade a un proyecto.

El punto de extensión de las naturalezas permite a los escritores de naturalezas registrar la implementación de su naturaleza bajo un nombre simbólico que luego se utiliza desde dentro del área de trabajo para localizar y configurar naturalezas. El nombre simbólico es el ID de la extensión de naturaleza. Al definir una extensión de naturaleza, es aconsejable que los usuarios incluyan para el atributo "name" un valor legible por personas que identifique su significado y pueda presentarse potencialmente a los usuarios.

Las naturalezas pueden especificar restricciones de relación con otras naturalezas. La restricción "una sola naturaleza ("one-of-nature") especifica que en un proyecto, y en un momento determinado, sólo puede existir como máximo una naturaleza perteneciente a un conjunto determinado. Esto obliga a la exclusión mutua entre las naturalezas que no sean compatibles entre sí. La restricción "requisito de naturaleza" ("requires-nature") especifica una dependencia con respecto a otra naturaleza. Cuando se añade una naturaleza a un proyecto, también deben añadirse todas las naturalezas que requiera. Las naturalezas se configurarán y desconfigurarán de tal forma que las naturalezas que requieran siempre se configuren antes que ellas y se desconfiguren después de ellas. Para esta razón, las dependencias cíclicas entre naturalezas no están permitidas.

No pueden añadirse ni eliminarse naturalezas de un proyecto si ese cambio va a violar las restricciones satisfechas anteriormente. Si se configura una naturaleza en un proyecto pero luego resulta que no se satisfacen las restricciones, esa naturaleza y todas las naturalezas que la necesitan quedan marcadas como disabled (inhabilitadas), aunque siguen permaneciendo en el proyecto. Esto puede suceder cuando, por ejemplo, falta una naturaleza necesaria en la instalación. Las naturalezas que faltan en la instalación y las naturalezas implicadas en ciclos de dependencias también quedan marcadas como inhabilitadas.

Las naturalezas también pueden especificar los constructores incrementales de proyectos que configuran, si los hay. Con esta información, el área de trabajo garantizará que los constructores sólo se ejecuten cuando su naturaleza correspondiente esté presente y habilitada en el proyecto que se construye. Si una naturaleza se elimina de un proyecto, pero el método deconfigure de la misma no puede eliminar sus constructores correspondientes, el área de trabajo eliminará automáticamente dichos constructores de la especificación. No está permitido que dos naturalezas especifiquen el mismo constructor incremental de proyectos en su código.

Las naturalezas también tienen la posibilidad de impedir la creación de recursos enlazados en los proyectos a los que están asociadas. Estableciendo el atributo allowLinking en "false", una naturaleza puede declarar que nunca deben crearse recursos enlazados. Esta característica es nueva en el release 2.1.

Códigos XML de configuración:

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

   <!ATTLIST extension
     point CDATA #REQUIRED
     id    CDATA #IMPLIED
     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)
   >

Ejemplos: a continuación figura un ejemplo de tres configuraciones de naturaleza. Las naturalezas waterNature y fireNature pertenecen al mismo conjunto exclusivo, y por tanto no pueden coexistir en el mismo proyecto. La naturaleza snowNature necesita a la naturaleza waterNature, por lo que snowNature quedará inhabilitada en los proyectos en los que falte waterNature. De ello se deduce que snowNature no puede habilitarse en un proyecto que tenga fireNature. La naturaleza fireNature no permite la creación de recursos enlazados.

 
   <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 estas extensiones estuviesen definidas en un conector cuyo id fuese "com.xyz.coolplugin", el nombre totalmente calificado de las naturalezas sería "com.xyz.coolplugin.fireNature", "com.xyz.coolplugin.waterNature" y "com.xyz.coolplugin.snowNature".

Información sobre las API: el valor del atributo class debe representar un implementador de org.eclipse.core.resources.IProjectNature. Las definiciones de las naturalezas se pueden examinar con la interfaz org.eclipse.core.resources.IProjectNatureDescriptor. Los objetos descriptores se pueden obtener mediante los métodos getNatureDescriptor(String) y getNatureDescriptors() de org.eclipse.core.resources.IWorkspace.

Implementación suministrada: la propia plataforma no posee ninguna naturaleza predefinida. La instalación de algunos productos en particular puede incluir naturalezas en caso necesario.

Copyright (c) 2003 IBM Corporation y otros. Reservados todos los derechos. Este programa y sus materiales adjuntos están disponibles bajo los términos de la licencia pública común (Common Public License) v1.0 que acompaña a esta distribución, y está disponible en http://www.eclipse.org/legal/cpl-v10.html