Il plug-in delle risorse include un meccanismo di eventi per notificare alle parti interessate le modifiche apportate alle risorse. Se è necessario tenere traccia delle modifiche alla struttura delle risorse mentre il plug-in è in esecuzione, è possibile registrare un IResourceChangeListener per l'area di lavoro. Il listener riceverà la notifica delle modifiche attraverso un oggetto IResourceChangeEvent, che descriverà le modifiche.
Per tenere traccia delle modifiche alle risorse, registrare un listener di modifiche delle risorse sull'area di lavoro.
IResourceChangeListener listener = new MyResourceChangeReporter();
ResourcesPlugin.getWorkspace().addResourceChangeListener(
listener, IResourceChangeEvent.POST_CHANGE);
Il listener verrà informato dopo l'esecuzione di modifiche alle risorse dell'area di lavoro. I metodi dell'API di risorse che modificano le risorse attivano questi eventi come parte della propria funzionalità documentata. Il commento del metodo di un'API di risorse riporta esplicitamente l'attivazione o meno di un evento di modifica delle risorse. Ad esempio, quanto riportato di seguito viene incluso nel commento di IFile.createContents():
Questo metodo modifica le risorse; le modifiche verranno riportate in un successivo evento di modifica risorse comprendente l'indicazione che il contenuto di tale file è stato modificato.
I metodi per la creazione, la cancellazione o la modifica di una risorsa, generalmente attivano questi eventi. I metodi che consultano ma non intervengono sulle risorse, generalmente non attivano questi eventi.
Se si desidera modificare una serie di risorse in un unico momento, è possibile eseguire il batch delle chiamate dell'API di modifica di risorse in modo che un solo evento di modifica risorse verrà inviato per l'intera serie di modifiche. IWorkspace.run(runnable, monitor) viene utilizzato per il batch delle operazioni. Gli eventi di modifica risorse vengono inviati ai listener registrati solo quando l'eseguibile specificato è stato completato. Qualsiasi eseguibile aggiuntivo (nidificato) creato nell'eseguibile verrà considerato parte dell'operazione di batch principale e le modifiche di risorse apportate in tali eseguibili appariranno nella notifica di modifica di risorse dell'elemento principale.
Utilizzare il batch delle modifiche ogni volta che è possibile per limitare il sovraccarico di trasmissione di molte modifiche granulari. La mancanza di utilizzo del batching determinerà probabilmente notifiche di modifica delle risorse e build automatiche del sistema.
L'evento di modifica risorse descrive le specifiche della modifica (o della serie di modifiche) apportata nell'area di lavoro. L'evento contiene un delta delle risorse che descrive l'effetto di rete delle modifiche. Ad esempio, se si aggiunge una risorsa e, successivamente, si cancella durante un batch di modifiche, la risorsa non apparirà nel delta.
Il delta delle risorse è strutturato come una struttura ad albero derivante dalla directory principale dell'area di lavoro. La struttura del delta delle risorse descrive i seguenti tipi di modifiche:
Per esplorare una struttura di delta delle risorse, implementare l'interfaccia IResourceDeltaVisitor oppure esaminare esplicitamente la struttura utilizzando IResource.getAffectedChildren. I visitatori del delta delle risorse implementano un metodo visit richiamato dal delta delle risorse ad ogni modifica apportata nella struttura.
Nota: le modifiche apportate alle proprietà di sessione o alle proprietà persistenti delle risorse non vengono identificate nel delta delle risorse.
Gli eventi di modifica delle risorse vengono inviati ogni volta che una modifica (o una serie di modifiche) viene apportata all'area di lavoro. Inoltre, tali eventi vengono inviati anche per alcune specifiche operazioni dell'area di lavoro. La tabella seguente riepiloga i tipi di eventi di modifica delle risorse e quando questi vengono riportati.
Tipo di evento |
Descrizione |
---|---|
PRE_CLOSE |
Notifica ai listener che sta per essere chiuso un progetto. Questo evento può essere utilizzato per estrarre e salvare informazioni necessarie dalla rappresentazione in memoria (ad es., proprietà di sessione) di un progetto prima che questo venga chiuso. Quando un progetto viene chiuso, la rappresentazione in memoria viene eliminata. Durante questo evento, l'area di lavoro è bloccata (nessuna risorsa può essere aggiornata). L'evento PRE_CLOSE viene attivato anche durante la chiusura dell'area di lavoro, dato che verranno chiusi tutti i progetti aperti. L'evento contiene il progetto che sta per essere chiuso. |
PRE_DELETE |
Notifica ai listener che sta per essere cancellato un progetto. Questo evento può essere utilizzato per eseguire operazioni di ripulitura, quali la rimozione di qualsiasi stato salvato relativo al progetto dalla directory del plug-in. Durante questo evento, l'area di lavoro è bloccata (nessuna risorsa può essere aggiornata). L'evento contiene il progetto che sta per essere cancellato. |
PRE_AUTOBUILD |
Notifica ai listener prima che si verifichi una build automatica. Questo evento viene trasmesso quando la piattaforma rileva la necessità di eseguire una build automatica, indipendentemente dal fatto che tale funzione sia o meno effettivamente abilitata. L'area di lavoro non è bloccata durante questo evento (le risorse possono essere aggiornate). L'evento contiene un delta delle risorse che descrive le modifiche occorse dalla notifica dell'ultimo evento POST_CHANGE. |
POST_AUTOBUILD |
Notifica ai listener dopo il verificarsi di una build automatica. Questo evento viene trasmesso dopo che la piattaforma ha eseguito una build automatica, indipendentemente dal fatto che tale funzione sia o meno effettivamente abilitata. L'area di lavoro non è bloccata durante questo evento (le risorse possono essere aggiornate). L'evento contiene un delta delle risorse che descrive le modifiche occorse dalla notifica dell'ultimo evento POST_CHANGE. |
POST_CHANGE |
Descrive una serie di modifiche occorse nell'area di lavoro dal momento in cui è stato riportato l'ultimo evento POST_CHANGE. Viene attivato dopo l'utilizzo singolo di un'API di modifica delle risorse o in una serie in batch di modifiche dell'area di lavoro. Viene attivato anche dopo il completamento di una notifica PRE_AUTOBUILD o POST_AUTOBUILD. L'evento contiene un delta delle risorse che descrive le modifiche di rete a partire dall'ultimo evento POST_CHANGE. L'area di lavoro è bloccata (nessuna risorsa può essere aggiornata) durante questo evento. |
Il seguente esempio implementa un listener di modifica delle risorse basato sulla console. Un listener di modifica delle risorse viene registrato per tipi specifici di eventi e le informazioni su tali eventi vengono visualizzate sulla console:
IResourceChangeListener listener = new MyResourceChangeReporter();
ResourcesPlugin.getWorkspace().addResourceChangeListener(listener,
IResourceChangeEvent.PRE_CLOSE
| IResourceChangeEvent.PRE_DELETE
| IResourceChangeEvent.PRE_AUTO_BUILD
| IResourceChangeEvent.POST_AUTO_BUILD
| IResourceChangeEvent.POST_CHANGE);
Il listener controlla ogni tipo di evento e riporta le informazioni sulla risorsa modificata e sui tipi di modifiche occorse. Sebbene questo esempio sia progettato per un listener generico che gestisce tutti i tipi di eventi di risorse, un listener tipico registrerà un solo tipo di evento.
L'implementazione per POST_CHANGE utilizza un'altra classe che è possibile utilizzare per "visitare" le modifiche nel delta delle risorse.
import org.eclipse.resources.*;
import org.eclipse.runtime.*;
public class MyResourceChangeReporter implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
IResource res = event.getResource();
switch (event.getType()) {
case
IResourceChangeEvent.PRE_CLOSE:
System.out.print("Project ");
System.out.print(res.getFullPath());
System.out.println(" is about to close.");
break;
case
IResourceChangeEvent.PRE_DELETE:
System.out.print("Project ");
System.out.print(res.getFullPath());
System.out.println(" is about to be deleted.");
break;
case
IResourceChangeEvent.POST_CHANGE:
System.out.println("Resources have changed.");
event.getDelta().accept(new DeltaPrinter());
break;
case IResourceChangeEvent.PRE_AUTO_BUILD:
System.out.println("Auto build about to run.");
event.getDelta().accept(new DeltaPrinter());
break;
case IResourceChangeEvent.POST_AUTO_BUILD:
System.out.println("Auto build complete.");
event.getDelta().accept(new DeltaPrinter());
break;
}
}
}
La classe DeltaPrinter implementa l'interfaccia IResourceDeltaVisitor per interrogare il delta delle risorse. Il metodo visit() viene richiamato per ogni modifica di risorsa presente nel delta delle risorse. Il visitatore utilizza un valore restituito per indicare se visitare i delta delle risorse secondarie.
class DeltaPrinter implements IResourceDeltaVisitor {
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (delta.getKind()) {
case IResourceDelta.ADDED:
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" was added.");
break;
case IResourceDelta.REMOVED"
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" was removed.");
break;
case IResourceDelta.CHANGED:
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" has changed.");
break;
}
return true; // visitare gli elementi secondari
}
}
Ulteriori informazioni sono reperibili nel delta delle risorse fornito all'utente. Il frammento di codice seguente mostra come può essere implementato il case IResourceDelta.CHANGED per descrivere ulteriormente le modifiche delle risorse.
...
case IResourceDelta.CHANGED:
System.out.print("Resource ");
System.out.print(delta.getFullPath());
System.out.println(" has changed.");
switch (delta.getFlags()) {
case IResourceDelta.CONTENT:
System.out.println("--> Content Change");
break;
case IResourceDelta.REPLACED:
System.out.println("--> Content Replaced");
break;
case IResourceDelta.REMOVED:
System.out.println("--> Removed");
break;
case IResourceDelta.MARKERS:
System.out.println("--> Marker Change");
IMarkerDelta[] markers =
delta.getMarkerDeltas();
// se interessano gli indicatori,
controllare questi delta
break;
}
break;
...
Per una descrizione completa dei delta delle risorse, dei visitatori e dei delta degli indicatori, consultare la specifica API per IResourceDelta, IResourceDeltaVisitor e IMarkerDelta.
Nota: i listener di modifica delle risorse sono utili per la traccia delle modifiche che si verificano nelle risorse mentre il plug-in è attivato. Se il plug-in dell'utente registra un listener di modifica delle risorse durante il proprio codice di avvio, è possibile che molti eventi di modifica di risorse siano stati attivati prima dell'attivazione del plug-in stesso. Il delta delle risorse contenuto nel primo evento di modifica delle risorse ricevuto dal plug-in non conterrà tutte le modifiche effettuate poiché il plug-in è stato attivato successivamente. Se è necessario tenere la traccia delle modifiche effettuate tra le attivazioni del plug-in, utilizzare il supporto fornito per il salvataggio dell'area di lavoro. Tale supporto è illustrato in Partecipazione di salvataggio dell'area di lavoro.