Nature di progetto

Le nature di progetto consentono ad un plugin 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 plugin e vengono generalmente aggiunte o rimosse per ogni singolo progetto quando l'utente esegue azioni definite dal plugin.

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.

Definizione di una natura

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 plugin 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 plugin 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.

Associazione della natura ad un progetto

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 la procedura 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
   }

NOTA: l'id natura è l'id completo dell'estensione della natura. L'id completo di un'estensione viene creato unendo l'id del plugin con l'id estensione semplice nel file plugin.xml. Ad esempio, una natura con id estensione semplice "mynature" nel plugin "com.example.natures" avrà il nome "com.example.natures.mynature"

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 plugin + 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 plugin, è 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
   }

Descrittori delle nature

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