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.
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.
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());
}
}
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());
}
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.
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:
<activityPatternBinding
activityId="org.eclipse.team.cvs"
pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
</activityPatternBinding>
<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.
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):