====== Sincronização de Informações entre os Bancos de Dados ====== Esta documentação tem como objetivo explicar o funcionamento da sincronização de informações entre as tabelas ''comum.usuario'', ''comum.pessoa'' e ''rh.servidor'' dos três bancos de dados utilizados pelos sistemas institucionais. Cada uma das tabelas será explicada em um dos tópicos abaixo. ===== Sincronizando os dados pessoais ===== Os dados pessoais não são sincronizados automaticamente entre os bancos por um timer. A sincronização dos dados pessoais normalmente é feita de duas formas: ou ela é realizada sempre que um dado pessoal é alterado em um dos sistemas ou então é feita de forma indireta, dependendo da sincronização de outras informações para ser feita como, por exemplo, os dados de alunos ou os dados de servidores. Assim, ao migrar alunos do banco acadêmico para o banco administrativo, os dados pessoais dos alunos também são migrados. Sempre que for necessário modificar dados pessoais, é necessário chamar uma classe da arquitetura para que as modificações sejam propagadas para todos os bancos de dados. A classe em questão é a classe ''SincronizadorPessoas'', do pacote ''br.ufrn.comum.sincronizacao''. Essa classe possui um método chamado ''sincronizarPessoa()'', que recebe como parâmetro uma pessoa e sincroniza os seus dados no banco cujo datasource foi passado para classe através do Factory Method ''usandoDataSource()''. Possui ainda um método estático chamado ''getNextIdPessoa()'', que tem como objetivo buscar o próximo identificador disponível para uma pessoa utilizando a sequence ''pessoa_seq'', do banco comum. Isso significa que todas as pessoas de todos os sistemas terão o id gerado por essa sequence, para evitar que haja uma inconsistência entre os identificadores nos três bancos de dados. Os passos necessários para se chamar a sincronização de dados pessoais são os seguintes: primeiro, utiliza-se o método estático ''usandoDataSource()'' da classe ''SincronizadorPessoas'' passando o datasource do banco de destino dos dados. Em seguida, chama-se o método ''sincronizarPessoa()'' da classe. Com isso, a classe irá verificar se a pessoa passada como parâmetro já existe no banco. Se existir, apenas atualiza os dados. Se não existir, insere utilizando como o identificador o id que estiver no objeto pessoa passado como parâmetro. Para setar o id da pessoa, usa-se o método ''getNextIdPessoa()''. O método de sincronização deve ser chamado para cada datasource para o qual se deseja migrar os dados. Um exemplo de código pode ser visto abaixo: int id = SincronizadorPessoas.getNextIdPessoa(); pessoa.setId(id); SincronizadorPessoas.usandoDataSource(Database.getInstance().getComumDs()).sincronizarPessoa(pessoa); SincronizadorPessoas.usandoDataSource(Database.getInstance().getSigaaDs()).sincronizarPessoa(pessoa); SincronizadorPessoas.usandoDataSource(Database.getInstance().getSipacDs()).sincronizarPessoa(pessoa); É importante ressaltar que, nesse caso, não é necessário verificar se um sistema está ativo ou não, pois caso o datasource não seja encontrado, nada será feito. Para isso, foi utilizada uma implementação do padrão de projeto Null Object. ===== Sincronizando os usuários ===== A sincronização de usuários é feita de modo semelhante à sincronização de pessoas. Ela não é feita automaticamente por nenhum timer, e sim, chamada sempre que alguma informação de um usuário for modificada em algum dos sistemas. Assim como existe a classe ''SincronizadorPessoas'' para a sincronização dos dados pessoais, existe a classe ''SincronizadorUsuarios'' para a sincronização dos dados de usuários. A utilização da classe ''SincronizadorUsuarios'' é igual à utilização da classe ''SincronizadorPessoas''. Ela é instanciada através do Factory Method ''usandoDataSource()'', para o qual passamos o datasource que receberá os dados sincronizados. Em seguida, podemos chamar o método ''sincronizarUsuario()'', que irá verificar se o usuário já existe no banco de destino. Se existir, atualiza seus dados, senão, insere no banco. A classe ''SincronizadorUsuarios'' também possui um método estático chamado ''getNextIdUsuario()'' para gerar o próximo identificador disponível para o usuário. A sequence usada é a ''comum.usuario_seq'', do banco ''sistemas_comum''. A utilização da classe ''SincronizadorUsuarios'' é semelhante a ''SincronizadorPessoas'', conforme pode-se ver abaixo: int id = SincronizadorUsuarios.getNextIdUsuario(); usuario.setId(id); SincronizadorUsuario.usandoDataSource(Database.getInstance().getComumDs()).sincronizarUsuario(usuario); SincronizadorUsuario.usandoDataSource(Database.getInstance().getSigaaDs()).sincronizarUsuario(usuario); SincronizadorUsuario.usandoDataSource(Database.getInstance().getSipacDs()).sincronizarUsuario(usuario); ==== Sincronização com Base LDAP ==== As informações básicas de usuários (login e senha) ficam armazenadas também em um diretório LDAP para que seja possível utilizar o mesmo login e senha dos sistemas em outros serviços da instituição, como e-mail ou acesso a periódicos da CAPES. As informações dos usuários são sincronizadas cada vez que um usuário se loga nos sistemas através da classe ''UsuarioLDAP'', do pacote ''br.ufrn.arq.usuarios''. A classe ''UsuarioLDAP'' é uma thread que é iniciada a cada login. A thread será responsável por sincronizar as informações do usuário que acabou de se logar. ===== Sincronizando os servidores ===== A sincronização de servidores é feita a partir do banco administrativo para os demais bancos de dados. Assim, sempre que informações de servidores são atualizadas, por exemplo, através de uma importação de fita espelho no SIGPRH, elas são migradas para os demais bancos através de um timer. O timer responsável pela realização dessa sincronização está implementado na classe ''TimerDadosRecursosHumanos'', do pacote ''br.ufrn.sipac.arq.timers.rh''. Para que a sincronização de servidores funcione, é necessário apenas que o timer seja ativado através de sua adição à lista de timers na tabela ''infra.registro_timer''.