83
UNIVERSIDADE FEDERAL DE SANTA CATARINA UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA CONSULTAS SQL EM BIBLIOTECAS DIGITAIS Guilherme Cordeiro

UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

UNIVERSIDADE FEDERAL DE SANTA CATARINA

UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARACONSULTAS SQL EM BIBLIOTECAS DIGITAIS

Guilherme Cordeiro

Page 2: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

2

UNIVERSIDADE FEDERAL DE SANTA CATARINADEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA

CURSO DE BACHARELADO EM CIÊNCIAS DA COMPUTAÇÃO

UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARACONSULTAS SQL EM BIBLIOTECAS DIGITAIS

Autor :Guilherme Cordeiro

Orientador :Prof. Dr. Roberto Willrich

Banca Examinadora :Prof. Dr. Vitório Bruno Mazzola

Prof. Dr. Mário Dantas

Palavras-chave :Dublin Core, XML, Java, bibliotecas digitais, XQuery

Florianópolis, 2 de junho de 2003

Page 3: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

3

Dedicação

Dedico este trabalho à minha família.

Page 4: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

4

Agradecimentos

Agradeço a todos aqueles que me ajudaram, direta ou indiretamente, na realização

deste trabalho.

Page 5: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

5

Sumário

Sumário 5

Resumo 7

Abstract 7

1 Introdução 81.1 Motivação 81.2 Objetivos do Projeto 81.3 Estrutura do Documento 9

2 Java 102.1 Origem e características da linguagem Java 102.2 JDBC : Java Database Connectivity 112.3 Java Servlets 12

3 Bancos de Dados Relacionais e MySQL 133.1 Conceitos básicos 133.2 MySQL 14

4 XML e XQuery 154.1 Origem do XML 154.2 Características básicas do XML 164.3 Validação de documentos XML 174.4 APIs para manipulação de XML : DOM e SAX 184.5 Estilo em documentos XML 194.6 Transformações de XML 204.7 Consultas em XML : XQuery 204.8 Consultas XQuery FLWR 21

5 Dublin Core 235.1 Dublin Core Metadata Initiative 235.2 Elementos de Metadados do Dublin Core 24

6 Bibliotecas Digitais 296.1 Definição 296.2 Vantagens 306.3 Requisitos 306.4 Implementação 31

7 Descrição do Projeto 347.1 Arquitetura e implementação 347.2 Software desenvolvido 35

8 Conclusão 42

Page 6: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

6

9 Referências Bibliográficas 43

Anexos 49

Page 7: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

7

Resumo

As tecnologias relacionadas à multimídia e à World Wide Web estão em contínuo

aperfeiçoamento. Elas são cada vez mais usadas, em diversos campos, e várias pesquisas no

meio acadêmico e empresarial estão sendo desenvolvidas nessa área. Torna-se importante

estudar-se novos meios para busca e representação de metadados relacionados a essas

tecnologias. Neste trabalho, procurou-se estudar a representação e manipulação de

informações com XML e Dublin Core e o conceito de bibliotecas digitais. A principal

contribuição deste trabalho é o desenvolvimento de um software que permita que uma

biblioteca digital, que adote SQL como linguagem de consulta, receba solicitações de

consultas XQuery adotando os metadados Dublin Core. Palavras-chave : Dublin Core, XML,

Java, bibliotecas digitais, XQuery.

Abstract

Technologies related to multimedia and World Wide Web are in continuous

improvement. They are used more and more, in many fields, and several academic and

corporative researches are being developed in this area. It becomes important to study new

ways for fetch and representation of metadata related to these technologies. In this work, we

intended to study the representation and handling of informations in XML and Dublin Core

and the concept of digital libraries. The main contribution of this work is the development of a

software that allows a digital library, with SQL as its query language, to receive XQuery

queries requests using Dublin Core metadata. Keywords : Dublin Core, XML, Java, digital

libraries, XQuery.

Page 8: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

8

1 Introdução

Neste capítulo apresentaremos a motivação do projeto, seus objetivos e a estrutura

deste documento.

1.1 Motivação

Atualmente, as tecnologias relacionadas à multimídia e à World Wide Web estão em

contínuo aperfeiçoamento, sendo cada vez mais utilizadas para atividades como comércio

eletrônico, entretenimento, informação, ensino, correio eletrônico, etc.

Sendo a Web uma rede de alcance mundial e a maior rede de computadores do mundo,

uma aplicação que funcione sobre ela tem alcance mundial. Assim, são criadas cada vez mais

aplicações para a Web, sendo realizadas muitas pesquisas nessas áreas, no meio acadêmico e

também no meio empresarial. Por sua vez, uso da multimídia oferece meios para representar

vários tipos de informações, e os repositórios para esses dados são um avanço sobre os meios

convencionais de armazenamento e busca de informação.

1.2 Objetivos do Projeto

Os objetivos gerais do projeto são estudar a representação de informações utilizando-

se XML e Dublin Core, o conceito de bibliotecas digitais e tecnologias para manipulação de

dados em XML e Dublin Core.

Como objetivos específicos, desenvolveu-se um software que possibilita a uma

biblioteca digital, que emprega SQL como sua linguagem de consulta, responder a consultas

XQuery, as quais empregam os metadados Dublin Core. Os metadados locais, do banco de

dados da biblioteca digital, são traduzidos para o padrão Dublin Core. O resultado da consulta

XQuery processada pelo programa é um arquivo XML.

Page 9: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

9

1.3 Estrutura do Documento

O capítulo 2 apresenta a origem e características básicas da linguagem Java, além de

apresentar as tecnologias JDBC e Java Servlets.

O capítulo 3 aborda conceitos básicos sobre a teoria de bancos de dados relacionais e

também apresenta o servidor de banco de dados MySQL.

O capítulo 4 apresenta a tecnologia XML, mostrando sua origem, características

básicas, validação de documentos XML, transformações e estilo em XML, além de

tecnologias relacionadas com XML, como DOM, SAX e XQuery.

O capítulo 5 trata do padrão de metadados Dublin Core : origem, atividades da Dublin

Core Metadata Initiative, características dos elementos de dados do Dublin Core e

recomendações para sua representação em XML

O capítulo 6 apresenta o conceito de biblioteca digital, apresentando uma definição de

bibliotecas digitais, suas vantagens em relação às bibliotecas convencionais, requisitos para

bibliotecas digitais e as atividades básicas para sua implementação.

O capítulo 7 mostra a arquitetura do software do projeto, a estratégia de

implementação e apresenta o software desenvolvido.

O capítulo 8 apresenta as conclusões sobre o que foi estudado e desenvolvido neste

projeto de conclusão de curso.

Page 10: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

10

2 Java

Este capítulo aborda a origem e características básicas da linguagem Java, além de

apresentar as tecnologias JDBC (Java Database Connectivity) e Java Servlets.

2.1 Origem e características da linguagem Java

Em 1991, a Sun Microsystems iniciou um projeto de pesquisa com o codinome Green,

relativo a dispositivos eletrônicos inteligentes destinados ao consumidor final. O projeto

Green resultou numa linguagem baseada em C e C++, batizada de Oak por seu criador, James

Gosling. Como já existia uma linguagem chamada Oak, seu nome foi mudado para Java

(região de origem de um café vendido numa cafeteria local).

O mercado de dispositivos inteligentes não estava se desenvolvendo tão rapidamente e

a Sun havia perdido um contrato importante pelo qual competia. Assim, o projeto Green

estava em risco de cancelamento. Ele foi salvo pela enorme popularidade que a WWW (World

Wide Web) estava adquirindo em 1993, e a Sun percebeu o enorme potencial de empregar Java

para adicionar conteúdo dinâmico a páginas da WWW.

Em maio de 1995, a Sun Microsystems anunciou a linguagem Java formalmente em

uma conferência, o que causou o interesse imediato da comunidade comercial por causa do

grande interesse na WWW. Desde então, Java é utilizada para muitas finalidades, como criar

páginas da WWW com conteúdo dinâmico ou desenvolver aplicativos comerciais de grande

escala.

A linguagem Java é orientada a objeto, assim os programas Java são compostos de

classes, as quais são compostas por métodos. Existem várias bibliotecas de classe, conhecidas

como Java APIs (Application Programming Interfaces), que auxiliam na manipulação de

strings, conexão em rede, leitura/escrita de arquivos etc. A seguir, é apresentado um programa

simples em Java, que mostra uma mensagem ao usuário :

Page 11: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

11

/* Programa Welcome.java */

public class Welcome {

public static void main (String args[]) {

System.out.println(“Welcome to Java”);

}

}

Os programas Java geralmente passam por cinco fases de programação :

• edição : criação do código-fonte (arquivo .java), pode ser realizada em um editor de

texto como o Windows Notepad, ou num IDE (Integrated Development Environment)

como o Java NetBeans.

• compilação : o programador utiliza o comando javac para compilar o programa. O

programa é traduzido para bytecodes (linguagem entendida pelo interpretador Java), num

arquivo .class.

• carga : o carregador de classe coloca os arquivos .class na memória. Há dois tipos de

programas que podem ser carregados : aplicativos (normalmente armazenado e

executado a partir do computador local do usuário) e applets (carregados no navegador

WWW a partir de um computador remoto, executados no navegador e descartados

quando é finalizada sua execução).

• verificação : o verificador de bytecode verifica se os bytecodes de um applet são válidos

e não violam as restrições de segurança da linguagem Java.

• execução : o interpretador Java executa o aplicativo ou applet, um bytecode por vez,

realizando assim a ação especificada pelo programa.

2.2 JDBC : Java Database Connectivity

A tecnologia JDBC (Java Database Connectivity) consiste numa API para

conectividade independente do banco de dados, entre a linguagem Java e um grande número

de sistemas de banco de dados. Ela permite a utilização de SQL para o acesso aos dados.

JDBC torna possível a realização de três tarefas: estabelecer uma conexão com um

banco de dados, enviar declarações SQL e processar os resultados. Há drivers JDBC para

Page 12: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

12

vários sistemas de banco dados, como ADABAS, Clipper, DB2, Microsoft SQL Server,

MySQL, Oracle, PostgreSQL e Sybase.

De acordo com [Sun, 2003b], JDBC possui as seguintes vantagens :

• dados já existentes podem ser reaproveitados.

• desenvolvimento de aplicações torna-se simplificado.

• nenhuma configuração no computador cliente é necessária para estabelecimento de

conexão.

2.3 Java Servlets

A tecnologia Java Servlets permite uma troca de informações entre um cliente e um

servidor. O cliente solicita alguma ação e o servidor executa tal ação e responde ao cliente. O

servlet extende a funcionalidade de um servidor. Os servlets são equivalentes, no lado do

servidor, aos applets no lado do cliente [Deitel, 2001]. Eles são suportados pela maioria dos

servidores Web disponíveis, como Microsoft IIS (Internet Information Server) e Apache.

Os servlets utilizam o protocolo HTTP (Hypertext Transfer Protocol) da WWW para a

comunicação entre cliente e servidor. O cliente envia uma solicitação HTTP para o servidor.

O servidor recebe a solicitação e a envia para ser processada pelo servlet adequado. Os

servlets fazem o processamento e retornam os resultados para o cliente, geralmente no

formato HTML, mas outros formatos podem ser usados, como imagens e dados binários.

Todos os servlets devem implementar a interface da API Servlet. Duas classes abstract

implementam a interface da API Servlet : a classe GenericServlet (do pacote javax.servlet) e a

classe HTTPServlet (do pacote javax.servlet.http). Essas classes fornecem implementações-

padrão de todos os métodos da API Servlet. A maioria dos servlets estende GenericServlet e

HTTPServlet e redefine alguns ou todos os seus métodos.

Page 13: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

13

3 Bancos de Dados Relacionais e MySQL

Este capítulo aborda conceitos básicos sobre bancos de dados e apresenta algumas

características do servidor de banco de dados MySQL.

3.1 Conceitos básicos

A tecnologia de banco de dados surgiu no momento em que o desenvolvimento de

sistemas computacionais para grandes organizações passou a necessitar de uma forma mais

eficiente para gerenciamento dos dados. O sistema de banco de dados fornece uma visão

abstrata dos dados, ou seja, a tecnologia usada para sua implementação é transparente ao

usuário.

Um sistema de banco de dados deve oferecer vários serviços aos seus usuários, como

por exemplo : acesso concorrente, integridade, flexibilidade e facilidade no acesso aos dados,

segurança e eliminação de redundância e inconsistência de dados,

Os modelos de dados são um método formal de representar logicamente os dados e a

manipulação dos mesmos. O modelo de dados define os tipos de objetos comportados pelo

banco de dados, os operadores válidos e as regras de integridade.

O modelo relacional representa dados e relacionamentos entre dados através de um

conjunto de tabelas, onde cada tabela possui um número de colunas com nomes únicos. Um

banco de dados relacional consiste numa coleção de tabelas, cada uma com um nome único. O

banco de dados relacional pode ser expresso utilizando-se diagramas E-R (entidade-

relacionamento).

Praticamente todos os sistemas de bancos de dados utilizam SQL (Structured Query

Language) como a linguagem para definição de dados (DDL) e também como a linguagem

para manipulação de dados (DML). SQL permite a definição de visões, transações, restrições

de integridade e autorização de acesso. A seguir, é mostrado um exemplo de consulta SQL,

que retorna os atributos “titulo” e “editora”, dos registros da tabela “livros” que obedeçam à

Page 14: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

14

condição da cláusula WHERE. A consulta ordena os resultados pelo atributo “titulo” :

SELECT titulo, editora FROM livros

WHERE autor = “Luís de Camões”

ORDER BY titulo

3.2 MySQL

MySQL é um servidor de banco de dados, multi-thread, de código aberto, e que utiliza

o modelo relacional, desenvolvido pela empresa MySQL AB [MySQL, 2003b]. Os principais

objetivos do MySQL são velocidade, robustez e facilidade de uso.

O MySQL é um dos sistemas de código aberto mais utilizados atualmente. Ele é

utilizado pelo fabricante com bancos de dados que possuem 50 milhões de registros. Há

também relatos de usuários que utilizam o MySQL com 60 mil tabelas e cerca de 5 bilhões de

registros.

A segurança também é um ponto forte do MySQL. Seu sistema de senhas é flexível e

seguro, garantindo que cada usuário execute somente as ações que lhe são permitidas. O

servidor decide os diferentes privilégios de acordo com o usuário, o banco de dados e o host.

Os dados manipulados pelo MySQL trafegam criptografados pela rede.

O MySQL oferece APIs (Application Programming Interfaces) para as linguagens de

programação C, C++, Eiffel, Java, Perl, PHP, Python, Ruby e Tcl. Ele funciona em várias

plataformas e sistemas operacionais distintos, além de possuir interface para acesso via ODBC

(Open Database Connectivity).

Page 15: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

15

4 XML e XQuery

Este capítulo apresenta uma visão geral da tecnologia XML, abordando aspectos como

sua origem, suas características básicas, validação de documentos XML e estilo em

documentos XML. Além disso, este capítulo também aborda tecnologias relacionadas com

XML, como DOM, SAX e XQuery.

4.1 Origem do XML

Em 1996, o World Wide Web Consortium (W3C) iniciou o projeto de uma linguagem

de marcação abrangente, a qual seria capaz de combinar a ampla aceitação do HTML

(HyperText Markup Language) com a flexibilidade e a capacidade da SGML (Standard

Generalized Markup Language). A SGML havia sido adotada como padrão internacional de

troca e armazenamento de dados em 1986 pela ISO (International Organization for

Standardization), através da norma ISO8879. A linguagem que se transformou no XML usou

como base as especificações da SGML, e foi especificada para ser um subconjunto desta

linguagem. O XML 1.0 se tornou uma recomendação do W3C em fevereiro de 1998.

O uso da SGML como ponto de partida possibilitou que a equipe que desenvolvia o

XML se concentrasse em transformar uma linguagem que já funcionava em algo mais

simples. O SGML já fornecia uma linguagem aberta que poderia ser expandida por qualquer

um com qualquer finalidade. Considerações sobre facilidade de uso motivaram a idéia de que

o XML deveria ser mais simples que o SGML : leitura e digitação de linguagem de marcação

por usuários de ferramentas amplamente disponíveis e simples, assim como a simplificação

do processo de computação de documentos e intercâmbio de dados. Por suas muitas

propriedades opcionais, o SGML é tão complexo que é difícil escrever parsers genéricos,

entretanto construir parsers em XML é muito mais simples. O XML alavanca softwares e

protocolos da Internet já existentes, buscando a facilidade de transmissão e processamento de

dados, e sendo um subconjunto da SGML, proporciona compatibilidade retroativa com

sistemas de orientação SGML, economizando em custos de conversão.

Page 16: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

16

4.2 Características básicas do XML

Assim como o HMTL, o XML utiliza tags e atributos para definição dos dados. As

tags são definidas utilizando-se “<” e “>”, sendo que o XML permite que o usuário defina

suas próprias tags. Um exemplo de informação representada em XML é mostrada a seguir,

que mostra como os documentos XML representam informações de maneira simples e auto-

explicativa :

<?xml version="1.0" encoding="ISO-8859-1"?>

<recado>

<para>Pedro</para>-

