Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
UNIVERSIDADE FEDERAL DE SANTA CATARINA
UM TRADUTOR DE CONSULTAS XQUERY / DUBLIN CORE PARACONSULTAS SQL EM BIBLIOTECAS DIGITAIS
Guilherme Cordeiro
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
3
Dedicação
Dedico este trabalho à minha família.
4
Agradecimentos
Agradeço a todos aqueles que me ajudaram, direta ou indiretamente, na realização
deste trabalho.
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
6
9 Referências Bibliográficas 43
Anexos 49
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.
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.
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.
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 :
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
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.
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 à
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).
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.
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
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.
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].
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
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
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-
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>
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.
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;
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 >.
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.
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
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’.
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.
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
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
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
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.
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.
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.
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.
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
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.
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.
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.
41
Figura 10 – Arquivo HTML com a resposta do servlet
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.
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.
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.
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.
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.
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.
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.
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";
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();
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 + ",";
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,
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; }
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(){
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);
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){
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();
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;
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;
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();}
}}
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");
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.*;
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();
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;}
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;}
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();
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)
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>
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),
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,
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');
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', '');
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 (
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);
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.
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.
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).
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.
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.
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
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.
82
Figura 4 – Arquivo HTML para consulta ao servlet
Figura 5 – Arquivo HTML com a resposta do servlet
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.