Nelle discussioni precedenti relative alle risorse e al file system (Associazione delle risorse ai percorsi del disco) si è supposto che tutte le risorse di un progetto si trovino nello stesso percorso all'interno del file system. In genere questo è quanto accade. Tuttavia, il concetto di risorse collegate nel workbench viene fornito in modo che i file e le cartelle contenute in un progetto possano essere memorizzate nel file system all'esterno del percorso del progetto.
Le risorse collegate devono disporre di un progetto come risorsa principale. Possono trovarsi virtualmente in qualsiasi punto del file system e risiedere all'esterno del percorso del progetto o persino all'interno di un altro progetto. Esistono solo alcune restrizioni relative ai percorsi delle risorse collegate. È possibile utilizzare il metodo IWorkspace.validateLinkLocation per verificare la validità di un determinato percorso per la creazione di una risorsa collegata.
Le risorse collegate vengono create mediante il metodo
IFolder.createLink o
IFile.createLink.
Per stabilire a livello di programmazione se una determinata risorsa è una risorsa collegata, è possibile utilizzare il metodo IResource.isLinked.
Si tenga presente che tale metodo restituirà true
solo per le risorse collegate, non per i relativi elementi secondari.
Per manipolare le risorse collegate, oltre ai metodi speciali che consentono di crearle e comprendere se una risorsa è collegata, è possibile utilizzare la normale API dello spazio di lavoro. Per molti aspetti, le risorse collegate funzionano esattamente come qualsiasi altra risorsa nello spazio di lavoro. Tuttavia, per lo spostamento, la copia o l'eliminazione delle risorse collegate vengono applicate alcune restrizioni. Per informazioni sulle singole operazioni e le relative limitazioni, vedere IResource e le relative sottoclassi.
Le variabili di percorso possono essere utilizzate per specificare il percorso delle risorse collegate. Una variabile di percorso è una semplice associazione (Stringa -> IPath) che definisce un collegamento a un percorso nel file system. Le variabili possono semplificare la gestione delle risorse collegate riducendo il numero di percorsi in cui vengono utilizzati i percorsi assoluti del file system prefissati nel codice.
Le variabili di percorso semplificano la gestione delle risorse collegate in diversi modi:
L'ultima voce dell'elenco richiede una spiegazione. Quando un utente crea una risorsa collegata in un progetto, viene aggiunta una descrizione di tale risorsa al file di descrizione del progetto (".project") nel percorso del progetto stesso.
Grazie all'uso di una variabile di percorso, gli utenti possono condividere un progetto (copiandone il contenuto o utilizzando un repository) e ridefinire la variabile adatta a ogni singola stazione di lavoro. Ad esempio, un utente può memorizzare le risorse esterne nel percorso c:\temp di un sistema,
mentre un altro utente che utilizza Unix può memorizzare le stesse risorse in /home/username/tmp. La definizione di una variabile di percorso su ciascuna stazione di lavoro (TEMP=c:\temp
e TEMP=/home/userb/tmp)
consente agli utenti di risolvere questa differenza e condividere i progetti con le risorse collegate senza apportare variazioni.
IPathVariableManager definisce l'API per la creazione, la manipolazione e la risoluzione delle variabili di percorso e fornisce metodi per la convalida dei nomi e dei valori di variabile prima della relativa creazione e per l'installazione di un listener a cui inviare una notifica quando le definizioni delle variabili di percorso cambiano. Per ottenere un'istanza di questa classe, è necessario utilizzare IWorkspace.getPathVariableManager. Per ulteriori dettagli, vedere gli esempi di codice riportati alla fine di questa sezione.
Il metodo IResource.getRawLocation può essere utilizzato per individuare il percorso non risolto di una risorsa collegata, ossia per ottenere il nome della variabile del percorso effettivo anziché risolverla nel relativo valore. Se nella variabile di percorso non è definito il percorso di una risorsa, il metodo getRawLocation funziona esattamente come il metodo getLocation.
I client che manipolano le risorse a livello di programmazione devono essere consapevoli della possibilità che i collegamenti vengano interrotti. I collegamenti si interrompono quando non esiste il percorso di una risorsa collegata o quando viene specificato un percorso relativo di una variabile di percorso non definita. I casi speciali che seguono sono validi quando si utilizza il protocollo IResource:
null
per le risorse collegate con percorsi relativi
delle variabili di percorso non definite.Dal momento che alcuni plug-in potrebbero non essere in grado di gestire le risorse collegate, sono disponibili alcuni meccanismi per la relativa disabilitazione. Se si scrive un plug-in che richiede che tutto il contenuto di un progetto si trovi nel percorso predefinito del progetto, è possibile utilizzare questi meccanismi per impedire che gli utenti creino risorse collegate nei percorsi non desiderati.
Il primo meccanismo è chiamato veto della natura del progetto. Se si definisce la
natura del proprio progetto, è possibile specificare nella definizione che la natura non è compatibile con le risorse collegate.
Di seguito è riportato un esempio di definizione di natura che impiega tale meccanismo:
<extension
id="myNature"
name="My Nature"
point="org.eclipse.core.resources.natures">
<runtime>
<run class="com.xyz.MyNature"/>
</runtime>
<options allowLinking="false"/>
</extension>
Il secondo meccanismo che consente di impedire la creazione delle risorse collegate è chiamato hook del team. Se si definisce l'implementazione del repository, è possibile utilizzare il punto di estensione org.eclipse.core.resources.teamHook per impedire la creazione delle risorse collegate nei progetti che sono condivisi con il proprio tipo di repository. Per impostazione predefinita, i fornitori dei repository non consentono la creazione di risorse collegate nei progetti collegati al repository.
Se il supporto del repository è fornito da un plug-in precedente che non rileva le risorse collegate, non sarà possibile creare risorse collegate in questi progetti.
Infine, è possibile utilizzare un'impostazione di preferenza per disabilitare le risorse collegate per l'intero spazio di lavoro.
Diversamente dai due precedenti meccanismi di veto che agiscono su ciascun progetto, questa preferenza influisce su tutti i progetti dello spazio di lavoro. Per impostarla a livello di programmazione,
utilizzare la preferenza ResourcesPlugin.PREF_DISABLE_LINKING
.
Questa impostazione viene generalmente utilizzata insieme alla funzione principale
meccanismo di sostituzione dei riferimenti per consentire che la funzione principale dell'installazione Eclipse disattivi le risorse collegate.
Si noti che anche quando viene impostata, gli utenti o i plug-in possono sostituirla disattivando la preferenza.
Di seguito sono riportati alcuni esempi di utilizzo delle risorse collegate nel codice. Nel primo esempio
viene definita una variabile di percorso:
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IPathVariableManager pathMan = workspace.getPathVariableManager();
String name = "TEMP";
IPath value = new Path("c:\\temp");
if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) {
pathMan.setValue(name, value);
} else {
//nome o valore non valido, viene generata un'eccezione o l'utente viene avvisato
}
A questo punto è possibile creare una risorsa collegata relativa alla variabile di percorso definita:
IProject project = workspace.getProject("Project");//si suppone che esista
IFolder link = project.getFolder("Link");
IPath location = new Path("TEMP/folder");
if (workspace.validateLinkLocation(location).isOK()) {
link.createLink(location, IResource.NONE, null);
} else {
//percorso non valido, viene generata un'eccezione o l'utente viene avvisato
}
In questo modo si ottiene una cartella collegata nello spazio di lavoro chiamata "Link"
e ubicata nel percorso "c:\temp\folder".
Infine, i frammenti di codice che seguono illustrano il funzionamento di altri metodi relativi alle risorse collegate:
link.getFullPath() ==> "/Project/Link"
link.getLocation() ==> "c:\temp\folder"
link.getRawLocation() ==> "TEMP/folder"
link.isLinked() ==> "true"
IFile child = link.getFile("abc.txt");
child.create(...);
child.getFullPath() ==> "/Project/Link/abc.txt"
child.getLocation() ==> "c:\temp\folder\abc.txt"
child.getRawLocation() ==> "c:\temp\folder\abc.txt"
child.isLinked() ==> "false"