<de>Maria</de>

<titulo>Lembrete</titulo>

<assunto>Nao esqueca da reuniao amanha</assunto>

</recado>

A primeira linha contém informações sobre a versão do XML utilizada, assim como o

conjunto de caracteres empregado. As linhas seguintes fornecem as tags e os atributos que

representam a informação propriamente dita, a partir do elemento raiz <recado>.

É importante fazer estas observações sobre o XML :

• ao contrário do HTML, as tags do XML são sensíveis a maiúsculas/minúsculas (case

sensitive);

• no XML é ilegal omitir a tag de finalização (/>);

• todos os elementos devem ser apropriadamente aninhados;

• todos os documentos XML precisam ter um único par de tags que definem o elemento

raiz;

• se forem utilizados conjuntos de nome/atributo, como no HTML, os atributos devem

estar indicados por um par de aspas duplas (");

• os comentários em XML são definidos da mesma maneira que no HTML : iniciam com

“<!--” e “-->”.

Os dados em XML são autodescritivos à medida em que cada elemento leva seu

próprio nome que pode estar relacionado a um modelo externo para problemas do mundo real

Page 17: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

17

que o documento descreve. Apesar de ser semelhante ao HTML, o XML proporciona um

poder de representação muito maior ao permitir que o usuário defina suas próprias tags de

acordo com suas necessidades, sem precisar ficar preso a padrões do W3C, como no caso do

HTML.

4.3 Validação de documentos XML

A partir do momento em que o usuário tenha a necessidade de usar um conjunto

próprio de tags para representar informação, surge a questão de como especificar regras para

validar os documentos XML de acordo com tais especificações do usuário. A resposta para

essa questão é fornecida pelo Document Type Definition (DTD), que é um conjunto de

definições que capturam as regras que um usuário adiciona para ampliar as regras centrais da

sintaxe XML e criar um vocabulário para descrever um problema ou situação. Utilizando

DTDs, o usuário conta com uma ferramenta para validar os documentos que suas aplicações

trocam, e pode descobrir novos vocabulários em tempo de operação. Um exemplo de DTD,

para o documento XML mostrado anteriormente, é mostrado a seguir :

<?xml version="1.0"?>

<!DOCTYPE recado [

<!ELEMENT recado (de,para,titulo,assunto)>

<!ELEMENT de (#PCDATA)>

<!ELEMENT para (#PCDATA)>

<!ELEMENT titulo (#PCDATA)>

<!ELEMENT assunto (#PCDATA)>

]>

É possível notar que os DTDs seguem suas próprias regras sintáticas, mas permitem

que o usuário faça sentenças bem definidas sobre o que é ou não um documento válido em

uma determinada classe de documentos XML. Isto leva diretamente a uma distinção entre

parsers de validação e não validação. Um parser de não validação apenas verifica o

documento quanto à adequação às regras centrais da sintaxe XML. Um parser de validação

verifica também um documento contra um DTD para decidir se este é válido de acordo com as

regras do DTD.

Page 18: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

18

4.4 APIs para manipulação de XML : DOM e SAX

A partir do momento em que o usuário definiu o vocabulário para sua necessidade, ele

pode começar a decidir a respeito de outros aspectos da aplicação, que poderá envolver a

manipulação de arquivos XML para se obter respostas, podendo também ser necessário gerar

respostas no formato de arquivos XML. O Document Object Model (DOM) é uma API

(Application Programming Interface) para fazer essa manipulação. Ele especifica um

conjunto de objetos e interfaces para manipular documentos e interfaces HTML e XML. O

W3C mantém a recomendação para o DOM, sendo esta uma das interfaces que mais possui

suporte para trabalhar com documentos XML, junto com o Simple API for XML (SAX).

O DOM fornece uma visão do documento estruturada em árvore. Um parser

compatível com DOM lê todo o documento e oferece uma visão construindo uma árvore de

objetos na memória. As principais estruturas do componente do documento são nós na árvore

objeto. Para acessar itens e manipulá-los, navega-se na árvore de análise utilizando as

interfaces DOM. Segundo [DOM, 2003], o DOM é dividido em três partes :

• Core : fornece um conjunto de objetos de baixo nível que podem representar qualquer

documento estruturado. Enquanto o DOM por si só é capaz de representar qualquer

documento HTML ou XML, a interface Core é um projeto compacto e mínimo para

manipular o conteúdo do documento. Dependendo do uso do DOM, a interface Core

pode não ser conveniente ou apropriada para todos os usuários;

• HTML e XML : fornecem interfaces adicionais e de alto nível que são usadas com a

interface Core para fornecer uma visão mais conveniente do documento. Estas duas

interfaces consistem de objetos e métodos que fornecem acesso mais fácil e direto aos

tipos específicos de documentos.

A outra principal API para manipulação de documentos XML é o Simple API for XML

(SAX). Ao contrário do DOM, o SAX não é o produto de uma organização de padrões, mas

sim um produto casual de um grupo de desenvolvedores de XML que necessitavam de uma

API eficiente no início do XML. Inicialmente era uma API apenas para a linguagem Java e foi

a primeira API empregada amplamente para manipulação de XML [SAX, 2003].

Page 19: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

19

O SAX permanece popular porque tem uma abordagem diferente para oferecer o

acesso a documentos XML. Ao invés de apresentar uma árvore com as informações do

documento completo, o SAX fornece eventos à medida que analisa o documento. Um parser

compatível com SAX não retém o documento, mas avisa ao programa utilizado à medida que

processa cada parte do documento. A resposta a um evento fica por conta do programa que

está usando o parser. Um programa tem total responsabilidade pela manutenção do estado do

documento, podendo manter tanta informação quanto necessária para satisfazer os requisitos

da aplicação. Assim, pode-se prever que o parser gerado seja bastante compacto, gerando

pedidos mínimos aos recursos do sistema. O SAX é ideal para lidar com documentos XML

muito grandes. Apesar de o DOM ser a API mais utilizada para XML hoje em dia, os parsers

SAX já estão disponíveis.

4.5 Estilo em documentos XML

Embora o XML se concentre no armazenamento dos dados e no valor da conexão

direta entre aplicações, separando-se da apresentação dos dados, muitas vezes pode ser

necessário apresentar os dados XML a um usuário humano. A exibição de dados XML em

Web browser é muito utilizada atualmente, em aplicações Web. O estilo em XML é uma

ferramenta muito importante para desenvolvedores da Web, pois com essa ferramenta

interfaces de usuários são implementadas rapidamente para dados XML.

As técnicas usadas para o estilo em XML variam em complexidade e sofisticação. As

duas técnicas mais importantes são a Cascading Style Sheet (CSS) e a Extensible Stylesheet

Language (XSL). A CSS é a técnica mais simples, mas não é estritamente uma técnica da

comunidade XML. Na verdade, seu uso foi estendido à medida que os desenvolvedores XML

as tomaram emprestadas do mundo de desenvolvimento Web, mais especificamente HTML.

Fornece estilos simples para a apresentação de informações (tipo da fonte, cor da fonte, cor do

fundo, etc), sendo capazes de atribuir determinadas informações sobre estilo a elementos

XML identificados.

A outra técnica utilizada para estilos, a XSL, resulta do desenvolvimento do XML, e

junta as preocupações de estilo do CSS com a natureza expressiva do XML. Os

Page 20: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

20

programadores utilizam a XSL para especificar o mapeamento de dados XML em um

conteúdo visual. Ao contrário do CSS, o XML permite que se atribua estilo baseado no

contexto dos dados XML, podendo ainda executar o processamento embutindo códigos de

script nas folhas de estilo XSL.

4.6 Transformações de XML

Uma das técnicas poderosas do XML é a transformação, que permite que um

documento XML seja mapeado de um formato para outro, baseando-se num conjunto de

regras aplicadas ao primeiro documento. As transformações do XML são usadas para a

tradução entre vocabulários XML semelhantes, e também para a tradução de documentos

XML para outros formatos de arquivo texto. A transformação em XML é uma técnica muito

útil caso sejam necessárias transformações eficientes par se obter um formato comum, por

exemplo.

O formato mais recente para transformações de XML faz parte da linguagem de estilo

XSL, sendo chamado de XSL Transformation (XSLT). O propósito básico da linguagem

XSLT é organizar um documento XML para ser usado com o estilo XSL. Embora não tenha

sido projetada como uma linguagem de transformação com propósitos genéricos, a XSLT é

bastante flexível e possibilita a execução da maioria das transformações, classificando e

organizado tarefas em XML sem se escrever seu próprio código procedural. O usuário é que

escreve as regras para transformar XML com base no contexto no qual os elementos

aparecem.

4.7 Consultas em XML : XQuery

Com o grande aumento das informações armazenadas, trocadas ou apresentadas em

XML, a capacidade de realizar eficientemente consultas em dados XML se torna muito

importante. Uma das grandes virtudes do XML é sua flexibilidade em representar muitos tipos

de informação, incluindo a informação tradicionalmente considerada como banco de dados,

ou aquela considerada como documento. Para explorar essa flexibilidade, uma linguagem de

consulta para XML precisa incluir as características que são necessárias para receber

Page 21: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

21

informação destas diversas fontes.

A linguagem XQuery foi projetada para atender aos requisitos identificados pelo W3C

XML Query Working Group. Foi projetada para ser uma linguagem pequena, facilmente

implementável, na qual consultas são facilmente compreendidas. Também é flexível o

bastante para realizar consultas em uma grande variedade de fontes de informação XML,

incluindo tanto bancos de dados como documentos. O Query Working Group identificou duas

necessidades : uma linguagem de consulta que possa ser facilmente lida por um usuário, e

uma sintaxe de consulta baseada em XML. A XQuery foi projetada para atender a primeira

necessidade. Uma sintaxe baseada em XML para a semântica da XQuery será definida

separadamente.

A XQuery é uma linguagem funcional na qual uma consulta é representada por uma

expressão. Vários tipos de expressão são suportados, assim as consultas podem tomar diversas

formas. As várias formas de expressões em XQuery podem ser aninhadas, assim a noção de

subconsulta (subquery) é natural na XQuery. A entrada e saída de uma consulta são instâncias

de um modelo de dados, o XML Query Data Model, onde um documento é modelado como

uma árvore de nodos. Um fragmento de um documento, ou uma coleção de documentos,

podem necessitar de uma raiz comum, logo eles podem ser modelados como uma “floresta”

ordenada de nodos de vários tipos, incluindo nodos elemento, nodos atributo e nodos texto.

O exemplo a seguir ilustra uma consulta em XQuery a uma base de dados em XML

que armazena dados sobre livros. A consulta retorna todos os livros da editora Morgan

Kaufmann publicados em 1998 :

FOR $b IN document("bib.xml")//book

WHERE $b/publisher = "Morgan Kaufmann"

AND $b/year = "1998"

RETURN $b/title

4.8 Consultas XQuery FLWR

As consultas XQuery FLWR (pronuncia-se “flower”), uma abreviatura de FOR-LET-

Page 22: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

22

WHERE-RETURN, representam em XQuery as consultas SELECT-FROM-WHERE, da

linguagem SQL.

A gramática da linguagem XQuery permite a criação de produções maleáveis,

altamente recursivas e capazes de gerar um grande número de diferentes consultas, incluindo

praticamente qualquer combinação imaginável de declarações FOR, LET, WHERE e

RETURN.

A seguir, apresentamos um exemplo de consulta XQuery FLWR. Esta consulta

seleciona os campos dc:title, dc:creator e dc:publisher, do arquivo “texto.xml”, que obedecem

à condição da cláusula WHERE, e ordena o resultado pelo campo dc:title :

FOR $a IN document("texto.xml")/metadata/record

WHERE $a/dc:language = pt

ORDER BY $a/dc:title

RETURN

<metadata>

{ $a/dc:title }

{ $a/dc:creator }

{ $a/dc:publisher }

</metadata>

Page 23: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

23

5 Dublin Core

Este capítulo aborda o padrão de metadados Dublin Core, mostrando a origem e as

atividades da organização responsável por este padrão, a Dublin Core Metadata Initiative.

Serão apresentadas também as principais características dos elementos do Dublin Core, além

de exemplos e recomendações para sua representação em XML.

5.1 Dublin Core Metadata Initiative

O Dublin Core Metadata Initiative (DCMI) é um projeto de desenvolvimento de

padrões para metadados e para organização de informações, assim como catalogação e

classificação dessas informações em meio eletrônico. Concebido em 1995, o DCMI conta com

a participação de 800 pessoas de todo o mundo, representando mais de 45 países. O conjunto

de elementos para metadados Dublin Core foi traduzido para 25 idiomas e adotado

formalmente por 7 governos, com outros governos discutindo sua possível adoção.

As atividades do DCMI incluem :

• Desenvolvimento de padrões e manutenção das recomendações para metadados, através

de workshops internacionais e reuniões de grupos de trabalho;

• Ferramentas, serviços e infra-estrutura, incluindo o registro de metadados DCMI para

auxiliar no gerenciamento e manutenção dos metadados DCMI em vários idiomas;

• Apoio ao setor educacional e divulgação para a comunidade, incluindo desenvolvimento

e distribuição de recursos educacionais e de treinamento, consultoria, e coordenação de

atividades com outros projetos de metadados.

O DCMI é aberto à participação de todos os interessados. Possui atualmente 17 grupos

de trabalho com 75 integrantes ou mais, e centenas de outros participantes que monitoram o

progresso desses grupos. As atividades do DCMI são distribuídas globalmente, tanto em

termos de participação em grupos de trabalho como na realização de encontros e workshops.

Page 24: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

24

O padrão de metadados Dublin Core possui características que o diferenciam de outros

padrões semelhantes :

• simplicidade na descrição dos recursos : pode ser usado por não-catalogadores, autores

ou desenvolvedores da Web sem conhecimento prévio de todas as regras de catalogação;

• interoperabilidade semântica : pessoas com níveis diferentes de conhecimento sobre um

determinado assunto terão o mesmo entendimento da importância do elemento palavra-

chave, que afinal resume o assunto. A convergência sobre o entendimento comum,

ligeiramente mais genérica, possibilita maior visibilidade e acessibilidade de todos os

recursos;

• escopo internacional : a participação de representantes de vários continentes tem

assegurado o desenvolvimento do padrão levando em conta a natureza multilíngüe e

multicultural do universo de informação eletrônica;

• extensibilidade : além de balancear a necessidade de simplicidade na descrição de

recursos digitais com a precisão na recuperação da informação, o Dublin Core conta com

possibilidade de expansão do conjunto de elementos para cobrir necessidades adicionais

de novos recursos.

5.2 Elementos de Metadados do Dublin Core

Cada elemento do Dublin Core é definido usando um conjunto de dez atributos da

norma ISO/IEC 11179 [ISO/IEC 11179, 2003] para a descrição de elementos de dados. Estes

atributos incluem :

• Nome : o rótulo atribuído ao elemento de dados;

• Identificador : o identificador único atribuído ao elemento;

• Versão : a versão do elemento;

• Autoridade de Registro : entidade autorizada a registrar o elemento;

• Linguagem : a linguagem na qual o elemento é especificado;

• Definição : uma frase que representa claramente o conceito e a natureza do elemento;

• Obrigação : indica se o elemento precisa ou não estar sempre presente;

• Tipo do dado : indica o tipo de dados que pode ser representado no valor do elemento;

Page 25: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

25

• Ocorrência Máxima : Indica um limite para a repetição do elemento;

• Comentário : uma observação sobre a aplicação do elemento.

A seguir, apresentamos os elementos de dados do Dublin Core, as informações que são

incluídas em cada elemento e exemplos de representação dos elementos em XML. Deve-se

evitar repetir a mesma informação em mais de um elemento :

Elemento : Title

Nome dado ao documento, pelo qual será oficialmente conhecido. Inclui-se nesse

elemento : nome do documento, subtítulo do documento, volume do documento e número do

documento. Exemplo : <dc:title>Memórias Póstumas de Brás Cubas</dc:title>.

Elemento : Creator

Nome dado ao autor do conteúdo do documento. Este pode ser institucional ou

pessoal. É incluído nesse elemento : nome do criador do documento. Exemplo:

<dc:creator>Assis, Machado de</dc:creator>.

Elemento : Subject

Palavra(s) ou frase(s) que descreve(m) o assunto do documento. Inclui-se nesse

elemento: palavras-chaves. Exemplo: <dc:subject>literatura brasileira, santa catarina,

escritores brasileiros, biografia</dc:subject>.

Elemento : Description

Breve resumo do conteúdo do documento. Inclui-se nesse elemento: resumo do

documento. Exemplo : <dc:description>Ilustrações de aves brasileiras do pintor naturalista

Eduardo Brettas</ dc:description >.

Page 26: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

26

Elemento : Publisher

A pessoa ou entidade responsável pela publicação do documento. É incluído nesse

elemento: editor do documento. Exemplo : <dc:publisher>Ática</dc:publisher>.

Elemento : Contributor

Pessoa(s) ou entidade(s) que contribuiu(ram) de forma relevante para a conclusão do

documento. Inclui-se nesse elemento : autor de prefácio, tradutor. Exemplo:

<dc:contributor>Silva, Paulo C. Tradutor</ dc:contributor>.

Elemento : Date

Data da criação do documento. É incluído nesse elemento : data do documento.

Exemplo: <dc:date>2002-10-11</dc:date>.

Elemento : Type

Descreve a natureza ou gênero do conteúdo do documento. Inclui-se nesse documento:

tipo do documento. Exemplo : < dc:type >texto</dc:type>.

Elemento : Format

Descrição do formato digital do documento. Inclui-se nesse elemento : formato do

documento, duração (no caso de vídeos e sons), dimensão (no caso de imagens), tamanho do

documento. Exemplo : <dc:format>PDF; 2Mb</dc:format>.

Elemento : Identifier

Uma referência ao documento digital. Inclui-se nesse elemento : Uniform Resource

Locator (URL), International Standard Book Number (ISBN), International Standard Serial

Number (ISSN), Digital Object Identifier (DOI). Exemplo : <dc:identifier>http://catalog.loc.

Page 27: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

27

gov/67-26020</dc:identifier>.

Elemento : Source

Referencia a fonte do qual o documento foi digitalizado e/ou onde esse original se

encontra. São incluídos nesse elemento : título de periódico (no caso de artigos), a localização

do documento na rede (URL), nome do título geral do documento, identificação da obra

impressa (caso o documento tenha sido digitalizado). Exemplo: <dc:source> Journal of

Research and Development, v. 40, n. 2</dc:source>.

Elemento : Language

Idioma em que se encontra o documento. Inclui-se nesse elemento: idioma do

documento. Exemplo : <dc:language>pt-br</dc:language> (português do Brasil).

Elemento : Relation

Referência ao documento do qual é relacionado. Inclui-se nesse elemento : versão,

edição, parte de outro documento, baseado em outro documento, referência a outro

documento. Exemplo : <dc:relation>Anais do 9o Simpósio Brasileiro de Banco de Dados, São

Paulo, 1994</dc:relation>.

Elemento : Coverage

Descreve a extensão ou a competência do conteúdo do documento. São incluídos nesse

elemento: localização espacial, período temporal, jurisdição do documento. Exemplo:

<dc:coverage>1998-2002</dc:coverage>.

Elemento : Rights

Descreve as informações dos direitos que uma pessoa ou entidade possui sobre o

documento. Inclui-se nesse elemento: copyright, propriedade intelectual, URL do documento

Page 28: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

28

original, permissão para modificar o documento. Exemplo: <dc:rights>Domínio

Público</dc:rights>.

[Powell, 2002] fornece as recomendações para a implementação de Dublin Core em

XML, que são as seguintes :

• basear aplicações XML em XML Schemas ao invés de XML DTDs;

• utilizar XML Namespaces para identificar unicamente os elementos, refinamentos dos

elementos e esquemas de codificação;

• codificar propriedades como elementos XML e valores como o conteúdo desses

elementos;

• os nomes das propriedades para os 15 elementos devem ser em letras minúsculas;

• valores múltiplos de propriedades devem ser codificados repetindo-se o elemento XML

para essa propriedade;

• refinamentos dos elementos devem ser tratados da mesma maneira que outras

propriedades;

• esquemas de codificação devem ser implementados usando o atributo ‘xsi:type’ do

elemento XML para a propriedade;

• refinações de elementos e esquemas de codificação devem usar os nomes especificados

na recomendação para qualificadores Dublin Core [DCMI, 2000];

• onde a linguagem do valor é indicada, deve ser codificada usando o atributo ‘xml:lang’.

Page 29: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

29

6 Bibliotecas Digitais

Este capítulo apresenta o conceito de biblioteca digital, mostrando uma definição de

bibliotecas digitais, suas vantagens em relação às bibliotecas convencionais, requisitos para

uma biblioteca digital e as atividades básicas para sua implementação.

6.1 Definição

Há várias definições para a “biblioteca digital”, também chamada de “bibliotec a

virtual” ou “biblioteca eletrônica”. De acordo com [Pulliam, 1996], uma biblioteca digital é

uma infra-estrutura de informação eletrônica padronizada que permite armazenamento

distribuído de dados, busca e recebimento de dados em uma grande região geográfica através

de links e uma interface transparente ao usuário final.

Para a maioria das definições de bibliotecas digitais, têm sido identificados elementos

comuns, que são os seguintes, segundo [ARL, 1995] :

• a biblioteca digital não é uma entidade única;

• a biblioteca digital necessita de tecnologia para interligar os vários recursos;

• as interligações entre as várias bibliotecas digitais e serviços de informação são

transparentes aos usuários finais;

• o acesso universal às bibliotecas digitais e serviços de informação é um objetivo;

• coleções de bibliotecas digitais não estão limitadas a hospedagem de documentos, elas

também armazenam dados digitais que não podem ser representados ou distribuídos em

formatos impressos.

As bibliotecas digitais podem ser centralizadas ou distribuídas. As bibliotecas digitais

distribuídas são representadas por várias bibliotecas digitais que podem ser acessadas através

de uma única interface do cliente. Nas bibliotecas digitais distribuídas, cada organização é

responsável por administrar de seu acervo. Em uma biblioteca centralizada os objetos que

compõem as coleções podem ser armazenados em servidores diferentes, entretanto a

administração é centralizada.

Page 30: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

30

Para bibliotecas digitais distribuídas é necessário utilizar padrões que garantam a

comunicação entre os diversos participantes do sistema. Podemos citar como exemplos de

padrões o protocolo SDLIP (Simple Digital Library Interoperability Protocol) proposto no

projeto Bibliotecas Digitais Stanford [SDLP, 2003], e os padrões ISO ILL (InterLibrary Loan

Application Standards) [ILL, 2003]. Além destes, o padrão internacional Z39.50 [Z39.50 MA,

2003] é muito adotado para busca e acesso sobre mais que uma biblioteca digital.

6.2 Vantagens

Entre as vantagens das bibliotecas digitais em relação às bibliotecas convencionais,

podemos citar :

• acesso disponível a partir de qualquer computador acessando a Web;

• pesquisa facilitada, pois é mais fácil pesquisar através do computador do que em uma

biblioteca convencional;

• o armazenamento é mais simples, pois exige somente discos rígidos ao invés de salas

enormes, prateleiras etc;

• o acervo, por não ser físico, não requer manutenção;

• os documentos magnéticos podem ser copiados por quantos usuários o desejarem, ao

contrário dos documentos físicos, os quais sempre têm uma quantidade limitada de

exemplares, o que limita o acesso à informação.

Em relação à web, as bibliotecas digitais possuem a vantagem de possuir suas

informações bem organizadas em tabelas de bancos de dados, ao contrário da Web, onde as

informações estão distribuídas de forma anárquica; assim, a busca de informações em

bibliotecas digitais é enormemente facilitada.

6.3 Requisitos

Muitas pessoas pensam que uma biblioteca digital consiste de um imenso conjunto de

informações espalhadas pela Internet e que podem ser acessadas por qualquer computador, a

qualquer momento e por qualquer usuário. Há também aqueles que pensam que a World Wide

Page 31: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

31

Web representa uma biblioteca digital. No entanto, esta quantidade de informações é muito

volátil para ser considerada um verdadeiro repositório, e além disso as bibliotecas digitais são

muito mais do que apenas repositórios de informações. A seguir, apresentamos as

características que devem ser apresentadas por bibliotecas digitais, além dos dados

digitalizados :

• Coerência : as bibliotecas digitais devem apresentar coerência, organização de seu

conteúdo, classificando seu material por assunto, autor, etc. Especialistas em

determinada área montam as coleções, que por sua vez são combinadas em um grande

formulário das bibliotecas digitais. O ideal seria que diferentes instituições se

responsabilizassem por criar coleções de variados tipos, compartilhariam essas

coleções e assim otimizariam as vantagens da distribuição pela Internet;

• Infra-estrutura econômica : alguns projetos de bibliotecas digitais desenvolvidos por

instituições acadêmicas estão procurando financiamento, e cobrando taxas de acesso

de seus usuários;

• Pesquisabilidade : a capacidade de encontrar e utilizar materiais na Internet é a maior

vantagem para a maioria dos usuários, mas meios rudimentares de pesquisa é fonte de

desapontamento. A questão da acessibilidade está sendo alvo de pesquisas, visando o

desenvolvimento de mecanismos de pesquisa mais avançados e métodos de filtragem

de informações;

• Preservação : as bibliotecas, por definição, coletam e armazenam informações para

atender a demandas de seus usuários, mas em relação a coleções digitais na Internet,

existem grandes desafios para arquivamento. A preservação também deve garantir que

as informações permaneçam intactas. Especialistas em segurança auxiliam na

preservação, assegurando a autenticidade das informações;

• Serviço : as bibliotecas digitais podem oferecer serviços onde os usuários podem

questionar, utilizar serviços para orientação e instrução, e obter respostas para seus

problemas mais comuns.

6.4 Implementação

Segundo [Pulliam, 1996], o projeto de uma biblioteca digital deve possuir cinco

Page 32: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

32

atividades básicas : criação e captura, armazenamento e gerenciamento, serviço de busca,

distribuição e gerenciamento de direitos autorais. Estas cinco atividades serão discutidas a

seguir.

Criação e captura :

Os dados multimídia que formarão a biblioteca digital necessitam logicamente ser

digitalizados. Com a evolução tecnológica na informática e a redução dos custos de

armazenamento, comunicação e processamento, tornou-se possível armazenar os dados

digitalizados em grandes volumes e de acordo com a demanda dos usuários.

Armazenamento e gerenciamento :

Vários tipos de dados digitalizados necessitam de muito espaço de armazenamento e

largura de banda, tornando-se necessária a compactação desses dados. Assim, a tecnologia de

compressão de dados deve ser incorporada ao sistema da biblioteca digital, para minimizar

custos de armazenamento e transmissão. O sistema de arquivos também deve ser

suficientemente flexível para incorporar, a curto e médio prazo, novos dados multimídia que

surgem constantemente.

Serviço de busca

Geralmente as informações multimídia não possuem informações de indexação

internamente, mas em bibliotecas digitais os objetos multimídia podem ser associados a

informações de indexação. Além disso, tipos diferentes de objetos podem ser classificados em

categorias diferentes. Com estas informações de categorização e indexação, os usuários

podem fazer buscas de informações usando consultas booleanas ou linguagem natural.

Pesquisas estão sendo realizadas em reconhecimento de voz e imagens para que no futuro os

usuários possam procurar informações de áudio ou materiais audiovisuais.

O ideal é que a ferramenta de busca seja construída sob uma base de reformulação de

consulta e também seja capaz de incorporar buscas dependentes do contexto. Usuários finais

Page 33: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

33

geralmente não têm tempo nem paciência para verificar uma lista muito grande de

documentos após realizar uma consulta. Assim, a reformulação da consulta pode ser feita

oferecendo-se termos de busca alternativos para o usuário final e enfatizando-se a participação

do usuário na formação de uma ciclo de formulação de consultas e apresentação de resultados.

Distribuição

A rede para a transmissão de áudio e vídeo deve ter grande largura de banda, assim

deve-se utilizar redes de computadores de alta velocidade, como ATM (Asynchronous

Transfer Mode).

Gerenciamento de direitos autorais

O gerenciamento de direitos autorais normalmente é uma função chave em bibliotecas

digitais que causa impactos nas outras quatro funções principais, impondo regras de uso

definidas pelo proprietário da informação e a proteção dos dados multimídia disponíveis

contra acessos e modificações não autorizadas.

Não existe uma única solução para o gerenciamentos dos direitos autorais, mas

técnicas comuns como marca d’água (assinatura digital codificada nos objetos) e

fingerprinting (identificação do usuário que acessou a informação) podem ser usadas para

prevenir modificações e acessos não autorizados aos dados.

Page 34: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

34

7 Descrição do Projeto

Este capítulo aborda as atividades desenvolvidas no projeto de conclusão de curso,

mostrando a arquitetura do software desenvolvido, a estratégia de implementação e o seu

funcionamento.

O objetivo principal do projeto é criar um software que possibilite a uma biblioteca

digital, a qual adota SQL como linguagem de consulta, processar solicitações de consultas

XQuery com metadados Dublin Core.

7.1 Arquitetura e implementação

O esquema geral de funcionamento do software é apresentado na Figura 1.

Figura 1 – Esquema geral de funcionamento do software

A primeira parte do projeto consiste num software que recebe uma consulta XQuery

FLWR, e o wrapper (conversor de linguagens de consulta e de resultados de consultas) faz a

conversão dessa consulta para SQL, traduzindo os metadados Dublin Core para metadados

locais. A consulta SQL é executada e seu resultado é transformado para XML, de acordo com

[Bos, 1997]. Caso seja de seu interesse, o usuário pode verificar qual a consulta SQL

resultante da tradução da consulta XQuery FLWR. O usuário também pode configurar as

traduções de metadados locais para metadados Dublin Core, e vice-versa.

Page 35: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

35

A segunda parte do projeto consiste num servlet que responde às consultas XQuery

FLWR, a partir de uma página HTML. Este servlet realiza somente consultas no mesmo estilo

da primeira parte do software e responde ao usuário gerando uma página HTML. A

configuração das traduções de metadados não pode ser feita através do servlet. Grande parte

do trabalho desenvolvido para o software Java foi reaproveitada no desenvolvimento do

servlet. O servlet pode ser usado num servidor Web, para responder a consultas através da

Internet.

A tecnologia JDBC ajudou muito no desenvolvimento do software e possibilita uma

tradução mais simplificada do código, caso seja necessário no futuro utilizar o software com

outros sistemas de bancos de dados diferentes do MySQL. Num primeiro momento, pensou-se

em utilizar tecnologias como SAX ou DOM para a tradução da consulta SQL para XML. Mas

não foi necessário, poisa manipulação de strings e arquivos oferecida pelas bibliotecas Java

foi suficiente, e talvez até mais eficiente do que a criação de árvores de nodos (DOM) ou de

eventos (SAX).

7.2 Software desenvolvido

A interface inicial do software apresenta as opções ao usuário, e o programa já mostra

uma consulta XQuery FLWR, que faz parte dos seis exemplos disponíveis, conforme mostra a

Figura 2. O usuário pode alterar esta consulta para certos tipos de combinação de comandos

FOR, WHERE e ORDER BY. Pelo que foi pesquisado na Internet, não se encontrou uma

ferramenta ou biblioteca que pudesse auxiliar nessa tradução. Projetos como [Rainbow, 2003]

estão na fase de testes e ainda não foram liberados.

Page 36: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

36

Figura 2 – Interface inicial do programa

Escolhendo a opção “Consulta XQuery”, o usuário recebe o resultado da consulta SQL

equivalente a consulta XQuery FLWR da interface inicial, traduzido para XML e usando

metadados Dublin Core. O banco de dados utilizado possui uma estrutura simples, contendo

dados sobre livros, autores e publicadores (ver Anexo 6). A Figura 3 mostra a janela com o

resultado em XML.

Page 37: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

37

Figura 3 – Resultado em XML da consulta XQuery FLWR

Se o usuário achar necessário, pode escolher a opção “Detalhes – Consulta SQL” para

visualizar a consulta SQL equivalente à consulta XQuery FLWR, que é mostrada na Figura 4.

Figura 4 – Consulta SQL equivalente à consulta XQuery FLWR

Além de realizar consultas, o usuário também pode configurar a tradução de

metadados do banco de dados local, para metadados Dublin Core. Por exemplo, configurar a

tradução do metadado “autor”, para o metadado Dublin Core “Creator”, para a tabela

“animacao”. A tradução de metadados Dublin Core para metadados do banco de dados local é

realizada para os metadados Dublin Core “Language”, “Type” e “Format”. Segundo [DCMI,

2003a], esses metadados precisam respeitar certas regras de apresentação, utilizando códigos

Page 38: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

38

especiais para representação de idiomas e tipos de arquivos.

As Figuras 5 e 6 mostram as janelas a partir das quais o usuário escolhe a tabela do

banco de dados, ou o metadado Dublin Core, onde realizará a configuração.

Figura 5 – Seleção de tabela para configuração de tradução

Figura 6 – Seleção de metadado Dublin Core para configuração de tradução

Nas duas traduções, o usuário faz as modificações que julgar necessárias e pode salvá-

las. As informações de tradução são salvas em arquivo texto (ver Anexos 2 e 3), o que facilita

a configuração, pois não é necessário incluir estas informações no código-fonte do programa,

o que necessitaria uma nova compilação a cada nova configuração de tradução. O usuário

também pode editar diretamente os arquivos de configuração. As Figuras 7 e 8 mostram as

janelas onde fazer a configuração das traduções e salvá-la.

Page 39: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

39

Figura 7 – Configuração da tradução de metadados Dublin Core / locais

Figura 8 – Configuração da tradução de metadados locais / Dublin Core

No caso do servlet, para testar seu funcionamento utilizou-se o JSDK 2.1 (Java Servlet

Development Kit 2.1). Executa-se o JSDK 2.1 e o arquivo HTML com a consulta ao servlet

(ver Anexo 5) é aberto num navegador. O usuário digita sua consulta XQuery FLWR e clica

no botão “Submeter consulta” para enviá-la ao servlet, conforme mostra a Figura 9.

Page 40: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

40

Figura 9 – Arquivo HTML para consulta ao servlet

O servlet a seguir processa a consulta, da mesma forma que o programa em Java faz, e

gera um arquivo HTML com a resposta em XML para o usuário, conforme é mostrado na

Figura 10. Também é mostrada a consulta SQL equivalente a consulta XQuery submetida pelo

usuário.

Page 41: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

41

Figura 10 – Arquivo HTML com a resposta do servlet

Page 42: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

42

8 Conclusão

Os objetivos deste projeto foram alcançados. Realizou-se o estudo das tecnologias

necessárias para a implementação do software, e criou-se o software que converte uma

biblioteca digital, suportando SQL, em uma biblioteca digital que suporta a consulta XQuery

traduzindo metadados proprietários em metadados Dublin Core. Este projeto contribuiu para a

criação de bibliotecas digitais abertas seguindo uma interface padrão para acesso aos seus

dados. O trabalho que foi realizado será utilizado no Projeto SIDIE – Sistema de

Disponibilização de Informações para Ensino, cujo objetivo é a construção de uma infra-

estrutura de digitalização, organização e disponibilização de conteúdos digitais voltados ao

ensino e pesquisa [SIDIE, 2003].

Com este trabalho, foram revistos muitos conceitos e outros conhecimentos tiveram

que ser aprendidos. A teoria de banco de dados relacionais e linguagem SQL foi um item

revisado para a realização deste trabalho, de grande importância na atividade profissional. Um

grande conjunto de tecnologias foi estudado, como XML, XQuery, JDBC, Java Servlets, e

com certeza também ajudarão muito na vida profissional, pois tais tecnologias estão se

tornando cada vez mais importantes. Também foi interessante aprender sobre os tópicos de

biblioteca digital e metadados, que não são muito explorados nas disciplinas do curso de

graduação.

A World Wide Web ajudou muito na realização deste trabalho, pois a maioria das

tecnologias estudadas são recentes, em contínua evolução. Os tutoriais, manuais, bibliotecas e

ferramentas utilizados no trabalho foram quase todos obtidos na Internet, o que facilitou muito

o desenvolvimento do projeto, tanto pela gratuidade como pela atualização constante do

material utilizado.

Para trabalhos futuros, sugere-se a aplicação do software aqui desenvolvido em algum

projeto mais amplo relativo a bibliotecas digitais, além do próprio Projeto SIDIE, e projetos

para geração e intercâmbio de metadados. Também pode-se sugerir a aplicação de outros

padrões diferentes do Dublin Core, na criação e intercâmbio dos metadados entre diferentes

sistemas.

Page 43: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

43

9 Referências Bibliográficas

[Anderson, 2001] ANDERSON, Richard et al. Professional XML. Rio de Janeiro: Ciência

Moderna, 2001.

[ARL, 1995] Association of Research Libraries. Appendix II - Definition and Purposes of a

Digital Library. In: Association of Research Libraries Proceedings of the 126th Annual

Meeting, Boston: 1995. Disponível em: <http://www.arl.org/arl/proceedings/126/2-

defn.html>. Acesso em: 23 mai. 2003.

[BDB-IBICT, 2003] Site do Projeto Biblioteca Digital Brasileira - IBICT. Disponível em:

<http://www.ibict.br/bdb/inicio.htm>. Acesso em: 25 mai. 2003.

[BD-RMAV, 2003] Site da Biblioteca Digital da RMAV-FLN. Disponível em:

<http://www.rmav-fln.ufsc.br/projetos/biblioteca/>. Acesso em: 25 mai. 2003.

[Bos, 1997] BOS, Bert. XML representation of a relational database. Publicado em: 11 jul.

1997. Disponível em: <http://www.w3.org/XML/RDB.html>. Acesso em: 25 mai. 2003.

[Cover, 2001] The Cover Pages. Code for the Representation of the Names of Languages.

Publicado em: 29 ago. 2001. Disponível em: <http://www.oasis- open.org/cover/iso639a.

html>. Acesso em: 25 mai. 2003.

[Cover, 2003a] The Cover Pages. Country Code List: ISO 3166-1993 (E). Disponível em:

<http://www.oasis-open.org/cover/country3166.html>. Acesso em: 25 mai. 2003.

[Cover, 2003b] The Cover Pages. W3C Document Object Model (DOM). Publicado em: 4

abr. 2003. Disponível em: <http://xml.coverpages.org/dom.html>. Acesso em: 23 mai. 2003.

[DCMI, 2003a] Dublin Core Metadata Initiative. Dublin Core Metadata Element Set,

Version 1.1: Reference Description. Publicado em: 4 fev. 2003. Disponível em:

<http://dublincore.org/documents/2003/02/04/dces/>. Acesso em: 23 mai. 2003.

Page 44: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

44

[DCMI, 2003b] Dublin Core Metadata Initiative. DCMI Type Vocabulary. Publicado em: 12

fev. 2003. Disponível em: <http://dublincore.org/documents/2003/02/12/dcmi-type-

vocabulary/>. Acesso em: 23 mai. 20003.

[DCMI, 2003c] Dublin Core Metadata Initiative. DCMI Metadata Terms. Publicado em: 4

mar. 2003. Disponível em: <http://dublincore.org/documents/2003/03/04/dcmi-terms/>.

Acesso em: 23 mai. 2003.

[Deitel, 2001] DEITEL, Harvey M.; DEITEL, Paul J. Java - Como Programar. 3. ed. Porto

Alegre: Bookman, 2001.

[D-Lib, 2003] Site da D-Lib Magazine. Disponível em: <http://www.dlib.org/>. Acesso em:

23 mai. 2003.

[ILL, 2003] Site da Interlibrary Loan Application Standards Maintenance Agency.

Disponível em: <http://www.nlc-bnc.ca/iso/ill/>. Acesso em: 23 mai. 2003.

[ISO/IEC 11179, 2003] Site da ISO/IEC 11179 Information Technology. Disponível em:

<http://metadata-stds.org/11179/>. Acesso em: 23 mai. 2003.

[Katz, 2001] KATZ, Howard. A quick intro to XQuery. Publicado em: 10 mai. 2001.

Disponível em: <http://www.fatdog.com/XQuery_Intro.html>. Acesso em: 25 mai. 2003.

[Manolescu, 2000] MANOLESCU, Ioana et al. Agora: Living with XML and Relational.

In: Proceedings of the 26th VLDB Conference, 2000, Cairo. Disponível em:

<http://www.vldb.org/conf/2000/P623.pdf>. Acesso em: 23 mai. 2003.

[Manolescu, 2001] MANOLESCU, Ioana et al. Answering XML Queries over

Heterogeneous Data Sources. In: Proceedings of the 27th VLDB Conference, 2001, Roma.

Disponível em: <http://www.vldb.org/conf/2001/P241.pdf>. Acesso em: 25 mai. 2003.

Page 45: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

45

[Media, 2001] Media Types. Publicado em: 16 out. 2001. Disponível em:

<http://www.isi.edu/in-notes/iana/assignments/media-types/media-types>. Acesso em: 25

mai. 2003.

[Moeller, 2002] MOELLER, Anders; SCHWARTZBACH, Michael I. XQuery - information

extraction and transformation. In: The XML Revolution - Technologies for the future Web.

Publicado em: out. 2002. Disponível em: <http://www.brics.dk/~amoeller/XML/querying/

index.html>. Acesso em 23 mai. 2003.

[MySQL, 2003a] MySQL AB. Download Connector/J 2.0. Disponível em: <http://www.

mysql.com/downloads/api-jdbc-old.html>. Acesso em: 25 mai. 2003.

[MySQL, 2003b] MySQL AB. MySQL Reference Manual. Disponível em: <http://www.

mysql.com/doc/en/index.html>. Acesso em: 25 mai. 2003.

[Powell, 2001] POWELL, Andy; WAGNER, Harry. Namespace Policy for the Dublin Core

Metadata Initiative (DCMI). Publicado em: 26 out. 2001. Disponível em:

<http://dublincore.

org/documents/2001/10/26/dcmi-namespace/>. Acesso em: 23 mai. 2003.

[Powell, 2002] POWELL, Andy; JOHNSTON, Pete. Guidelines for implementing Dublin

Core in XML. Publicado em: 9 set. 2002. Disponível em: <http://www.dublincore.org/

documents/2002/09/09/dc-xml-guidelines/>. Acesso em: 23 mai. 2003.

[Pulliam, 1996] PULLIAM, Donnie et al. Digital Libraries - A Technology Assessment by

Benjamin Franklin Scholars. In: The Benjamin Franklin Capstone Course (E 497S),

Raleigh: North Carolina State University, 1996. Disponível em:

<http://www4.ncsu.edu/~jherkert/

dlta.html>. Acesso em: 23 mai. 2003.

Page 46: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

46

[Rainbow, 2003] Site do Rainbow - XQuery Processing System Using Relational

Technology. Disponível em: <http://davis.wpi.edu/dsrg/rainbow/index.htm>. Acesso em: 25

mai. 2003.

[SAX, 2003] Site do SAX Project. Disponível em: <http://www.saxproject.org/>. Acesso

em: 23 mai. 2003.

[SDLP, 2003] Site do Stanford Digital Libraries Project. Disponível em: <http://www-

diglib.stanford.edu/diglib/>. Acesso em: 23 mai. 2003.

[SIDIE, 2003] Site do Projeto SIDIE – Sistema de Disponibilização de Informações para

o Ensino. Disponível em: <http://www.sidie.nurcad.ufsc.br/>. Acesso em: 4 jul. 2003.

[Sun, 2002a] Sun Microsystems. Class PrintWriter - java.io. In: Java 2 Platform, Standard

Edition, v1.4.1 API Specification. Publicado em: 2002. Disponível em:

<http://java.sun.com/j2se/1.4.1/docs/api/java/io/PrintWriter.html>. Acesso em: 25 mai. 2003.

[Sun, 2002b] Sun Microsystems. Class XmlDocument - com.sun.xml.tree. In: Java 2

Platform, Standard Edition, v1.4.1 API Specification. Publicado em: 2002. Disponível em:

<http://java.sun.com/xml/jaxp/dist/1.0.1/docs/api/internal/com/sun/xml/tree/XmlDocument.

html>. Acesso em: 25 mai. 2003.

[Sun, 2002c] Sun Microsystems. Generating XML from an Arbitrary Data Structure. In:

The Java Webservices Tutorial. Publicado em: 7 ago. 2002. Disponível em:

<http://java.sun.com/webservices/docs/1.0/tutorial/doc/JAXPXSLT6.html>. Acesso em: 25

mai. 2003.

[Sun, 2002d] Sun Microsystems. Interface Document - org.w3c.dom. In: Java 2 Platform,

Standard Edition, v1.4.1 API Specification. Publicado em: 2002. Disponível em:

<http://java.sun.com/j2se/1.4.1/docs/api/org/w3c/dom/Document.html>. Acesso em: 25 mai.

2003.

Page 47: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

47

[Sun, 2002e] Sun Microsystems. Interface ResultSet - java.sql. In: Java 2 Platform,

Standard Edition, v1.4.1 API Specification. Publicado em: 2002. Disponível em:

<http://java.sun.com/j2se/1.4.1/docs/api/java/sql/ResultSet.html>. Acesso em: 25 mai. 2003.

[Sun, 2002f] Sun Microsystems. Interface ResultSetMetaData - java.sql. In: Java 2

Platform, Standard Edition, v1.4.1 API Specification. Publicado em: 2002. Disponível em:

<http://java.sun.com/j2se/1.4.1/docs/api/java/sql/ResultSetMetaData.html>. Acesso em: 25

mai. 2003.

[Sun, 2002g] Sun Mycrosystems. Reading XML Data into a DOM. In: The Java

Webservices Tutorial. Publicado em: 7 ago. 2002. Disponível em: <http://java.sun.com/

webservices/docs/1.0/tutorial/doc/JAXPDOM3.html>. Acesso em: 23 mai. 2003.

[Sun, 2003a] Sun Microsystems. Use of ResultSet.getXXX: Table-Free Versions. In: The

Java Tutorial. Publicado em: 2003. Disponível em: <http://java.sun.com/docs/books/tutorial/

jdbc/basics/_retrievingTable.html>. Acesso em: 25 mai. 2003.

[Sun, 2003b] Sun Microsystems. The JDBC API Universal Data Access for the Enterprise.

Publicado em: 12 abr. 2003. Disponível em: <

http://java.sun.com/products/jdbc/overview.html >. Acesso em: 25 mai. 2003.

[W3 Schools, 2003] Site da W3 Schools Online Web Tutorials. Disponível em:

<http://www.w3schools.com/>. Acesso em: 25 mai. 2003.

[XEAR, 2002] Site do XEAR - The XML To SQL Translation System. Disponível em:

<http://davis.wpi.edu/dsrg/WEB_DB/XQuery/>. Acesso em: 25 mai. 2003.

[XML, 2000] W3C XML Core Working Group (WG). Extensible Markup Language

(XML) 1.0 (Second Edition). Publicado em: 6 out. 2000. Disponível em:

<http://www.w3.org/TR/REC-xml/>. Acesso em: 23 mai. 2003.

Page 48: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

48

[XQuery, 2001] W3C XML Query Working Group. XQuery: A Query Language for XML.

Publicado em 15 fev. 2001. Disponível em: <http://www.w3.org/TR/2001/WD-xquery-

20010215/>. Acesso em: 23 mai. 2003.

[XQuery, 2002a] W3C XML Query Working Group. XQuery Grammar. Publicado em: nov.

2002. Disponível em: <http://www.w3.org/2002/11/xquery-xpath-applets/xquery-bnf.html>.

Acesso em: 25 mai. 2003.

[XQuery, 2002b] W3C XML Query Working Group. XML Query Use Cases. Publicado em

15 nov. 2002. Disponível em: <http://www.w3.org/TR/2002/WD-xmlquery-use-cases-

20021115/>. Acesso em: 23 mai. 2003.

[XQuery, 2003] W3C XML Query Working Group. XQuery 1.0: An XML Query

Language. Publicado em 2 mai. 2003. Disponível em: <http://www.w3.org/TR/2003/WD-

xquery-20030502/>. Acesso em: 23 mai. 2003.

[Z39.50 MA, 2003] Site da Z39.50 Maintenance Agency. Disponível em:

<http://www.loc.gov/z3950/agency/>. Acesso em: 23 mai. 2003.

Page 49: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

49

Anexos

Anexo 1 : Código-fonte do software - arquivo “SQLXML.java”

/* Versão JDBC/MySQL */

import java.sql.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;import javax.xml.parsers.*;import java.io.*;

public class SQLXML extends JFrame{ private JTextArea inputXQuery; private JComboBox exemplosXQuery; private JButton submitXQuery, traducaoDCLocal, traducaoLocalDC, sair; private JScrollPane sp; private String ex[] = {"Exemplo 1","Exemplo 2","Exemplo 3","Exemplo 4",

"Exemplo 5","Exemplo 6"}; private XMLResult resposta; private DCLocal configDCLocal; private LocalDC configLocalDC; private String consultaXQuery, consultaSQL, resultadoDC; private Connection connection; private Statement statement; private ResultSet resultSet; private ResultSetMetaData rsmd; private JTable table; private String bdbuDC[][] = new String[15][6]; private String ident[], local[], dc[]; private int sizeDC;final int Title = 0, Creator = 1, Subject = 2, Description = 3, Publisher = 4, Contributor = 5, Date = 6, Type = 7, Format = 8, Identifier = 9, Source = 10, Language = 11, Relation = 12, Coverage = 13, Rights = 14; final String stringsDC[] = {"title", "creator", "subject", "description",

"publisher", "contributor", "date", "type", "format", "identifier", "source", "language", "relation", "coverage", "rights"};

/* Tabelas do BD bdbu */final int animacao = 0, audio = 1, bdmm = 2, imagem = 3, texto = 4, video = 5;final String stringsBD[] = {"animacao","audio","bdmm","imagem","texto","video"};final String xq[] =

{"FOR $a IN document(\"texto.xml\")/metadata/record\n" + "WHERE $a/dc:language = pt\n" + "ORDER BY $a/dc:language\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "ORDER BY $a/dc:language\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "WHERE $a/dc:format = text/html\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "WHERE $a/dc:language = pt\n" + "RETURN\n" + " <metadata>\n { $a }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "RETURN\n" + " <metadata>\n { $a }\n </metadata>"};final String identDC[] = {"Title", "Creator", "Subject", "Description",

"Publisher", "Contributor", "Date", "Type", "Format", "Identifier", "Source", "Language", "Relation","Coverage", "Rights"};

public SQLXML() {

super("SQLXML v1.4");String url = "jdbc:mysql://localhost/bdbu";

Page 50: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

50

String username = "root";String password = "senha";try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection(url, username, assword);}catch (ClassNotFoundException cnfex) {

System.err.println("Falha ao carregar driver JDBC/MySQL.");cnfex.printStackTrace();System.exit(1);}

catch (SQLException sqlex) {System.err.println("Impossível conectar");sqlex.printStackTrace();System.exit(1);}

inputXQuery = new JTextArea(xq[0],15,30);exemplosXQuery = new JComboBox(ex);exemplosXQuery.setMaximumRowCount(6);submitXQuery = new JButton("Consulta XQuery");traducaoDCLocal = new JButton("Tradução DC para BD local");traducaoLocalDC = new JButton("Tradução BD Local para DC");sair = new JButton("Sair");resposta = new XMLResult();configDCLocal = new DCLocal();configLocalDC = new LocalDC();exemplosXQuery.addItemListener(

new ItemListener() {public void itemStateChanged(ItemEvent e) {inputXQuery.setText(xq[exemplosXQuery.getSelectedIndex()]);}

});submitXQuery.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

setBD_DC();setElements();consultaXQuery = inputXQuery.getText();consultaSQL = converterXQuerySQL(consultaXQuery);getTable();try {

resultadoDC = DC_Output();resposta.showResult(resultadoDC,consultaSQL);

}catch (NullPointerException ex) {

ex.printStackTrace();JOptionPane.showMessageDialog(null,"ResultSet não

possui registros");setTitle("Sem registros para exibir");

}}

});traducaoDCLocal.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

configDCLocal.show();}

});traducaoLocalDC.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

configLocalDC.show();}

});sair.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

