Naturezas de projectos

As naturezas de projectos permitem a um plug-in identificar um projecto como tipo de projecto específico. Por exemplo, as ferramentas de desenvolvimento Java (Java development tools (JDT)) utilizam uma "natureza Java" para adicionar comportamento específico Java a projectos.  As naturezas de projectos são definidas por plug-ins e geralmente adicionadas ou removidas por projecto, quando o utilizador realizar alguma acção definida pelo plug-in.

Um projecto pode ter mais do que uma natureza.  Todavia, ao definir uma natureza de projecto, pode definir restrições especiais para a natureza:

Para implementar uma natureza própria, é necessário definir uma extensão e facultar uma classe que implemente IProjectNature.

Definir uma natureza

O ponto de extensão org.eclipse.core.resources.natures é utilizado para adicionar uma definição de natureza de projecto. A marcação seguinte adiciona uma natureza para o plug-in com.exemplo.naturezas hipotético.

   <extension
      point="org.eclipse.core.resources.natures"
      id="aminhanatureza"
      name="A Minha Natureza">
      <runtime>
         <run class="com.exemplo.naturezas.aMinhaNatureza">
         </run>
      </runtime>
   </extension>

A classe identificada na extensão deve implementar a IProjectNature da interface da plataforma. Esta classe implementa comportamento específico de plug-in para associar informações específicas a naturezas a um projecto, quando a natureza for configurada.

   public class aMinhaNatureza implements IProjectNature {

      private IProject project;

      public void configure() throws CoreException {
         // Adicionar informações específicas a naturezas
         // para o projecto como, por exemplo, adicionar um construtor
         // à especificação de construção de um projecto.
      }
      public void deconfigure() throws CoreException {
         // Remover as informações específicas a naturezas aqui.
      }
      public IProject getProject() {
         return project;
      }
      public void setProject(IProject value) {
         project = value;
      }
   }

Os métodos configure() e deconfigure() são enviados pela plataforma quando são adicionadas e removidas naturezas de um projecto.  Pode implementar o método configure() para adicionar um construtor a um projecto, tal como vimos em Construtores.

Associar a natureza a um projecto

Não basta definir a natureza para a associar a um projecto.  É necessário atribuir uma natureza a um projecto actualizando a descrição do projecto de modo a incluir a natureza em questão.  Tal realiza-se geralmente quando o utilizador cria novo projecto com um assistente especializado em novos projectos que atribui a natureza.  A porção de código seguinte mostra como atribuir a nossa natureza a dado projecto.

  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.exemplo.naturezas.aminhanatureza";
      description.setNatureIds(newNatures);
      project.setDescription(description, null);
  } catch (CoreException e) {
      // Something went wrong
   }

NOTA: O ID da natureza é o ID totalmente qualificado da extensão da natureza. O ID totalmente qualificado de uma extensão é criado combinando o ID do plug-in com o ID da extensão simples no ficheiro plugin.xml. Por exemplo, uma natureza com o ID de extensão simples "aminhanatureza" no plug-in "com.exemplo.naturezas" teria o nome "com.exemplo.naturezas.aminhanatureza"

As naturezas só são realmente atribuídas (e configuradas) ao projecto quando se define a descrição do projecto.  Repare também que o identificador utilizado para a natureza é o nome totalmente qualificado (ID de plug-in + ID de extensão) da extensão da natureza.

Se a natureza tiver sido definida com restrições, a API do espaço de trabalho poderá ser usada para validar a nova natureza.  Por exemplo, suponhamos que uma natureza é definida com um pré-requisito:

   <extension
      point="org.eclipse.core.resources.natures"
      id="OutraNatureza"
      name="Outra Natureza">
      <runtime>
         <run class="com.exemplo.naturezas.OutraNatureza">
         </run>
      </runtime>
   <requires-nature id="com.exemplo.naturezas.aminhanatureza"/>
   </extension>

A nova natureza só é válida se a primeira natureza existir no projecto.  Consoante a concepção do plug-in, poderá optar por verificar se a natureza de pré-requisito foi instalada ou poderá optar por adicionar a natureza de pré-requisito.  Seja como for, poderá verificar a validade das combinações propostas de naturezas de projectos com a API do espaço de trabalho.

     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.exemplo.naturezas.OutraNatureza";
      IStatus status = workspace.validateNatureSet(natures);

      // verificar estado e decidir que fazer
      if (status.getCode() == IStatus.OK) {
      	description.setNatureIds(newNatures);
      	project.setDescription(description, null);
        } else {
      	// levantar um erro de utilizador
	...
      }
  } catch (CoreException e) {
      // Something went wrong
   }

Descritores de naturezas

Além de trabalhar com naturezas por ID, poderá obter o descritor (IProjectNatureDescriptor) que descreve uma natureza, as suas restrições e a sua etiqueta.   Poderá consultar determinada natureza relativamente ao descritor ou obter descritores do espaço de trabalho.  A porção de código seguinte obtém o descritor da nossa própria natureza de projecto:

      IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.exemplo.naturezas.OutraNatureza");

Também poderá obter uma matriz de descritores para todas as naturezas instaladas:

      IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();