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.
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.
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
}
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();