shutDown();System.exit(0);

}}

);JPanel topPanel = new JPanel();

Page 51: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

51

topPanel.setLayout(new BorderLayout());topPanel.add(new JScrollPane(inputXQuery),BorderLayout.NORTH);topPanel.add(exemplosXQuery,BorderLayout.CENTER);topPanel.add(submitXQuery,BorderLayout.SOUTH);JPanel midPanel = new JPanel();midPanel.setLayout(new BorderLayout());midPanel.add(traducaoDCLocal,BorderLayout.NORTH);midPanel.add(traducaoLocalDC,BorderLayout.CENTER);midPanel.add(sair,BorderLayout.SOUTH);Container c = getContentPane();c.setLayout(new BorderLayout());c.add(topPanel,BorderLayout.NORTH);c.add(midPanel, BorderLayout.CENTER);setSize(500,415);show();

}

public void setElements() {

int aux = 0, i, inicio, fim;try {

RandomAccessFile r = new RandomAccessFile("elements.txt","r");String linha = "", texto = "";while ((linha = r.readLine()) != null)

texto += linha;r.close();linha = texto;while (linha.indexOf(",") != -1){

linha = linha.substring(linha.indexOf(",") + 1);aux++;

}ident = new String[aux];local = new String[aux];dc = new String[aux];for (i = 0; i < aux; i++){

inicio = texto.indexOf("(") + 1;fim = texto.indexOf(",");ident[i] = texto.substring(inicio,fim);inicio = texto.indexOf(",") + 1;fim = texto.indexOf("-");local[i] = texto.substring(inicio,fim);inicio = texto.indexOf("\"") + 1;fim = texto.indexOf("\"",inicio);dc[i] = texto.substring(inicio,fim);if (texto.indexOf("(",fim) != -1)texto = texto.substring(texto.indexOf("(",fim));

}sizeDC = aux;

}catch (FileNotFoundException f) {

f.printStackTrace();}catch (IOException io) {

io.printStackTrace();}

}

