Recursos Vinculados

Discussões anteriores sobre recursos e o sistema de arquivos (Mapeamento de recursos a localizações de discos) assumiram que todos os recursos em um projeto estão localizados no mesmo lugar no sistema de arquivos.  Isso geralmente é verdade.  Entretanto, o conceito de recursos vinculados no workbench é fornecido para que os arquivos e pastas dentro de um projeto possam ser armazenados no sistema de arquivos fora da localização do projeto. 

Os recursos vinculados devem ter um projeto como seu recurso pai. Eles podem ser localizados praticamente em qualquer lugar no sistema de arquivos. Podem residir fora da localização do projeto ou mesmo dentro de outro projeto. Existem apenas poucas restrições em localizações de recursos vinculadas. O método IWorkspace.validateLinkLocation pode ser utilizado para assegurar que uma determinada localização é válida para criar um recurso vinculado.

Os recursos vinculados são criados utilizando o método IFolder.createLink ou IFile.createLink. Para determinar de maneira programática se um determinado recurso é vinculado, é possível utilizar o método IResource.isLinked. Observe que esse método retornará true apenas para recursos vinculados, não para filhos de recursos vinculados.

Além desses métodos especiais para criação de recursos vinculados e descobrir se um recurso é vinculado, é possível utilizar a API normal do espaço de trabalho ao manipular recursos vinculados. Na maioria dos aspectos, os recursos vinculados agem exatamente como qualquer outro recurso no espaço de trabalho. Entretanto, algumas restrições se aplicam ao mover, copiar ou excluir recursos vinculados.  Consulte IResource e suas subclasses para obter informações sobre operações individuais e suas limitações.

Variáveis de Caminho

As variáveis de caminho podem ser utilizadas ao especificar a localização de recursos vinculados.  Uma variável de caminho é um mapeamento (String -> IPath) simples que define um atalho para uma localização no sistema de arquivos.  As variáveis podem facilitar o gerenciamento de recursos vinculados pela redução do número de locais onde caminhos embutidos em código absolutos do sistema de arquivos são utilizados.  

As variáveis de caminho dinamizam o gerenciamento dos recursos vinculados para usuários de várias maneiras:

O último item nessa lista merece um pouco de explicação. Quando um usuário cria um recurso vinculado em um projeto, uma descrição do recurso vinculado é adicionada ao arquivo de descrição do projeto (".project") na localização do projeto. Utilizando uma variável de caminho, os usuários podem compartilhar um projeto (copiando o conteúdo do projeto ou utilizando um repositório), e redefinir a variável para que se adeqüe a cada estação de trabalho individual.  Por exemplo, um usuário pode armazenar recursos externos em c:\temp em um sistema, enquanto outro usuário utilizando Unix poderia armazenar os mesmos recursos em /home/username/tmp.  A definição de uma variável de caminho em cada espaço de trabalho (TEMP=c:\temp e TEMP=/home/userb/tmp) permite aos usuários contornar essa diferença e compartilhar os projetos com os recursos vinculados como estão.

IPathVariableManager define a API para criar, manipular e resolver variáveis de caminho. Ele também fornece métodos para validação de nomes e valores de variáveis antes de criá-las e para instalação de um atendente a ser notificado quando as definições da variável de caminho forem alteradas. É possível obter uma instância dessa classe utilizando IWorkspace.getPathVariableManager. Consulte os exemplos de código no final desta seção para obter detalhes adicionais.

O método IResource.getRawLocation pode ser utilizado para descobrir a localização não resolvida de um recurso vinculado. Ou seja, obter o nome real da variável de caminho em vez de resolvê-la para seu valor.  Se a localização de um recurso não estiver definida em uma variável de caminho, o método getRawLocation age exatamente como o método getLocation.

Links Interrompidos

Os clientes que manipulam recursos de modo programático precisam estar cientes da possibilidade de links interrompidos. Os links interrompidos ocorrem quando a localização de um recurso vinculado não existe ou foi especificada relativamente a uma variável de caminho indefinida. Os casos especiais a seguir se aplicam ao utilizar o protocolo IResource:

Compatibilidade com Plug-ins Instalados

Alguns plug-ins podem não ser capazes de tratar recursos vinculados, portanto há alguns mecanismos disponíveis para desativá-los. Se estiver gravando um plug-in que realmente precise que todo o conteúdo de um projeto seja encontrado na localização padrão do projeto, você pode utilizar esses mecanismos para prevenir que os usuários criem recursos vinculados onde não deseja que eles apareçam.

O primeiro mecanismo é chamado veto da natureza do projeto. Se você definir sua própria natureza do projeto, é possível especificar a definição de natureza que a natureza não é compatível com recursos vinculados. Aqui está um exemplo de uma definição de natureza que emprega o veto da natureza:

<extension
	id="myNature"
	name="My Nature"
	point="org.eclipse.core.resources.natures">
	<runtime>
		<run class="com.xyz.MyNature"/>
	</runtime>
	<options allowLinking="false"/>
</extension>

O segundo mecanismo para prevenir a criação do recurso vinculado é o gancho de equipe. Se você definir sua própria implementação de repositório, é possível utilizar o ponto de extensão org.eclipse.core.resources.teamHook para prevenir a criação de recursos vinculados em projetos que são compartilhados com seu tipo de repositório. Por padrão, os provedores de repositórios não permitem recursos vinculados em projetos conectados ao repositório. 

Se o suporte de repositório for fornecido por um plug-in mais antigo que não esteja ciente de recursos vinculados, não será possível criar recursos vinculados nesses projetos. 

Finalmente, há uma definição de preferência que pode ser utilizada para desativar recursos vinculados para o espaço de trabalho inteiro. Enquanto os dois mecanismos de veto anteriores funcionam por projeto, essa preferência afeta todos os projetos no espaço de trabalho. Para definir essa preferência de modo programático, utilize a preferência ResourcesPlugin.PREF_DISABLE_LINKING. Essa definição será utilizada normalmente em conjunto com o recurso principal mecanismo de substituição de preferência para permitir que o recurso principal da instalação do Eclipse desative os recursos vinculados. Observe que mesmo quando definido, os usuários ou plug-ins podem substituir isso pela desativação da preferência.

Recursos Vinculados no Código

Vejamos alguns exemplos de utilização de recursos vinculados no código. Iniciaremos pela definição de uma variável de caminho:

   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 ou valor inválido, lançar uma exceção ou avisar o usuário
   }
Agora podemos criar um recurso vinculado relativo à variável de caminho definida:
   IProject project = workspace.getProject("Project");//assumir que exista
   IFolder link = project.getFolder("Link");
   IPath location = new Path("TEMP/folder");
   if (workspace.validateLinkLocation(location).isOK()) {
      link.createLink(location, IResource.NONE, null);
   } else {
      //localização inválida, lançar uma exceção ou avisar o usuário
   }
É isso! Agora você possui uma pasta vinculada em seu espaço de trabalho chamada "Link" que está localizada em "c:\temp\folder".

Terminaremos com alguns fragmentos de código nesse recurso vinculado para ilustrar o comportamento de outros métodos relacionados aos recursos vinculados:

   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"
   

Copyright IBM Corporation e outros 2000, 2003.