Desenvolvimento de um Sistema Utilizando a Tecnologia JSP para
Transcrição
Desenvolvimento de um Sistema Utilizando a Tecnologia JSP para
EDEILSON MILHOMEM DA SILVA DESENVOLVIMENTO DE UM SISTEMA UTILIZANDO A TECNOLOGIA JSP PARA A MANIPULAÇÃO E RECUPERAÇÃO DE FOTOS DOCUMENTADAS EM RDF Palmas 2004 ii EDEILSON MILHOMEM DA SILVA DESENVOLVIMENTO DE UM SISTEMA UTILIZANDO A TECNOLOGIA JSP PARA A MANIPULAÇÃO E RECUPERAÇÃO DE FOTOS DOCUMENTADAS EM RDF “Relatório apresentado como requisito parcial da disciplina de Prática de Sistemas de Informação I (Estágio) do curso de Sistemas de Informação, orientado pela Profª. Parcilene Fernandes de Brito” Palmas 2004 iii EDEILSON MILHOMEM DA SILVA Desenvolvimento de um sistema utilizando a tecnologia JSP para a manipulação e recuperação de fotos documentadas em RDF “Relatório apresentado como requisito parcial da disciplina de Prática de Sistemas de Informação I (Estágio) do curso de Sistemas de Informação, orientado pelo Profª. Parcilene Fernandes de Brito” BANCA EXAMINADORA _____________________________________________ Profª. Parcilene Fernandes de Brito Centro Universitário Luterano de Palmas _____________________________________________ Prof. Fabiano Fagundes Centro Universitário Luterano de Palmas _____________________________________________ Prof. Jackson Gomes de Souza Centro Universitário Luterano de Palmas Palmas 2004 iv “Ensina-me, Senhor o teu caminho, e andarei na tua verdade, une o meu coração ao temor do teu nome.” (Salmos 86:16) “Os problemas significativos com os quais nos deparamos não podem ser resolvidos no mesmo nível de pensamento em que estávamos quando eles foram criados.” (Albert Einsten) v AGRADECIMENTOS No total de 8(oito) degraus, graças a meu bom e amado Pai (Deus), cheguei ao fim do sétimo. Obrigado Deus, por ter me dado forças durante esse percurso, por ter colocado as pessoas certas em minha vida para que pudessem me dar o apoio moral e psicológico que precisava para continuar a acreditar em mim mesmo. Agradeço a você, mamãe querida, por, em muitos momentos, ter me compreendido (pra não dizer suportado) e me dado o apoio necessário para continuar a luta, por me fazer acreditar que eu sempre posso e poderei bem mais do que minha mente possa imaginar. Enfim, por depositar confiança em mim. Ah..., Dna. Maria, obrigado por ter me fornecido a base necessária pra eu estar aqui hoje, agradecendo-a. Amo muito a senhora, mesmo que às vezes não demonstre isso expressivamente. Agradeço a vocês maninhas, Katá e Nicky. A Katá por sempre ter demonstrado tão intensamente o seu imenso amor por mim, por sempre ter feito esforço em me compreender, onde em muitos momentos nem eu mesmo conseguia. Lembra como a gente ia de mãos dadas pra escola?! Isso foi o princípio de tudo, mas você não imagina o quanto esses anos juntos, na escola, me deram o sustento necessário para prosseguir em frente, sozinho. Nicky, mesmo que às vezes transpareça que eu tenha maior afinidade, carinho, atenção e amor pela Katá, isso é uma inverdade e você sabe disso. Te amo tanto quanto a Katá, e você sempre será uma pessoa muito importante pra mim. Conte comigo sempre que precisar, pois estarei lá para te estender a mão. Agradeço a você, meu melhor cunhado, segundo você: “o cara agregado à família”. Obrigado negão, por ser uma pessoa amiga, companheira e ter sempre as palavras certas no momento oportuno. Como já dizia você...: “cada um sabe a dor e delícia de ser o que é”, então negão, seja feliz. Ah! Quando tiver rico, não esquece do cunhadão aqui, hein! Agradeço a você Parcilene, orientadora, psicóloga e amiga querida, que um dia me fez enxergar que não valia a pena desistir da guerra. Ainda que eu acreditasse nisso não encontrava forças para continuar. Continuei, e hoje estou aqui, preste a vencer a primeira batalha, prestando-te meus sinceros agradecimentos. A você Fabigundes (Fabiano) que sempre tentou trazer ânimo, incentivo e que também sempre deu as velhas e boas “porradas” na tentativa de fazer com que nós, alunos, nos tornássemos pessoas melhores. Ainda que essas “porradas”, na grande maioria das vezes, causassem algum transtorno, você nunca exitou em dá-las e pode ter certeza que eu vi tirei muito proveito disso tudo e confesso também que, em alguns momentos, fiquei chateado e magoado, mas acredito que isso “faz parte”. Agradeço também ao grupo batizado como “Amaleros”, formado por: André (Rincon ou Dedé), Carlos(Kaká ou Careli), Fernando (Óculos) Leandro (Mamá ou Macieira), Lucas (Skywalker ou Luquinha), Jorge (Ginho), Fabiano (Fabigundes) e Victor (Narizinho - o ladrão de oxigênio mesmo sem perceberem, me forneceram subsídios para continuar em frente. Enfim, mesmo que indiretamente, são muitas as pessoas que, de alguma forma, contribuíram para a conclusão do referido trabalho, por isso, minha sincera gratidão a todos. vii SUMÁRIO LISTA DE FIGURAS............................................................................................. ix LISTA DE TABELAS.............................................................................................xii LISTA DE ABREVIATURAS ...............................................................................xiii RESUMO ................................................................................................................ 12 ABSTRACT............................................................................................................. 13 1 Introdução....................................................................................................... 14 2 Revisão de Literatura...................................................................................... 17 2.1 2.1.1 2.2 Funcionamento de um Servlet........................................................... 18 Java Server Pages ................................................................................... 20 2.2.1 Objetos Pré-definidos para a Criação de Páginas JSP......................... 22 2.2.2 Expressões e Declarações.................................................................... 24 2.2.3 Diretivas .............................................................................................. 26 2.3 2.3.1 2.4 3 Servlet...................................................................................................... 17 XML........................................................................................................ 28 Namespaces ......................................................................................... 30 Resource Description Framework ....................................................... 31 2.4.1 Modelo Básico RDF ............................................................................ 32 2.4.2 Primitivas do modelo........................................................................... 38 2.4.3 RDF Schema........................................................................................ 47 2.5 API Jena ................................................................................................. 58 2.6 Considerações ........................................................................................ 62 Materiais e Métodos........................................................................................ 63 3.1 Local e Período ...................................................................................... 63 3.2 Materiais................................................................................................. 63 3.2.1 Hardware ............................................................................................. 64 3.2.2 Software............................................................................................... 64 viii 3.2.3 3.3 4 Fontes Bibliográficas........................................................................... 64 Metodologia............................................................................................ 64 Resultados e Discussão................................................................................... 67 4.1 O Sistema................................................................................................ 67 4.2 RDF Schema na Criação de um Conjunto de Regras para Descrição das Imagens 69 4.3 Representação do Vocabulário em uma Classe Java ......................... 71 4.4 Utilizando o Vocabulário representado em uma Classe Java para Criação de um Documento RDF. ................................................................................. 73 4.5 Processo de Armazenamento das Descrições das Imagens................ 75 4.6 Classe Criada para Implementação do Sistema ................................. 77 4.6.1 Método verificarArquivoExiste(String) .............................................. 78 4.6.2 Método gravarArquivo(String, Model) ............................................... 79 4.6.3 Método gravarArquivo (String, RDFWriter, Model) .......................... 79 4.6.4 Método carregarArquivo(String)......................................................... 80 4.6.5 Método pegarNovoArquivo (String) ................................................... 80 4.6.6 Método pegarConjuntoArquivos(String)............................................. 81 4.7 Utilizando o Sistema para Descrição de uma Imagem....................... 81 4.8 Considerações ........................................................................................ 85 5 Considerações finais....................................................................................... 86 6 Referência Bibliográfica ................................................................................ 88 ANEXO.................................................................................................................... 90 APÊNDICE............................................................................................................. 96 ix LISTA DE FIGURAS Figura 1 - Arquitetura proposta para a Web Semântica (Berners-Lee, 2001)................... 14 Figura 2: A arquitetura de aplicativo servlet (KUMIAWAN, 2002) .................................. 17 Figura 3: Como funciona um Servlet.................................................................................. 18 Figura 4: Exemplo de um código Servlet............................................................................ 19 Figura 5: Etapas da primeira execução de uma página JSP (OLIVEIRA, 2001) .............. 21 Figura 6: Exemplo simples de uma página JSP ................................................................. 21 Figura 7: Código HTML retornado para o cliente e a Servlet gerada a partir da requisição do documento JSP demonstrado na Figura 6 ................................................... 22 Figura 8: Comparação entre a utilização de uma expressão e o método println() da classe JspWriter ............................................................................................................................. 25 Figura 9: Exemplo de declaração de uma variável inteira tanto no escopo de um scriptlet, quanto como atributo da classe Servlet............................................................................... 26 Figura 10: Sintaxe de definição de diretivas (HALL,?)...................................................... 27 Figura 11: Sintaxe para utilização da diretiva include................................................. 28 Figura 12: Exemplo de um DTD três elementos e um atributo. ......................................... 29 Figura 13: Exemplo de um arquivo XML válido e bem formado de acordo com o DTD da Figura 12. ............................................................................................................................ 29 Figura 14: Exemplo de declaração de um namespace ....................................................... 30 Figura 15: Esquema de utilização de um namespace em um documento XML. ................ 31 Figura 16: Documento XML que utiliza os elementos pré-definidos em um namespace... 31 Figura 17: Representação de uma sentença: grafo e tripla ............................................... 34 Figura 19: Propriedade com valor estruturado usando um nó vazio ................................ 35 Figura 20: Propriedade com valor estruturado ................................................................. 35 Figura 21: Formato de representação de dados em RDF.................................................. 36 Figura 22: Sentença em forma de tripla ............................................................................. 36 Figura 24: Serialização em XML de um recurso RDF de forma abreviada ...................... 37 Figura 25: Representação de uma sentença sem o elemento <rdf:RDF>....................... 38 Figura 26: Representação do elemento <rdf:Description> .................................... 39 Figura 28: Representação do atributo <rdf:ID> ........................................................... 40 Figura 29: Grafo da definição de um tipo .......................................................................... 41 Figura 30: Representação do atributo <rdf:type>....................................................... 41 x Figura 31: Representação do atributo <rdf:type> como atributo do elemento <rdf:Description> .................................................................................................... 41 Figura 32: Representação do atributo <rdf:type> com o mecanismo de namespace 42 Figura 33: Representação do elemento bag ....................................................................... 43 Figura 34: Representação do elemento Sequence.............................................................. 43 Figura 35: Representação do elemento Alternative ........................................................... 44 Ordenação .............................................................................................................................. 44 Figura 36: Representação de um código RDF reificado.................................................... 45 Figura 37: Representação gráfica de uma esquema e sua utilização em um documento RDF ..................................................................................................................................... 47 Figura 38: Hierarquia de classes do modelo RDF Schema (BRICKLEY, 2000). .............. 48 Figura 39: Modelo RDF/XML utilizado para definição de classes e propriedades........... 48 Figura 40: Processo de definição de classes ...................................................................... 49 Figura 41: Representação gráfica de um esquema............................................................. 50 Figura 42: Parte do esquema da Figura 41 serializado em XML....................................... 50 Figura 43: Sintaxes da criação de uma classe.................................................................... 51 Figura 44: Sintaxes de definição de uma propriedade e seu relacionamento com uma classe ................................................................................................................................... 52 Figura 45: Definição de Propriedade................................................................................. 53 Figura 46: Exemplo do elemento <rdfs:subClassOf> .............................................. 54 Figura 47: Hierarquia de propriedades a partir da utilização do elemento <rdfs:subPropertyOf> ............................................................................................. 55 Figura 48: Representação do elemento <rdfs:range>................................................. 56 Figura 49: Representação do elemento <rdfs:domain> .............................................. 56 Figura 49: Representação de uma taxionomia em RDF/XML............................................ 57 Figura 50: Exemplo de criação de um documento RDF simples ....................................... 59 Figura 52: Exemplo de definição de tipagem para um dado recurso ............................... 60 Figura 53: Resultado obtido a partir da execução do código demonstrado na Figura 52.60 Figura 54: Criação um recurso com uma propriedade tendo como valor um outro recurso ............................................................................................................................................. 61 Figura 55: Resultado obtido a partir da execução do código demonstrado na Figura 54.61 Figura 56: Etapas possíveis para descrição das imagens.................................................. 68 Figura 57: Esquema que representa as imagens referentes ao domínio “Instituição de xi Ensino Superior”................................................................................................................. 69 Figura 58: Grafo do esquema da Figura 57....................................................................... 71 Figura 59: Criação de um vocabulário em uma classe Java: utilizando a API Jena. ....... 72 Figura 60: Código Java de criação de um documento RDF a partir do esquema representado na seção 4.3................................................................................................... 74 Figura 61: Documento RDF gerado a partir da execução do código Java demonstrado na Figura 60. ............................................................................................................................ 75 Figura 62: Estrutura hierárquica de armazenamento dos documentos RDF. ................... 76 Figura 63: Documento que armazena o nome dos arquivos RDF que descrevem as imagens: de acordo com a posição ocupada pelos mesmos no esquema. .......................... 77 Figura 64: Código Java que implementa o método verificarArquivoExiste (String) .......................................................................................................................... 79 Figura 65: Código Java que implementa o método gravarArquivo (String, Model)............................................................................................................................... 79 Figura 66: Código Java que implementa o método gravarArquivo (String, RDFWriter, Model) .................................................................................................... 80 Figura 67: Código Java que implementa o método carregarArquivo(String).... 80 Figura 68: Código Java que implementa o método pegarNovoArquivo (String)81 Figura 69: Código Java que implementa o método pegarConjuntoArquivos (String) .......................................................................................................................... 81 Figura 70: Tela Principal do Sistema................................................................................. 82 Figura 71: Formulário que possibilita a submissão das informações sobre uma dada imagem. ............................................................................................................................... 83 Figura 72: Documento RDF gerado................................................................................... 84 xii LISTA DE TABELAS Tabela 1: Objetos implícitos de uma página JSP (BROGDEN, 2002) 23 Tabela 2: Atributos da diretiva page. 27 Tabela 3: Sentença dividida em partes 33 Tabela 4: Comparação entre os tipos de Coleções providas pelo modelo RDF (BRAGANHOLO, 2001). 44 Tabela 5: Resultado da sentença utilizando uma reificação 45 Tabela 6: Cronograma de atividades 66 Tabela 7: Relação dos métodos da classe Arquivo. 78 Tabela 8: Métodos da classe HttpServletRequest (BROGDEN, 2002) 91 Tabela 9: Métodos da classe HttpServletResponse (BROGDEN, 2002) 92 Tabela 10: Métodos da classe JspWriter (BROGDEN, 2002) 93 Tabela 11: Métodos da classe HttpSession (BROGDEN, 2002) 93 Tabela 12: Métodos da classe ServletContext (BROGDEN, 2002) 94 Tabela 13: Métodos da classe PageContext 95 xiii LISTA DE ABREVIATURAS API = Application Programmer Interface DTD = Document Type Definition HP = Hewlett-Packard Compan HTML = HyperText Markup Language HTTP = HyperText Transfer Protocol JSP = Java Server Pages RDF = Resource Description Framework RDQL = Query language for RDF URI = Uniform Resoucer Identifier W3C = World Wide Web Consortium XML = eXtensible Markup Language 12 RESUMO As páginas dispostas na web não obedecem a uma estrutura padrão, ou seja, são geradas de acordo com a estrutura definida pelos desenvolvedores (webmasters). Devido a essa heterogeneidade (falta de padronização) as pesquisas realizadas pelos sites tradicionais de busca são possíveis apenas por palavra-chave. Esse é um dos motivos pelos quais, quando um usuário faz uma busca em um desses sites, muitas páginas irrelevantes para pesquisa são retornadas, tendo o mesmo que fazer uma filtragem manual dessas informações. Um dos passos para tornar essas pesquisas eficientes é a estruturação das páginas segundo um padrão. Dessa forma, foi proposto pela W3C o modelo RDF, que dentre os recursos oferecidos, dispõe de mecanismo que possibilita a estruturação das páginas de forma homogênea. Tendo como base esse modelo, o presente trabalho discorre sobre o desenvolvimento de um sistema que possibilita a estruturação de informações referentes ao domínio “imagens da instituição de ensino superior CEULP/ULBRA”. Para o desenvolvimento desse trabalho foi utilizada a tecnologia JSP (tecnologia que permite o desenvolvimento de páginas web a partir da linguagem Java), isso porque a linguagem Java dispõe de uma API (Jena) que possibilita a interação com documentos RDF. Palavras-chaves: RDF, RDF Schema, API Jena e JSP. 13 ABSTRACT The web pages do not obey to a standard structure, or either, they are generated in accordance with the structure defined by the developers (webmasters). Because this heterogeneity (standardization lack) the searches made by traditional search engines are possible only through keywords. This is one of the reasons for which when an user makes a search in one of these sites many pages irrelevant for the search are returned, of this form the user has that manual filtering the information. One of the steps to become these searchs efficient is the definition of the pages according to a standard. Of this form, model RDF was considered by the W3C, that amongst the resources offered for exactly, makes use of mechanism that makes possible the organization of the pages of homogeneous form. Following this model, the present work discourses about the development of a system that makes possible to structuralize the information according the domain "images of the superior education institute CEULP/ULBRA". For development of this work the technology JSP was used (technology that allows the development of web pages from the Java language), this because the Java language makes use of an API (Jena) that makes possible the interaction with RDF documents. Keywords: RDF, RDF Schema, API Jena e JSP 14 1 INTRODUÇÃO A web semântica representa a evolução da web atual. Ela visa fornecer estruturas e dar significados ao conteúdo das páginas web, criando um ambiente onde agente de software e usuários possam trabalhar de forma cooperativa (BERNERS-LEE, 2001). Desta forma, vários trabalhos estão sendo desenvolvidos com o intuito de se criar um ambiente propício para a existência de uma web com significado. Na arquitetura proposta para a web semântica de Berners-Lee (2001) (Figura 1) é possível visualizar uma sistematização das etapas de construção desse ambiente. Figura 1 - Arquitetura proposta para a Web Semântica (Berners-Lee, 2001) De acordo com a arquitetura proposta por (Berners-Lee, 2001) (Figura 1), a camada 15 de estrutura representa o primeiro passo para a definição da web semântica, pois nesse momento em que as informações são sistematizadas, ou seja, é dado significado os dados. A camada de esquema, a ontologia, fornece um conjunto de regras que define hierarquia, relacionamentos e restrições entre termos, ou seja, permite a representação de um conjunto de regras mediante a especificação de um dado domínio e, para isso são utilizadas linguagens para ontologia. (LUSTOSA, 2003). “E, por fim, a camada lógica tem a função de definir um conjunto de regras de inferências, além dos próprios mecanismos que as realizarão, atribuindo-as aos documentos que contém dados. As regras de inferência oferecem aos agentes computacionais o poder de raciocinar sobre as estruturas de dados que estão expressas na camada de estrutura, a partir das relações entre esses dados definidas na camada de esquema” (LUSTOSA, 2003). O presente trabalho está vinculado à camada de estrutura da web semântica, desta forma, é construído um ambiente que utilize tecnologias capazes de propiciar uma sistematização das informações, de forma que elas venham a ter um significado para a máquina. No referido trabalho será utilizado o padrão RDF, recomendado pela W3C. De uma forma simples, o RDF pode ser entendido como um padrão que tem como funcionalidade prover metadados na web através da aplicação da linguagem XML. Sua padronização estabelece um modelo de dados e sintaxe para codificar, representar e transmitir metadados (CIUFFO, 2002). Para o desenvolvimento do ambiente, escolheu-se o domínio “imagens da instituição de ensino superior CEULP/ULBRA”. Dessa forma, foi desenvolvido um sistema web que permite o armazenamento de imagens e a descrição da mesma a partir do modelo RDF. Para o desenvolvimento do ambiente foi utilizada a tecnologia JSP, pois a mesma além de ser uma tecnologia voltada para a web, também trabalha com a linguagem Java. Isso é um fator positivo, levando-se em consideração que há uma API (Application Programing Interface) Java, desenvolvida pela HP, que dispõe de várias classes que permitem a interação com um documento RDF. Este trabalho está organizado da seguinte forma: na seção 2.1 são apresentados os conceitos teóricos que fundamentam a tecnologia Servlet, já que a mesma é a base de funcionamento da tecnologia JSP, apresentada na seção 2.2. Na seção 2.3 é feita uma breve 16 explanação da linguagem de marcação XML, pois a mesma além de serializar o modelo RDF, também dispõe de um recurso (seção 2.3.1) que possibilita o compartilhamento de vocabulários: namespace. A seção 2.4 apresenta o modelo RDF, logo em seguida é demonstrado na seção 2.4.1 o modelo RDF básico, caracterizado como um padrão para descrição de recursos (universo de objetos que podem ser descritos) com propriedades (atributos dos recursos). E, na seção 2.4.3 é feita uma explanação a respeito do RDF Schema, utilizado para representação de esquemas, ou seja, fornece descrição de grupos de recursos e os relacionamentos existentes entre eles. A seção 2.5 apresenta alguns dos recursos disponibilizados pela API Jena para criação e manipulação de documentos RDF. A seção 2.6 apresenta breves considerações a respeito dos conceitos que fundamentam teoricamente o trabalho. Os materiais e a metodologia utilizados para o desenvolvimento do presente trabalho são apresentados na seção 3. E, logo a seguir (seção 4) são demonstrados os resultados obtidos a partir do desenvolvimento do sistema e quais foram os passos seguidos para o seu desenvolvimento. E, para finalizar, são apresentadas as considerações finais, seguido das referências utilizadas para o desenvolvimento do trabalho. 17 2 REVISÃO DE LITERATURA 2.1 Servlet Servlet é uma tecnologia para internet baseada na plataforma Java que possibilita a criação de página web de forma dinâmica (JCP - SERVLET SPECIFICATION, 2003). Ou seja, as páginas web podem ser geradas dinamicamente diante da ação de um determinado usuário. Essa interação com o usuário é baseada na arquitetura cliente-servidor em que o cliente faz uma requisição via HTTP ou HTTPS (protocolo de comunicação web), o servidor processa a solicitação e por fim envia a resposta ao solicitante. A Figura 2 demonstra a arquitetura de um aplicativo Servlet. Figura 2: A arquitetura de aplicativo servlet (KUMIAWAN, 2002) Ainda segundo a representação da Figura 2 um aplicativo Servlet também pode incluir conteúdos estáticos, tais como: uma página HTML ou um arquivo imagem. 18 2.1.1 Funcionamento de um Servlet Quando o servidor recebe uma solicitação de um cliente para processar uma página pela primeira vez, o mesmo efetua o carregamento do Servlet, carrega-o na memória e por fim envia a resposta ao cliente. Depois que o Servlet foi carregado permanecerá na memória aguardando outras solicitação. A Figura 3 demonstra como é o funcionamento de um Servlet. Figura 3: Como funciona um Servlet Caso a página não mais esteja sendo requerida pela primeira vez, o servidor verifica se o Servlet sofreu alguma alteração. Caso tenha sido alterado, o servidor carrega o Servlet novamente na memória e envia a resposta ao cliente. 19 Esse processo de envio do Servlet para a memória tem o intuito de agilizar o processamento para uma suposta nova solicitação feita por um cliente de uma página web. Figura 4: Exemplo de um código Servlet. Conforme pode ser observado na Figura 4, não é uma tarefa muito simples e rápida desenvolver uma página web utilizando a tecnologia Servlet, pois o código HTML das páginas devem ser criados a partir da sintaxe Java, utilizando strings para definição dos elementos HTML. Isso dificulta bastante o trabalho do desenvolvedor porque além de se preocupar em como as informações estarão expostas na parte gráfica da página, tem que se preocupar também com a parte lógica (implementação das classes propriamente dita). 20 2.2 Java Server Pages Como forma de sanar o problema da tecnologia Servlet no que diz respeito a dificuldade de edição de páginas web surgiu a tecnologia JSP, que não veio para substituíla, mas sim estender a sua potencialidade. Dessa forma, JSP oferece uma maior facilidade de codificação, além de permitir também uma programação separada em camadas: camada lógica (parte dinâmica) e camada de apresentação (parte estática), e através disso facilitar tanto a elaboração quanto a manutenção de uma aplicação. Segundo (JCP, 2003), JSP é uma tecnologia para desenvolvimento de aplicações web que utiliza a linguagem Java. Uma página JSP é um documento que descreve como criar uma resposta para uma solicitação em um determinado protocolo. O protocolo utilizado como padrão para essas solicitações e respostas é o HTTP. Como se trata de uma tecnologia baseada em Java, ela herda todas suas características como: linguagem baseada nos conceitos da orientação a objetos, multiplataforma, além do gerenciamento automático de memória. Quando uma página JSP é carregada pela primeira vez o código Java é compilado gerando uma Servlet que é executado. Após o carregamento dessa Servlet, uma página HTML é enviada para o browser (navegador) do cliente. As próximas requisições são enviadas diretamente a Servlet que foi gerada na primeira vez em que a página foi carregada, não ocorrendo mais as etapas de geração e compilação. A Figura 5 mostra o esquema de execução de uma página JSP na primeira vez em que é requisitada. 21 Figura 5: Etapas da primeira execução de uma página JSP (OLIVEIRA, 2001) Conforme representação da Figura 5, quando uma página web é solicitada é enviada uma requisição ao servidor web, sendo que o mesmo a encaminha para o contentor Servlet/JSP, e com isso (passo 3) o contentor verificará que não há uma instância de Servlet correspondente à página JSP. Dessa forma, a página JSP é traduzida para o código fonte de uma classe Servlet que será usada na resposta à requisição. No passo (4) o código fonte do Servlet é compilado, no passo (5) é criada uma instância da classe, e por fim, (passo 6), é gerada a resposta à requisição feita pelo cliente. A Figura 6 mostra um exemplo simples de uma página JSP. Figura 6: Exemplo simples de uma página JSP 22 Conforme representação da Figura 6, uma página JSP pode ser formada tanto por conteúdo estático (HTML), quanto por código dinâmico (processado do lado do servidor), sendo que o código processado pelo servidor é delimitado respectivamente pelas tags de abertura e fechamento “<%” e “%>”. Quando uma página JSP é requisitada, processada e carregada é retornado ao cliente apenas o código HTML, escondendo assim o código fonte que a originou. A parte 1 da Figura 7, tendo como base o documento JSP apresentado na Figura 6, exibe o código HTML retornado para o cliente e, a parte 2 demonstra o Servlet gerado após o carregamento da página JSP.. Figura 7: Código HTML retornado para o cliente e a Servlet gerada a partir da requisição do documento JSP demonstrado na Figura 6 2.2.1 Objetos Pré-definidos para a Criação de Páginas JSP Uma característica importante da tecnologia JSP é que a mesma disponibiliza objetos implícitos (o desenvolvedor não precisa instanciá-los), que são sempre criados quando uma página JSP é carregada, formando assim o Servlet equivalente. A Tabela 1 23 demonstra quais são esses objetos. Tabela 1: Objetos implícitos de uma página JSP (BROGDEN, 2002) Objeto Tipo request javax.servlet.ServletRequest response javax.servlet.ServletResponse pagecontext javax.servlet.jsp.PageContext session javax.servlet.http.HttpSession application javax.servlet.ServletContext out javax.servlet.jsp.JspWriater config javax.servlet.ServletConfig Uma referência de objeto apontando para page “this” exception Exceções (throwable) Conforme pode ser observado na Tabela 1, são nove os objetos pré-definidos que podem ser utilizados durante o desenvolvimento de uma aplicação JSP. Dentre as quais 6 destacam-se: HttpServletRequest, HttpServletResponse, JspWriter, HttpSession, ServletContext e PageContext, pois são utilizadas com maior freqüência. A seguir é feita uma explanação a respeito das classes às quais esses objetos pertencem e em anexo segue alguns de seus métodos e suas respectivas descrições. • Classe HttpServletRequest: o objeto request tem a responsabilidade de representar todas as solicitações feitas pelos usuários, como por exemplo: fornecer meio de acesso a cookies, acesso a parâmetros advindos de uma página e, até mesmo a URL que fez a solicitação. • Classe HttpServletResponse: HttpServletResponse é segundo uma (BROGDEN, extensão da 2002), interface ServletResponse, que acrescenta métodos específicos para as transações HTTP. Essa classe fornece métodos que permitem representar as 24 respostas que serão dadas ao cliente mediante a requisição de uma página. • Classe JspWriter: a finalidade dessa classe é proporcionar funcionalidades de fluxos de saídas para o conteúdo de uma página, ou seja, disponibiliza métodos para enviar informações para o navegador (browser) do cliente. • Classe HttpSession: essa interface permite trabalhar com as variáveis específicas pertencentes à sessão de cada usuário e é de fundamental importância, pois informações pertencentes a uma dada sessão podem ser utilizadas em páginas distintas, desde que a sessão seja a mesma. • Classe ServletContext: quando uma Servlet é gerada, uma instância da interface ServletContext é criada. Esse objeto representa a aplicação a qual a página JSP pertence. Segundo (BROGDEN, 2002), esse é o caminho primário para a comunicação entre uma Servlet e o contentor Servlet. Cada aplicativo web, que pode conter várias Servlets ou páginas JSP, compartilha um ServletContext. • Classe PageContext: essa classe fornece métodos para gerenciar os recursos oferecidos pelas Servlets (BROGDEN, 2002). Ou seja, é ela quem define os objetos que podem ser utilizados de forma implícita dentro de uma página JSP. 2.2.2 Expressões e Declarações Além dos scriptlets (código Java inserido entre os elementos “<%” e “%>”), a tecnologia JSP permite também que o código Java seja colocado numa página usando expressões e declarações (HUNTER, 2002). Uma expressão é determinada pelos elementos “<%=” e “%>”, em que o elemento “<%=” determina seu início e o elemento “%>” determina o fim. Expressão é um meio alternativo e rápido de se enviar um valor (dado de saída) para o navegador do cliente, pois o outro meio para postar dados de saída é utilizar o método println() do objeto implícito out. Dessa forma, o uso de expressões o 25 torna trabalho do desenvolvedor menos dispendioso. A Figura 8 mostra um exemplo de utilização de expressão em que uma mensagem é enviada para o cliente e sua representação equivalente utilizando o método println(). Figura 8: Comparação entre a utilização de uma expressão e o método println() da classe JspWriter Segundo (HALL,?) uma declaração permite a definição tanto de métodos quanto de variáveis que passam a fazer parte da classe Servlet, ou seja, não faz parte do método _jspService (método invocado sempre que uma página JSP é requerida), diferentemente das variáveis que são declaradas nos scriptlets. Uma declaração de um objeto feita dentro do escopo de um scriptlets é local ao método _jspService, dessa forma o objeto é instanciado sempre que uma página JSP for requerida, o que não acontece se a variável for declarada como atributo da classe Servlet, e para isso a sintaxe utilizada é: <%! declaração %>. A Figura 9, dividida em partes, demonstra uma declaração de uma variável tanto local ao método _jspService quanto como atributo da classe Servlet. 26 Figura 9: Exemplo de declaração de uma variável inteira tanto no escopo de um scriptlet, quanto como atributo da classe Servlet. Como a declaração da variável inteira contAcesso demonstrada na parte 1 da Figura 9 pertence somente ao scriptlet em questão, trata-se então de uma variável local ao método _jspService, ou seja, essa variável será declarada, inicializada e incrementada sempre que a página JSP for requerida. Dessa forma, a mesma terá sempre o valor 1. Diferentemente da declaração demonstrada na parte 2, pois, como ela é declarada dentro dos elementos “<%!” e “%>”, a variável passa a ser então atributo da classe Servlet e o método jspService apenas modifica o valor da variável, incrementando-a. 2.2.3 Diretivas De acordo com (HUNTER, 2002), uma diretiva JSP permite que uma página JSP controle certos aspectos de seu Servlet, ou seja, permite ajustar instruções no nível da página, como: inserir arquivos estáticos em um documento JSP e importar um determinado pacote ou classe. Elas são definidas entre as tags “<%@” e “%>”. Na Figura 10 é demonstrada a sintaxe para definição de uma ou várias diretivas. 27 Figura 10: Sintaxe de definição de diretivas (HALL,?). Conforme representação na Figura 10, o processo de definição de uma diretiva resume-se em: definir o nome da diretiva que será representada, juntamente com o atributo disponibilizado pela mesma e seu respectivo valor. As principais diretivas são: page e include. A diretiva page permite que sejam definidos atributos que serão aplicados a todo o documento JSP e inclusive a todos os arquivos incluídos estaticamente a essa página. A seguir são demonstrados na Tabela 2 os atributos que podem ser utilizados por essa diretiva Tabela 2: Atributos da diretiva page. Exemplo (admita que os Atributo atributos abaixo representados Descrição estão dentro dos elementos “<%@ “ e “ %>” ). Permite import especificar importados para os serem pacotes que são utilizados no page import=”java.util.*” decorrer da página JSP Permite definir como as informações serão contentType enviadas para o cliente, ou seja, se as informações estarão dispostas em texto page contentType=”text/plain” plano ou texto HTML. O valor padrão para essa propriedade é true que indica o processamento normal do Servlet, em que múltiplas requisições são isThreadSafe processadas simultaneamente. Se o valor for false indica que o processamento deve ser feito por instâncias separadas do Servlet ou serialmente. page IsThreadSafe=”false” 28 O valor padrão true indica que a variável pré-definida session deve ser associada a Session sessão.Se esse atributo tiver com valor page session=false falso é indicado que nenhuma sessão será utilizada. Especifica o tamanho do buffer para escrita Buffer utilizado pelo objeto da classe jspWriter. page buffer=”15” O tamanho padrão é inferior a 8k. Esse atributo tem a função de indicar se o autoflush buffer deve ser esvaziado ou não quando estiver cheio. Para isso o mesmo recebe um page Autoflush=”true” valor true ou false. Especifica errorPage executada qual caso página uma de erro exceção deve seja ser gerada page errorPage=”url” durante o processamento da página JSP. Indica se a página corrente pode atuar como isErrorPage página de erro para uma outra página JSP. page isErrorPage=”true” Tem como valor padrão false. Especifica a linguagem que será utilizada. Language Ainda que a única possível por enquanto page language=”Java” seja a Java. A diretiva include permite a inclusão de arquivos estáticos em uma página JSP. A sintaxe para utilização da mesma pode ser visualizada na Figura 11. Figura 11: Sintaxe para utilização da diretiva include. 2.3 XML XML é uma linguagem de marcação recomendada pela W3C devido à facilidade de manipulação, criação e estruturação de documentos, além de ser portável, pois um documento XML baseia-se em um documento texto (BRAY, 2004). “Linguagens de marcação são linguagens que descrevem a estrutura de um documento, ou seja, como as informações estão organizadas. As linguagens de marcação determinam a forma como o documento está estruturado, e de acordo com essa estrutura, 29 determinam como ele será apresentado. Regras explícitas determinam onde estas estruturas começam e terminam através de marcas (tags) que são colocadas antes e depois do conteúdo associado, respectivamente tag de início e tag de fim” (LIMA et al, 2003). “Os documentos descritos em XML baseiam-se em três componentes distintos: estrutura, conteúdo e apresentação. A estrutura é definida através de um DTD, onde estão contidas as regras que regerão os documentos XML, ou seja, é na definição do tipo do documento que serão especificadas as marcações da linguagem que está sendo desenvolvida” (LIMA et al, 2003). Um exemplo de DTD pode ser visto na Figura 12. Figura 12: Exemplo de um DTD três elementos e um atributo. O conteúdo é onde estão representados os dados, de acordo com a estrutura definida em um DTD ou não. Para definir que um documento XML está correto existem dois conceitos: o de documento bem formado e o de documento válido. Um documento bem formado é aquele em que todas as tags que foram iniciadas foram também finalizadas seguindo uma seqüência lógica. E um documento válido é aquele em que, além de bem formado, também segue corretamente a estrutura definida no DTD. A Figura 13 demonstra um arquivo XML validado de acordo com o DTD da Figura 12. Figura 13: Exemplo de um arquivo XML válido e bem formado de acordo com o DTD da Figura 12. A primeira linha da Figura 13 indica a versão da linguagem XML que será utilizada no documento. Na linha 2, a instrução <DOCTYPE> referencia o DTD responsável pela Verificar possibilidade de alteração 30 validação do documento XML. Da linha 3 a linha 5 há a representação da estrutura do documento propriamente dita, onde uma turma é formada por um atributo de valor a1 e dois elementos, ano e semestre, com respectivos valores 2004 e 1. Estabelecendo assim uma estrutura hierárquica entre os elementos. Uma outra característica importante da linguagem de marcação XML está no mecanismo de namespace que tem como objetivo possibilitar o compartilhamento de esquemas ou vocabulários. 2.3.1 Namespaces Namespaces têm como objetivo identificar um conjunto de elementos (esquema), usando prefixos que formam uma nova sintaxe a ser utilizada ao longo de um outro documento qualquer (BRAY, 1999). Com isso, torna-se possível a reutilização desse conjunto de elementos na representação de novos domínios. Essa identificação é feita através do um atributo URI que funciona como um identificador único. Um namespace é declarado usando uma família de atributos reservados (BRAY, 1999). O nome do atributo deve ser xmlns ou ter xmlns: como prefixo. A Figura 14 demonstra um exemplo de declaração de namespace. Figura 14: Exemplo de declaração de um namespace Conforme a representação da Figura 14, na linha 1 é declarado o namespace através da variável (prefixo) <ep> que terá como valor a sintaxe do esquema representado no namespace e há também a representação do atributo <xmlns> seguido de um URI que identifica a localização da sintaxe. Dessa forma, é possível fazer qualquer associação em um determinado documento a um elemento qualquer representado em uma outra localidade, através da variável que recebeu como valor do namespace em questão. A Figura 15 demonstra como seria essa associação. 31 Figura 15: Esquema de utilização de um namespace em um documento XML. A Figura 16 mostra como o elemento de um esquema pré-definido pode ser utilizado em um documento XML. Figura 16: Documento XML que utiliza os elementos pré-definidos em um namespace. Na linha 1 da Figura 16 todos os elementos <http://www.ulbra-to.br/XML/esquemas/produto#> contidos no poderão URI ser referenciados ao longo de todo o documento XML através do atributo <ep>. As linhas 3 e 4 referenciam os elementos <descricao> e <valor>, contidos no namespace associado ao prefixo <ep>. As seções subseqüentes apresentarão a utilização de namespace declarando e utilizando sintaxe de modelos já estruturados e disponíveis na web. 2.4 Resource Description Framework RDF é uma recomendação da W3C (World Wide Web Consortion) que apresenta uma nova forma de descrição dos dados na web. Para que o modelo de dados RDF possa 32 ser representado, foi adotado o conceito de metadados, de forma a possibilitar a descrição de recursos e, com isso, propiciar uma semântica aos mesmos. Esse modelo teve grande aceitação dentre as ferramentas que proporcionam a resolução da interoperabilidade em diversas plataformas devido a sua arquitetura genérica de metadados, permitindo, assim, a descrição dos recursos no contexto web através de padrões de metadados (LASSILA 1999). Como o RDF é um modelo, há a necessidade de utilização de uma linguagem para que o mesmo possa ser representado. Para isso, foi adotada pela W3C a linguagem XML, pois a mesma demonstra algumas facilidades. Dentre elas destaca-se: a facilidade de estruturação dos documentos, pois os elementos que compõem so documentos XML podem ser criados de acordo com que seja necessidade. O modelo RDF encontra-se definido em dois documentos: Resource Description Framework (RDF) Model and Syntax Specification (LASSILA, 1999), que descreve o modelo de dados RDF e Resource Description Framework (RDF) Schema Specification (BRICKLEY, 2000), que descreve as primitivas de modelagem utilizadas para a descrição de um domínio particular de interesse. Estas especificações são descritas na próxima seção. 2.4.1 Modelo Básico RDF O modelo RDF básico destaca-se pela simplicidade com que busca estruturar o conteúdo de uma página web. Para que o modelo possa ser visualizado e representado, são utilizados grafos rotulados que são construídos com a utilização de três objetos. Esses objetos são descritos a seguir: • Resources (recursos): Os recursos representam o universo de objetos que podem ser descritos pelo modelo RDF. Uma página inteira da web ou uma parte dela; uma coleção de páginas; ou um objeto que não é diretamente acessível via web, por exemplo, um livro impresso. Para cada recurso é associado um identificador único (URI) de forma a poder identificá-lo posteriormente. • Properties (propriedade): representam os aspectos do recurso a serem 33 descritos. Propriedades podem ser visualizadas como atributos (características) de recursos. Também são utilizadas para descrever relacionamento entre recursos. Neste sentido, o modelo de dados RDF assemelha-se ao modelo Entidade-Relacionamento. Cada propriedade tem um significado específico, definem seus valores permitidos, os tipos de recursos que podem descrever, e seus relacionamentos com outras propriedades. • Statements (sentenças): representam a relação entre um recurso, uma de suas propriedades e o valor que essa propriedade pode assumir, ou seja, é uma espécie de declaração de um recurso contendo um nome, uma propriedade e um valor agregado. Estas três partes da sentença (tripla) são chamadas respectivamente de predicate (propriedade), subject (recurso) e object (valor de uma propriedade). E a notação utilizada para representação dessa tripla é: (predicate, [subject], [object]). “Com isso, as sentenças conseguem representar essa interligação entre o recurso, suas propriedades e seus valores (NOLETO, 2003)” . A Tabela 3 ilustra a construção de uma sentença que descreve que o recurso, um documento da web e de URI http://www.ulbra-to.br/exemplos/, possui uma propriedade http://purl.org/dc/elements/1.1/creator, cujo valor é uma string (literal) "Priscilla de Mello". Tabela 3: Sentença dividida em partes Subject (Resource) http://www.ulbra-to.br/exemplos Predicate (Property) http://purl.org/dc/elements/1.1/creator Object / Literal "Priscilla de Mello" As sentenças também conferem ao modelo de dados RDF a qualidade de ser compreendida tanto por seres humanos, uma vez que a sentença da Tabela 3 pode ser interpretada como “Priscilla de Mello é a criadora do recurso http://www.ulbrato.br/exemplos”, bem como por máquinas, que têm acesso a uma representação formal deste modelo. Além do formato de tripla, conforme ilustra a Tabela 3, o modelo de dados também 34 pode ser visualizado na forma de um grafo, que consiste de um conjunto de nós conectados por arcos rotulados, onde os nós representam os recursos web, os arcos representam as propriedades destes recursos e os retângulos representam os literais (String) (MANOLA, 2004). A Figura 17 demonstra a sentença da Tabela 3 nas formas de um grafo e de uma tripla respectivamente na parte 1 e 2. Figura 17: Representação de uma sentença: grafo e tripla Agora, considerando o caso em que há a necessidade de representar características mais específicas sobre o criador desse recurso. O indivíduo cujo nome é Priscilla de Mello com email <[email protected]> é a criadora do recurso http://www.ulbra-to.br/exemplo/. A intenção dessa sentença é fazer com que o valor da propriedade Creator seja uma entidade estruturada. Em RDF uma entidade é representada por outro recurso. A sentença acima não nomeia o recurso, portanto a Figura 18 demonstra um diagrama tendo um recurso representado por uma elipse vazia. 35 Figura 19: Propriedade com valor estruturado usando um nó vazio Para que possa ser associado um URI ao recurso anônimo ramificado poderia ser utilizado um atributo identificador <ID> advindo de uma base conforme exemplificado na Figura 20. Figura 20: Propriedade com valor estruturado Com isso, o modelo RDF permite que um dado recurso possa abrir novas ramificações, especificando o modelo num contexto geral de forma mais detalhada. Ou seja, a indicação do arco criador aponta para um novo recurso que, representado por um 36 URI, faz junção através de novos arcos de propriedades com os seus respectivos objetos. 2.4.1.1 XML como linguagem de Especificação da Sintaxe RDF Como RDF é um modelo, faz-se necessário o uso de uma linguagem para sua representação A Figura 21 exemplifica o padrão utilizado para descrição do formato RDF. Figura 21: Formato de representação de dados em RDF De acordo com a Figura 21 inicialmente (linha 1) define-se o tipo da classe que será descrita. Depois é atribuído um valor ao atributo <rdf:ID> como forma de identificação do recurso e, após isso (linha 5 a 7), são inseridas as propriedades e os respectivos valores, descrevendo, dessa forma, as características do recurso. Para que o modelo possa ser representado, a XML dispõe de duas sintaxes: serializada e abreviada. Os exemplos utilizados nos tópicos 2.4.1.1.1 e 2.4.1.1.2 são baseados na sentença da Figura 22. Figura 22: Sentença em forma de tripla 2.4.1.1.1 Sintaxe Serializada 37 Essa forma de representação permite expressar toda a potencialidade do modelo RDF. A Figura 23 ilustra como a sentença pode ser representada de forma serializada em XML. Figura 23: Serialização em XML de um recurso RDF Nas linhas 2 e 3 são declaradas as variáveis de namespaces “RDF:” e “dc”, que utilizadas no documento XML especificarão a localização de um novo vocabulário. Na linha 6 há a declaração do atributo <about> com valor “http://www.ulbra- to.br/exemplo/2010” que determina o URI do recurso a ser descrito. Em seguida na linha 7 há a declaração da tag de abertura “dc:creator”, que indica quem é o criador do recurso, ou seja, uma String de valor “Priscilla de Mello”. Com isso, tem-se a descrição de um recurso com algumas informações relevantes para o entendimento de sua semântica. 2.4.1.1.2 Sintaxe Abreviada Já essa forma de representação inclui construtores adicionais de tal forma que o modelo RDF possa ser representado de maneira mais compacta. A Figura 24 ilustra a representação da sentença utilizando a serialização em XML de forma abreviada. Figura 24: Serialização em XML de um recurso RDF de forma abreviada 38 A sentença descrita na Figura 24 é equivalente à representada na Figura 23, pois mesmo que sejam descritas de maneiras diferentes, ao final provocarão o mesmo resultado a uma aplicação. 2.4.2 Primitivas do modelo As propriedades de um objeto têm a responsabilidade de descrever características adicionais sobre o mesmo, ou seja, são qualificados valores às propriedades, nomeando-as com unidade de medidas de um vocabulário qualquer (MARINO, 2001). Para que os recursos do modelo de dados RDF possam ser descritos de forma clara e objetiva, foram criadas algumas definições que serão abordadas nos tópicos seguintes. 2.4.2.1 O Elemento <rdf:RDF> Para que um documento RDF com mais de uma sentença seja descrito, é obrigatória a utilização do elemento <rdf:RDF>. A Figura 25 mostra um exemplo de um documento RDF com apenas uma sentença, dessa forma o elemento <rdf:RDF> se torna opcional. Figura 25: Representação de uma sentença sem o elemento <rdf:RDF> 2.4.2.2 Descrição (atributo Description / <rdf:Description>) O atributo <rdf:Description> identifica o sujeito (subject) de uma sentença. Esse elemento pode conter alguns elementos e/ou atributos: URI do recurso que está sendo descrito, representação das propriedades, sentenças aninhadas, além de atributos e recursos 39 anônimos (AHMED, 2004). Dentre os atributos existentes para descrição do elemento <rdf:Description>, os mais importantes são: <rdf:about>, <rdf:ID>, <rdf:type>. A Figura 26 demonstra a representação desse elemento. Figura 26: Representação do elemento <rdf:Description> Conforme pode ser visualizado na linha 07, o elemento <dc:Creator> pode ser entendido como um atributo de <rdf:Description> ou seu elemento filho, de acordo com a representação hierárquica de um documento XML. 2.4.2.3 Identificação sobre (atributo about / <rdf:about>) O atributo <rdf:about> tem como conteúdo um URI que é utilizado como um identificador único de recursos e propriedades. Quando em um dado recurso diz-se que o atributo <rdf:about> possui um determinado URI, isso não implica dizer que o recurso ou propriedade esteja naquela localidade. Os URIs para as sentenças podem ser relativos ao documento que contém as sentenças, ou seja, um recurso pode ser referenciado mesmo que esteja contido em outro documento. Figura 27: Representação do elemento <rdf:about> 40 2.4.2.4 Identificação (atributo ID / <rdf:ID>) Assim como o atributo <rdf:about>, o atributo <rdf:ID> tem a função de identificar um recurso. Com a diferença que o atributo <rdf:ID> permite a criação de um recurso local sobre o qual podem ser feitas novas sentenças, além de permitir também a utilização da sintaxe abreviada, ou seja, permite utilizar URI abreviado caso o recurso que esteja sendo referenciado faça parte do documento que contém o metadado. É importante ressaltar que, os atributos <rdf:about> e o <rdf:ID> são mutuamente exclusivos, ou seja, somente um pode ser utilizado no elemento <rdf:Description>. Figura 28: Representação do atributo <rdf:ID> 2.4.2.5 Tipo (atributo type / <rdf:type>) Esse atributo permite indicar que o referido recurso é de um tipo específico. Os tipos permitidos são: numérico, texto ou um tipo de um recurso já existente. Quando o atributo <rdf:type> é utilizado, uma relação binária entre dois elementos é estabelecida. Essa relação é análoga ao mecanismo de instanciação da orientação a objetos. A Figura 29 mostra essa relação. 41 Figura 29: Grafo da definição de um tipo A Figura 30 ilustra a representação do atributo <rdf:type> serializada em XML. Figura 30: Representação do atributo <rdf:type> Na linha 6 é utilizado o caractere “#”, que funciona como um delineador ou indicador de fragmento e, segundo (MARINO, 2001), tem como função referenciar o aparecimento de um componente dentro do recurso. Com isso, todas as propriedades que referenciam o recurso estabelecem um relacionamento com a parte referenciada. Uma segunda forma de representação do atributo <rdf:type> é utilizá-lo como atributo do elemento <rdf:Description>. A Figura 31 ilustra como seria essa representação. Figura 31: Representação do atributo <rdf:type> como atributo do elemento <rdf:Description> 42 Além das duas formas de representação supracitadas, há uma terceira, essa utiliza o mecanismo de namespace. A Figura 32 demonstra como é essa representação. Figura 32: Representação do atributo <rdf:type> com o mecanismo de namespace 2.4.2.6 Conjunto ou lista (Containers) Os containers são coleções utilizadas para representar conjunto de recursos ou literais. Por exemplo, para demonstrar que um determinado trabalho foi criado por mais de uma pessoa, ou então dizer que uma lista de estudantes pertence a um curso. Para que essas listas possam ser representadas, o modelo RDF provê três tipos de coleções: bag, sequence e alternative. 2.4.2.6.1 Coleção Bag (<rdf:Bag>) A coleção Bag é utilizada para declarar propriedades com múltiplos valores, não importando a ordem em que os valores são apresentados. A Figura 33 demonstra a representação de uma coleção utilizando a lista Bag. 43 Figura 33: Representação do elemento bag Nas linhas 8, 9 e 10 é utilizado o elemento <rdf:li> que é responsável por representar os membros da coleção correspondente. 2.4.2.6.2 Coleção Sequence (<rdf:Seq>) Essa coleção possui as mesmas funções do elemento Bag no que diz respeito à representação de múltiplos valores para uma determinada propriedade e diante da possibilidade de a coleção assumir valores duplicados. A diferença é que os elementos representados na lista devem estar representados em ordem ascendente. A Figura 34 ilustra a representação do elemento Sequence. Figura 34: Representação do elemento Sequence 2.4.2.6.3 Coleção Alternative (<rdf:Alt>) 44 Assim como as demais listas acima, a coleção alternative permite a representação de objetos ou recursos. As diferenças são que: essa permite declarar apenas um valor a uma propriedade e não permite valores duplicados. A Figura 35 ilustra a representação do elemento Alternative. Figura 35: Representação do elemento Alternative 2.4.2.6.4 Comparação entre as Coleções Após a explanação das coleções que o modelo RDF dispõe pode ser realizada uma breve comparação entre as mesmas, conforme a Tabela 4 ilustra. Tabela 4: Comparação entre os tipos de Coleções providas pelo modelo RDF (BRAGANHOLO, 2001). Ordenação Duplicação Propriedade Multivalorada Bag Não Sim Sim Sequence Sim Sim Sim Alternative Não Não Não 2.4.2.7 O Mecanismo de Reificação Para que as características de um determinado recurso possam ser descritas, baseadas na arquitetura RDF, sempre é estabelecida uma relação binária (propriedadevalor). Esse valor pode ser tanto um literal quanto um outro recurso. Quando esse valor se 45 trata de um recurso obtém-se então o mecanismo de reificação, já que a descrição final do recurso terá como resultado uma sentença sobre outra sentença. Para que a reificação possa ser representada, o modelo RDF provê quatro propriedades: • subject: identifica o recurso que está sendo descrito pela sentença modelada; • predicate: identifica a propriedade que está sendo descrita pela sentença modelada; • object: identifica o valor da propriedade na sentença modelada; • type: descreve o tipo do novo recurso. Todas as sentenças reificadas são instâncias de <rdf:statement>. A Figura 36 ilustra a reificação de uma sentença RDF. Figura 36: Representação de um código RDF reificado A Tabela 5 apresenta o resultado obtido através do código demonstrado na Figura 36. Duas sentenças são demonstradas: a segunda, que apresenta a reificação, é representada por <http://www.ulbra-to.br/exemplos/2010>, que possui o predicado <creator> e um objeto <http://www.ulbra- to.br/exemplos/pessoalPage.htm>) (primeira sentença), que possui duas propriedades nome e email, cujo os valores são respectivamente Priscilla de Mello e [email protected] Tabela 5: Resultado da sentença utilizando uma reificação Sentença Sujeito Predicado Objeto 46 1 2 http://www.ulbrato.br/exemplos/pessoalPage.htm http://www.ulbra-to.br/exemplos/2010 Nome creator “Priscilla de Mello” http://www.ulbrato.br/exemplos/pessoalPage.htm 47 2.4.3 RDF Schema RDF Schema estende a potencialidade do modelo RDF básico, através do uso de propriedades que proporcionam formas de interligar os recursos que estão sendo descritos e, com isso, propiciar uma semântica ao esquema representado (BRICKLEY, 2000). A partir disso, é permitida a criação de vocabulários representados por classes e propriedades que tornam possível o seu reaproveitamento em outros modelos. A parte 1 da Figura 37 demonstra a representação de um esquema RDF no formato gráfico. Figura 37: Representação gráfica de uma esquema e sua utilização em um documento RDF Conforme a ilustração da parte 2 da Figura 37, um documento RDF qualquer pode ser originado tendo como base a estrutura representada no esquema pré-definido na parte 1. Nesse caso, foi gerado um documento que descreve as características de um cachorro cujo nome é Bellone que tem como cor e raça os valores Preta e Pastor Belga, respectivamente. Para que haja um entendimento de como um esquema RDF possa ser representado, nas próximas seções serão feitas explanações dos principais elementos que compõem um 48 esquema RDF (classes e propriedades) e das normas que os regem. A Figura 38 representa a hierarquia de classes do esquema RDF. Figura 38: Hierarquia de classes do modelo RDF Schema (BRICKLEY, 2000). Para a definição de classes e propriedades em um esquema RDF é utilizado o modelo padrão RDF/XML. Esse modelo é demonstrado na Figura 39. Figura 39: Modelo RDF/XML utilizado para definição de classes e propriedades Na linha 2, através do atributo <rdf:ID>, é definida a classe que estará sendo descrita. Na linha 3 é declarada a variável que conterá a namespace com a definição do modelo RDF, enquanto na linha 4 é definido o URI do esquema representado. Nas linhas 5 e 6 são definidas as propriedades da classe que está sendo descrita, sendo que as propriedades podem ser tanto um recurso quanto um literal, linhas 5 e 6, respectivamente. 49 2.4.3.1 Classes Classe é um modelo que pode ser originado a partir de uma descrição genérica de recursos individuais pertencente a um dado universo. Após a definição de uma classe, com a utilização do conceito de heranças, subclasses podem ser geradas, que passarão a conter todas as características referentes à superclasse, além das características inerentes a ela. Devido a isso, uma hierarquia é criada entre as classes representadas no esquema, possibilitando assim um reuso de definições já existentes. A Figura 40 demonstra o processo de definição de classes. Figura 40: Processo de definição de classes Conforme representação na parte 1 da Figura 40, um conjunto de classes e propriedades, ou seja, o esquema propriamente dito, é definido dentro do elemento <rdf:RDF>. Nas partes 3 e 4 são definidas as classes que estarão sendo descritas, cachorro e vertebrados respectivamente, através do elemento <rdfs:Class>. E por fim, na parte 5 o elemento <rdfs:subClassOf> determina que a classe cachorro herda todas as características da classe dos “vertebrados”. Esses elementos serão abordados de forma mais clara nas seções subseqüentes. 2.4.3.1.1 <rdfs:resouce> 50 Um esquema RDF corresponde a um conjunto de recursos oriundos de um domínio específico. E para que esse conjunto possa ser representado, tem-se que partir de uma classe genérica, de forma que a mesma comporte todas as outras classes e subclasses definidas no esquema. Figura 41: Representação gráfica de um esquema A Figura 41 representa um esquema hierárquico de uma turma onde a mesma possui um professor em um dado ano e semestre. Nesse caso o recurso que herdará todas as características da classe <rdfs:resource> seria a turma, pois a mesma é entendida como o recurso genérico do esquema em questão. A Figura 42 representa parte do esquema da Figura 41 serializado em XML. Figura 42: Parte do esquema da Figura 41 serializado em XML 2.4.3.1.2 <rdfs:Class> O elemento <rdfs:Class> é utilizado para definição de classes. Ele possui um atributo <rdf:ID> que tem a função de identificar a classe que está sendo descrita. Para a 51 descrição de uma classe podem ser utilizadas duas sintaxes diferentes, ressaltando que essas sintaxes, mesmo sendo descritas de formas diferentes, provocam ao final o mesmo resultado. A Figura 43 representa essas sintaxes. Figura 43: Sintaxes da criação de uma classe Conforme pode ser observado na pate 2 da Figura 43, uma classe pode ser definida através da utilização do elemento <rdf:type> com valor <http://w3.org/2000/01/rdf-schema#Class>, que indica que o recurso que está sendo descrito é uma classe. 2.4.3.1.3 <rdfs:Property> Esse é o elemento utilizado para definir propriedades, ou seja, representa os recursos que são propriedades RDF de um outro recurso. Duas sintaxes diferentes podem ser utilizadas para que as mesmas possam ser descritas e só assim interligadas a uma classe. A Figura 44 representa essas sintaxes. 52 Figura 44: Sintaxes de definição de uma propriedade e seu relacionamento com uma classe Em ambas definições é utilizado o elemento <rdf:ID> como forma de identificar a propriedade que está sendo descrita. Na sintaxe demonstrada na parte 1 da Figura 44 é dito que uma propriedade estará sendo descrita através da classe <rdf:Property>, enquanto a sintaxe representada na parte 2 demonstra que a mesma propriedade pode ser criada através de um recurso, onde o elemento <rdf:type> tem a responsabilidade de representar o que está sendo descrito, que pode ser tanto uma propriedade (parte 2 da Figura 44) quanto uma classe (parte 1 da Figura 44) 2.4.3.2 Propriedades As propriedades expressam características ou aspectos que uma dada classe pode assumir, além de utilizarem também mecanismo para expressar relacionamentos entre as classes. A Figura 45 representa o processo de definição de uma propriedade. 53 Figura 45: Definição de Propriedade O modelo RDF básico provê do elemento <rdf:Property> como forma de representar uma propriedade, enquanto que o RDF Schema dispõe de dois elementos <rdfs:domain> e <rdfs:range> como forma de interligar uma propriedade a uma referida classe. Com isso, conforme representação na Figura 45 da linha 5 a 8, uma propriedade raça do tipo literal é definida como característica da classe Cachorro. 2.4.3.2.1 <rdfs:subClassOf> Esse elemento determina a relação entre classes (subclasse e superclasse). Se for definido um elemento <rdfs:subClassOf> em uma classe subtende-se que um relacionamento é estabelecido entre uma subclasse e uma superclasse (herança simples). Agora, caso mais de um elemento <rdfs:subClassOf> esteja definido em determinada classe, é estabelecido o conceito de herança múltipla. A Figura 46 está dividida em 2 partes. Na primeira parte é estabelecido o conceito de herança simples, na segunda, é demonstrado o de herança múltipla. 54 Figura 46: Exemplo do elemento <rdfs:subClassOf> Na parte 1 da Figura 46, é dito que a classe Cachorro além de possuir as características inerentes a ela, também possui as características da classe dos Vertebrados. A parte 2 da figura mostra o conceito de herança múltipla, pois a classe Cachorro herda as características tanto da classe Vertebrados quanto dos Mamíferos, ou seja, um Cachorro se enquadra em ambas as classes. 2.4.3.2.2 <rdfs:subPropertyOf> 55 O elemento <rdfs:subPropertyOf> determina que uma propriedade é uma especialização de uma outra. Isso implica dizer que é estabelecida uma relação hierárquica entre as propriedades. Para demonstração desse elemento será utilizado o seguinte exemplo: a distância oficial entre a cidade de Palmas e Paraíso é de 62km, enquanto a estimada é de 59km. Para o exemplo em questão, a unidade km se trata de uma propriedade, assim como o valor oficial e o estimado, sendo que essas distâncias (oficial e estimada) herdarão as características da propriedade km. A Figura 47, dividida em partes, demonstra essa relação hierárquica entre as propriedades tanto graficamente quanto serializada em RDF/XML. Figura 47: Hierarquia de propriedades a partir da utilização do elemento <rdfs:subPropertyOf> 2.4.3.2.3 <rdfs:range> O elemento <rdfs:range> é uma instância da classe <rdfs:ConstraintProperty> que tem como funcionalidade especificar que valores uma propriedade pode assumir. Uma propriedade admite apenas um <rdfs:range>, pois a mesma pode ser de apenas um tipo, ou seja, não pode ser multivalorada, por exemplo, não pode assumir valores tipo inteiro e literal simultaneamente. Para 56 representação desse elemento, considerando o exemplo em que se deseja representar uma propriedade km que terá como valor um objeto do tipo inteiro. Figura 48: Representação do elemento <rdfs:range> 2.4.3.2.4 <rdfs:domain> Assim como o <rdfs:range>, o <rdfs:domain> também é instância da classe <rdfs:ConstraingProperty>, pois também tem a função de restringir, só que nesse caso especifica a qual classe uma propriedade está agregada, diferentemente do <rdfs:range> que identifica que valor uma propriedade pode assumir. Para exemplificação desse elemento a Figura 48 representa o exemplo em que uma propriedade km do tipo inteiro relaciona-se com a classe distância. Figura 49: Representação do elemento <rdfs:domain> 2.4.3.3 Representação de uma taxionomia serializada em RDF/XML Após ter sido feita uma explanação a respeito dos principais elementos que compõem o modelo RDF Schema, uma taxionomia pode ser representada a partir da escolha de um domínio. A Figura 49 representa a criação de uma taxionomia serializada em RDF/XML tendo como base o domínio “Reino Animal” representado na Figura 37. 57 Figura 49: Representação de uma taxionomia em RDF/XML A partir do esquema serializado em RDF/XML, representado na Figura 49, que descreve um domínio referente ao reino animal, é possível a criação de sentenças que descrevam recursos pertencentes a esse domínio. 58 2.5 API Jena Jena é uma API (conjunto de classes) Java, desenvolvida pela HP, que possibilita a construção de aplicações para web semântica. Essa API propicia um ambiente para trabalhar com RDF, RDFS e OWL (MCBRIDE, 2004). Dentre todos os recursos oferecidos, serão mostrados aqui somente alguns conceitos fundamentais para a criação e manipulação de grafos RDF. Para isso a API disponibiliza algumas classes que tornam possível a manipulação de recursos, propriedades e literais. As interfaces que representam os recursos, propriedades e literais são respectivamente chamadas de: Resource, Property e Literal. Na Jena um grafo é chamado de “modelo”, representado pela interface Model. O processo de geração de documentos RDF a partir da utilização da API Jena é feito da seguinte forma: Passo 1: Inicialmente instancia-se um objeto da classe ModelMem, que conterá um grafo vazio e que estará disponível apenas em memória, ou seja, existirá apenas durante o processo de execução do programa. Passo 2: Conforme citado no Passo 1, o grafo criado, ainda vazio, precisa de recursos para que seja possível a manipulação do modelo RDF. Para isso o mesmo pode ser feito através do método createResource disponibilizado pela classe ModelMem. Passo 3: Após a criação do recurso, faz-se necessária a inserção de propriedade(s) no mesmo, e com isso é(são) propiciada(s) característica(s) ao recurso criado. Seguindo os passos (1, 2 e 3) anteriormente mostrados, serão feitas demonstrações de exemplos de códigos Java, que terão sempre ao final de sua execução a geração de um documento RDF. 59 Figura 50: Exemplo de criação de um documento RDF simples Da linha 01 até a linha 03 são importadas as classes que serão utilizadas no decorrer da implementação (código Java). Na linha 16 é criado um modelo vazio, que passará a não ser vazio a partir das linhas 17, 18 e 19, onde são criados e adicionados ao modelo: um recurso <http://www.ulbra-to.br/exemplo/2010> e uma propriedade <nome>, cujo valor é um literal “Priscilla de Mello”. Ao final, na linha 20, o modelo criado foi impresso a partir da utilização do método write do objeto objModelo. Figura 51: Resultado obtido a partir da execução do código demonstrado na Figura 50. No exemplo demonstrado na Figura 50, foi criada uma tripla: recurso, propriedade com seu respectivo valor (um literal). Agora, considerando que a sentença criada seja de um tipo específico, o código da Figura 52 mostra qual seria o procedimento necessário para definição de tipagem. 60 Figura 52: Exemplo de definição de tipagem para um dado recurso A diferença do código apresentado na Figura 50 para o demonstrado na Figura 53, é que no primeiro (Figura 50) durante a criação do recurso, linha 17, é passada uma String por parâmetro, determinando assim o URI do mesmo, enquanto o segundo (Figura 52) é passado por parâmetro um outro recurso, dessa forma é dito que o recurso que está sendo criado é do tipo do que foi passado por parâmetro, nesse caso em específico, tipo pessoa. A Figura 53 mostra o documento RDF gerado a partir da execução do código demonstrado na Figura 52. Figura 53: Resultado obtido a partir da execução do código demonstrado na Figura 52. No exemplo subseqüente, Figura 54, é demonstrado um código Java que cria um documento RDF contendo um recurso que, além de possuir uma propriedade com um valor 61 literal, possui também uma segunda propriedade (endereco) contendo um recurso como valor. Dessa forma o resultado final obtido será uma sentença sobre outra sentença. Figura 54: Criação um recurso com uma propriedade tendo como valor um outro recurso A Figura 55 demonstra o documento RDF gerado a partir da execução do documento Java demonstrado na Figura 54. Figura 55: Resultado obtido a partir da execução do código demonstrado na Figura 54. 62 Tendo como base os exemplos demonstrados anteriormente, torna-se possível então a criação de documentos RDF a partir de quaisquer dados de entrada. É importante ressaltar que os documentos criados estão armazenados apenas na memória e, caso haja necessidade de guardar esses documentos, os mesmo devem ser armazenados fisicamente. 2.6 Considerações Para que pudesse haver um melhor entendimento a respeito da tecnologia JSP, foi mostrado inicialmente na seção 2.1, o que é, e como é o funcionamento de um Servlet, que é o fundamento básico para a tecnologia JSP, já que JSP é uma extensão da tecnologia Servlet. Logo em seguida, na seção 2.2, foram mostrados alguns conceitos da tecnologia JSP, que vão desde a sua importância, funcionamento básico, demonstração de expressões, declarações e diretivas, até a demonstração dos objetos pré-definidos (objetos utilizados para desenvolvimento de páginas web). Como RDF é um modelo que utiliza a linguagem XML para ser representado, na seção 2.3 é feita uma breve explanação a respeito dos conceitos da linguagem de marcação XML. A XML também dispõe de um recurso importantíssimo que possibilita o compartilhamento de recursos: namespace. Na seção 2.4 são demonstrados os conceitos do modelo RDF através de exemplos elucidativos, que buscam, assim, fazer com que o leitor compreenda quais são os recursos oferecidos pelo modelo e a partir disso criar documentos RDF. E, por fim, na seção 2.5, dentre os diversos reursos oferecidos pela API Jena, foi demonstrado, através de exemplos, como é o procedimento de criação (implementação) de um documento RDF e os resultados finais obtidos. 63 3 MATERIAIS E MÉTODOS Para o desenvolvimento do referido trabalho foram utilizados diversos recursos bibliográficos, de hardware e software, que aliados às orientações permitiram a finalização do mesmo. 3.1 Local e Período Este trabalho foi desenvolvido durante o primeiro semestre de 2004, como parte da disciplina “Prática em Sistemas de Informação I”. Os locais utilizados para sua elaboração foram os laboratórios de informática do curso de Sistemas de Informação, sendo que os mais utilizados foram o Laboratório de Inteligência Computacional (Linc) e Núcleo de Desenvolvimento de Software (NDS) do Centro Universitário Luterano de Palmas. Bem como, destacando também, a utilização de um computador pessoal. 3.2 Materiais Os recursos utilizados para o desenvolvimento do trabalho foram disponibilizados pelo próprio curso Sistemas de Informação do CEULP/ULBRA em seus laboratórios, tais como hardware e software licenciados. As demais ferramentas free foram adquiridas via Internet. 64 3.2.1 Hardware Pentium III, 750 Mhz e 128 Mb de RAM (Disponível no laboratório); Pentium IV, 2.4 Ghz e 256 Mb de RAM (Disponível no laboratório); 3.2.2 Software Microsoft Windows 2000 Professional; Microsoft Office 2000 Professional; Internet Explorer 6.0; Acrobat Reader 6.0; Corel Draw 11 Macromedia Fireworks MX Sun WebServer 6.1 Máquina Virtual Java (j2sdk 1.4.0 ) 3.2.3 Fontes Bibliográficas Livros Dissertações de Mestrados; Trabalhos de Conclusão de Curso; Publicações Científicas; Artigos; Site da W3C (World Wide Web Consortium) (W3C, 2004); Sites diversos. 3.3 Metodologia Diversas pesquisas foram realizadas, de maneira que permitisse oferecer uma sustentação teórica necessária para a conclusão do presente trabalho. Assim, foram 65 abordados conceitos e técnicas alusivas ao escopo do trabalho, para que fosse possível desenvolver um sistema que possibilitasse a descrição de imagens, como forma de concretização dos conceitos explanados na Revisão de Literatura. Foi estabelecido também um cronograma de estudos para o desenvolvimento do referido trabalho, sendo que o mesmo é apresentado na Tabela 6. 66 Tabela 6: Cronograma de atividades Data 22/3/2004 29/3/2004 Atividade Aprendizado sobre RDF: o que é, qual sua importância, elementos disponíveis para criação de um documento RDF. Baseado na fundamentação teórica: construir documentos RDF para esclarecer os conceitos estudados anteriormente. Depois de fazer um estudo dos conceitos básico do modelo RDF, fazer a documentação 5/4/2004 (revisão de literatura) sobre o RDF e RDF Básico, além da linguagem XML que serializa o modelo. Aprendizado de RDF Schema: realizar pesquisas e leitura do material fornecido pelo site 12/4/2004 da W3C e também de livros e dissertações. E, a partir disso, será utilizado esses conceitos para criação de um esquema que represente o domínio do referido trabalho. 19/4/2004 Tendo como base os conceitos adquiridos até o momento, será feita a revisão de literatura sobre RDF Schema. Aprendizado sobre a tecnologia JSP: processamento de dados de formulários, interação 26/4/2004 com o usuário, manipulação de sessão, o que é, e para que serve uma diretiva, expressões e utilização dos objetos implícitos. Fazer a devida documentação a respeito dos referidos conceitos. Aprendizado sobre API Jena (API Java desenvolvida pela HP para manipulação dinâmica de documentos RDF): qual sua importância, para que serve, e como deve ser 3/5/2004 utilizada, sendo que para isso devem implementados exemplos de códigos Java que criem documentos RDF. Realizar também a devida documentação a respeitos dos recursos oferecidos pela mesma para manipulação de documentos RDF. 10/5/2004 17/5/2004 24/5/2004 31/5/2004 7/6/2004 Definir como será o esquema de funcionamento do sistema, ou seja, etapas para descrição de uma determinada imagem. Definir como será a forma de armazenamentos dos documentos RDF, para que, num processo futuro, o processo de busca possa ser facilitado. Definir a interface: a interface deverá ser preparada para suportar a descrição de documentos de acordo com o esquema previamente definido. Depois de todos os conceitos adquiridos anteriormente, o sistema deverá ser então implementado. Fazer a devida documentação a respeitos dos resultados obtidos, os testes na aplicação desenvolvida e correções no relatório final. 67 4 RESULTADOS E DISCUSSÃO A presente seção tem o objetivo de, a partir dos conceitos apresentados anteriormente, mostrar um sistema que foi desenvolvido para construção de documentos RDF que descrevam imagens referentes ao âmbito institucional, no caso em questão: CEULP/ULBRA. O sistema foi implementado em JSP, sendo que, o que motivou a escolha dessa tecnologia, foi o fato de a mesma ser uma tecnologia para web, além de trabalhar com a linguagem Java, pois há uma API Java disponível para manipulação de documentos RDF. Para tanto, foi desenvolvido um esquema do sistema, além de um conjunto de regras estabelecidas para descrição das imagens, que serão apresentadas nas seções seguintes. 4.1 O Sistema Para que haja um melhor entendimento, por parte do leitor, foi desenvolvida uma representação gráfica dos passos necessários para a descrição das imagens, que vão desde a digitalização até a descrição da mesma, através de um documento RDF, de forma transparente ao usuário. Transparente, no sentido de que o mesmo não conhece a estrutura interna de criação e armazenamento dos documentos RDF responsáveis pela descrição das imagens. 68 Figura 56: Etapas possíveis para descrição das imagens. De acordo com a Figura 56, inicialmente um usuário pode digitalizar a imagem (passo 1), e com isso disponibilizá-la em algum meio físico de armazenamento (passo 2). A partir da imagem armazenada, o usuário, através do browser¸ pode acessar o sistema que foi desenvolvido e informar os dados referentes à imagem em questão, objetivando assim descrevê-la (passo 3). A partir da confirmação do usuário para a respectiva descrição (passo 4), a imagem é então enviada e armazenada no servidor, juntamente com a descrição equivalente, ou seja, o documento RDF. 69 4.2 RDF Schema na Criação de um Conjunto de Regras para Descrição das Imagens Baseado nos conceitos apresentados na seção 2.4.3, sobre RDF Schema, que possibilita a representação de vocabulários diante da especificação de um domínio, foi desenvolvido um esquema que representa as regras de criação de um documento RDF. A Figura 57 demonstra esse esquema serializado em RDF/XML. Figura 57: Esquema que representa as imagens referentes ao domínio “Instituição de Ensino Superior”. 70 Seguindo a representação do esquema serializado em RDF/XML (Figura 57), das linhas 04 a 07 está sendo definida a classe maior, que herda todas as características de Resource, ou seja, todas as ramificações do esquema partirão dessa classe, que é a genérica. Para que possa haver um vínculo entre a figura (.jpeg) e o documento RDF que está descrevendo-a, foi criada uma propriedade localFisico, que armazenará o caminho da imagem equivalente, conforme pode ser observado das linhas 08 a 12 da Figura 57. As imagens podem pertencer a dois âmbitos na instituição: o acadêmico e o administrativo. Para tanto, foram criadas, respectivamente as classes Curso (linha 13 a 16) e setorAdministrativo (linha 27 a 30). O que há nos cursos, tanto de graduação, quanto de pós-graduação, está sempre ligado às atividades de ensino, pesquisa e extensão. Devido a isso, foi criada uma propriedade atividadeNoCurso que é utilizada para representar tais atividades, conforme pode ser visualizado na linha 22 a 26. Após a determinação da atividade, a imagem pode estar ligada a uma pessoa ou a uma estrutura física. Para os casos em que seja uma pessoa, foi criada uma classe Pessoa (linha 36 a 40), sendo que essa pessoa pode ser de um dos três tipos: “docente”, “discente” e “funcionário administrativo”. Por isso, da linha 41 a linha 45 foi criada uma propriedade tipoPessoa que se relaciona com Pessoa. Se a pessoa for do tipo “docente”, estará implícito que é um professor, e que também poderá possuir um cargo (linha 46 a 50), assim como, um “funcionário administrativo”. Da mesma forma, os discentes são compreendidos, com a diferença que os mesmos não terão um cargo, porém (em alguns casos) exercerão uma determinada função (linha 51 a 55) na instituição, tais como: estagiário ou monitor. Se a imagem for uma estrutura física, a mesma possuirá apenas um valor literal, que representará uma descrição (linha 31 a 35). Assim como a propriedade pessoa está relacionada com o setor acadêmico, ela também se relaciona com “setor administrativo” (linha 39), com a diferença que a última citada possui uma propriedade cargo, diferentemente do acadêmico, em que poderia possuir um cargo ou uma função. Da mesma forma, a propriedade que determina a descrição da estrutura física (estruturaFisica) também está agregada tanto ao setor acadêmico quanto ao administrativo (linha 34). A Figura 58 representa o esquema serializado em RDF/XML da Figura 58 no formato de grafo. 71 Figura 58: Grafo do esquema da Figura 57. Segundo (NOLETO, 2003), um grafo RDF Schema (Figura 58) serve para visualizar e auxiliar na definição de um modelo em que as classes (recursos) podem ser representadas por nós, as propriedades pelas arestas e o tipo que essa propriedade pode assumir é representada por um retângulo. Assim, através da aresta, pode-se fazer uma ligação entre as classes representando uma relação de hierarquia, uma ligação entre classe e tipo da propriedade, para determinar o tipo que uma propriedade pode assumir. 4.3 Representação do Vocabulário em uma Classe Java De acordo com os exemplos demonstrados na seção 2.5, os recursos com suas respectivas propriedades são criados e armazenados em um modelo na memória. Isso pode ser observado como um problema, tendo em vista a portabilidade. Dessa forma, torna-se inevitável a duplicação do modelo, haja vista a inexistência de um prefixo de namespace dinâmico de forma a tornar ineficaz a reusabilidade do código em outros documentos (NOLETO, 2003). Para isso, segundo representação da Figura 59, uma classe Java foi 72 criada com o intuito de representar o vocabulário criado e serializado em RDF/XML (Figura 57), e a partir dessa representação o cliente (desenvolvedor) pode reutilizar o esquema criado de acordo com as suas necessidades. Figura 59: Criação de um vocabulário em uma classe Java: utilizando a API Jena. Conforme pode ser observado (Figura 59), inicialmente (linha 01) é definido a que pacote pertence a classe que está sendo implementada, logo em seguida (linha 12) é instanciada uma variável do tipo String que contém a namespace à qual os recursos e as 73 propriedades serão posteriormente associados. Da linha 17 a 41 é feita a declaração das propriedades e dos recursos, e um pouco mais adiante, linha 47 a 59, é feita a associação dos recursos e das propriedades anteriormente declarados a namespace do referido vocabulário. 4.4 Utilizando o Vocabulário representado em uma Classe Java para Criação de um Documento RDF. Com o intuito de demonstrar a utilização da classe Java, criada na seção 4.3, para representação de um vocabulário, a Figura 60 apresenta um código que terá ao final de sua execução a criação de um documento RDF. 74 Figura 60: Código Java de criação de um documento RDF a partir do esquema representado na seção 4.3. De acordo com o código representado na Figura 60, na linha 04 é importada a classe que contém a definição do vocabulário e, a partir disso, o esquema pertinente a ela poderá ser utilizado durante o processo de implementação. Conforme pode ser observado da linha 32 a 37, um recurso e algumas das propriedades definidas anteriormente estão sendo utilizados para a criação de um novo documento RDF. A Figura 61 apresenta o documento RDF gerado a partir da execução do código demonstrado na Figura 60. 75 Figura 61: Documento RDF gerado a partir da execução do código Java demonstrado na Figura 60. 4.5 Processo de Armazenamento das Descrições das Imagens De acordo com a representação do esquema, na seção 4.2, uma propriedade localFisico foi criada para estabelecer um vínculo entre a imagem (figura .jpeg) e sua descrição equivalente (.rdf). Além disso, foi criada uma hierarquia de pastas, obedecendo a estrutura estabelecida pelo esquema, com o objetivo de estabelecer uma organização para o armazenamento dos documentos RDF. A estrutura hierárquica pode ser observada na Figura 62. 76 Figura 62: Estrutura hierárquica de armazenamento dos documentos RDF. Conforme foi dito anteriormente, a estrutura hierárquica das pastas foi criada de acordo com a definição do esquema, por isso, pode ser observado que há duas pastas genéricas: curso e setorAdm. Na pasta curso há mais um nível, em que o mesmo é subdividido em graduaçao e posGraduacao, sendo que ambos contêm seus respectivos cursos e cada um dos cursos contém mais um nível: estruturaFisica e pessoa. O nível setorAdm é subdividido apenas em estruturaFisica e pessoa . 77 Para que a aplicação, num processo futuro, não tenha a necessidade de pesquisar em todos os documentos e de conhecer a estrutura física que armazena os documentos RDF, foi criado um documento RDF intermediário, que tem a responsabilidade de guardar os nomes dos documentos criados, pertinentes a cada uma das ramificações da estrutura hierárquica. Partindo-se do pré-suposto que o único documento criado foi o demonstrado na Figura 60, o documento intermediário estaria organizado da seguinte forma (Figura 63). Figura 63: Documento que armazena o nome dos arquivos RDF que descrevem as imagens: de acordo com a posição ocupada pelos mesmos no esquema. Como foi criado um único documento RDF, o arquivo intermediário contém apenas um recurso, sendo que esse recurso possui um URI com valor “curso/graduacao/SistemasDeInformacao/pessoa”, ou seja, todos os documentos RDF associados a esse recurso, através da propriedade arquivo, são de uma pessoa do curso de graduação de Sistemas de Informação 4.6 Classe Criada para Implementação do Sistema Durante o processo de desenvolvimento do sistema, observou-se a necessidade de criação de apenas uma classe Arquivo, que permite ao desenvolvedor trabalhar fisicamente com os documentos RDF, já que para manipular os mesmos em memória existem as classes disponibilizadas pela API Jena. Os métodos pertinentes a referida classe estão sendo demonstrados na Tabela 7. 78 Tabela 7: Relação dos métodos da classe Arquivo. Assinatura Retorno Métodos e Parâmetros Boolean verificarArquivoExiste(String nomeArquivo) boolean gravarArquivo(String, Model) boolean gravarArquivo(String, RDFWriter writer, Model) Model carregarArquivo(String nomeArquivo) int pegarNovoArquivo(String) File[] pegarConjuntoArquivos(String) Nas seções subseqüentes é feito um breve comentário a respeito de cada um desses métodos, além do código Java que os implementam. 4.6.1 Método verificarArquivoExiste(String) Esse método é utilizado para verificar se um determinado arquivo existe ou não em um local especificado pelo usuário (desenvolvedor), sendo que tanto o nome do arquivo, quanto o local são passados por parâmetro numa única string. O mesmo é utilizado para verificar se o documento RDF intermediário existe. Se não existir, o mesmo deverá ser então criado e, caso contrário, ele deverá ser apenas alterado. O código que implementa esse método é apresentado na Figura 64. 79 Figura 64: Código Java que implementa o método verificarArquivoExiste (String) 4.6.2 Método gravarArquivo(String, Model) Esse método é utilizado para gravar um novo arquivo RDF, que recebe por parâmetro o nome do arquivo e o objeto Model, que contém o modelo RDF. Esse método é utilizado quando o documento RDF intermediário é gravado. Seu código pode ser visualizado na Figura 65. Figura 65: Código Java que implementa o método gravarArquivo (String, Model) 4.6.3 Método gravarArquivo (String, RDFWriter, Model) Conforme pode ser observado, esse método possui a assinatura diferente do apresentado na seção 4.6.2. Isso se deve ao fato de o mesmo possibilitar a alteração do(s) prefixos(s) da(s) namespace(s) do documento RDF, antes que o arquivo possa ser então armazenado em uma memória física. Esse método é utilizado durante o processo de armazenamento dos documentos RDF que descrevem as imagens, tendo em vista que o prefixo da namespace é alterado para “imagem”. O código que implementa esse método pode ser visualizado na Figura 66. 80 Figura 66: Código Java que implementa o método gravarArquivo (String, RDFWriter, Model) 4.6.4 Método carregarArquivo(String) A partir do nome do arquivo, juntamente com seu caminho físico, esse método, quando invocado, retornará um objeto Model, ou seja, passará o conteúdo do arquivo RDF para a memória, fazendo com que o mesmo possa ser então alterado e posteriormente re-armazenado. O presente método é utilizado para realizar alteração no documento RDF intermediário, tendo em vista que o mesmo já exista. Na Figura 67, pode ser visualizado o código que implementa o presente método. Figura 67: Código Java que implementa o método carregarArquivo(String) 4.6.5 Método pegarNovoArquivo (String) Antes que um novo arquivo possa ser gerado, o mesmo precisa ser associado a um identificador, pois não pode haver arquivos com o mesmo nome em um mesmo local físico. Para isso, esse método é utilizado com a função de gerar um novo e único identificador para o arquivo que posteriormente será armazenado. A implementação desse método pode ser visualizada na Figura 68. 81 Figura 68: Código Java que implementa o método pegarNovoArquivo (String) 4.6.6 Método pegarConjuntoArquivos(String) Esse método tem a responsabilidade de retornar um conjunto de arquivos pertencentes a uma determinada pasta. Ele ainda não está sendo utilizado, foi projetado e implementado para que possa ser utilizado durante o processo futuro de implementação de um módulo que fará as buscas nos documentos RDF armazenados. Seu código pode ser visualizado na Figura 69. Figura 69: Código Java que implementa o método pegarConjuntoArquivos (String) 4.7 Utilizando o Sistema para Descrição de uma Imagem Como em RDF não há uma forma de verificar se os documentos criados estão de acordo com o esquema que representa o domínio, foi desenvolvida uma interface que segue a especificação do esquema, limitando assim as possibilidades do usuário, ou seja, só poderão ser criados documentos de acordo com a especificação pré-definida pelo sistema. Nesse sentido, pode ser observado como uma vantagem, analisando o ponto de vista de que o usuário não poderá criar documentos aleatórios. Para a demonstração dos passos a serem seguidos para descrição de uma dada imagem escolheu-se uma fotografia de um grupo de 82 estagiários, alunos do curso de graduação de Sistemas de Informação e que estão vinculados à atividade ensino. A parte do sistema que possibilita a escolha de uma imagem (.jpeg) pode ser visualizada na Figura 70. Figura 70: Tela Principal do Sistema. Após a escolha da imagem o sistema direciona o usuário para a tela em que estará disponível o formulário com os campos necessários para descrição da referida imagem. A Figura 71 apresenta tal formulário com as devidas informações a respeito da imagem anteriormente escolhida. 83 Figura 71: Formulário que possibilita a submissão das informações sobre uma dada imagem. Conforme pode ser observado na Figura 71, para os campos, Titulo, Crédito, Descrição e Data (que fornecem informações gerais sobre a imagem) foram atribuídas respectivamente as seguintes informações: “Estagiários em um laboratório”, “Coordenadora do Curso”, “Estagiários do curso de Sist. Inf.” e “15/06/2004”. É importante ressaltar que somente o campo Descrição é facultado ao usuário o seu preenchimento. Informações mais específicas podem ser determinadas a partir das opções demonstradas na parte 2 da Figura 71. Dessa forma foi possível detalhar a descrição da imagem a tal ponto de dizer que a mesma se trata de alunos estagiários do curso de graduação de Sistemas de Informação. A Figura 72 apresenta o documento RDF gerado a partir da confirmação da descrição da referida imagem. 84 Figura 72: Documento RDF gerado. 85 4.8 Considerações Como forma de colocar em prática parte dos conceitos que fundamentam teoricamente o trabalho (seção 2), a seção 4 demonstrou as etapas a serem seguidas para a construção de um sistema que vise a descrição de uma dada imagem referente a insituição de ensino CEULP/ULBRA. A seção 4.1 apresentou o sistema como um todo e, logo após, na seção 4.2, foi apresentado o esquema criado e serializado em RDF/XML para representação do referido domínio. A sua representação equivalente em uma classe Java (utilizando os recursos oferecidos pela API Jena) foi apresentada na seção 4.3. A seção 4.4 demonstrou, através de um exemplo prático, como a classe Java, que representa o vocabulário, pode ser utilizada durante um processo de implementação que visa a criação de um documento RDF. A seção 4.5 apresentou qual o processo de armazenamento seguido, sendo que esse processo se deve ao fato de tornar os arquivos armazenados bem definidos e organizados, objetivando assim facilitar o processo de implementação do módulo que realizará as buscas, além de torná-las mais eficazes. A seção 4.6 apresenta uma classe que foi criada para o gerenciamento dos arquivos RDF, como: verificar se um dado arquivo existe, pegar o identificador para criação de um novo arquivo, gravar um arquivo ou então recuperá-lo. E, por fim, na seção 4.7 é feita a descrição de uma determinada imagem de modo a demonstrar quais seriam as etapas a serem seguidas para a descrição da mesma a partir da utilização do sistema. 86 5 CONSIDERAÇÕES FINAIS Um grande desafio enfrentado pelos pesquisadores é o desenvolvimento da web semântica, pois envolve dispendiosas modificações da web atual, em que as informações são apenas exibidas, para uma web onde as informações sejam apresentadas, interpretadas e processadas por agentes de software. Segundo (LUSTOSA, 2003), a web semântica será o futuro da web atual em as informações serão dads explicitamente com seus signficados e, a partir disso as máquinas farão o processamento automático e a integração dessas informações disponíveis na web. Um dos passos para tornar essa web possível é a estruturação das informações de forma homogênea, ou seja, obedecendo a um padrão específico. Para isso é explorada a potencialidade da XML em definir esquema (vocabulários) e a flexibilidade do RDF em representar dados (OWL, 2003). O presente trabalho objetivou, a partir do entendimento sobre os conceitos RDF e RDF Schema, a demonstração das etapas de desenvolvimento de uma ferramenta que possibilitasse a um usuário a descrição e o armazenamento de uma determinada imagem referente ao domínio “instituição de ensino superior CEULP/ULBRA”. A definição do domínio era o ponto base para desenvolvimento da referida aplicação, sendo que, a partir da definição do mesmo, foi definido formalmente um conjunto de termos que regeriam o comportamento dos documentos RDF, ou seja, os documentos RDF que descreverão as imagens estarão de acordo com o esquema criado. Essas regras foram definidas a partir da utilização do RDF Schema que possibilita a definição de classes que possuem superclasses e várias subclasses, propriedades que podem ter subpropriedade e domínio. Nesse sentido, o RDF Schema pertence à definição de ontologias, no entanto com algumas limitações, isso pelo fato de o mesmo não possuir, 87 em sua sintaxe, propriedades que viabilizem inferências. Essas inferências visam fazer com que a máquina possa, através de acesso às regras e a uma coleção de dados e metadados, abstrair um significado semântico das informações disponibilizadas na web (OWL, 2003). Assim, como trabalho futuro, pode ser utilizada uma linguagem para ontologias na representação do supracitado domínio. E, a partir da ontologia criada, possibilitar que as máquinas possam fazer inferências. Assim, será possível obter uma performance útil de raciocínio sobre os documentos. Para a criação dessa ontologia pode ser utilizada a linguagem OWL, que pode ser entendida como uma linguagem para construção de ontologias que permite a representação explícita de um conjunto de termos de um vocabulário e os relacionamentos entre os mesmos (OWL, 2003). A sua possível utilização deve-se ao fato de ser baseada na sintaxe da XML e RDF, pois os documentos RDF responsáveis pela descrição das imagens poderiam ser reaproveitados, ou seja, seriam apenas readaptados para a ontologia criada. Tendo como base as imagens sistematizadas, a partir da utilização do sistema, uma nova funcionalidade pode ser acrescida ao mesmo: a realização de consultas a esses documentos RDF, sendo que para isso seria utilizada a linguagem de consulta RDQL. RDQL é uma linguagem de consulta para extrair dados de um documento RDF, ou seja, permite acessar informações específicas em um documento, a partir de uma dada consulta (SEABORNE, 2004). A sintaxe dessa linguagem de consulta é similar à sintaxe da SQL, uma linguagem para consulta a banco de dados relacionais. Embora esse não tenha sido o objetivo do trabalho, foram realizados alguns estudos a respeito de tal linguagem de consulta e, a partir desses estudos, foram realizados alguns testes para que pudesse haver um entendimento de como a mesma poderia ser aplicada no ambiente. 88 6 REFERÊNCIA BIBLIOGRÁFICA (AHMED, 2001) AHMED, Kal; et.al. Professional XML Metadata. Wrox Press. 2001. (BRAGANHOLO, 2001) BRAGANHOLO, V. Paula XML Schema, RDF(s) e UML: Uma comparação. Disponível em <www.inf.ufrgs.br/~vanessa/artigos/ideas2001.pdf.>, 2001. (BRAY, 1999) BRAY, Tim, HOLLANDER, Dave, LAYMAN Andrew. Namespaces in XML. Textuality, Hewlett-Packard, and Microsoft. World Wide Web Consortium, 1999. Disponível em <http://www.w3.org/TR/REC-xml-names/, 1999>. Acessado em: 20 de abril de 2004. (BRAY, 2004) BRAY, Tim, PAOLI, Jean, SPERBERG-MCQUEEN, C. M., MALER, Eve, YERGEAU, François. Extensible Markup Language (XML) 1.0 (Third Edition), W3C Recommendation 04 February 2004. Disponível em: <http://www.w3.org/TR/2004/REC-xml-20040204/> Acessado em: 09 de fevereiro de 2004 (BRICKLEY, 2000) BRICKEY, D.; GUHA R. V. (eds.) Resouce Description Framework (RDF) Schema specification 1.0 mar 2003. Disponivel em: <http://www.w3.org/TR/2000/CR-rdf-schema-20000327/>, 2000. (BROGDEN, 2002) BROGDEN, Bill, Chris Minnick. Guia de Desenvolvimento Javatm Desenvolvendo E-Comerce com JAVA, XML e JSP. Makron Books, São Paulo 2002. (CIUFFO, 2002) CIUFFO, L. N. Linguagens e ferramentas para a WEB Semântica. Trabalho de Conclusão de Curso (Curso de Ciências da Computação). UFJF, Minas Gerais, 2002. (HALL, ?) HALL, MARTY SERVLETS and JAVASERVER PAGESTM. Versão online. Disponível em: <http://www.moreservlets.com/>. Acessado em: 26 de abril de 2004. (HUNTER, 2002) HUNTER, Jason & CRAWFORD, Willian. JAVA servlet: programação. Ciência Moderna, Rio de Janeiro 2002. (JCP – JAVASERVER PAGES SPECIFICATION, 2003) JAVA COMMUNITY PROCESS, JSR-000152 JavaServer PagesTM 2.0 Specification. Disponível em: <http://jcp.org/aboutJava/communityprocess/first/jsr152/index3.htm> Acessado em: 20 de abril de 2004. (JCP – SERVLET SPECIFICATION, 2003) JAVA COMMUNITY PROCESS, JSR000154 JavaTM Servlet 2.4 Specification. 89 <http://jcp.org/aboutJava/communityprocess/final/jsr154/index.html> Acessado em: 26 de abril de 2004 (KIRK & PITTS-MOULTIS, 2000) KIRK, Cheryl, PITTS-MOULTIS, Natanya. XML – Black Book. São Paulo: Makron Books, 2000. (KUMIAWAN, 2002) KUMIAWAN, Budi Java para Web com Servlets, JSP E EJB. Rio de Janeiro, Editora Moderna, 2002. (LASSILA, 1999) LASSILA, O., SWICK, RALPH R. Resource Description Framework (RDF) Model and Syntax Specification W3C Recommendation 22 February 1999. Disponível em:<http://www.w3.org/TR/REC-rdf-syntax/> Acessado em: 23 de janeiro de 2004 (LUSTOSA, 2003) LUSTOSA, Pollyane de Almeida. OWL e Protégé: estudo e aplicação de conceitos para definição de ontologias Disponível em: <http://www.ulbra-to.br/ensino/43020/artigos/TCC2003/> Acessado em: 2 de julho de 2004. (MANOLA, 2004) MANOLA, Frank, MILLER, Eric. RDF Primer, W3C Recommendation 10 February 2004. Disponível em: <http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#conceptsummary> Acessado em: 12 de fevereiro de 2004 (MARINO, 2001) MARINO, M. TERESA. Integração de informações em ambientes científicos na WEB: Uma abordagem baseada na arquitetura RDF. Disponível em <ttp://genesis.nce.ufrj.br/dataware/Metadados/Teses/Teresa/pagina_tese.htm >, 2001. Acessado em: 15 de maio de 2004. (MCBRIDE, 2004) MCBRIDE, Brian. An Introduction to RDF and the Jena RDF API Disponível em <http://jena.sourceforge.net/tutorial/RDF_API/index.html>, 2001. Acessado em: 18 de junho de 2004. (NOLETO, 2003) NOLETO, Danilo de Abreu. Utilização da API JENA e do Padrão RDF para a estruturação de um portal para manipulação de Imagens. Disponível em: <http://www.ulbra-to.br/ensino/43020/artigos/ TCC2003/TCC/Relatorio_Estagio_Danilo.pdf > Acessado em: 16 de junho de 2004. (OLIVEIRA, 2001) Alcione de Paiva Oliveira, Apostila Servlet/JSP, Universidade Federal de Viçosa Disponível em: <http://inf.unisul.br/~osmarjr/download/apostilajava.html> Acessado em: 18 de abril de 2004 OWL, 2003) Owl Web Ontology Language Guide. Agosto de 2003. Disponível em: <http://www.w3.org/TR/2003/CR-owl-guide-20030818/>. Acessado em:2 de julho de 2004. (SEABORNE,2004) SEABORNE, HP Labs Bristol RDQL - A Query Language for RDF W3C Member Submission 9 January 2004 Disponível em: <http://www.w3.org/Submission/2004/SUBM-RDQL-20040109/> Acessado em: 4 de julho de 2004 (LIMA, 2003) LIMA, Carlos Eduardo, SILVA, Edeilson Milhomem, SCHMITZ, Lucas Roberto Bechert, BRITO, Parcilene Fernandes, FAGUNDES, Fabiano XML e JAVA no Desenvolvimento de um Editor de Fórmulas do Cálculo de Predicados. 3º Encontro de Estudantes de Informática do Estado do Tocantins, 2002 90 ANEXO Relação de alguns métodos das classes que implementam os objetos pré-definidos pela tecnologia JSP e suas respectivas descrições. 91 Tabela 8: Métodos da classe HttpServletRequest (BROGDEN, 2002) Retorno Stri ng long Stri ng Método getContextPath() getDateHeader(String nome) getHeader(String nome) Descrição Retorna parte do URI O valor do Retorna getIntHeader(String nome) de o valor de cabeçalho de requisição especificado Converte int cabeçalho requisição na forma de data. o cabeçalho de requisição especificado em um valor inteiro. Stri ng Retorna o nome do método que getMethod() foi utilizado para requisição, por exemplo: GET, POST. Stri ng Retorna getPathInfo() quaisquer informações associadas a URL que o cliente fez a requisição. Stri ng getQueryString() Retorna a Retorna Stri ng getRequestURI() querystring, ou seja, o endereço completo. parte específica do URL, desde o nome do protocolo utilizado (HTTP, HTTPS) até o nome da página. Stri ng Retorna getServletPath() parte requisição do URL que dessa chama o servlet. Retorna o nome do esquema de autenticação utilização para a Stri ng getAuthType() segurança do exemplo: “BASIC servlet, ou “SSL” por ou null caso o servlet não esteja protegido. É utilizado somente em sessões Stri ng de getRemoteUser() autenticação. invocado, retorna Quando o login do usuário, ou null, caso o mesmo não tenha sido autenticao. Retorna Prin cipal getUserPrincipal() um objeto java.security.Principal contendo o nome do usuário autenticado atual. Cook ie[] getCockies() Retorna um objetos Cookie vetor contendo que o os cliente enviou junto a sua requisição. 92 Stri ng Http Session getRequestSessionId() Retorna o Retorna getSession() não a Http da sessão haja sessão uma atual, sessão caso ela é criada automaticamente. Retorna Session id especificada pelo cliente. a sessão atual. Caso não haja nenhuma sessão e, a getSession(boolean criar) variável passada por parâmetro for verdadeira, uma nova sessão é criada. bool ean isRequestSessionIdValid() Verifica se o id da sessão requisitada ainda é válido. Tabela 9: Métodos da classe HttpServletResponse (BROGDEN, 2002) Retorno void Método addCookie(Cookie cookie) Descrição Adiciona um cookie no navegador do cliente. Adiciona void addDateHeader(String nome, long date) um cabeçalho de resposta com o nome e a data que foram passados por parâmetro. void bool ean setDateHeader(String String nome, long data) Modifica tanto o nome quanto a data do cabeçalho de resposta. Retorna verdadeiro (true) caso containsHeader(String nome) o cabeçalho de resposta já tenha sido definido. Redireciona o cliente para uma void sendRedirect(String endereco) página qualquer, de acordo com o valor passado por parâmetro. Codifica Stri ng para encodeRedirectURL(String url) o URL uso send_Redirect necessário especificado no ou, a método se não for codificação, retorna o URL sem alteração. Codifica Stri ng o URL especificado incluindo nele o ID da sessão, encodeURL (String url) ou se a necessária codificação retorna o não for URL sem alteração. void void sendError (int sc) sendError(int sc, String msg) Envia um código de erro http para o cliente Envia um código de erro com uma mensagem descritiva. 93 Tabela 10: Métodos da classe JspWriter (BROGDEN, 2002) Retorno Método void clearBuffer() void close() void flush() int getBufferSize() int getRemaining() void newLine() void print(boolean b) void print(char c) void print(char[] s) void print(double d) void print(float f) void print(int i) void Print(java.lang.Object obj) void println() Descrição Apaga o conteúdo do buffer. Fecha o fluxo, esvaziando-o primeiro. Esvazia o fluxo. Retorna o tamanho atual do buffer. Retorna o espaço não utilizado no buffer. inicia uma nova linha. Imprime um valor booleano. Imprime um caracter. Imprime um vetor de caracteres. Imprime um valor do tipo double. Imprime um valor de ponto flutuante. Imprime um inteiro. Imprime um objeto. Imprime uma string. Tabela 11: Métodos da classe HttpSession (BROGDEN, 2002) Retorno Método Descrição Retorna o objeto com um nome Obje ct getAttribute(String nome) específico, exista ou nenhum null caso objeto não com o nome indicado. Insere void setAttribute(String nome, Object obj) o específica indicado. objeto a sessão com o nome 94 Retorna Enum eration getAttributeNames() um String todos lista contendo os de os objetos objetos nomes de anexados a sessão em questão. void removeAttribute(String nome) long getCreationTime() long getLastAccessedTime() Remove da sessão o objeto de acordo com o nome informado. Retorna a hora de quando uma sessão foi criada. Retorna a última vez em que o cliente enviou uma requisição com essa sessão. Especifica o tempo, em segundos, que a sessão ficará void setMaxInactiveInterval(int intervalo) aberta para o cliente, sendo que esse tempo é contabilizado entre o intervalo de requisição e outra. void invalidate() Invalida uma desvincula quaisquer sessão e objetos pertencentes a ela. Stri ng getId() Retorna o identificado da sessão em questão. Tabela 12: Métodos da classe ServletContext (BROGDEN, 2002) Retorno Objec t Método getAttribute(String nome) void removeAttribute(String nome) void setAttribute(String nome, Object obj) Descrição Retorna um atributo indexado por nome. Remove o atributo do contexto do servlet. Liga um objeto determinado nome a de um atributo neste contexto de servlets. Strin g Strin g getRealPath(String caminho) Retorna o caminho real para um determinado caminho virtual. Retorna o nome e a versão do getServletInfo() contentor servlets no qual a servlet está sendo executada. Retorna a versão principal da int getMajorVersion() API de servlets Java que contentor servlet suporta. o 95 Tabela 13: Métodos da classe PageContext Retorno Método Descrição Retorna o associado object getAttribute(String nome) objeto ao passado por retorno será que nome está que foi parâmetro. O null o caso objeto não exista. void removeAttribute(String nome) void setAttribute(String nome, Object atributo) Remove o objedo de acordo com o nome informado. Anexa o objeto em questão ao escopo da página. O void include(String caminho) recurso processado especificado com parte é das ServletRequest e ServletResponse atuais. Reinicializa void release() objeto o estado PageContext de para ele possa ser reutilizado. um que 96 APÊNDICE Código utilizado na aplicação para a criação dos documentos RDF que descreverão as imagens. 97 <%@ page import="java.util.*,com.hp.hpl.mesa.rdf.jena.mem.ModelMem,com.hp.hpl.mesa.rdf.jena.model. *,com.hp.hpl.mesa.rdf.jena.vocabulary.*,java.io.PrintWriter,java.io.*,EDRDF.*,com.hp.hpl.mes a.rdf.jena.vocabulary.*,EDRDF.Imagem.vocabulario.Imagem"%> <%@include file="include/noCache.jsp"%> <% String script = "<script language='javascript'>"; int op = Integer.parseInt(request.getParameter("tipo")); HttpSession s = request.getSession(true); s.setMaxInactiveInterval(2400); String strTitulo=request.getParameter("txtTitulo"); String strDescricao=request.getParameter("txtDescricao"); String strData=request.getParameter("txtData"); String strCriador=request.getParameter("txtCriador"); String strTipoCurso; String strCaminhoFisico = "documentos/jpeg/"+s.getAttribute("figura"); switch (op){ case 1:{ strTipoCurso="Graduacao"; String strNomeCurso = request.getParameter("selGraduacao"); String strAtividade = request.getParameter("selAtividadeCurso"); String strTipoPessoa=request.getParameter("selTipoAtividade"); String strCargo=request.getParameter("selCargo"); try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pPessoa, objModelo.createResource() 98 .addProperty(Imagem.pTipoPessoa,strTipoPessoa))); RDFWriter objWriter = objModelo.getWriter(); to.br/imagem/esquema#"); objWriter.setNsPrefix("Imagem", "http://www.ulbra- Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/pessoa/ "; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/pessoa/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/graduacao/"+strNomeCurso+"/pessoa"). addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestinoOriginal )+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } catch(Exception e){ System.out.println("Error: "+e); } break; }// fim case 1 99 case 2: { String strNomeCurso = request.getParameter("selGraduacao"); String strAtividade = request.getParameter("selAtividadeCurso"); String strTipoPessoa=request.getParameter("selTipoAtividade"); String strCargo=request.getParameter("selCargo"); strTipoCurso="Graduacao"; try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pPessoa, objModelo.createResource() .addProperty(Imagem.pTipoPessoa,strTipoPessoa) .addProperty(Imagem.pCargo,strCargo))); RDFWriter objWriter = objModelo.getWriter(); to.br/imagem/esquema#"); objWriter.setNsPrefix("Imagem", "http://www.ulbraArquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/pessoa/ "; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/pessoa/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; 100 //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/graduacao/"+strNomeCurso+"/pessoa") .addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestino Original)+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } } }catch(Exception e){ System.out.println("Error: "+e); break; case 4: { try{ String strNomeCurso = request.getParameter("selGraduacao"); String strAtividade = request.getParameter("selAtividadeCurso"); String strTipoPessoa=request.getParameter("selTipoAtividade"); String strCargo=request.getParameter("selCargo"); String strFuncao=request.getParameter("selFuncao"); strTipoCurso="Graduacao"; //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, 101 objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pPessoa, objModelo.createResource() .addProperty(Imagem.pTipoPessoa,strTipoPessoa) .addProperty(Imagem.pFuncao,strFuncao))); to.br/imagem/esquema#"); RDFWriter objWriter = objModelo.getWriter(); objWriter.setNsPrefix("Imagem", "http://www.ulbra- Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/pessoa/ "; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/pessoa/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/graduacao/"+strNomeCurso+"/pessoa"). addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestinoOriginal )+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } 102 catch(Exception e){ System.out.println("Error: "+e); } break; }// fim case 4 case 5:{ String strAtividade = request.getParameter("selAtividadeCurso"); String strNomeCurso = request.getParameter("selGraduacao"); String strEstruturaFisica = request.getParameter("selEstruturaFisica"); strTipoCurso="Graduacao"; try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pEstruturaFisica,strEstruturaFisica)); RDFWriter objWriter = objModelo.getWriter(); to.br/imagem/esquema#"); objWriter.setNsPrefix("Imagem", "http://www.ulbra//código de impressão, temporário Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/estrutur aFisica/"; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); 103 String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/graduacao/"+strNomeCurso+"/estruturaFisica/Imagem_"+novo+".r df"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/graduacao/"+strNomeCurso+"/estrutura Fisica").addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestino Original)+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } catch(Exception e){ System.out.println("Error: "+e); } break; } case 6:{ strTipoCurso="pos-graduacao"; String strNomeCurso = request.getParameter("selPosGraduacao"); String strAtividade = request.getParameter("selAtividadePosGraduacao"); String strTipoPessoa=request.getParameter("selTipoAtividadePosGraduacao"); String strCargo=request.getParameter("selCargoPosGraduacao"); try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) 104 rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pPessoa, objModelo.createResource() .addProperty(Imagem.pTipoPessoa,strTipoPessoa))); RDFWriter objWriter = objModelo.getWriter(); to.br/imagem/esquema#"); objWriter.setNsPrefix("Imagem", "http://www.ulbra- Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/pes soa/"; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); RDF gerado> // Ccodigo temporario. Apeans para pegar o nome e caminho do arquivo String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/pessoa/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); // Ccodigo temporario. Apeans para pegar o nome e caminho do arquivo RDF gerado> strCaminhoDestino+="Imagem_"+novo+".rdf"; System.out.println(strCaminhoDestino); //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/posGraduacao/"+strNomeCurso+"/pesso a").addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestinoOrigi nal)+".rdf"); 105 //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } catch(Exception e){ System.out.println("Error: "+e); } break; } case 7:{ strTipoCurso="pos-graduacao"; String strNomeCurso = request.getParameter("selPosGraduacao"); String strAtividade = request.getParameter("selAtividadePosGraduacao"); String strTipoPessoa=request.getParameter("selTipoAtividadePosGraduacao"); String strCargo=request.getParameter("selCargoPosGraduacao"); try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pPessoa, objModelo.createResource() .addProperty(Imagem.pTipoPessoa,strTipoPessoa) .addProperty(Imagem.pCargo,strCargo))); to.br/imagem/esquema#"); RDFWriter objWriter = objModelo.getWriter(); objWriter.setNsPrefix("Imagem", "http://www.ulbra- Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; 106 String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/pes soa/"; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/pessoa/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; System.out.println(strCaminhoDestino); //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/posGraduacao/"+strNomeCurso+"/pesso a").addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestinoOrigi nal)+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } catch(Exception e){ System.out.println("Error: "+e); } break; } case 9:{ strTipoCurso="pos-graduacao"; String strNomeCurso = request.getParameter("selPosGraduacao"); String strAtividade = request.getParameter("selAtividadePosGraduacao"); String strTipoPessoa=request.getParameter("selTipoAtividadePosGraduacao"); String strFuncao=request.getParameter("selFuncaoPosGraduacao"); try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); 107 Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao) rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pPessoa, objModelo.createResource() .addProperty(Imagem.pTipoPessoa,strTipoPessoa) .addProperty(Imagem.pFuncao,strFuncao))); to.br/imagem/esquema#"); RDFWriter objWriter = objModelo.getWriter(); objWriter.setNsPrefix("Imagem", "http://www.ulbra- Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/pes soa/"; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/pessoa/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; System.out.println(strCaminhoDestino); //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/posGraduacao/"+strNomeCurso+"/pesso a").addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestinoOrigi nal)+".rdf"); 108 //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } catch(Exception e){ System.out.println("Error: "+e); } break; } case 10 : { String strAtividade = request.getParameter("selAtividadePosGraduacao"); String strNomeCurso = request.getParameter("selPosGraduacao"); String strEstruturaFisica = request.getParameter("selEstruturaFisicaPosGraduacao"); strTipoCurso="pos-graduacao"; try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pCurso, objModelo.createResource(strNomeCurso) .addProperty(Imagem.pAtividadeNoCurso,strAtividade) .addProperty(Imagem.pTipoCurso,strTipoCurso) .addProperty(Imagem.pEstruturaFisica,strEstruturaFisica)); RDFWriter objWriter = objModelo.getWriter(); to.br/imagem/esquema#"); objWriter.setNsPrefix("Imagem", "http://www.ulbra- Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; 109 String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/estr uturaFisica/"; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/curso/posGraduacao/"+strNomeCurso+"/estruturaFisica/Imagem_"+novo +".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("curso/posGraduacao/"+strNomeCurso+"/estrut uraFisica").addProperty(pArquivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDest inoOriginal)+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } catch(Exception e){ System.out.println("Error: "+e); } break; } case 11:{ String strTipoPessoa=request.getParameter("selTipoAtividadeSetorAdministrativo"); String strCargo=request.getParameter("selCargoSetorAdministrativo"); try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); 110 rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pSetorAdministrativo, objModelo.createResource() .addProperty(Imagem.pPessoa, objModelo.createResource() .addProperty(Imagem.pTipoPessoa,strTipoPessoa) .addProperty(Imagem.pCargo,strCargo))); RDFWriter objWriter = objModelo.getWriter(); to.br/imagem/esquema#"); objWriter.setNsPrefix("Imagem", "http://www.ulbra//código de impressão, temporário Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/setorAdm/pessoa/"; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/setorAdm/pessoa/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; System.out.println(strCaminhoDestino); //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("setorAdm/pessoa/").addProperty(pArquivo,"i magem_"+objArquivo.pegarNovoArquivo(strCaminhoDestinoOriginal)+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); 111 //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } catch(Exception e){ System.out.println("Error: "+e); } break; } case 12:{ String strEstruturaFisica = request.getParameter("selEstruturaFisicaSetorAdministrativo"); try{ //Cria na memória o novo documento RDF Model objModelo = new ModelMem(); Resource rImagem = objModelo.createResource(Imagem.rImagem); rImagem.addProperty(DC.title,strTitulo); rImagem.addProperty(DC.creator,strCriador); rImagem.addProperty(DC.date,strData); if (!strDescricao.equals("")) rImagem.addProperty(DC.description,strDescricao); rImagem.addProperty(Imagem.pLocalFisico,strCaminhoFisico); rImagem.addProperty(Imagem.pSetorAdministrativo, objModelo.createResource() .addProperty(Imagem.pEstruturaFisica,strEstruturaFisica)); RDFWriter objWriter = objModelo.getWriter(); objWriter.setNsPrefix("Imagem", "http://www.ulbrato.br/imagem/esquema#"); Arquivo objArquivo = new Arquivo(); String strIntermediario="C:/Sun/WebServer6.1/docs/foto/documentos/intermediario.rdf"; String strCaminhoDestinoOriginal; String strCaminhoDestino =strCaminhoDestinoOriginal ="C:/Sun/WebServer6.1/docs/foto/documentos/rdf/setorAdm/estruturaFisica/"; int novo = objArquivo.pegarNovoArquivo(strCaminhoDestino); String tmpCaminhoArquivoRDF = "/foto/documentos/rdf/setorAdm/estruturaFisica/Imagem_"+novo+".rdf"; s.setAttribute("novo_arquivo_rdf",tmpCaminhoArquivoRDF); strCaminhoDestino+="Imagem_"+novo+".rdf"; 112 //Insere propriedade no documento intermediário Model objModeloIntermediario = new ModelMem(); if (objArquivo.verificarArquivoExiste(strIntermediario)) objModeloIntermediario = objArquivo.carregarArquivo(strIntermediario); Property pArquivo = objModeloIntermediario.createProperty("http://www.ulbrato.br/Imagem/intermediario/","arquivo"); objModeloIntermediario.createResource("setorAdm/estruturaFisica").addProperty(pArq uivo,"imagem_"+objArquivo.pegarNovoArquivo(strCaminhoDestinoOriginal)+".rdf"); //Cria novo arquivo com o documento intermdiário objArquivo.gravarArquivo(strIntermediario,objModeloIntermediario); //Cria novo arquivo com a descrição da imagem objArquivo.gravarArquivo(strCaminhoDestino,objWriter,objModelo); } } catch(Exception e){ System.out.println("Error: "+e); } break; } default:{ break; } script += "alert('Imagem descrita com sucesso!');"; script += "</script>"; out.print(script); %>
Documentos relacionados
Manipulação de dados abertos para construção de novas
compõem esse tipo de Web são documentos que não possuem a característica de se ligarem justamente pela simplicidade de não serem estruturados. Portanto o resultado desse tipo de Web é uma coleção d...
Leia mais