public String converterXQuerySQL(String s) {

String variavel = s.substring(s.indexOf("$") + 1, s.indexOf("$") + 2);String listaTabelas = s.substring(s.indexOf("(\"") + 2, s.indexOf("\")"));listaTabelas = listaTabelas.substring(0,listaTabelas.indexOf(".xml"));String listaAtributos = s.substring(s.indexOf(">") + 1,s.indexOf("</"));String resposta = "SELECT ";if (listaAtributos.indexOf("/") != -1){

while (listaAtributos.indexOf("/") != -1){

listaAtributos = listaAtributos.substring(listaAtributos.indexOf(":") + 1);String atr = listaAtributos.substring(0,listaAtributos.indexOf(" "));listaAtributos = listaAtributos.substring(listaAtributos.indexOf("}"));atr = getMetaData(atr, listaTabelas);resposta = resposta + atr;if (listaAtributos.indexOf("/") != -1){

resposta = resposta + ",";

Page 52: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

52

}else{

resposta = resposta + " ";}

}}else{

resposta = resposta + "* ";}resposta = resposta + "FROM " + listaTabelas;if (s.indexOf("WHERE") != -1){

int aux = s.indexOf("/",s.indexOf("WHERE"));String condicaoWhere = "";if (s.indexOf("ORDER BY") != -1){

condicaoWhere = s.substring(aux + 1, s.indexOf("ORDER") - 1);}else{

condicaoWhere = s.substring(aux + 1, s.indexOf("RETURN") - 1);}condicaoWhere = condicaoWhere.substring(condicaoWhere.indexOf(":") +

1);String md = condicaoWhere.substring(0, condicaoWhere.indexOf(" "));md = getMetaData(md, listaTabelas);String exp = condicaoWhere.substring(condicaoWhere.lastIndexOf(" ") +

1);String sinal = condicaoWhere.substring(condicaoWhere.indexOf(" ") +

1,condicaoWhere.lastIndexOf(" "));if (md.equals("idioma") || md.equals("tipo")){ for (int i = 0; i < sizeDC; i++) if (exp.equals(dc[i])) { try { String query = "SELECT codigo FROM " + md +

" WHERE descr = \"" + local[i] + "\""; Statement st = connection.createStatement();ResultSet r = st.executeQuery(query);r.next();exp = r.getString(1);

} catch (SQLException sqlex) {

sqlex.printStackTrace(); } break; }}resposta = resposta + " WHERE " + md + " " + sinal + " " + exp;

}if (s.indexOf("ORDER BY") != -1){ String exp2 = s.substring(s.indexOf("ORDER BY"),s.indexOf("RETURN") - 1); exp2 = exp2.substring(exp2.indexOf(":") + 1); String md2 = getMetaData(exp2, listaTabelas); resposta = resposta + " ORDER BY " + md2;}return resposta;

}

