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.
- getMetaData
- a classe que implementa esta interface deve, neste método, acessar a
fonte de dados e retornar uma implementação da interface java.sql.DatabaseMetaData.
- start
- a implementação pode, através deste método iniciar algum recurso
necessário para sua operação, como, por exemplo, criar uma conexão com
o SGBD. Este é o primeiro método usado internamente pelo Integrate.
- stop
- o Integrate executa este método no final das operações. A
implementação pode utilizá-lo para finalizar os recursos utilizados,
como, por exemplo, encerrar a conexão criada com o SGBD.
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