En las descripciones anteriores de los recursos y del sistema de archivos (Correlacionar recursos con ubicaciones de disco), se presuponía que todos los recursos de un proyecto se encontraban en la misma ubicación del sistema de archivos. Generalmente, esto es verdad. Sin embargo, la noción de recursos enlazados al entorno de trabajo implica que los archivos y carpetas de un proyecto puedan almacenarse en el sistema de archivos fuera de la ubicación del proyecto.
Los recursos enlazados deben tener un proyecto como recurso padre. Pueden ubicarse virtualmente en cualquier lugar del sistema de archivos. Pueden residir fuera de la ubicación del proyecto, o incluso dentro de otro proyecto. Las ubicaciones de los recursos enlazados están sujetas a unas pocas restricciones. Puede utilizarse el método IWorkspace.validateLinkLocation para asegurarse de que una ubicación determinada sea válida para crear un recurso enlazado.
Los recursos enlazados se crean mediante los métodos
IFolder.createLink
o
IFile.createLink.
Para determinar programáticamente si un recurso determinado es un recurso enlazado, puede
utilizar el método
IResource.isLinked.
Tenga en cuenta que este método sólo devolverá true
para los recursos enlazados, no para los hijos de recursos enlazados.
Aparte de estos métodos especiales para crear recursos enlazados y averiguar si un recurso está enlazado, puede utilizar la API habitual del área de trabajo al manipular recursos enlazados. En la mayoría de los aspectos, los recursos enlazados actúan exactamente igual que cualquier otro recurso del área de trabajo. Sin embargo, están sujetos a algunas restricciones por lo que respecta a movimiento, copia y supresión. Consulte IResource y sus subclases para obtener información acerca de las operaciones individuales y sus limitaciones.
Pueden utilizarse variables de vía de acceso al especificar la ubicación de los recursos enlazados. Una variable de vía de acceso es una correlación simple (String -> IPath) que define un acceso directo a una ubicación del sistema de archivos. Las variables pueden facilitar la gestión de los recursos enlazados, al reducir el número de ubicaciones en las que se utilizan vías de acceso absolutas del sistema de archivos codificadas por programa.
Las variables de vía de acceso reducen la gestión por parte del usuario de los recursos enlazados de diversas formas:
El último elemento de esta lista merece una explicación más detallada. Cuando el usuario crea un recurso enlazado en un proyecto, una descripción del recurso enlazado se añade al archivo de descripción del proyecto (".project") en la ubicación del proyecto. Al utilizar una variable de vía de acceso, los usuarios pueden compartir un proyecto (copiando el contenido del mismo o utilizando un repositorio) y redefinir la variable para que se ajuste a cada una de las estaciones de trabajo individuales. Por ejemplo, un usuario puede
almacenar recursos externos bajo c:\temp en un sistema, mientras que otro usuario que utiliza
Unix puede almacenar los mismos recursos en /home/username/tmp. La definición de una
variable de vía de acceso en cada área de trabajo (TEMP=c:\temp
y
TEMP=/home/userb/tmp)
permite a los usuarios orillar esta diferencia y compartir sin más los proyectos que cuentan con recursos enlazados.
IPathVariableManager define la API destinada a crear, manipular y resolver variables de vía de acceso. También suministra métodos para validar nombres y valores de variable antes de crearlas, y para instalar un escuchador al que deben notificarse los cambios en las definiciones de variable de vía de acceso. Puede obtener una instancia de esta clase utilizando IWorkspace.getPathVariableManager. Consulte los ejemplos de código que figuran al final de esta sección para obtener más detalles.
Puede utilizarse el método IResource.getRawLocation para averiguar la ubicación no resuelta de un recurso enlazado. Es decir, para obtener el nombre real de la variable de vía de acceso en lugar de resolverlo como su valor. Si una ubicación de recurso no está definida con una variable de vía de acceso, el método getRawLocation actúa exactamente igual que el método getLocation.
Los clientes que manipulan los recursos programáticamente deben ser conscientes de la posibilidad de que existan enlaces rotos. Los enlaces rotos se producen cuando la ubicación de un recurso enlazado no existe o se ha especificado en relación a una variable de vía de acceso no definida. Los siguientes casos especiales hacen referencia a la utilización del protocolo IResource:
null
para los recursos enlazados cuyas ubicaciones sean relativas a variables de vía de acceso no definidas.Es posible que algunos conectores no sean capaces de manejar recursos enlazados, por lo que existen diversos mecanismos disponibles para inhabilitarlos. Si escribe un conector que precisa sin falta que todo el contenido de un proyecto se encuentre en la ubicación por omisión del proyecto, puede utilizar estos mecanismos para impedir que los usuarios creen recursos enlazados en lugares en los que no desea que aparezcan.
El primer mecanismo se denomina veto de naturaleza de proyecto. Si define su propia naturaleza de proyecto, puede especificar en la definición de naturaleza que ésta no es compatible con los recursos enlazados. A continuación figura un ejemplo de definición de naturaleza que emplea el veto de naturaleza:
<extension id="miNaturaleza" name="Mi Naturaleza" point="org.eclipse.core.resources.natures"> <runtime> <run class="com.xyz.MyNature"/> </runtime> <options allowLinking="false"/> </extension>
El segundo mecanismo para impedir la creación de recursos enlazados es el gancho de equipo. Si define su propia implementación de repositorio, puede utilizar el punto de extensión org.eclipse.core.resources.teamHook para impedir la creación de recursos enlazados en proyectos compartidos con el tipo de repositorio. Por omisión, los proveedores de repositorios no permiten los recursos enlazados en proyectos conectados al repositorio.
Si un conector más antiguo que no tiene conocimiento de los recursos enlazados es quien suministra el soporte de repositorio, no podrá crear recursos enlazados en esos proyectos.
Finalmente, existe en las preferencias un valor que puede utilizarse para inhabilitar los recursos enlazados en toda el área de trabajo. Mientras que los dos mecanismos de veto anteriores actúan en función del proyecto, esta preferencia afecta a todos los proyectos del área de trabajo. Para establecer esta preferencia programáticamente, utilice la preferencia
ResourcesPlugin.PREF_DISABLE_LINKING
.
Tenga en cuenta que, aunque se haya establecido este valor, los usuarios o los conectores pueden alterarlo temporalmente desactivando la preferencia.
Examinemos algunos ejemplos de código de utilización de recursos enlazados. Empezaremos por definir una variable de vía de acceso:
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 { //nombre o valor no válido, lanzar una excepción o avisar al usuario }
Ahora podemos crear un recurso enlazado relativo a la variable de vía de acceso definida:
IProject project = workspace.getProject("Project");//presuponer que existe IFolder link = project.getFolder("Link"); IPath location = new Path("TEMP/folder"); if (workspace.validateLinkLocation(location).isOK()) { link.createLink(location, IResource.NONE, null); } else { //ubicación no válida, lanzar una excepción o avisar al usuario }
Esto es todo. Ahora disponemos de una carpeta enlazada en el área de trabajo, denominada "Link", ubicada en "c:\temp\folder".
Terminaremos con algunos fragmentos de código de este recurso enlazado que muestran el comportamiento de otros métodos relacionados con los recursos enlazados:
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"