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