Provedores de Repositório

Um provedor de repositório (RepositoryProvider) é a classe central na implementação de seu repositório.  Essa classe é responsável pela configuração de um projeto para gerenciamento de repositório e fornecimento dos ganchos necessários para modificação do recurso.  Os provedores são mapeados para um projeto utilizando propriedades persistentes do projeto.  O mecanismo para mapeamento de provedores para um projeto não é central na API da equipe, mas será necessário que você o reconheça ao filtrar recursos na sua UI.  Na maior parte, a API da equipe estará sendo utilizada para funcionar com projetos e associá-los ao provedor.  

Para implementar um provedor, é necessário definir um repositório utilizando org.eclipse.team.core.repository e fornecendo uma classe derivada de  RepositoryProvider.  Utilizaremos o cliente CVS como exemplo para ver como isso funciona.

Ponto de extensão

O ponto de extensão org.eclipse.team.core.repository é utilizado para adicionar uma definição de repositório.  A seguir a marcação para o cliente CVS.

<extension 

point="org.eclipse.team.core.repository">
<repository
class="org.eclipse.team.internal.ccvs.core.CVSTeamProvider"
id="org.eclipse.team.cvs.core.cvsprovider">
</repository>
</extension>

Isso registra seu fornecedor de equipe com o plug-in de suporte da equipe e atribui um ID que deverá ser utilizado quando seu provedor for associado a um projeto.  A classe especificada para o repositório deve estender RepositoryProvider.

Implementando um Provedor de Repositório

