Naturezas do projeto

As naturezas do projeto permitem que um plug-in marque um projeto como um tipo específico de projeto. Por exemplo, o JDT (Ferramentas de Desenvolvimento Java) utiliza uma "Natureza Java" para adicionar comportamento específico Java nos projetos.  As naturezas dos projetos são definidas por plug-ins e são normalmente incluídas ou removidas de acordo com o projeto quando o usuário executa alguma ação definida pelo plug-in.

Um projeto pode ter mais de uma natureza.  Entretanto, quando você define uma natureza de projeto, é possível definir restrições especiais para ela:

Para implementar uma natureza própria, você precisa definir uma extensão e fornecer uma classe que implemente IProjectNature.

Definindo uma natureza

O ponto de extensão org.eclipse.core.resources.natures é utilizado para incluir uma definição de natureza do projeto. A marcação a seguir inclui uma natureza para o plug-in hipotético com.example.natures.

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

A classe identificada na extensão deve implementar IProjectNature da interface da plataforma. Essa classe implementa o comportamento específico do plug-in para associação de informações específicas da natureza com um projeto, quando a natureza está configurada.

   public class MyNature implements IProjectNature {

      private IProject project;

      public void configure() throws CoreException {
         // Incluir informações específicas da natureza
         // do projeto, como a inclusão de um construtor
         // na especificação de construção de um projeto.
      }
      public void deconfigure() throws CoreException {
         // Remover as informações específicas da natureza 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 incluídas e removidas naturezas de um projeto.  É possível implementar o método configure() para adicionar um construtor ao projeto, conforme abordado em Construtores.

Associando a natureza a um projeto

A definição da natureza não é suficiente para associá-la a um projeto.  É necessário atribuir uma natureza a um projeto, fazendo a atualização da descrição do projeto para incluir a natureza.  Isso normalmente acontece quando o usuário cria um novo projeto com um assistente especializado de novo projeto que atribui a natureza.  O fragmento a seguir mostra como atribuir a nova natureza a um determinado projeto.

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 deu errado
   }

NOTA: O ID da natureza é o ID completo da extensão da natureza. O ID completo de uma extensão é criado com a combinação do id do plug-in com o ID simples da extensão no arquivo plugin.xml. Por exemplo, uma natureza com ID simples de extensão "mynature" no plug-in "com.example.natures" terá o nome "com.example.natures.mynature".

As naturezas não são realmente atribuídas (e configuradas) ao projeto até que você defina a descrição do projeto dentro deste.  Observe também que o identificador utilizado para a natureza é o nome completo (ID do plug-in + ID da 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 utilizada para validar a nova natureza.  Por exemplo, suponha que uma natureza seja definida com um pré-requisito:

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

A nova natureza não será válida a não ser que exista a primeira natureza do projeto.  Dependendo do design do plug-in, você pode verificar se a natureza de pré-requisito foi instalada ou pode incluí-la você mesmo.  De qualquer maneira, é possível verificar a validade das combinações de naturezas de projeto sugeridas utilizando 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.example.natures.myOtherNature";
      IStatus status = workspace.validateNatureSet(natures);

      // verificar o status e decidir o que fazer
      if (status.getCode() == IStatus.OK) {
      	description.setNatureIds(newNatures);
      	project.setDescription(description, null);
      } else {
      	// surgiu um erro do usuário
	...
      }
   } catch (CoreException e) {
      // Algo deu errado
   }

Descritores da Natureza

Além de trabalhar com naturezas pelo ID, é possível obter o descritor (IProjectNatureDescriptor) que descreve uma natureza, suas restrições e seu rótulo.  É possível consultar em uma determinada natureza o seu descritor ou obter descritores do espaço de trabalho.  O fragmento a seguir obtém o descritor de natureza do projeto da nossa nova natureza:

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

Também é possível obter uma matriz de descritores para todas as naturezas instaladas:

      IProjectNatureDescriptor[] descriptors =
workspace.getNatureDescriptors();