Lookup

Lookup é o serviço disponibilizado pelo Integrate que extrai os esquemas das fontes de dados registradas no sistema, serviço que pode auxiliar o desenvolvedor de um mediador na construção do esquema global para uma solução de integração. Tal serviço é disponibilizado através da interface Lookup. O Integrate disponibiliza duas implementações desta interface: LookupJDBC (para fontes de dados relacionais, utilizando um driver JDBC específico do SGBD desejado) e LookupCSV (para obter esquemas de arquivos CSV, dependendo, neste caso do driver JDBC disponibilizado pelo próprio Integrate). O Integrate utiliza uma instância de um objeto que implementa esta interface para cada fonte de dados disponível.

A figura abaixo exibe a estrutura de classes definida pelo Integrate, seguida por uma breve descrição dos métodos. Para detalhes, consulte o javadoc.

pacote br.ufg.integrate.lookup

Novas implementações podem ser produzidas por desenvolvedores JDBC para atender suas necessidades, caso as disponibilizadas não sejam suficientes.

Os tópicos abaixo exemplificam a utlização destas implementações, através de alguns serviços disponibilizados pela da interface ControllerI. Para estes exemplos, supõem-se que os arquivos de configuração do Integrate estão corretamente definidos.


Esquemas em JDBC

Uma opção de se obter os esquemas das fontes de dados é através do método lookupMetaData(). O trecho de código abaixo exibe sua utilização:

1 ControllerI c = Controller.getInstance();
2 try {
3     List<DatabaseMetaData> coll = c.lookupMetaData();
4     DatabaseMetaData dbmd = null;
5     ResultSet rs = null;
6     String[] type = {"TABLE"};
7 //imprime o nome das tabelas de cada banco de dados
8     for(Iterator<DatabaseMetaData> it = coll.iterator();it.hasNext();){
9         dbmd = it.next();
10        rs = dbmd.getTables(null, null, "%", type);
11        while(rs.next()){
12            System.out.println(rs.getString(3));
13       }
14     }
15     c.stop();
16 } catch (Exception e){
17     (...)
18 }
O método lookupMetaData() acessa todas as fontes de dados registradas no arquivo integrate-datasources.xml e cria uma coleção de objetos java.sql.DatasourceMetaData, um para cada fonte de dados. A ordenação das fontes de dados nesta coleção é feita pela ordem alfabética dos seus identificadores, feita no arquivo integrate-datasources.xml.

Apenas para exemplificar a utilização desta coleção, as linhas 5 e 14 fazem a iteração na referida coleção para obter individualmente cada DatabaseMetaData (linha 9). A linha 10 utiliza este objeto para obter os nomes das tabelas da fonte de dados corrente, enquanto que o loop das linhas 11 a 13 percorre a coleção de nomes e imprime na saída padrão. Nota-se a necessidade de se conhecer e manipular JDBC diretamente.


Esquemas em XML Schema

Para eliminar a necessidade de se manipular objetos da API JDBC, como no exemplo anterior, pode-se utilizar outro serviço, conforme exibido no código abaixo:
1 ControllerI c = Controller.getInstance();
2 try {
3     System.out.println(c.lookup());
4     c.stop();
5 } catch (Exception e){
6    (...)
7 }
Este trecho de código gera um java.text.StringBuilder cujo conteúdo contém os esquemas das fontes de dados registradas, em formato XML Schema. As fontes de dados aparecem em ordem alfabética dos identificadores definidos no arquivo integrate-datasources.xml. Um exemplo de saída, contendo duas fontes de dados ("csv" e "hsqldb"), com uma tabela cada, sendo a primeira com 5 colunas e a segunda com 3 colunas, seria o seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsh="http://www.integrate.ufg.br/schema/XMLSchema">
    <xsh:integrate-schema id="csv" name="depto">
      <xs:complexType name="depto.depto_Type">
        <xs:sequence>
          <xs:element name="CODDEPTO" type="xs:integer"
              minOccurs="0" maxOccurs="unbounded">
            <xs:key name="depto.depto_key">
              <xs:selector xpath="depto.depto"/>
              <xs:field xpath="CODDEPTO"/>
            </xs:key>
          </xs:element>
          <xs:element name="NOMEDEPTO" type="xs:string"/>
          <xs:element name="CODCURSO" type="xs:integer"
              minOccurs="0" maxOccurs="unbounded">
            <xs:key name="depto.depto_key">
              <xs:selector xpath="depto.depto"/>
              <xs:field xpath="CODCURSO"/>
            </xs:key>
          </xs:element>
          <xs:element name="NOMECURSO" type="xs:string"/>
          <xs:element name="CODINSTRUTOR" type="xs:integer"
              minOccurs="0" maxOccurs="unbounded">
            <xs:key name="depto.depto_key">
              <xs:selector xpath="depto.depto"/>
              <xs:field xpath="CODINSTRUTOR"/>
            </xs:key>
          </xs:element>
          <xs:element name="NOMEINSTRUTOR" type="xs:string"/>
          <xs:element name="CELULARINSTRUTOR" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xsh:integrate-schema>
 
    <xsh:integrate-schema id="hsqldb" name="PUBLIC">
      <xs:complexType name="PUBLIC.CLIENTES_Type">
        <xs:sequence>
          <xs:element name="CODCLIENTE" type="xs:integer"
              minOccurs="0" maxOccurs="unbounded">
            <xs:key name="PUBLIC.CLIENTES_key">
              <xs:selector xpath="PUBLIC.CLIENTES"/>
              <xs:field xpath="CODCLIENTE"/>
            </xs:key>
          </xs:element>
          <xs:element name="NOME" type="xs:string"/>
          <xs:element name="SOBRENOME" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xsh:integrate-schema>
</xs:schema>

Este tipo de serviço possibilita ao desenvolvedor do mediador manipular este XML em memória como desejar.


Esquemas invidualizados

Assim como os exemplos citados acima, o Integrate pode fornecer o esquema de apenas uma fonte de dados, e não da coleção de fontes registradas no integrate-datasources.xml. Para tal, basta alterar os métodos nos códigos acima - lookup() e lookupMetaData() - informando como argumento o identificador da fonte de dados. Assim como nos exemplos acima, o retorno será em XML ou em JDBC, de acordo com o método utilizado.


Esquemas em arquivo

O Integrate oferece a opção da impressão dos esquemas obtidos nos exemplos acima em um arquivo texto, através dos métodos saveSchemasToXMLFile(). Como argumento, deve-se informar o caminho e o nome do arquivo que será criado como saída e, caso o arquivo já exista, se o conteúdo obtido irá sobrescrever o conteúdo existente ou se será adicionado ao final.

Última atualização: 28/06/2009
Get Integrate at SourceForge.net. Fast, secure and Free Open Source software downloads