Além dos Fundamentos

Se você planeja fornecer suporte de sincronização e não tem um mecanismo existente para gerenciar o estado de sincronização, essa seção explica como implementar um Assinante do ponto de partida. Isso significa que não há infra-estrutura de sincronização existente e ilustra como utilizar alguma API que é fornecida para manter o estado de sincronização.

Para lembrar deste exemplo, utilizaremos um exemplo em execução. O código fonte pode ser localizado no pacote do fornecedor do sistema de arquivos do plug-in org.eclipse.team.examples.filesystem. Você deve verificar o projeto a partir do repositório CVS e utilizar como uma referência enquanto estiver lendo este tutorial.

Implementando um Assinante do Ponto de Partida

Este primeiro exemplo assume que não há infra-estrutura existente para manter o estado de sincronização do espaço de trabalho local. Ao implementar um assinante do ponto de partida, você pode utilizar alguma API adicional fornecida no plug-in org.eclipse.team.core. O pacote org.eclipse.team.core.variants contém duas subclasses de Assinante que podem ser utilizadas para simplificar a implementação. A primeira é ResourceVariantTreeSubscriber que será discutido no segundo exemplo a seguir. A segunda é uma subclasse da primeira: ThreeWaySubscriber. Esta implementação do assinante fornece várias classes úteis para gerenciar o estado de sincronização de um espaço de trabalho local. Se você não tem uma infra-estrutura existente, esse é um bom lugar para começar.

A implementação de um assinante do ponto de partida será ilustrada utilizando o exemplo do sistema de arquivos disponível no plug-in org.eclipse.team.examples.filesystem. O código na seguinte descrição é mantido no mínimo desde que esteja disponível a partir do repositório Eclipse CVS. Embora não seja tecnicamente um assinante de três caminhos, o exemplo do sistema de arquivos ainda pode fazer bom uso desta infra-estrutura. Os plug-ins FTP e WebDav também são construídos utilizando esta infra-estrutura.

ThreeWaySubscriber

Para o exemplo do sistema de arquivos, já tivemos uma implementação de um RepositoryProvider que associou um projeto local a um local do sistema de arquivos em que o conteúdo local foi espelhado. FileSystemSubscriber foi criado como uma subclasse de ThreeWaySubscriber para fazer uso de um ThreeWaySynchronizer para gerenciar o estado de sincronização do espaço de trabalho. As subclasses desta classe devem fazer o seguinte:

Além da implementação do assinante, as operações de obtenção e colocação para o fornecedor do sistema de arquivos foram modificadas para atualizar o estado de sincronização no ThreeWaySynchronizer. As operações são implementadas na classe org.eclipse.team.examples.filesystem.FileSystemOperations.

ThreeWaySynchronizer

ThreeWaySynchronizer gerencia o estado de sincronização entre o espaço de trabalho local e um local remoto. Ele armazena em cache e mantém os timestamps remotos, de base e locais para suportar o cálculo eficiente do estado de sincronização de um recurso. Ele também remove notificações de alterações para quaisquer listeners registrados. O ThreeWaySubscriber traduz esses eventos de alteração no formato apropriado a ser enviado para os listeners registrados com o assinante.

O ThreeWaySynchronizer faz uso das regras de planejamento e travas de núcleo para assegurar a segurança de encadeamento e fornecer a colocação em batch da notificação de alteração.

ThreeWayRemoteTree

Uma ThreeWayRemoteTree é uma subclasse deResourceVariantTree que é personalizada para oThreeWaySubscriber. Deve ser substituída pelos clientes para fornecer o mecanismo para produzir o estado remoto do servidor. ResourceVariantTree é discutido mais detalhadamente no próximo exemplo.

CachedResourceVariant

Um CachedResourceVariant é uma implementação parcial do IResourceVariant que armazena em cache qualquer conteúdo produzido por um período de tempo (atualmente 1 hora). Isso é útil desde que o conteúdo possa ser acessado várias vezes em um curto período de tempo (por exemplo, para determinar o estado de sincronização e exibir o conteúdo em um editor de comparação). As subclasses ainda devem fornecer o identificador de conteúdo exclusivo junto com a matriz de byte que pode ser mantida para recriar o manuseio da variante de recurso.

Construindo na Parte Superior da Sincronização do Espaço de Trabalho Existente

Muitos fornecedores de repositórios podem já ter um mecanismo para gerenciar seu estado de sincronização (por exemplo, se eles tiverem os plug-ins existentes). O ResourceVariantTreeSubscriber e suas classes relacionadas fornecem a habilidade de construir na parte superior de uma infra-estrutura de sincronização existente. Por exemplo, esta é a superclasse de todos os assinantes de CVS.

ResourceVariantTreeSubscriber

Como foi mencionado no exemplo anterior, o ThreeWaySubscriber e uma subclasse de ResourceVariantTreeSubscriber que fornece a sincronização do espaço de trabalho local utilizando umThreeWaySynchronizer. As subclasses de ResourceVariantTreeSubscriber devem fornecer:

Os outros recursos do assinante são implementados utilizando essas facilidades.

ResourceVariantTree

ResourceVariantTree é uma implementação concreta de IResourceVariantTree que fornece o seguinte:

O seguinte deve ser implementado pelas subclasses:

As implementações concretas deResourceVariantByteStore são fornecidas e mantêm os bytes nas chamadas do workbench (PersistantResourceVariantByteStore) ou armazenam os bytes somente para a sessão atual(SessionResourceVariantByteStore). No entanto, construir um assinante na parte superior de uma infra-estrutura de sincronização do espaço de trabalho existente normalmente exigirá a implementação das subclasses de ResourceVariantByteStore que fazem a interface com o sincronizador de suporte. Por exemplo, o ThreeWayRemoteTree faz uso de uma implementação de armazenamento de byte que armazena os bytes remotos no ThreeWaySynchronizer.

A criação dos controles variantes de recurso para este exemplo não diferem do exemplo anterior, exceto que os controles são solicitados a partir de uma instância da árvore variante de recursos em vez do assinante.