public void getTable(){

try {statement = connection.createStatement();resultSet = statement.executeQuery(consultaSQL);displayResultSet(resultSet);

}catch (SQLException sqlex) {

sqlex.printStackTrace();}

}

private void displayResultSet(ResultSet rs)throws SQLException{

boolean moreRecords = rs.next();if (!moreRecords) {

JOptionPane.showMessageDialog(this,

Page 53: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

53

"ResultSet não possui registros");setTitle("Sem registros para exibir");return;

}Vector columnHeads = new Vector(), rows = new Vector();try {

rsmd = rs.getMetaData();for (int i = 1; i <= rsmd.getColumnCount(); ++i)

columnHeads.addElement(rsmd.getColumnName(i));do {

rows.addElement(getNextRow(rs, rsmd));} while (rs.next());table = new JTable(rows, columnHeads);

}catch (SQLException sqlex) {

sqlex.printStackTrace();}

}

private Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd)throws SQLException{

Vector currentRow = new Vector();for (int i = 1; i <= rsmd.getColumnCount(); ++i)

switch (rsmd.getColumnType(i)) {case Types.CHAR:case Types.VARCHAR:case Types.LONGVARCHAR:

currentRow.addElement(rs.getString(i));break;

case Types.INTEGER:case Types.TINYINT:case Types.DOUBLE:

currentRow.addElement(new Long(rs.getLong(i)));break;

case Types.DATE:currentRow.addElement(rs.getDate(i));break;

default:System.out.println("Tipo: " +

rsmd.getColumnTypeName(i));}

return currentRow;}

public void shutDown(){

try {connection.close();

}catch (SQLException sqlex) {

System.err.println("Impossível desconectar");sqlex.printStackTrace();

}}

public String DC_Output(){

int numRows = table.getRowCount();int numCols = table.getColumnCount();String tag = "", output = "<?xml version=\"1.0\"?>" + "\n", aux = "";output += "<metadata>" + "\n";try { for (int i = 0; i < numRows; i++) { output += " " + "<record>" + "\n"; for (int j = 0; j < numCols; j++) { tag = getTagDC(table.getColumnName(j),rsmd.getTableName(j+1)); if (tag != "") { output += " " + "<dc:" + tag + ">"; if (tag.equals("format") || tag.equals("language")) { aux = getRef((table.getValueAt(i, j)).toString(), tag); for (int k = 0; k < sizeDC; k++) if (aux.equals(local[k])) { output += dc[k]; break; }

Page 54: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

54

} else

output += table.getValueAt(i, j); output += "</dc:" + tag + ">" + "\n";

} } output += " " + "</record>" + "\n"; }} catch (SQLException sqlex) {

sqlex.printStackTrace();}output += "</metadata>";return output;

}

public String getMetaData(String dc, String tableName){

int linha = 0, coluna = 0;for (int i = 0; i < 15; i++)

if (dc.equals(stringsDC[i])){

linha = i;break;

}for (int j = 0; j < 15; j++)

if (tableName.equals(stringsBD[j])){

coluna = j;break;

}return bdbuDC[linha][coluna];

}

public String getTagDC(String colName, String tableName){

String resposta = "";int col = 0;for (int j = 0; j < 6; j++)

if (tableName.equals(stringsBD[j])){

col = j;break;

}for (int i = 0; i < 15; i++)

if (colName.equals(bdbuDC[i][col])){

resposta = stringsDC[i];break;

}return resposta;

}

public String getRef(String codigo, String tag){

String tipo = "", col = "", table = "";if (tag.equals("format")){

col = "extensao";table = "tipo";

}else{

col = "descr";table = "idioma";

}String query = "SELECT " + col + " FROM " + table + " WHERE codigo =

" + codigo;try {

Statement st = connection.createStatement();ResultSet result = st.executeQuery(query);result.next();tipo = result.getString(1);

}catch (SQLException sqlex) {

sqlex.printStackTrace();}return tipo;

}

public void setBD_DC(){

Page 55: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

55

/* Elementos DC para o BD bdbu */try {

RandomAccessFile r = new RandomAccessFile("bdbu.txt","r");String linha = "", texto = "";int aux, i, j;while ((linha = r.readLine()) != null)

texto += linha;r.close();for (j = 0; j < 6; j++){

for (i = 0; i < 15; i++){ aux = texto.indexOf("-",texto.indexOf(identDC[i] + "," + stringsBD[j])) + 1; bdbuDC[i][j] = texto.substring(aux + 1, texto.indexOf(")",aux) - 1);}

}}catch (FileNotFoundException f) {

f.printStackTrace();}catch (IOException io) {

io.printStackTrace();}

}

public static void main(String args[]){

final SQLXML app = new SQLXML();app.addWindowListener(

new WindowAdapter() {public void windowClosing(WindowEvent e){

app.shutDown();System.exit(0);

}}

);}

}

class XMLResult extends JFrame{

private JTextArea result;private JButton detalhes, voltar;private SQLResult SQL;private String sqlQuery;

public XMLResult(){

super("Resultado XML");result = new JTextArea("",20,30);detalhes = new JButton("Detalhes - Consulta SQL");voltar = new JButton("Voltar");SQL = new SQLResult();detalhes.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

SQL.showResult(sqlQuery);}

});voltar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dispose();}

});JPanel topPanel = new JPanel();topPanel.setLayout(new BorderLayout());topPanel.add(new JScrollPane(result),BorderLayout.NORTH);topPanel.add(detalhes,BorderLayout.CENTER);topPanel.add(voltar,BorderLayout.SOUTH);Container c = getContentPane();c.setLayout(new BorderLayout());c.add(topPanel,BorderLayout.NORTH);setSize(500,425);

Page 56: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

56

}

public void showResult(String DC, String SQL){

result.setText(DC);sqlQuery = SQL;show();

}}

class SQLResult extends JFrame{

private JTextArea result;private JButton voltar;

public SQLResult(){

super("Consulta SQL equivalente a consulta XQuery");result = new JTextArea("",10,30);voltar = new JButton("Voltar");voltar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dispose();}

});JPanel topPanel = new JPanel();topPanel.setLayout(new BorderLayout());topPanel.add(new JScrollPane(result),BorderLayout.NORTH);topPanel.add(voltar,BorderLayout.CENTER);Container c = getContentPane();c.setLayout(new BorderLayout());c.add(topPanel,BorderLayout.NORTH);setSize(500,238);

}

public void showResult(String resultado){

result.setText(resultado);show();

}}

class DCLocal extends JFrame{

private JButton animacao, audio, bdmm, imagem, texto, video, cancelar;private DCMetadata dcmd;

public DCLocal(){

super("Tradução de Dublin Core para Metadados Locais");animacao = new JButton("Tabela animacao");audio = new JButton("Tabela audio");bdmm = new JButton("Tabela bdmm");imagem = new JButton("Tabela imagem");texto = new JButton("Tabela texto");video = new JButton("Tabela video");cancelar = new JButton("Cancelar");animacao.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dcmd = new DCMetadata("animacao");}

});audio.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dcmd = new DCMetadata("audio");}

});bdmm.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

Page 57: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

57

dcmd = new DCMetadata("bdmm");}

});imagem.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dcmd = new DCMetadata("imagem");}

});texto.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dcmd = new DCMetadata("texto");}

});video.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dcmd = new DCMetadata("video");}

});cancelar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dispose();}

});Container c = getContentPane();c.setLayout(new GridLayout(7,1));c.add(animacao);c.add(audio);c.add(bdmm);c.add(imagem);c.add(texto);c.add(video);c.add(cancelar);setSize(500,300);

}}

class DCMetadata extends JFrame{

private JLabel jl[];private JTextField tf[];private JButton voltar, salvar;private String tab;final String identDC[] = {"Title", "Creator", "Subject", "Description",

"Publisher", "Contributor", "Date", "Type", "Format", "Identifier", "Source", "Language", "Relation","Coverage", "Rights"};

public DCMetadata(String tabela){

super("Metadados Dublin Core para a tabela " + tabela);jl = new JLabel[15];tf = new JTextField[15];int i;for (i = 0; i < 15; i++){

jl[i] = new JLabel(identDC[i]);tf[i] = new JTextField(10);

}voltar = new JButton("Voltar");salvar = new JButton("Salvar alterações");

tab = tabela;

try {RandomAccessFile r = new RandomAccessFile("bdbu.txt","r");String linha = "", texto = "";while ((linha = r.readLine()) != null)

texto += linha;r.close();

Page 58: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

58

int aux;for (i = 0; i < 15; i++){ aux = texto.indexOf("-",texto.indexOf(identDC[i] + ","+ tabela)) +

1; tf[i].setText(texto.substring(aux + 1, texto.indexOf(")",aux) –

1));}}catch (FileNotFoundException f) {

f.printStackTrace();}catch (IOException io) {

io.printStackTrace();}voltar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dispose();}

});salvar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

salvarAlteracoes(tab);}

});Container c = getContentPane();c.setLayout(new GridLayout(16,16));for (i = 0; i < 15; i++){

c.add(jl[i]);c.add(tf[i]);

}c.add(voltar); c.add(salvar);setSize(500,500);show();

}

public void salvarAlteracoes(String tabela){

try {RandomAccessFile r = new RandomAccessFile("bdbu.txt","r");String linha = "", texto = "";while ((linha = r.readLine()) != null)

texto += linha;r.close();File f = new File("bdbu.txt");f.delete();int i, aux1, aux2;for (i = 0; i < 15; i++){ aux1 = texto.indexOf("\"",texto.indexOf(identDC[i] + "," +

tabela)); aux2 = texto.indexOf("\"",aux1 + 1); texto = texto.substring(0,aux1 + 1) + tf[i].getText() +

texto.substring(aux2);}

RandomAccessFile output = new RandomAccessFile("bdbu.txt","rw");output.writeBytes(texto);output.close();JOptionPane.showMessageDialog(null,"Alterações salvas com sucesso");

}catch (FileNotFoundException f) {

f.printStackTrace();}catch (IOException io) {

io.printStackTrace();}

}}

class LocalDC extends JFrame{

private JButton language, type, format, cancelar;

Page 59: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

59

private LocalMetadata lmd;

public LocalDC(){

super("Tradução de Metadados Locais para Dublin Core");language = new JButton("Language");type = new JButton("Type");format = new JButton("Format");cancelar = new JButton("Cancelar");language.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

lmd = new LocalMetadata("Language");}

});type.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

lmd = new LocalMetadata("Type");}

});format.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

lmd = new LocalMetadata("Format");}

});cancelar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dispose();}

});Container c = getContentPane();c.setLayout(new GridLayout(4,1));c.add(language);c.add(type);c.add(format);c.add(cancelar);setSize(500,300);

}}

