====== API para integração do SIGED com outros sistemas ====== O SIGED conta com uma API para que outros sistemas possam realizar consultas e manipulações de documentos na sua base de dados. Essa API foi feita com o objetivo de ser acessada via Spring HTTP Invoker ou via Web Service (ainda não implementado), dependendo da localização do sistema cliente. ===== Principais Classes ===== A seguir, serão listadas as principais classes, como Data Transfer Objects e Interfaces Remotas, que serão utilizadas na integração de outros sistemas com o SIGED. Essas classes encontram-se no pacote ''br.ufrn.integracao.siged'', no projeto da arquitetura. ==== DescritorDTO ==== A classe DescritorDTO tem como objetivo armazenar as principais informações de um [[desenvolvimento:especificacoes:siged:casos_de_uso:administracao:cadastros:descritores|descritor]] para que elas possam ser utilizadas em outros sistemas. Dessa forma, os sistemas têm acesso apenas às informações que realmente serão necessárias para o seu funcionamento, obedecendo assim ao princípio do encapsulamento, e não haverá acoplamento entre eles e o [[desenvolvimento:especificacoes:siged:estudo:proposta_ged_ufrn|SIGED]]. A classe DescritorDTO pode armazenar ainda a informação do valor de um descritor para um determinado documento, o que a torna, portanto, equivalente às classes Descritor e ValorDescritor do SIGED. Os seus atributos são: ^ Atributo ^ Significado ^ | id | Identificador do Descritor no SIGED. | | descricao | Nome do descritor. | | tipoDocumento | Tipo de documento do qual o descritor faz parte. | | documento | Documento associado ao descritor, para quando esta classe for usada como equivalente da classe ValorDescritor do SIGED. Pode ser nulo. | | valor | Valor do descritor quando associado a um documento. Pode ser nulo. | ==== DocumentoDTO ==== De forma equivalente à classe DescritorDTO, essa classe tem como objetivo armazenar as principais informações de um documento para que elas possam ser utilizadas em outros sistemas. A classe DocumentoDTO é equivalente à classe Documento do SIGED. Os seus atributos são: ^ Atributo ^ Significado ^ | id | Identificador do documento no SIGED. | | tipoDocumento | Identificador do tipo do documento. | | idArquivo | Id do arquivo (na base de arquivos) associado ao documento. | | indexavel | Identifica se o documento é indexável ou não. É um boolean. | | palavrasChave | Palavras-chave do documento. É uma String. | | localizacaoFisica | Localização física do documento. É uma String. | | descritores | Uma lista de objetos do tipo DescritorDTO, que contém os descritores do documento e seus valores. | | localizacao | Identificador da pasta em que o documento será armazenado. Pode ser null, se for armazenar na raiz. | ==== PastaDocumentoDTO ==== A classe PastaDocumentoDTO tem como objetivo armazenar as principais informações de uma pasta de documentos para que elas possam ser utilizadas em outros sistemas. Os seus atributos são: ^ Atributo ^ Significado ^ | id | Identificador da pasta no SIGED. | | nome | Nome da pasta. | | pai | Pasta na qual essa pasta está inserida. Null, se a pasta estiver na raiz. | === Utilização no SIGRH === Em Casos de Uso envolvendo documentos funcionais, iniciados à partir do SIGPRH e utilizando a comunicação com o serviço remoto do SIGED, utilizar o seguinte padrão para a criação das pastas: DOCUMENTOS FUNCIONAIS\SIAPE-NOME\CASO DE USO por exemplo: DOCUMENTOS FUNCIONAIS\312654-JOAO SILVA\CAPACITAÇÕES DOCUMENTOS FUNCIONAIS\312654-JOAO SILVA\COMPROVANTE AUXILIO TRANSPORTE onde DOCUMENTOS FUNCIONAIS é o diretório raíz de todos os documentos funcionais dos servidores, o id deste diretório está mapeada na tabela comum.parametros com o parâmetro DIRETORIO_DOCUMENTOS_FUNCIONAIS_SIGED. O diretório 312654-JOAO SILVA deverá ser uma instância de PastaDocumentoDTO, e "CERTIFICADOS CAPACITAÇÕES", "COMPROVANTE AUXILIO TRANSPORTE" deverão ser também instâncias de PastaDocumentoDTO com a propriedade "pai" apontando para o id da PastaDocumento "312654-JOAO SILVA" (sendo portanto, pela abstração do SIGED, suas sub-pastas). ==== ResultadoBuscaDTO ==== Data Transfer Object com as principais informações retornadas pela busca de documentos do SIGED. Cada objeto ResultadoBuscaDTO está associado a um objeto DocumentoDTO, trazendo ainda algumas informações adicionais, como a relevância da busca e o texto no documento que casou com a busca. A classe ResultadoBuscaDTO é equivalente à classe ResultadoBusca, do SIGED. Os seus atributos são: ^ Atributo ^ Significado ^ | documento | DTO do Documento retornado pela busca. | | texto | Texto que casa com a string de busca. | | relevancia | Relevância do resultado na busca. | ==== ArquivoDocumento ==== Interface que define as principais informações de um arquivo, para que ele possa ser inserido na base de arquivos através da classe [[desenvolvimento:especificacoes:arquitetura:servicos:arquivos:envio_arquivos|EnvioArquivoHelper]]. A classe existe para que a API seja agnóstica com relação à forma de envio de arquivos utilizada pelo sistema cliente. Para que o sistema cliente adapte a sua forma de envio de arquivos para a API do SIGED, basta que seja criado um [[http://en.wikipedia.org/wiki/Adapter_pattern|adapter]] com esse fim. A próxima classe é um exemplo disso. Métodos da Interface: ^ Método ^ Significado ^ | byte[] getBytes() | Retorna o conteúdo do arquivo como um array de bytes. | | String getContentType() | String que identifica o tipo do conteúdo do arquivo. | | String getName() | Retorna o nome do arquivo. | | long getSize() | Retorna o tamanho do arquivo em bytes. | ==== UploadedFileAdapter ==== Para envio de arquivos, é comum utilizarmos os componentes do Tomahawk, da Apache. O envio de arquivos do Tomahawk expõe os dados do arquivo através da interface UploadedFile. Essa classe adapta a interface do UploadedFile para a interface ArquivoDocumento, da API de integração do SIGED. Para utilizá-la, basta instanciar um UploadedFileAdapter passando como parâmetro do construtor um UploadedFile. A implementação do adapter, para servir de exemplo para implementação de outros adapters, está listada abaixo: public class UploadedFileAdapter implements ArquivoDocumento { private UploadedFile file; public UploadedFileAdapter(UploadedFile file) { this.file = file; } public byte[] getBytes() throws IOException { return file.getBytes(); } public String getContentType() { return file.getContentType(); } public String getName() { return file.getName(); } public long getSize() { return file.getSize(); } } E o seu uso pode ser visto abaixo: UploadedFile uploadedFile = ...; ArquivoDocumento arquivo = new UploadedFileAdapter(uploadedFile); ==== TiposDocumento ==== Classe contendo constantes com os identificadores dos principais tipos de documento. ==== IntegracaoSigedService ==== Essa interface é o principal mecanismo de integração com o SIGED. Contém os métodos que irão possibilitar a interação entre os sistemas, permitindo busca, cadastro, atualização, remoção, etc. de documentos. Os sistemas têm acesso apenas à interface. A implementação da interface está no SIGED e os sistemas a acessam através do Spring Http Invoker ou através de Web Services. Nas seções a seguir será mostrado com maior detalhes como utilizar essa interface. Os métodos disponíveis atualmente são os seguintes: ^ Método ^ Significado ^ | List buscarDescritores(int tipoDocumento) | Busca os descritores associados a um determinado tipo de documento. | | DocumentoDTO cadastrarDocumento(DocumentoDTO documento, ArquivoDocumento arquivo, infoUsuarioDTO usuario) | Cadastra um documento no SIGED. Deve-se passar como parâmetro o documento a ser cadastrado, o arquivo associado ao documento e o usuário que está cadastrando. Caso o usuário não tenha permissão para cadastrar o documento em questão, será disparada uma exceção. | | PastaDocumentoDTO cadastrarPastas(InfoUsuarioDTO usuario, String diretorio, Integer idPastaPai) | Cadastra uma árvore de pastas no SIGED. | | DocumentoDTO cadastrarPastasDocumento(DocumentoDTO documento, ArquivoDocumento arquivo, InfoUsuarioDTO usuario, String diretorio, Integer idPastaPai) | Cadastra um documento e sua árvore de pastas no SIGED. | | DocumentoDTO atualizarDocumento(DocumentoDTO documento, ArquivoDocumento arquivo, infoUsuarioDTO usuario) | Atualiza um documento no SIGED. Deve-se passar como parâmetro o documento a ser atualizado, o arquivo associado ao documento e o usuário que está cadastrando. Se o arquivo for null, mantém o que está. Se for diferente de null, atualiza o arquivo. | | void excluirDocumento(infoUsuarioDTO usuario, int idDocumento) | Exclui um documento do SIGED de acordo com o id passado como parâmetro. | | PastaDocumentoDTO buscarPasta(String nome, Integer pai) | Dado um nome e a pasta pai, retorna a pasta de documentos que possui esses valores no SIGED. | | PastaDocumentoDTO cadastrarPasta(PastaDocumentoDTO pasta, infoUsuarioDTO usuario) | Cadastra uma pasta de documentos no SIGED. Deve-se passar como parâmetro as informações da pasta e o usuário que está cadastrando. | | DocumentoDTO buscarPorId(infoUsuarioDTO usuario, int id) | Dado o ID de um documento, retorna um DocumentoDTO com as suas principais informações. | | DocumentoDTO buscarPorIdArquivo(infoUsuarioDTO usuario, int idArquivo) | Busca um documento pelo identificador do arquivo associado ao mesmo. | | List buscarDocumentos(infoUsuarioDTO usuario, String criterio) | Método para busca de documentos por um critério. Busca dados no conteúdo dos documentos. | | List buscaAvancada(infoUsuarioDTO usuario, Integer tipoDocumento, List descritores, String criterio) | Método para busca avançada de documentos, podendo restringir a busca por tipo de documento, valores de descritores e um determinado texto no seu conteúdo. | | void excluirDocumento(infoUsuarioDTO usuario, int idDocumento) | Exclui um documento do SIGED de acordo com o ID do documento passado por parâmetro | | void excluirDocumentoPorIdArquivo(infoUsuarioDTO usuario, int idArquivo) | Exclui um documento do SIGED de acordo com o ID do arquivo associado ao documento | ===== Consumindo Serviços ===== ==== HTTP Invoker ==== Para consumir os serviços da API de integração do SIGED, deve-se declarar bean ''integracaoSigedInvoker'' no ''remote-services.xml'' do sistema para o qual se está fazendo a integração, conforme documentado na seção de [[desenvolvimento:especificacoes:arquitetura:servicos:integracao_entre_sistemas|integração entre sistemas]]. Para o uso em um managed bean do JSF, deve-se injetar o bean em um atributo do tipo ''IntegracaoSigedService'' utilizando a anotação ''@Autowired''. Depois basta utilizar normalmente os métodos da interface. @Component @Scope("request") public class ExemploIntegracaoSigedMBean extends AbstractController { @Resource(name="integracaoSigedInvoker") private IntegracaoSigedService siged; public String buscarDocumento() { DocumentoDTO doc = siged.buscarPorId(10); /* ... */ } } Para uma action do Struts, deve-se utilizar o método getBean(), definido em ''AbstractAction'', passando como parâmetros request e o nome do bean: "integracaoSigedInvoker". public class ExemploIntegracaoSigedAction extends AbstractAction { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception { IntegracaoSigedService siged = getBean(req, "integracaoSigedInvoker"); DocumentoDTO doc = siged.buscarPorId(10); /* ... */ } } Nos processadores, deve-se utilizar o método getBean(), definido em ''AbstractProcessador'', passando como parâmetros o nome do bean: "integracaoSigedInvoker" e o movimento. public class ProcessadorExemploIntegracaoSiged extends AbstractProcessador { public Object execute(Movimento mov) throws NegocioException, ArqException, RemoteException { IntegracaoSigedService siged = getBean("integracaoSigedInvoker", mov); DocumentoDTO doc = siged.buscarPorId(10); /* ... */ } } ==== Web Services ==== Ainda não implementado. Sem previsão de implementação por enquanto. ===== Exemplos ===== Para os exemplos a seguir, deve-se considerar que o objeto siged já foi corretamente buscado de acordo com a seção anterior. ==== Busca de Descritores ==== //**Código:**// List descritores = siged.buscarDescritores(10); for (DescritorDTO descritor : descritores) { System.out.println(descritor.getId() + " - " + descritor.getDescricao() + " - " + descritor.getTipoDocumento()); } //**Saída:**// 17 - Titulo - 10 18 - Autores - 10 ==== Buscar documento por ID ==== //**Código:**// DocumentoDTO documento = siged.buscarPorId(getUsuarioLogado(), 66); System.out.println(documento.getId()); System.out.println(documento.getIdArquivo()); System.out.println(documento.isIndexavel()); System.out.println(documento.getLocalizacaoFisica()); System.out.println(documento.getPalavrasChaves()); System.out.println(documento.getTipoDocumento()); System.out.println(documento.getLocalizacao()); for (DescritorDTO descritor : documento.getDescritores()) { System.out.println(descritor.getId() + " - " + descritor.getDescricao() + " - " + descritor.getTipoDocumento()); } //**Saída:**// 66 2984 true l k 10 null 3918654 - Autores - 10 3918655 - Título - 10 A partir deste momento, vamos considerar que o código usado acima para imprimir as informações do documento está no método **''void imprimirDocumento(DocumentoDTO documento)''**. ==== Busca de Documentos ==== //**Código:**// List resultado = siged.buscarDocumentos(getUsuarioLogado(), "software"); for (ResultadoBuscaDTO item : resultado) { imprimirDocumento(item.getDocumento()); System.out.println("Texto: " + item.getTexto()); System.out.println("______"); } //**Saída:**// 58 2317 10 46 3917883 - Autores - 10 3917884 - Título - 10 Texto: Hibernate [3], allows software developers to.... In a scenario described above, ORM software... designed to replace ORM in software... targets software working with semi-structured... Data Model RDBMS software application ORM ______ 56 2302 10 50 3917864 - Autores - 10 3917865 - Título - 10 Texto: de experiência em desenvolvimento de software. Trabalha há 7 anos em fábricas de software e projetos.... Gestores de fábricas de software procuram... traduzir requisitos em componentes do software... de software não deve ter ambigüidades e e diversos outros resultados... ==== Cadastro de Documentos ==== //**Código:**// DocumentoDTO doc = new DocumentoDTO(); doc.setTipoDocumento(10); doc.setIndexavel(true); doc.setLocalizacaoFisica("testando localizacao"); doc.setPalavrasChaves("testando palavras chave"); List descritores = siged.buscarDescritores(10); for (DescritorDTO descritor : descritores) { descritor.setValor("teste descritor " + descritor.getDescricao()); } doc.setDescritores(descritores); doc = siged.cadastrarDocumento(doc, new UploadedFileAdapter(arquivo), getUsuarioLogado()); DocumentoDTO cadastrado = siged.buscarPorId(getUsuarioLogado(), doc.getId()); imprimirDocumento(cadastrado); //**Saída:**// 69 3134 testando indexador testando localizacao testando palavras chave 10 null 3918673 - Autores - 10 3918674 - Título - 10 ===== Implementação ===== A implementação da API de integração do SIGED está no pacote ''br.ufrn.siged.remote'', do projeto SIGED. É formada basicamente por duas classes: IntegracaoSigedServiceImpl e SigedUtils. A classe IntegracaoSigedServiceImpl contém a implementação dos métodos da interface e é essa classe que é chamada pelos demais sistemas quando utilizam a integração com o SIGED. Ela pode ser exposta via Web Services ou via o Spring Http Invoker. No momento, apenas o Http Invoker está sendo utilizado. Para expô-la com o Http Invoker, foi declarado o bean ''integracaoSigedExporter'' no ''remote-services.xml'', conforme o código abaixo: Além disso, foi necessário declarar um Servlet no SIGED para que os demais sistemas acessem. O nome do servlet deve ser igual ao nome do bean declarado anteriormente: ''integracaoSigedExporter''. integracaoSigedExporter org.springframework.web.context.support.HttpRequestHandlerServlet integracaoSigedExporter /remoting/IntegracaoSigedService A outra classe é a SigedUtils, que contém métodos para transformar as classes do SIGED nos DTOs equivalentes e os DTOs nas classes.