A classe identificada na extensão deve ser uma classe filha de RepositoryProvider. Suas principais responsabilidades são configurar e desconfigurar um projeto para suporte ao repositório e fornecer os ganchos de modificação de recursos necessários.  O cliente CVS serve como um bom exemplo.  Seu provedor de repositório é CVSTeamProvider.

   public class CVSTeamProvider extends RepositoryProvider {

...

RepositoryProvider define dois métodos abstratos, configureProject e deconfigure.  Todos os fornecedores devem implementar esses métodos. 

Um projeto é configurado no momento da sua associação a um provedor de repositório específico.  Isso normalmente acontece quando o usuário seleciona um projeto e utiliza os assistentes de equipe para associar um projeto a seu repositório.  Independentemente de como a operação é acionada, esse é o momento apropriado para calcular ou armazenar em cache quaisquer dados sobre o projeto que serão necessários para fornecer sua função de repositório.  (Assuma que o mapeamento do projeto para seu fornecedor já tenha acontecido.  Você tratará disso no seu assistente de configuração.)

O fornecedor do CVS simplesmente divulga o fato de um projeto ter sido configurado:

public void configureProject() throws CoreException {

CVSProviderPlugin.broadcastProjectConfigured(getProject());
}

Não seguimos a implementação do mecanismo de difusão do plug-in.  Basta dizer que as partes que precisam calcular ou inicializar dados específicos do projeto podem fazer isso agora.

Um projeto é desconfigurado quando o usuário não deseja mais associar um provedor de equipe a um projeto.   Cabe ao plug-in implementar a ação do usuário que faz com que isso aconteça (e a retirada do mapeamento do projeto a partir do provedor de equipe acontecerá aí).  O método deconfigure   é a hora apropriada para excluir os caches relacionados ao projeto ou remover as referências ao projeto na UI.  O fornecedor do CVS esvazia os caches relacionados ao projeto mantidos em suas exibições e faz a difusão do fato de que o projeto foi desconfigurado.

public void deconfigure() throws CoreException {

...
try {
EclipseSynchronizer.getInstance().flush(getProject(), true, true /*flush deep*/, null);
} catch(CVSException e) {
throw new CoreException(e.getStatus());
} finally {
CVSProviderPlugin.broadcastProjectDeconfigured(getProject());
}
}

Configurando um Projeto

Normalmente, a primeira etapa na construção de uma UI de equipe é implementar uma página de assistente que permite aos usuários configurar um projeto para o suporte de equipe de seu plug-in.  Esse é o lugar onde o ID do fornecedor de equipe será adicionado às propriedades do projeto.  Você participa na configuração do projeto pela contribuição ao ponto de extensão org.eclipse.team.ui.configurationWizards.  Esse assistente é mostrado quando o usuário escolhe Equipe->Compartilhar Projeto...

Examinaremos isso no contexto da implementação do cliente CVS.  A seguir, a marcação da UI do CVS para seu assistente de configuração:

<extension 

point="org.eclipse.team.ui.configurationWizards">
<wizard
name="%SharingWizard.name"
icon="icons/full/wizards/newconnect_wiz.png"
class="org.eclipse.team.internal.ccvs.ui.wizards.SharingWizard"
id="org.eclipse.team.ccvs.ui.SharingWizard">
</wizard>
</extension>

Como de costume, os plug-ins fornecem uma classe que implementa a extensão e um ID exclusivo para identificar sua extensão.  O nome e o ícone são mostrados na primeira página do assistente de configuração do projeto se houver vários fornecedores entre os quais escolher.

Depois que o usuário seleciona um fornecedor, a página seguinte mostra as informações de configuração específicas de seu fornecedor.  (Se seu fornecedor for o único plug-in de fornecedor de equipe instalado, o assistente irá diretamente para sua página.)  Seu assistente deve implementar IConfigurationWizard, que inicializa o assistente para um workbench e projeto especificados.  O restante da implementação depende do design de seu assistente. Você deve reunir as informações necessárias para associar o projeto ao seu suporte de equipe.

Quando o assistente for concluído, será necessário mapear o fornecedor da equipe para o projeto utilizando RepositoryProvider.map(IProject, String).  O mapeamento trata da atribuição da propriedade persistente correta do seu projeto.

O cliente CVS realiza esse trabalho no método setSharing de seu fornecedor, que é chamado quando o assistente é concluído:

public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {


// Assegure que as informações fornecidas correspondam às do projeto
...
// Assegure que a localização fornecida seja gerenciada
...
// Registre o projeto com a Equipe
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}

Localizando um Fornecedor

Os métodos estáticos em RepositoryProvider facilitam aos clientes o mapeamento de projetos para fornecedores e a localização de fornecedores associados a um determinado projeto.

Provedores de Repositório e Recursos

Se um produto decide incluir um plug-in de Repositório em um recurso, ele deve ligar o recurso ao id do repositório. Aqui estão as duas etapas para ativar um RepositoryProvider como um recurso:

  1. Ligue o recurso ao id do fornecedor do repositório. Isso permite que o plug-in de Equipe seja ativado/desativado com base nos ids do fornecedor de repositório.
    <activityPatternBinding
        activityId="org.eclipse.team.cvs"
        pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
    </activityPatternBinding>
  2. A seguir, ligue o recurso a todos os pacotes UI para o fornecedor:
    <activityPatternBinding
         activityId="org.eclipse.team.cvs"
         pattern="org\.eclipse\.team\.cvs\.ui/.*">
    </activityPatternBinding>

Há dois pontos acionadores de recursos definidos pelos plug-ins da Equipe. O primeiro é o assistente Equipe > Compartilhar Projeto... que permite a filtragem de fornecedores de repositório com base no estado ativado/desativado dos recursos do workbench e o outro é o acionador de auto-ativação do plug-in Equipe.

Ganchos de Modificação de Recursos

A maior parte das funções interessantes associadas a um fornecedor de repositório ocorre à medida que o usuário trabalha com recursos no projeto que está configurado para o fornecedor.  Para que fique ciente das alterações que o usuário faz em um recurso, o fornecedor pode implementar ganchos de modificação de recursos.  O plug-in de recursos fornece esses ganchos como pontos de extensão.  A documentação para IMoveDeleteHook, IFileModificationValidator e ResourceRuleFactory descreve os detalhes para implementar esses ganchos.

O plug-in da equipe otimiza e simplifica a associação do gancho com os recursos apropriados registrando ganchos genéricos no plug-in dos recursos.  Esses ganchos genéricos simplesmente procuram no fornecedor de repositório um determinado recurso e obtêm seu gancho.  A vantagem é que apenas um gancho de fornecedor é chamado, em vez de cada implementação de fornecedor ter que registrar um gancho que deve verificar primeiramente se o recurso é gerenciado pelo fornecedor.

O significado disso para o plug-in é que você fornece os ganchos necessários por meio da substituição de métodos no RepositoryProvider. A implementação padrão desses métodos responde null, indicando que nenhum gancho é necessário (exceto para o depósito de informações do provedor da regra de recursos, conforme descrito a seguir):