class LocalMetadata extends JFrame{

private JLabel jl[];private JTextField tf[];private JButton voltar, salvar;private String elm;

public LocalMetadata(String element){

super("Tradução de Metadados locais para o elemento " + element);int aux = 0, i, inicio, fim;try {

RandomAccessFile r = new RandomAccessFile("elements.txt","r");String linha = "", texto = "";while ((linha = r.readLine()) != null)

texto += linha;r.close();linha = texto;while (linha.indexOf(element + ",") != -1){ aux++; linha = linha.substring(linha.indexOf(element + ",") + 1);}jl = new JLabel[aux];tf = new JTextField[aux];i = 0;while (texto.indexOf(element) != -1){

inicio = texto.indexOf(element + ",");inicio = texto.indexOf(",",inicio) + 1;

Page 60: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

60

fim = texto.indexOf("-",inicio);jl[i] = new JLabel(texto.substring(inicio,fim));tf[i] = new JTextField(10);inicio = texto.indexOf("\"",inicio) + 1;fim = texto.indexOf("\"",inicio);tf[i].setText(texto.substring(inicio,fim));texto = texto.substring(fim);i++;

}}catch (FileNotFoundException f) {

f.printStackTrace();}catch (IOException io) {

io.printStackTrace();}voltar = new JButton("Voltar"); salvar = new JButton("Salvar

alterações");elm = element;voltar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

dispose();}

});salvar.addActionListener(

new ActionListener() {public void actionPerformed(ActionEvent e){

salvarAlteracoes(elm);}

});Container c = getContentPane();c.setLayout(new GridLayout(aux + 1,aux + 1));for (i = 0; i < aux; i++){

c.add(jl[i]);c.add(tf[i]);

}c.add(voltar); c.add(salvar);setSize(500,500);show();

}

public void salvarAlteracoes(String elemento){

try {RandomAccessFile r = new RandomAccessFile("elements.txt","r");String linha = "", texto = "";while ((linha = r.readLine()) != null)

texto += linha;r.close();File f = new File("elements.txt");f.delete();int i, aux1, aux2;for (i = 0; i < jl.length; i++){

aux1 = texto.indexOf("\"",texto.indexOf(elemento + "," + jl[i].getText()));

aux2 = texto.indexOf("\"",aux1 + 1);texto = texto.substring(0,aux1 + 1) + tf[i].getText() +

texto.substring(aux2);}RandomAccessFile output = new RandomAccessFile

("elements.txt","rw");output.writeBytes(texto);output.close();JOptionPane.showMessageDialog(null,"Alterações salvas com

sucesso");}catch (FileNotFoundException f) {

f.printStackTrace();}catch (IOException io) {

io.printStackTrace();}

}}

Page 61: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

61

Anexo 2 : Dados de configuração do software/servlet – Arquivo “bdbu.txt”

(Title,animacao-"titulo");(Creator,animacao-"autor");(Subject,animacao-"");(Description,animacao-"descr");(Publisher,animacao-"editora");(Contributor,animacao-"");(Date,animacao-"datag");(Type,animacao-"");(Format,animacao-"tipo");(Identifier,animacao-"url");(Source,animacao-"fonte");(Language,animacao-"idioma");(Relation,animacao-"relacao");(Coverage,animacao-"");(Rights,animacao-"direitos");

(Title,audio-"titulo");(Creator,audio-"autor");(Subject,audio-"");(Description,audio-"descr");(Publisher,audio-"editora");(Contributor,audio-"");(Date,audio-"datag");(Type,audio-"");(Format,audio-"tipo");(Identifier,audio-"url");(Source,audio-"fonte");(Language,audio-"idioma");(Relation,audio-"relacao");(Coverage,audio-"");(Rights,audio-"direitos");

(Title,bdmm-"nome");(Creator,bdmm-"");(Subject,bdmm-"");(Description,bdmm-"");(Publisher,bdmm-"");(Contributor,bdmm-"");(Date,bdmm-"");(Type,bdmm-"");(Format,bdmm-"");(Identifier,bdmm-"URL");(Source,bdmm-"");(Language,bdmm-"");(Relation,bdmm-"");(Coverage,bdmm-"");(Rights,bdmm-"");

(Title,imagem-"titulo");(Creator,imagem-"autor");(Subject,imagem-"");(Description,imagem-"descr");(Publisher,imagem-"editora");(Contributor,imagem-"");(Date,imagem-"datag");(Type,imagem-"");(Format,imagem-"tipo");(Identifier,imagem-"url");(Source,imagem-"fonte");(Language,imagem-"");(Relation,imagem-"relacao");(Coverage,imagem-"");(Rights,imagem-"direitos");

(Title,texto-"titulo");(Creator,texto-"autor");(Subject,texto-"");(Description,texto-"descr");(Publisher,texto-"editora");(Contributor,texto-"");(Date,texto-"datag");(Type,texto-"");(Format,texto-"tipo");

Page 62: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

62

(Identifier,texto-"url");(Source,texto-"fonte");(Language,texto-"idioma");(Relation,texto-"relacao");(Coverage,texto-"");(Rights,texto-"direitos");

(Title,video-"titulo");(Creator,video-"autor");(Subject,video-"");(Description,video-"descr");(Publisher,video-"editora");(Contributor,video-"");(Date,video-"datag");(Type,video-"");(Format,video-"tipo");(Identifier,video-"url");(Source,video-"fonte");(Language,video-"idioma");(Relation,video-"relacao");(Coverage,video-"");(Rights,video-"direitos");

Anexo 3 : Dados de configuração do software/servlet – Arquivo “elements.txt”

(Format,mpeg-"video/mpeg");(Format,mp3-"audio/mp3");(Format,gif-"image/gif");(Format,jpg-"image/jpg");(Format,txt-"text/plain");(Format,doc-"application/msword");(Format,mov-"video/mov");(Format,wav-"audio/wav");(Format,rm-"application/rm");(Format,bmp-"image/bmp");(Format,avi-"video/avi");(Format,swf-"application/swf");(Format,pdf-"application/pdf");(Format,html-"text/html");(Format,htm-"text/htm");(Format,mpg-"video/mpg");

(Language,Português-"pt");(Language,Inglês-"en");(Language,Espanhol-"es");(Language,Francês-"fr");(Language,Alemão-"de");(Language,Italiano-"it");

(Type,animacao-"image");(Type,audio-"sound");(Type,imagem-"image");(Type,texto-"text");(Type,video-"image");

Anexo 4 : Código-fonte do servlet – Arquivo “ServletXQuery.java”

/* Servlet para consulta XQuery *//* Os arquivos *.txt lidos pelo Servlet devem estar no diretório de instalação do JSDK (jsdk2.1) */

import java.sql.*;import javax.swing.*;import java.util.*;import javax.xml.parsers.*;import java.io.*;import javax.servlet.*;

Page 63: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

63

import javax.servlet.http.*;

public class ServletXQuery extends HttpServlet{

private String ex[] = {"Exemplo 1","Exemplo 2","Exemplo 3","Exemplo 4", "Exemplo 5","Exemplo 6"};

private String consultaSQL, resultadoDC;private Connection connection;private Statement statement;private ResultSet resultSet;private ResultSetMetaData rsmd;private JTable table;private String bdbuDC[][] = new String[15][6];private String ident[], local[], dc[];private int sizeDC;private boolean resultXML;

final int Title = 0, Creator = 1, Subject = 2, Description = 3, Publisher = 4, Contributor = 5, Date = 6, Type = 7, Format = 8, Identifier = 9, Source = 10, Language = 11, Relation = 12, Coverage = 13, Rights = 14;

final String stringsDC[] = {"title", "creator", "subject", "description", "publisher", "contributor", "date", "type", "format", "identifier", "source", "language", "relation", "coverage", "rights"};

/* Tabelas do BD bdbu */final int animacao = 0, audio = 1, bdmm = 2, imagem = 3, texto = 4, video = 5;final String stringsBD[] = {"animacao","audio","bdmm","imagem","texto","video"};final String xq[] ={"FOR $a IN document(\"texto.xml\")/metadata/record\n" + "WHERE $a/dc:language = pt\n" + "ORDER BY $a/dc:language\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "ORDER BY $a/dc:language\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "WHERE $a/dc:format = text/html\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "RETURN\n" + " <metadata>\n { $a/dc:title }\n { $a/dc:creator }\n" + " { $a/dc:publisher }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "WHERE $a/dc:language = pt\n" + "RETURN\n" + " <metadata>\n { $a }\n </metadata>", "FOR $a IN document(\"texto.xml\")/metadata/record\n" + "RETURN\n" + " <metadata>\n { $a }\n </metadata>"};final String identDC[] = {"Title", "Creator", "Subject", "Description",

"Publisher", "Contributor", "Date", "Type", "Format", "Identifier", "Source", "Language", "Relation","Coverage", "Rights"};

public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException{

String texto = req.getParameter("texto");PrintWriter output = res.getWriter();res.setContentType("text/html");String url = "jdbc:mysql://localhost/bdbu";String username = "root";String password = "senha";try {

Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection(url, username, password);

}catch (ClassNotFoundException cnfex) {

System.err.println("Falha ao carregar driver JDBC/MySQL.");cnfex.printStackTrace();System.exit(1);

}catch (SQLException sqlex) {

System.err.println("Impossível conectar");sqlex.printStackTrace();System.exit(1);

}resultXML = true;setBD_DC();

Page 64: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

64

setElements();consultaSQL = converterXQuerySQL(texto);getTable();try {

resultadoDC = DC_Output();}catch (NullPointerException ex) {

ex.printStackTrace();System.out.println("ResultSet não possui registros");resultXML = false;

}output.println("<html>");output.println("<head>");output.println("<title>Resultados da Consulta</title>");output.println("</head>");output.println("<body>");output.println("<p><b>XML gerado a partir da consulta :</b></p>");if (!resultXML){

output.println("<p>A consulta não retornou registros</p>");}else{

output.println("<textarea name = \"xml\" cols = \"60\" rows = \"15\">");output.println(resultadoDC);output.println("</textarea>");

}output.println("<p><b>Consulta SQL equivalente à consulta XQuery :</b></p>");output.println("<textarea name = \"sql\" cols = \"60\" rows = \"5\">");output.println(consultaSQL);output.println("</textarea>");output.println("<p><a href = \"file:///C:/ProjGuil/jsdk2.1/webpages/WEB-

INF/servlets/consulta.html\">Voltar</a></p>");output.println("</body>");output.println("</html>");output.close();destroy();

}public void setElements(){

int aux = 0, i, inicio, fim;try {

RandomAccessFile r = new RandomAccessFile("elements.txt","r");String linha = "", texto = "";while ((linha = r.readLine()) != null)

texto += linha;r.close();

linha = texto;

while (linha.indexOf(",") != -1){

linha = linha.substring(linha.indexOf(",") + 1);aux++;

}

ident = new String[aux];local = new String[aux];dc = new String[aux];

for (i = 0; i < aux; i++){

inicio = texto.indexOf("(") + 1;fim = texto.indexOf(",");ident[i] = texto.substring(inicio,fim);

inicio = texto.indexOf(",") + 1;fim = texto.indexOf("-");local[i] = texto.substring(inicio,fim);

inicio = texto.indexOf("\"") + 1;fim = texto.indexOf("\"",inicio);dc[i] = texto.substring(inicio,fim);

if (texto.indexOf("(",fim) != -1)texto = texto.substring(texto.indexOf("(",fim));

}

sizeDC = aux;}

Page 65: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

65

catch (FileNotFoundException f) {f.printStackTrace();

}catch (IOException io) {

io.printStackTrace();}

}

public String converterXQuerySQL(String s){ String variavel = s.substring(s.indexOf("$") + 1,s.indexOf("$") + 2); String listaTabelas = s.substring(s.indexOf("(\"") + 2,s.indexOf("\")")); listaTabelas = listaTabelas.substring(0,listaTabelas.indexOf(".xml")); listaTabelas = listaTabelas.substring(listaTabelas.indexOf("\"") + 1); String listaAtributos = s.substring(s.indexOf(">") + 1,s.indexOf("</")); String resposta = "SELECT "; if (listaAtributos.indexOf("/") != -1) { while (listaAtributos.indexOf("/") != -1) { listaAtributos = listaAtributos.substring(listaAtributos.indexOf(":") + 1); String atr = listaAtributos.substring(0,listaAtributos.indexOf(" ")); listaAtributos = listaAtributos.substring(listaAtributos.indexOf("}")); atr = getMetaData(atr, listaTabelas); resposta = resposta + atr; if (listaAtributos.indexOf("/") != -1) {

resposta = resposta + ","; } else {

resposta = resposta + " "; } } } else {

resposta = resposta + "* "; } resposta = resposta + "FROM " + listaTabelas; if (s.indexOf("WHERE") != -1) {

int aux = s.indexOf("/",s.indexOf("WHERE"));String condicaoWhere = "";if (s.indexOf("ORDER BY") != -1){

condicaoWhere = s.substring(aux + 1, s.indexOf("ORDER") - 1);}else{

condicaoWhere = s.substring(aux + 1, s.indexOf("RETURN") - 1);}condicaoWhere = condicaoWhere.substring(condicaoWhere.indexOf(":") + 1);String md = condicaoWhere.substring(0, condicaoWhere.indexOf(" "));md = getMetaData(md, listaTabelas);String exp = condicaoWhere.substring(condicaoWhere.lastIndexOf(" ") + 1);if (!Character.isLetterOrDigit(exp.charAt(exp.length() - 1)))

exp = exp.substring(0,exp.length() - 1);String sinal = condicaoWhere.substring(condicaoWhere.indexOf(" ") +

1,condicaoWhere.lastIndexOf(" "));if (md.equals("idioma") || md.equals("tipo")){

for (int i = 0; i < sizeDC; i++)if (exp.equals(dc[i])){

try {String query = "SELECT codigo FROM " + md +

" WHERE descr = \"" + local[i] + "\"";Statement st = connection.createStatement();ResultSet r = st.executeQuery(query);r.next();exp = r.getString(1);

}catch (SQLException sqlex) {

sqlex.printStackTrace();}break;

}}

resposta = resposta + " WHERE " + md + " " + sinal + " " + exp;}

Page 66: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

66

if (s.indexOf("ORDER BY") != -1){ String exp2 = s.substring(s.indexOf("ORDER BY"),s.indexOf("RETURN") - 1); if (!Character.isLetterOrDigit(exp2.charAt(exp2.length() - 1)))

exp2 = exp2.substring(0,exp2.length() - 1); exp2 = exp2.substring(exp2.indexOf(":") + 1); String md2 = getMetaData(exp2, listaTabelas); resposta = resposta + " ORDER BY " + md2;}return resposta;

}

public void getTable(){

try {statement = connection.createStatement();resultSet = statement.executeQuery(consultaSQL);displayResultSet(resultSet);

}catch (SQLException sqlex) {

sqlex.printStackTrace();}

}

private void displayResultSet(ResultSet rs)throws SQLException{

boolean moreRecords = rs.next();if (!moreRecords) {

System.out.println("ResultSet não possui registros");resultXML = false;return;

}Vector columnHeads = new Vector(), rows = new Vector();try {

rsmd = rs.getMetaData();for (int i = 1; i <= rsmd.getColumnCount(); ++i)

columnHeads.addElement(rsmd.getColumnName(i));do {

rows.addElement(getNextRow(rs, rsmd));} while (rs.next());table = new JTable(rows, columnHeads);

}catch (SQLException sqlex) {

sqlex.printStackTrace();}

}

private Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd)throws SQLException{

Vector currentRow = new Vector();for (int i = 1; i <= rsmd.getColumnCount(); ++i)

switch (rsmd.getColumnType(i)) {case Types.CHAR:case Types.VARCHAR:case Types.LONGVARCHAR:

currentRow.addElement(rs.getString(i));break;

case Types.INTEGER:case Types.TINYINT:case Types.DOUBLE:

currentRow.addElement(new Long(rs.getLong(i)));break;

case Types.DATE:currentRow.addElement(rs.getDate(i));break;

default:System.out.println("Tipo: " + rsmd.getColumnTypeName(i));

}return currentRow;

}

public void destroy(){

try {connection.close();

}catch (SQLException sqlex) {

System.err.println("Impossível desconectar");sqlex.printStackTrace();

Page 67: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

67

}}

public String DC_Output(){

int numRows = table.getRowCount();int numCols = table.getColumnCount();String tag = "", output = "<?xml version=\"1.0\"?>" + "\n", aux = "";output += "<metadata>" + "\n";try { for (int i = 0; i < numRows; i++) {

output += " " + "<record>" + "\n";for (int j = 0; j < numCols; j++){

tag = getTagDC(table.getColumnName(j), rsmd.getTableName(j+1));if (tag != ""){

output += " " + "<dc:" + tag + ">";if (tag.equals("format") || tag.equals("language")){ aux = getRef((table.getValueAt(i, j)).toString(), tag); for (int k = 0; k < sizeDC; k++) if (aux.equals(local[k])) { output += dc[k]; break; }}else output += table.getValueAt(i, j);output += "</dc:" + tag + ">" + "\n";

}}output += " " + "</record>" + "\n";}

} catch (SQLException sqlex) {sqlex.printStackTrace();

}output += "</metadata>";return output;

}

public String getMetaData(String dc, String tableName){

int linha = 0, coluna = 0;for (int i = 0; i < 15; i++)

if (dc.equals(stringsDC[i])){

linha = i;break;

}for (int j = 0; j < 15; j++)

if (tableName.equals(stringsBD[j])){

coluna = j;break;

}return bdbuDC[linha][coluna];

}

public String getTagDC(String colName, String tableName){

String resposta = "";int col = 0;for (int j = 0; j < 6; j++)

if (tableName.equals(stringsBD[j])){

col = j;break;

}for (int i = 0; i < 15; i++)

if (colName.equals(bdbuDC[i][col])){

resposta = stringsDC[i];break;

}return resposta;

}

public String getRef(String codigo, String tag)

Page 68: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

68

