Le nature di progetto consentono ad un plug-in di contrassegnare un progetto come progetto di tipo specifico. Ad esempio, il JDT (Java Development Tools) utilizza una "natura Java" per aggiungere ai progetti una funzionalità specifica di Java. Le nature dei progetti sono definite dai plug-in e vengono generalmente aggiunte a o rimosse dai singoli progetti quando l'utente esegue azioni definite dal plug-in.
Ogni progetto può disporre di più nature. Tuttavia, quando si definisce una natura di progetto, è possibile stabilire per essa vincoli speciali:
Per implementare la propria natura personalizzata, è necessario definire un'estensione e fornire una classe che implementa IProjectNature.
Il punto di estensione org.eclipse.core.resources.natures viene utilizzato per aggiungere una definizione di natura di progetto. Il seguente tag aggiunge una natura per un ipotetico plug-in com.example.natures.
<extension point="org.eclipse.core.resources.natures" id="myNature" name="My Nature"> <runtime> <run class="com.example.natures.MyNature"> </run> </runtime> </extension>
La classe identificata nell'estensione deve implementare l'interfaccia di piattaforma IProjectNature. Questa classe implementa la funzionalità specifica del plug-in per associare le informazioni specifiche della natura ad un progetto, quando la natura viene configurata.
public class MyNature implements IProjectNature { private IProject project; public void configure() throws CoreException { // Aggiungere informazioni specifiche sulla natura // del progetto, ad esempio aggiungendo un generatore // alla specifica di build di un progetto. } public void deconfigure() throws CoreException { // Rimuovere da questo punto le informazioni specifiche sulla natura. } public IProject getProject() { return project; } public void setProject(IProject value) { project = value; } }
I metodi configure() e deconfigure() vengono inviati dalla piattaforma quando le nature vengono aggiunte e rimosse da un progetto. L'utente può implementare il metodo configure() per aggiungere un generatore ad un progetto, come descritto nella sezione Generatori.
Definire la natura non è sufficiente per associarla a un progetto. E necessario assegnare una natura a un progetto aggiornando la descrizione di quest'ultimo in modo che includa la natura in questione. Ciò avviene generalmente quando l'utente crea un nuovo progetto mediante una procedura guidata specializzata che assegna la nature. Il seguente frammento di codice illustra come assegnare la nuova natura a un progetto dato.
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) { // Qualcosa è andata male }
Le nature non vengono assegnate effettivamente al progetto (e quindi configurate) finché non viene impostata al suo interno la relativa descrizione. Va inoltre notato che l'identificativo utilizzato per la natura è il nome completo (ID del plug-in + ID dell'estensione) dell'estensione della natura.
Se sono stati specificati dei vincoli nella definizione della natura, è possibile utilizzare l'API dell'area di lavoro per convalidare la nuova natura. Ad esempio, si supponga che una natura venga definita con un prerequisito:
<extension point="org.eclipse.core.resources.natures" id="myOtherNature" name="My Other Nature"> <runtime> <run class="com.example.natures.MyOtherNature"> </run> </runtime> <requires-nature id="com.example.natures.myNature"/> </extension>
La nuova natura non è valida a meno che non esista la prima natura del progetto. A seconda della struttura del plug-in, è possibile verificare se la natura del prerequisito è già stata installata oppure aggiungere tale natura al progetto. In entrambi i casi, si può controllare la validità delle combinazioni proposte delle nature del progetto utilizzando l'API dell'area di lavoro.
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); // controllare lo stato per stabilire come procedere if (status.getCode() == IStatus.OK) { description.setNatureIds(newNatures); project.setDescription(description, null); } else { // si verifica un errore ... } } catch (CoreException e) { // Qualcosa è andata male }
Oltre a utilizzare le nature in base ai relativi ID, è possibile ottenere il descrittore (IProjectNatureDescriptor), che descrive la singola natura con i vincoli e l'etichetta specificati. E possibile eseguire una query su una natura particolare per individuarne il descrittore oppure ottenere i descrittori dall'area di lavoro. Il frammento di codice riportato di seguito consente di ottenere il descrittore relativo alla nuova natura del progetto in esame:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
E anche possibile ottenere una matrice di descrittori per tutte le nature installate:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();