Além dos Conceitos Básicos

Se tenciona facultar suporte de sincronização e não tem um mecanismo para gerir estados de sincronização, esta secção explica como implementar um Subscritor de raiz. Significa isto que não há infra-estrutura de sincronização e serve para ilustrar a utilização de uma API que é facultada para manter o estado de sincronização.

Passamos a ilustrar com um exemplo. O código fonte encontra-se no pacote de fornecedor do sistema de ficheiros do plug-in org.eclipse.team.examples.filesystem. Recomenda-se que dê saída ao projecto do repositório CVS e o utilize como referência para ler este guia de iniciação.

Implementar um Subscritor de Raiz

O primeiro exemplo supõe que não há infra-estrutura para manter o estado de sincronização do espaço de trabalho local. Ao implementar um subscritor de raiz, poderá utilizar uma API adicional facultada no plug-in org.eclipse.team.core. O pacote org.eclipse.team.core.variants contém duas subclasses de Subscriber, as quais podem ser usadas para simplificar a implementação. A primeira é ResourceVariantTreeSubscriber , a qual será debatida no segundo exemplo infra. A segunda é subclasse da primeira: ThreeWaySubscriber. Esta implementação de subscritor faculta várias classes úteis para gerir o estado de sincronização de um espaço de trabalho local. Se não tiver uma infra-estrutura, este é um bom sítio para começar.

Implementar um subscritor de raiz será ilustrado como exemplo de sistema de ficheiros disponível no plug-in org.eclipse.team.examples.filesystem. O código na descrição seguinte é mínimo dado que está disponível no repositório CVS do Eclipse. Embora não seja tecnicamente um subscritor tridireccional, o exemplo do sistema de ficheiros ainda pode fazer bom uso desta infra-estrutura. Os plug-ins FTP e WebDAV também são construídos com esta infra-estrutura.

ThreeWaySubscriber

Para o exemplo do sistema de ficheiros, já tínhamos uma implementação de um RepositoryProvider que associava um projecto local a uma localização de sistema de ficheiros onde era replicado o conteúdo. O FileSystemSubscriber foi criado como subclasse de ThreeWaySubscriber para poder utilizar um ThreeWaySynchronizer para gerir estados de sincronização de espaço de trabalho. As subclasses desta classe devem fazer o seguinte:

Além da implementação do subscritor, as operações get e put para o fornecedor de sistema de ficheiros foram modificadas para actualizar o estado de sincronização no ThreeWaySynchronizer. as operações são implementadas na classe org.eclipse.team.examples.filesystem.FileSystemOperations.

ThreeWaySynchronizer

O ThreeWaySynchronizer gere o estado de sincronização entre o espaço de trabalho local e uma localização remota. Coloca em memória cache e torna persistente as marcas de horas local, base e remota para suportar um cálculo eficiente do espaço de trabalho local de um recurso. Também desencadeia notificações de alterações para quaisquer ouvintes registados. O ThreeWaySubscriber converte estes eventos de alteração no formato correcto para serem enviados a ouvintes registados junto do subscritor.

O ThreeWaySynchronizer utiliza regras de agendamento e bloqueios do Núcleo para garantir protecção contra módulos e facultar lotes de notificações de alterações.

ThreeWayRemoteTree

Uma ThreeWayRemoteTree é uma subclasse da ResourceVariantTree que está personalizada para o ThreeWaySubscriber. Deve ser sobreposta por clientes para facultar o mecanismo de obtenção do estado remoto junto do servidor. A ResourceVariantTree é abordada em mais pormenor no exemplo seguinte.

CachedResourceVariant

Uma CachedResourceVariant é uma implementação parcial da IResourceVariant que coloca em memória cache o conteúdo obtido durante algum tempo (actualmente 1 hora). Revela-se útil porque o conteúdo pode ser acedido várias vezes num curto período de tempo (por exemplo, para determinar o estado de sincronização e apresentar o conteúdo num editor de comparações). As subclasses ainda devem facultar o identificador de conteúdo único junto com a matriz de bytes que pode ser tornada persistente, para recriar a pega da variante de recurso.

Construir em cima da Sincronização do Espaço de Trabalho existente

Muitos fornecedores de repositórios podem dispor já de um mecanismo para gerir os seus estados de sincronização (p.ex., se tiverem plug-ins existentes). O ResourceVariantTreeSubscriber e as suas classes relacionadas facultam a capacidade de construir em cima de uma infra-estrutura de sincronização existente. Por exemplo, esta é a superclasse de todos os subscritores CVS.

ResourceVariantTreeSubscriber

Como dissemos no exemplo anterior, o ThreeWaySubscriber é uma subclasse do ResourceVariantTreeSubscriber que faculta sincronização do espaço de trabalho local mediante um ThreeWaySynchronizer. As subclasses de ResourceVariantTreeSubscriber devem facultar:

As outras capacidades do subscritor são implementadas com estas funções.

ResourceVariantTree

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

O seguinte deve ser implementado por subclasses:

São facultadas implementações concretas de ResourceVariantByteStore que tornam persistentes os bytes ao longo de invocações de área de trabalho (PersistantResourceVariantByteStore) ou que colocaram em memória cache os bytes somente da sessão actual (SessionResourceVariantByteStore). Todavia, construir um subscritor em cima de uma infra-estrutura de sincronização do espaço de trabalho existente irá normalmente implicar a implementação de subclasses do ResourceVariantByteStore que constituem interface com o sincronizador subjacente. Por exemplo, a ThreeWayRemoteTree utiliza uma implementação de arquivo de bytes que armazena os bytes remotos no ThreeWaySynchronizer.

A criação de pegas de variantes de recursos para este exemplo não difere do exemplo anterior, salvo que as pegas são pedidas a uma instância de árvore de variantes de recursos ao invés do subscritor.