{ String tipo = "", col = "", table = ""; if (tag.equals("format")) { col = "extensao"; table = "tipo"; } else { col = "descr"; table = "idioma"; } String query = "SELECT " + col + " FROM " + table + " WHERE codigo = " + codigo;

try {Statement st = connection.createStatement();ResultSet result = st.executeQuery(query);result.next();tipo = result.getString(1);

} catch (SQLException sqlex) {

sqlex.printStackTrace(); } return tipo;}

public void setBD_DC(){

/* Elementos DC para o BD bdbu */try { RandomAccessFile r = new RandomAccessFile("bdbu.txt","r"); String linha = "", texto = ""; int aux, i, j; while ((linha = r.readLine()) != null) texto += linha; r.close(); for (j = 0; j < 6; j++) { for (i = 0; i < 15; i++) { aux = texto.indexOf("-",texto.indexOf(identDC[i] + "," + stringsBD[j])) +

1; bdbuDC[i][j] = texto.substring(aux + 1,texto.indexOf(")",aux) - 1);

}}}catch (FileNotFoundException f) {

f.printStackTrace();}catch (IOException io) {

io.printStackTrace();}

}}

Anexo 5 : Arquivo HTML da consulta ao servlet – Arquivo “consulta.html”

<html><head><title>Consulta XQuery / Dublin Core</title></head><body><p><b>Digite a sua consulta em XQuery :</b></p><form action = "http://localhost:80/servlet/ServletXQuery" method = "POST"><textarea name = "texto" cols = "60" rows = "15">FOR $a IN document(\"texto.xml\")/metadata/recordWHERE $a/dc:language = ptORDER BY $a/dc:languageRETURN <metadata> { $a/dc:title } { $a/dc:creator } { $a/dc:publisher } </metadata></textarea><p><input type = "submit" value = "Submeter consulta"></p>

Page 69: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

69

</form></body></html>

Anexo 6 : Banco de dados da Biblioteca Digital – Arquivo “bdbu.sql”

# phpMyAdmin MySQL-Dump# http://phpwizard.net/phpMyAdmin/## Host: localhost Database : bdbu

# --------------------------------------------------------## Table structure for table 'animacao'#

CREATE TABLE animacao ( titulo varchar(80) NOT NULL, descr varchar(250) NOT NULL, objm varchar(10) NOT NULL, autor varchar(40) DEFAULT 'Desconhecido' NOT NULL, tipo char(2) DEFAULT '02', tamanho varchar(7), duracao varchar(6), qualidade varchar(10) DEFAULT '1400' NOT NULL, resolucao varchar(9) DEFAULT '352x240' NOT NULL, servidor char(3), datac date DEFAULT '2000-02-15', datag date DEFAULT '2000-02-15' NOT NULL, palavrac varchar(80), instituicao char(3) DEFAULT '004' NOT NULL, responsavel varchar(4) NOT NULL, email varchar(32), url varchar(40), idioma char(1) NOT NULL, servidor2 char(3), visitas int(11) DEFAULT '0' NOT NULL, editora varchar(30), identificador varchar(50), relacao varchar(50), direitos varchar(50), fonte varchar(80), abrangencia varchar(50), UNIQUE objm (objm));

## Dumping data for table 'animacao'## --------------------------------------------------------## Table structure for table 'audio'#

CREATE TABLE audio ( titulo varchar(80) NOT NULL, descr varchar(250) NOT NULL, objm varchar(10) NOT NULL, autor varchar(40), tipo char(2), tamanho varchar(7), duracao varchar(6), qualidade varchar(6), servidor char(3), datac date, datag date, palavrac varchar(80), instituicao char(3), responsavel varchar(4) NOT NULL, email varchar(32), url varchar(40), idioma char(1) NOT NULL, visitas int(11) DEFAULT '0' NOT NULL, editora varchar(30), identificador varchar(50), relacao varchar(50),

Page 70: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

70

direitos varchar(50), fonte varchar(80), abrangencia varchar(50), UNIQUE objm (objm));

## Dumping data for table 'audio'#

INSERT INTO audio VALUES ( 'Submarino', 'cd do John Bala Jones', '0013-00702', '', '03', '0','', '', '', '2002-08-08', '2001-01-20', 'cd do John Bala Jones', '001', '0013', 'jonas', '','0', '0', 'Som Livre', '', '', 'Reservados', '', NULL);INSERT INTO audio VALUES ( 'Submarino', 'cd do John Bala Jones', '0013-00703', '', '03','0.35', '', '', '003', '2002-08-08', '2001-01-20', 'cd do John Bala Jones', '001', '0013','jonas', '', '0', '3', 'Som Livre', '', '', 'Reservados', '', NULL);

# --------------------------------------------------------## Table structure for table 'bdmm'#

CREATE TABLE bdmm ( codigo varchar(6) NOT NULL, nome varchar(80) NOT NULL, sigla varchar(6), URL varchar(40) NOT NULL);

## Dumping data for table 'bdmm'#

INSERT INTO bdmm VALUES ( '000001', 'Biblioteca Digital Jeferson Pistori', 'BDJP','http://200.199.223.152/bdmm/');INSERT INTO bdmm VALUES ( '000003', 'Biblioteca Digital RMAV', 'BDRMAV','http://200.135.48.105/bdigital/');INSERT INTO bdmm VALUES ( '000004', 'Biblioteca Digital Montez', 'BD3M','http://200.135.48.92/bdigital/');

# --------------------------------------------------------## Table structure for table 'idioma'#

CREATE TABLE idioma ( codigo char(1) NOT NULL, descr varchar(10) NOT NULL, UNIQUE codigo (codigo));

## Dumping data for table 'idioma'#

INSERT INTO idioma VALUES ( '0', 'Português');INSERT INTO idioma VALUES ( '1', 'Inglês');INSERT INTO idioma VALUES ( '2', 'Espanhol');INSERT INTO idioma VALUES ( '3', 'Francês');INSERT INTO idioma VALUES ( '4', 'Alemão');INSERT INTO idioma VALUES ( '5', 'Italiano');

# --------------------------------------------------------## Table structure for table 'imagem'#

CREATE TABLE imagem ( titulo varchar(80) NOT NULL, descr varchar(250), objm varchar(10) NOT NULL, autor varchar(40), tipo char(2), tamanho varchar(7), resolucao varchar(9), servidor char(3), datac date, datag date, palavrac varchar(80), instituicao char(3), responsavel varchar(4) NOT NULL,

Page 71: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

71

email varchar(32), url varchar(40), visitas int(11) DEFAULT '0' NOT NULL, editora varchar(30), identificador varchar(50), relacao varchar(50), direitos varchar(50), fonte varchar(80), abrangencia varchar(50), UNIQUE objm (objm));

## Dumping data for table 'imagem'#

INSERT INTO imagem VALUES ( 'godbless', 'asdasd', '0013-00705', '', '04', '0.00', '352x240','005', '2002-08-08', '2001-01-20', 'asdasd', '001', '0013', 'jonas', '', '0', 'e', 'i', 'r','', '', '');INSERT INTO imagem VALUES ( 'Brasão da UFSC', 'arquivo de imagem GIF com o brasão da UFSC','0013-00708', '', '04', '5 KB', '95 x 61', '004', '2003-04-10', '2003-04-10', 'brasão UFSClogo', '001', '004', '', '', '0', 'UFSC', '', '', '','http://www.ufsc.br/images/brasaobaixo.gif', '');INSERT INTO imagem VALUES ( 'Estrutura da RMAV-FLN', 'arquivo de imagem GIF mostrando aestrutura da rede RMAV-FLN, com suas instituições associadas', '0013-00709', 'Equipe RMAV-FLN', '04', '22 KB', '500 x 290', '004', '2003-04-10', '2003-04-10', 'estrutura RMAV-FLNtopologia', '001', '004', '', '', '0', 'RMAV-FLN', '', '', '', 'http://www.rmav-fln.ufsc.br/imagens/mapaderede.gif', '');

# --------------------------------------------------------## Table structure for table 'instituicao'#

CREATE TABLE instituicao ( codigo char(3) NOT NULL, sigla varchar(15), descr varchar(60), UNIQUE codigo (codigo));

## Dumping data for table 'instituicao'#

INSERT INTO instituicao VALUES ( '001', 'BU', 'Biblioteca Universitária');INSERT INTO instituicao VALUES ( '002', 'NUPILL', 'Departamento de Letras');INSERT INTO instituicao VALUES ( '003', 'CFH', 'Centro de Filosofia e Ciências Humanas');INSERT INTO instituicao VALUES ( '004', 'NURCAD', 'Nurcad');

# --------------------------------------------------------## Table structure for table 'responsavel'#

CREATE TABLE responsavel ( codigo varchar(4) NOT NULL, nome varchar(40) NOT NULL, email varchar(32) NOT NULL, url varchar(40) NOT NULL, senha varchar(8) NOT NULL, login varchar(10) NOT NULL, instituicao char(3) DEFAULT '001' NOT NULL, UNIQUE codigo (codigo), KEY instituicao (instituicao));

## Dumping data for table 'responsavel'#

INSERT INTO responsavel VALUES ( '0002', 'Marcos Hideki Watanabe de Moraes','[email protected]', '', 'ÏËÏÊÇÌÉ', 'mhwm', '1');INSERT INTO responsavel VALUES ( '0005', 'jose', 'jose', 'jose', '••Œš', 'jose', '1');INSERT INTO responsavel VALUES ( '0007', 'a', 'a', 'a', '••••••••', 'a', '1');INSERT INTO responsavel VALUES ( '0008', 'a', 'dasdas', 'asdas', '•', 'd', '1');INSERT INTO responsavel VALUES ( '0004', 'sandro', '[email protected]', 'kjhgkjh', 'Œ•‘›••','sandro', '001');INSERT INTO responsavel VALUES ( '0013', 'Jonas', 'jonas', 'jonas', '••‘•Œ', 'jonas', 'CTC');INSERT INTO responsavel VALUES ( '0009', 'sad', 'dasd', 'sadasd', '•', 'a', '1');

Page 72: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

72

INSERT INTO responsavel VALUES ( '0010', 'Roberto Willrich', '[email protected]', '','•ˆ¬¶»¶º', 'willrich', '001');

# --------------------------------------------------------## Table structure for table 'servidor'#

CREATE TABLE servidor ( codigo char(3) NOT NULL, host varchar(40) NOT NULL, port varchar(4) NOT NULL, protocolo varchar(5) NOT NULL, descr varchar(25), caminho varchar(40), tipomidia char(2) NOT NULL, path varchar(60) NOT NULL, tiposervidor char(2) NOT NULL, UNIQUE codigo (codigo));

## Dumping data for table 'servidor'#

INSERT INTO servidor VALUES ( '001', '150.162.229.43', '554', 'rtsp', 'ALECRIM-VIDEO','/bu/video', '04', '/usr/local/rmserver/Content/bu/video/', '01');INSERT INTO servidor VALUES ( '002', '150.162.229.44', '80', 'http', 'BOLDO-TEXTO','/bdbu/arquivos/texto', '01', '/var/www/html/projeto/bdbu/arquivos/texto/', '00');INSERT INTO servidor VALUES ( '003', '150.162.229.43', '554', 'rtsp', 'ALECRIM-AUDIO','/bu/audio', '03', '/usr/local/rmserver/Content/bu/audio/', '01');INSERT INTO servidor VALUES ( '004', '150.162.229.44', '80', 'http', 'BOLDO-ANIMACAO','/bdbu/arquivos/anima', '05', '/var/www/html/projeto/bdbu/arquivos/anima/', '00');INSERT INTO servidor VALUES ( '005', '150.162.229.44', '80', 'http', 'BOLDO-IMAGEM','/bdbu/arquivos/imagem', '02', '/var/www/html/projeto/bdbu/arquivos/imagem/', '00');

# --------------------------------------------------------## Table structure for table 'texto'#

CREATE TABLE texto ( titulo varchar(80), descr varchar(250), objm varchar(10) NOT NULL, autor varchar(60), tipo char(2), tamanho varchar(7), servidor char(3), datac date, datag date, palavrac varchar(80), instituicao char(3), responsavel varchar(4) NOT NULL, email varchar(32), url varchar(40), idioma char(1) NOT NULL, visitas int(11) DEFAULT '0' NOT NULL, editora varchar(50), identificador varchar(50), relacao varchar(50), direitos varchar(50), fonte varchar(80), abrangencia varchar(50) NOT NULL, UNIQUE objm (objm));

## Dumping data for table 'texto'#

INSERT INTO texto VALUES ( 'Texto Qualquer', 'texto teste', '0013-00698', '', '06', '0.00','002', '2002-07-04', '2001-01-20', 'texto teste', '001', '0013', 'jonas', '', '1', '2', '','', '', '', '', '');INSERT INTO texto VALUES ( 'asdasd', 'sadsadsad', '0003-00700', '', '06', '0.00', '002','2002-08-07', '2001-01-20', 'asdsadasd', '001', '0003', '', '', '0', '0', 'asdsa', 'dsadsad','asdsad', 'sadsadsad', 'asdasd', '');INSERT INTO texto VALUES ( 'asd213213', 'sadsdsd', '0003-00701', '', '06', '0.00', '002','2002-08-07', '2001-01-20', 'sadsad', '001', '0003', '', '', '0', '3', 'asdsadas', 'dasdasd','asdsad', 'sadsad', 'asdsad', '');

Page 73: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

73

INSERT INTO texto VALUES ( 'Teste', 'descricao', '0013-00704', '', '06', '0.00', '002', '2002-08-08', '2002-08-08', 'palavras chaves', '001', '0013', 'jonas', '', '0', '2', 'editora','identificador', 'relacao', 'direitos autoriais', 'fonte', 'abrangencia');INSERT INTO texto VALUES ( 'ela', 'descri', '0013-00706', 'Carlos Drummond', '06', '0.00','002', '2002-08-08', '2001-01-20', 'pchaves', '001', '0013', 'jonas', '', '0', '0', 'editora','identificador', 'relacao', 'direitos autoriais', 'fonte', 'abrangencia');INSERT INTO texto VALUES ( 'Avaliação Comparativa de Produtos Comerciais Multicast','Apresenta algumas ferramentas comerciais para videoconferência e ensino/treinamento adistância.', '0013-00710', 'Fabiano Bachmann', '06', '264 KB', '002', '2003-04-10', '2003-04-10', 'videoconferência multicast ferramentas', '004', '0004', '', '', '0', '0', 'NURCAD', '','', '', 'NURCAD', '');INSERT INTO texto VALUES ( 'Descrição de Ferramentas de Conferência e Compartilhamento','Resumo com as características de diversos softwares utilizados para videoconferência.','0013-00711', 'Carla Gurgacz', '06', '42 KB', '002', '2003-04-10', '2003-04-10','videoconferência softwares', '004', '0004', '', '', '0', '0', 'NURCAD', '', '', '', 'NURCAD','');INSERT INTO texto VALUES ( 'Glossário de Termos Multimídia', 'Um dicionário com os principaistermos técnicos utilizados no trabalho com arquivos multimídia.', '0013-00712', 'CarlosMontez', '15', '40 KB', '002', '2003-04-10', '2003-04-10', 'glossário multimídia termostécnicos', '004', '0004', '', '', '0', '0', 'NURCAD', '', '', '', 'NURCAD', '');

# --------------------------------------------------------## Table structure for table 'tipo'#

CREATE TABLE tipo ( extensao varchar(4), descr varchar(20), codigo char(2) NOT NULL, tipomidia char(2) NOT NULL, UNIQUE codigo (codigo));

## Dumping data for table 'tipo'#INSERT INTO tipo VALUES ( 'doc', 'doc', '06', '01');INSERT INTO tipo VALUES ( 'txt', 'txt', '05', '01');INSERT INTO tipo VALUES ( 'gif', 'gif', '04', '02');INSERT INTO tipo VALUES ( 'jpg', 'jpg', '01', '02');INSERT INTO tipo VALUES ( 'mpeg', 'mpeg', '02', '04');INSERT INTO tipo VALUES ( 'bmp', 'bmp', '11', '02');INSERT INTO tipo VALUES ( 'mov', 'mov', '07', '04');INSERT INTO tipo VALUES ( 'wav', 'wav', '08', '03');INSERT INTO tipo VALUES ( 'rm', 'rm', '09', '04');INSERT INTO tipo VALUES ( 'mp3', 'mp3', '03', '03');INSERT INTO tipo VALUES ( 'avi', 'avi', '12', '04');INSERT INTO tipo VALUES ( 'swf', 'swf', '13', '05');INSERT INTO tipo VALUES ( 'pdf', 'pdf', '14', '01');INSERT INTO tipo VALUES ( 'html', 'html', '15', '01');INSERT INTO tipo VALUES ( 'htm', 'htm', '16', '01');INSERT INTO tipo VALUES ( 'mpg', 'mpg', '17', '04');

# --------------------------------------------------------## Table structure for table 'tipomidia'#

CREATE TABLE tipomidia ( codigo char(2) NOT NULL, nome varchar(16) NOT NULL, UNIQUE codigo (codigo));

## Dumping data for table 'tipomidia'#

INSERT INTO tipomidia VALUES ( '05', 'animacao');INSERT INTO tipomidia VALUES ( '04', 'video');INSERT INTO tipomidia VALUES ( '03', 'audio');INSERT INTO tipomidia VALUES ( '01', 'texto');INSERT INTO tipomidia VALUES ( '02', 'imagem');

# --------------------------------------------------------## Table structure for table 'tiposervidor'#

CREATE TABLE tiposervidor (

Page 74: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

74

codigo char(2) NOT NULL, tipo varchar(22) NOT NULL, UNIQUE codigo (codigo));

## Dumping data for table 'tiposervidor'#INSERT INTO tiposervidor VALUES ( '01', 'Real');INSERT INTO tiposervidor VALUES ( '02', 'WindowsMedia');INSERT INTO tiposervidor VALUES ( '00', 'Web');

# --------------------------------------------------------## Table structure for table 'video'#

CREATE TABLE video ( titulo varchar(80) NOT NULL, descr varchar(250) NOT NULL, objm varchar(10) NOT NULL, autor varchar(40) DEFAULT 'Desconhecido' NOT NULL, tipo char(2) DEFAULT '02', tamanho varchar(7), duracao varchar(6), qualidade varchar(10) DEFAULT '1400' NOT NULL, resolucao varchar(9) DEFAULT '352x240' NOT NULL, servidor char(3), datac date DEFAULT '2000-02-15', datag date DEFAULT '2000-02-15' NOT NULL, palavrac varchar(80), instituicao char(3) DEFAULT '004' NOT NULL, responsavel varchar(4) NOT NULL, email varchar(32), url varchar(40), idioma char(1) NOT NULL, servidor2 char(3) NOT NULL, visitas int(11) DEFAULT '0' NOT NULL, editora varchar(30), identificador varchar(50), relacao varchar(50), direitos tinyint(50), fonte varchar(80), abrangencia varchar(50), UNIQUE objm (objm));

## Dumping data for table 'video'#INSERT INTO video VALUES ( 'Jonas', 'Pelé', '0003-00688', 'Jonas', '02', '3.61', '', '','352x240', '001', '2002-06-07', '2001-01-20', 'ASD', '001', '0002', '', '', '1', '001', '15','jonas', 'XF2190382183921980', 'com nenhum livro', '0', '', NULL);

Page 75: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

75

Um Tradutor de Consultas XQuery / Dublin Core paraConsultas SQL em Bibliotecas Digitais

Guilherme [email protected]

Universidade Federal de Santa CatarinaINE/CTC/UFSC

Caixa Postal 476 – CEP 88040-970 – Florianópolis, SC, Brasil

Resumo

Neste trabalho, estuda-se a representação e a manipulação de informações com XML eDublin Core e o conceito de bibliotecas digitais. A principal contribuição deste trabalho é odesenvolvimento de um software que permita que uma biblioteca digital, que adote SQL comolinguagem de consulta, receba solicitações de consultas XQuery adotando os metadados DublinCore.

Palavras-chave

Dublin Core, XML, Java, bibliotecas digitais, XQuery.

Abstract

In this work, the representation and handling of informations in XML and Dublin Coreand the concept of digital libraries are studied. The main contribution of this work is thedevelopment of a software that allows a digital library, with SQL as its query language, toreceive XQuery queries requests using Dublin Core metadata.

Keywords

Dublin Core, XML, Java, digital libraries, XQuery.

Page 76: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

76

1 Introdução

Atualmente, as tecnologias relacionadas à World Wide Web e à multimídia estão emconstante aprimoramento, sendo usadas em vários campos. Uma aplicação desenvolvida para aWorld Wide Web tem alcance mundial, assim estão sendo criadas cada vez mais aplicaçõespara essa rede, além de muitas pesquisas na área. O uso de multimídia proporciona meios pararepresentar vários tipos de informação e repositórios para esses dados são um avanço emrelação a meios convencionais de armazenamento de informação.

Neste trabalho, estudamos a representação e manipulação de informações com astecnologias XML e Dublin Core, e o conceito de bibliotecas digitais. Desenvolvemos umsoftware que permite que uma biblioteca digital (que emprega SQL como sua linguagem deconsulta) responda a consultas XQuery (com metadados Dublin Core). Os metadados do bancode dados da biblioteca digital são traduzidos para o padrão Dublin Core, e a resposta dosoftware à consulta XQuery é um arquivo XML.

2 Tecnologia Java

A linguagem Java foi anunciada oficialmente pela Sun em 1995, e desde então vemsendo amplamente utilizada em vários campos, desde adicionar conteúdo dinâmico à páginasda Web, até desenvolver aplicativos comerciais de grande porte. Como característicasprincipais, podemos dizer que Java é orientada a objetos, possui muitas bibliotecas de classes(APIs - Application Programming Interfaces) para auxiliar o programador em várias tarefas, eos programas em Java, aplicativos ou applets (programa Java que roda em um Web browser),são compilados em bytecodes e interpretados pelo computador.

A tecnologia JDBC (Java Database Connectivity) é uma API que permite conectividadeindependente, entre um programa Java e diferentes sistemas de bancos de dados. Existemdrivers JDBC para vários sistemas de bancos de dados, como DB2, MySQL, Oracle e Sybase.JDBC oferece vantagens, como reaproveitamento de dados já existentes e simplificação nodesenvolvimento de aplicações.

A tecnologia Java Servlets permitem que se estabeleça uma troca de informações entreum cliente e um servidor. Os servlets equivalem a um applet no lado do servidor, sendosuportados pela maioria dos servidores Web disponíveis. Os servlets utilizam o protocoloHTTP (Hypertext Transfer Protocol) para a comunicação cliente-servidor. Eles recebem asolicitação do cliente, fazem o processamento e retornam o resultado (formato HTML, dadosbinários, imagens etc.).

3 MySQL

MySQL é um servidor de banco de dados, multi-thread, de código aberto e que utiliza omodelo relacional, desenvolvido pela empresa MySQL AB. Os principais objetivos do MySQLsão velocidade, robustez e facilidade de uso.

Page 77: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

77

MySQL é um dos sistemas de código aberto mais utilizados atualmente. O MySQLoferece APIs para as linguagens de programação C, C++, Eiffel, Java, Perl, PHP, Python, Rubye Tcl. Ele funciona em várias plataformas e sistemas operacionais distintos, além de possuirinterface para acesso via ODBC (Open Database Connectivity).

4 XML e XQuery

O XML resulta do projeto de uma linguagem de marcação abrangente iniciado em 1996pelo World Wide Web Consortium (W3C), combinando a flexibilidade e a capacidade daSGML (Standard Generalized Markup Language) com a aceitação do HTML (HyperTextMarkup Language). XML usou como base um subconjunto da SGML, com a versão 1.0tornando-se uma recomendação do W3C em fevereiro de 1998.

Da mesma forma que o HTML, o XML utiliza tags (delimitadas por “<” e “>”) eatributos para representar os dados. XML permite que o usuário defina suas próprias tags. Umexemplo de informação XML é mostrada a seguir :

<?xml version="1.0" encoding="ISO-8859-1"?><recado><para>Pedro</para>-<de>Maria</de><titulo>Lembrete</titulo><assunto>Nao esqueca da reuniao amanha</assunto></recado>

Como o usuário define suas próprias tags para representar as informações, surge anecessidade de especificar regras para validar documentos XML de acordo com as definiçõesdo usuário. Para resolver essa questão, o usuário pode utilizar o Document Type Definition(DTD), que captura as regras do usuário para ampliar a sintaxe do XML e cria um vocabuláriopara descrever um problema ou situação. A seguir, é apresentado um DTD para o documentoXML mostrado anteriormente :

<?xml version="1.0"?><!DOCTYPE recado [ <!ELEMENT recado (de,para,titulo,assunto)> <!ELEMENT de (#PCDATA)> <!ELEMENT para (#PCDATA)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT assunto (#PCDATA)>]>

Após definir os dados XML e sua validação, o usuário pode decidir manipular osarquivos XML ou gerar respostas em XML. As duas principais tecnologias para manipulaçãode XML são o DOM (Document Object Model) e o SAX (Simple API for XML).

Page 78: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

78

O DOM é uma API mantida pelo W3C, fornecendo uma visão do documento emárvore. Um parser lê o documento e constrói uma árvore na memória, com os itens dodocumento. Para acessá-los, utiliza-se as interfaces DOM. A tecnologia SAX é produto de umgrupo de desenvolvedores XML, ela fornece eventos à medida que analisa cada parte dodocumento. A resposta ao evento fica por conta do programa que chamou o parser.

Com o aumento das informações em XML, torna-se necessária uma linguagem capaz derealizar consultas em dados XML de maneira eficiente. O W3C projetou a linguagem XQuerypara atender os seguintes requisitos : linguagem pequena, facilmente implementável, asconsultas são facilmente compreendidas e capacidade de realizar consultas em vários tipos defontes de informação XML [XQuery, 2003]. XQuery é uma linguagem funcional, querepresenta a consulta como uma expressão. Vários tipos de expressão são permitidos e essasexpressões podem ser aninhadas.

As consultas XQuery FLWR (abreviatura de FOR-LET-WHERE-RETURN), um tipoparticular de consultas XQuery, representam as consultas SELECT-FROM-WHERE dalinguagem SQL. A gramática da linguagem XQuery permite a criação de um grande número decombinações de FOR, LET, WHERE e RETURN, em produções altamente maleáveis erecursivas. A seguir, é mostrado um exemplo de consulta XQuery FLWR. A consulta selecionaos campos dc:title, dc:creator e dc:publisher, do arquivo “texto.xml”, que obedecem à condiçãoda cláusula WHERE, e ordena o resultado pelo campo dc:title :

FOR $a IN document("texto.xml")/metadata/recordWHERE $a/dc:language = ptORDER BY $a/dc:title RETURN <metadata> { $a/dc:title } { $a/dc:creator } { $a/dc:publisher } </metadata>

5 Dublin Core

O Dublin Core Metadata Initiative (DCMI) é um projeto de desenvolvimento depadrões para metadados e para organização de informações, além de catalogação erepresentação e classificação dessas informações em meio eletrônico. Foi concebido em 1995 econta com 800 participantes de 45 países [DCMI, 2003].

As atividades do DCMI, além do desenvolvimento e manutenção de recomendaçõespara metadados, incluem desenvolvimento de ferramentas, serviços e infra-estrutura, apoio aosetor educacional e divulgação para a comunidade. Algumas características que diferenciam opadrão Dublin Core de outros padrões semelhantes são : simplicidade na descrição de recursos,interoperabilidade semântica, escopo internacional e extensibilidade.

Page 79: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

79

As informações no padrão Dublin Core são representadas através de 15 elementosdiferentes : Title, Creator, Subject, Description, Publisher, Contributor, Date, Type, Format,Identifier, Source, Language, Relation, Coverage e Rights. Deve-se evitar repetir a mesmainformação em mais de um elemento. Na implementação de Dublin Core em XML, deve-seseguir certas recomendações, por exemplo : os nomes das propriedades para os 15 elementosdevem ser em letras minúsculas, valores múltiplos de propriedades devem ser representadospela repetição do elemento XML dessa propriedade e codificar propriedades como elementosXML e valores como o conteúdo desses elementos.

6 Bibliotecas Digitais

De acordo com [Pulliam, 1996], uma biblioteca digital é uma infra-estrutura deinformação eletrônica padronizada que permite armazenamento distribuído de dados, busca erecebimento de dados em uma grande região geográfica através de links e uma interfacetransparente ao usuário final.

As bibliotecas digitais podem ser distribuídas ou centralizadas. Nas bibliotecasdistribuídas são representadas por várias bibliotecas digitais que podem ser acessadas por umaúnica interface cliente. Nas bibliotecas centralizadas, os objetos que compõem as coleçõespodem ser armazenados em servidores diferentes, mas a administração é centralizada.

Entre as vantagens das bibliotecas digitais em relação às convencionais, pode-se citar :acesso a partir de qualquer computador conectado à World Wide Web, pesquisa facilitada,armazenamento mais simples, acervo não necessita de manutenção e facilidade em obter cópiasdos documentos. Em relação à World Wide Web, as bibliotecas digitais possuem a vantagemde possuir uma melhor organização de suas informações, o que facilita a busca por informaçõesespecíficas.

Na projeto de bibliotecas digitais, cinco atividades devem ser consideradas : criação ecaptura, armazenamento e gerenciamento, serviço de busca, distribuição e gerenciamento dedireitos autorais.

7 Software desenvolvido

O objetivo principal deste projeto é criar um software que possibilite a uma bibliotecadigital, a qual adota SQL como linguagem de consulta, processar solicitações de consultasXQuery com metadados Dublin Core. O esquema geral de funcionamento do software émostrado na Figura 1.

Page 80: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

80

Figura 1 – Esquema geral de funcionamento do software

A primeira parte do projeto consiste num software que recebe uma consulta XQueryFLWR, e o wrapper (conversor de linguagens de consulta e de resultados de consultas) faz aconversão dessa consulta para SQL, traduzindo os metadados Dublin Core para metadadoslocais. A consulta SQL é executada e seu resultado é transformado para XML, de acordo com[Bos, 1997]. Caso seja de seu interesse, o usuário pode verificar qual a consulta SQL resultanteda tradução da consulta XQuery FLWR. O usuário também pode configurar as traduções demetadados locais para metadados Dublin Core, e vice-versa.

A Figura 2 mostra a interface inicial do programa, onde o usuário pode digitar umaconsulta XQuery FLWR ou usar um dos exemplos disponíveis. O usuário também podeescolher configurar a tradução de metadados locais para metadados Dublin Core (e vice-versa).

Figura 2 – Interface inicial do programa

Page 81: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

81

A Figura 3 mostra a janela com a resposta em XML, caso o usuário tenha escolhido aopção “Consulta XQuery” na interface inicial. Caso seja de seu interesse, o usuário podeverificar a consulta SQL que equivale à consulta XQuery FLWR que ele digitou.

Figura 3 – Resultado em XML da consulta XQuery FLWR

A segunda parte do projeto consiste num servlet que responde às consultas XQueryFLWR, a partir de uma página HTML. Este servlet realiza somente consultas no mesmo estiloda primeira parte do software e responde ao usuário gerando uma página HTML. Aconfiguração das traduções de metadados não pode ser feita através do servlet. Grande parte dotrabalho desenvolvido para o software Java foi reaproveitada no desenvolvimento do servlet. Oservlet pode ser usado num servidor Web, para responder a consultas através da Internet.

A Figura 4 mostra o arquivo HTML onde o usuário digita a consulta para envio aoservlet e a Figura 5 mostra a resposta retornada pelo servlet.

Page 82: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

82

Figura 4 – Arquivo HTML para consulta ao servlet

Figura 5 – Arquivo HTML com a resposta do servlet

Page 83: UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARA

83

8 Conclusão

Pode-se dizer que os objetivos deste projeto foram alcançados. Realizou-se o estudo dastecnologias necessárias para a implementação do software, e criou-se o software que converteuma biblioteca digital, suportando SQL, em uma biblioteca digital que suporta a consultaXQuery traduzindo metadados proprietários em metadados Dublin Core. Este projetocontribuiu para a criação de bibliotecas digitais abertas seguindo uma interface padrão paraacesso aos seus dados. O trabalho que foi realizado será utilizado no Projeto SIDIE – Sistemade Disponibilização de Informações para Ensino, cujo objetivo é a construção de uma infra-estrutura de digitalização, organização e disponibilização de conteúdos digitais voltados aoensino e pesquisa [SIDIE, 2003].

Para trabalhos futuros, sugere-se a aplicação do software aqui desenvolvido em algumprojeto mais amplo relativo a bibliotecas digitais, além do próprio Projeto SIDIE, e projetospara geração e intercâmbio de metadados. Também pode-se sugerir a aplicação de outrospadrões diferentes do Dublin Core, na criação e intercâmbio dos metadados entre diferentessistemas.

9 Referências

[Bos, 1997] BOS, Bert. XML representation of a relational database. Publicado em: 11 jul.1997. Disponível em: <http://www.w3.org/XML/RDB.html>. Acesso em: 25 mai. 2003.

[DCMI, 2003] Dublin Core Metadata Initiative. Dublin Core Metadata Element Set, Version1.1: Reference Description. Publicado em: 4 fev. 2003. Disponível em:<http://dublincore.org/documents/2003/02/04/dces/>. Acesso em: 23 mai. 2003.

[Pulliam, 1996] PULLIAM, Donnie et al. Digital Libraries - A Technology Assessment byBenjamin Franklin Scholars. In: The Benjamin Franklin Capstone Course (E 497S), Raleigh:North Carolina State University, 1996. Disponível em: <http://www4.ncsu.edu/~jherkert/dlta.html>. Acesso em: 23 mai. 2003.

[SIDIE, 2003] Site do Projeto SIDIE – Sistema de Disponibilização de Informações para oEnsino. Disponível em: <http://www.sidie.nurcad.ufsc.br/>. Acesso em: 4 jul. 2003.

[XQuery, 2003] W3C XML Query Working Group. XQuery 1.0: An XML Query Language.Publicado em 2 mai. 2003. Disponível em: <http://www.w3.org/TR/2003/WD-xquery-20030502/>. Acesso em: 23 mai. 2003.