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 o rimosse per ogni singolo progetto quando l'utente esegue azioni definite dal plug-in.
Un 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 della generazione 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. È possibile implementare il metodo configure() per aggiungere un generatore a un progetto, come descritto nella sezione Builders.
Per associare una natura a un progetto non è sufficiente definirla. È necessario assegnare una natura a un progetto aggiornando la descrizione del progetto in modo da includere la natura. Ciò generalmente si verifica quando l'utente crea un nuovo progetto con una creazione guidata nuovo progetto specializzata che assegna la natura. Nel frammento di codice che segue viene illustrata la modalità di assegnazione della nuova natura a un determinato progetto.
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) { // Si è verificato un errore }
Le nature non vengono assegnate effettivamente al progetto (e quindi configurate) finché non ne viene impostata al suo interno la descrizione. Si noti inoltre 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 dello spazio di lavoro per convalidare la nuova natura. Si supponga ad esempio 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>
Perché la nuova natura sia valida è necessario che il progetto disponga della prima natura. 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 è possibile controllare la validità delle combinazioni proposte delle nature del progetto utilizzando l'API dello spazio 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) { // Si è verificato un errore }
Oltre a utilizzare le nature in base ai relativi ID, è possibile ottenere il descrittore (IProjectNatureDescriptor), che descrive una natura con i relativi vincoli e la relativa etichetta. È possibile eseguire una query di un descrittore di una particolare natura oppure ottenere i descrittori dallo spazio di lavoro. Nel frammento di codice che segue si ottiene il descrittore della natura del progetto per la nuova natura:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
È anche possibile ottenere una matrice di descrittori per tutte le nature installate:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();