MDRManager.getDefault().getDefaultRepository(); 2 – XmlmetamodelPackage extent = (XmlmetamodelPackage)repository.getExtent("xmlmetamodel"); 3 - if (extent !=null) { 4 - repository.beginTrans(true); 5 - xmlmetamodel.Xmldocument docroot = extent.getXmldocument().createXmldocument( DATAWAREHOUSES.xml", 1, "Armazena dados sobre o esquema do data warehouse academico", "20/07/2002", "20/07/2002"); 6 - xmlmetamodel.XmlprocessingInstruction pi = extent.getXmlprocessingInstruction().createXmlprocessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\""); 7 - xmlmetamodel.XmldocumentType dt= extent.getXmldocumentType().createXmldocumentType( "\"D:\\ServerREDIRIS\\ data\\dw.dtd\""); 8 - xmlmetamodel.Xmlelement elroot = extent.getXmlelement().createXmlelement("DATAWAREHOUSES"); 9 - extent.getXmlcontains().add(pi,docroot); 10 - extent.getXmlcontains().add(dt,docroot); 11 - extent.getXmlcontains().add(elroot,docroot); 12 - extent.getXmlcontains().add(
extent.getXmlcomment().createXmlcomment("Este documento armazena metadados sobre os esquemas dos datawarehouses"),
docroot); 13 - repository.endTrans();
}
A Listagem 5.5 apresenta uma parte de um código em Java para acessar o repositório XML. A linha 1 do programa MDRManager.getDefault().getDefaultRepository() retorna o repositório padrão armazenado. Este repositório vai ser sempre o próprio metamodelo MOF. Após, é necessário pesquisar, no repositório padrão, o pacote proxy referente ao metamodelo XML. O método repository.getExtent("xmlmetamodel”), na linha 2, procura um determinado pacote proxy dentro do repositório MOF. Ele recebe o nome do pacote como parâmetro e retorna um objeto do tipo RefPackage, que faz parte do pacote reflexivo de JMI. Se a pesquisa ao pacote desejado for bem sucedida, o próximo passo será utilizar o pacote para gerenciar metadados descritos em XML.
Para criar qualquer objeto no metamodelo é necessário obter a referência à interface proxy do objeto a ser criado. Por exemplo, para criar um novo documento XML é necessário
XmldocumentClass, que é obtido pelo método getXmldocument() do pacote XmlmetamodelPackage. A interface XmldocumentClass possui o método para criar um novo documento XML, instância de Xmldocument. Da mesma maneira, para se criar um objeto, instância de qualquer classe do metamodelo, é necessário obter a referência à sua interface proxy. A execução do código da Listagem 5.5 cria um objeto instrução de processamento, um objeto DocType e um objeto elemento, que é a raiz do documento XML. Além disso, é necessário fazer as associações entre os objetos. Isto é feito através da associação XMLContains do metamodelo.
A Figura 5.10 apresenta o documento XML criado pela execução do código Java da Listagem 5.5.
Figura 5.10 - Documento XML criado através da execução do código da Listagem 5.5
As linhas 1 e 2 da Listagem 5.5 variam segundo a implementação utilizada. A especificação MOF não diz como um programa cliente recupera a referência a um repositório MOF e nem como deve ser a pesquisa aos pacotes dentro do repositório. Isto é implementado segundo os critérios de quem projetou o repositório.
Além da importação dos metadados na forma de documentos XMI, e do uso das interfaces geradas a partir dos metamodelos, os usuários podem necessitar importar os metadados que estão em documentos XML, XSLT, DTD, entre outros. Isto é interessante, pois os usuários podem possuir ferramentas que já produzem metadados nestes padrões. Desta forma, basta importar os mesmos para o repositório MOF. Para isto, é necessário construir utilitários que façam o mapeamento entre os metadados descritos nos padrões originais (XML, XSLT, RDF) para os seus metamodelos correspondentes. Isto é uma alternativa a mais para intercâmbio dos metadados desses metamodelos. A próxima seção apresenta o mapeamento do padrão XML para o metamodelo XML.
5.4.5 Mapeamento XML para o Metamodelo XML
Para realizar o mapeamento entre o metamodelo XML e um documento XML foi construído
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DATAWAREHOUSES SYSTEM "D:\ServerREDIRIS\data\dw.dtd">
<!--Este documento armazena metadados sobre os esquemas dos datawarehouses--> <DATAWAREHOUSES></DATAWAREHOUSES>
um utilitário que exporta e importa os metadados para documentos XML a partir do repositório MOF.
5.4.5.1 Importação de documentos XML
O processo de importação consiste em submeter o documento XML a um parser XML, que processa o documento e importa para o repositório MOF como instância do metamodelo XML. A Figura 5.11 representa este processo.
Figura 5.11 – Importação de um documento XML
O módulo Importar XML executa as seguintes tarefas:
1. Processar o documento XML, verificando se ele é bem formado, ou seja, se os dados do arquivo passado como parâmetro estão mesmo na sintaxe XML.
2. Iniciar o repositório MOF e pesquisar o repositório XML, representado pelo metamodelo XML. Esta tarefa consiste em achar uma instância da classe MOFPackage do metamodelo MOF cujo nome é XMLMetamodel.
3. Criar uma instância da classe XMLDocument que representa o novo documento a ser importado para o repositório.
4. Para cada elemento do documento XML, criar uma instância da classe XMLElement. 5. Para cada atributo do documento XML, criar uma instância da classe XMLAttribute. 6. Similar aos passos 4 e 5, fazer os outros mapeamentos, como comentários, entidades,
instrução de processamento, entre outros.
7. Além de criar os objetos, é necessário criar as ligações entre os mesmos através da classe XMLContains, única associação do metamodelo XML.
A Listagem 5.6 apresenta uma parte do código Java que faz o mapeamento. O parser utilizado no processamento do documento XML foi o Xerces15 utilizando a API SAX (Simple API XML). No exemplo, é apresentado o código referente ao evento endElement do parser SAX,
15http://xml.apache.org/
Repositório MOF
ou seja, quando o parser encontra o final de um elemento. Ao chegar ao final do processamento de um elemento do documento, o programa cria um objeto MOF que é do tipo XMLElement, que faz parte do metamodelo XML. Ele verifica também se tal elemento possui conteúdo texto, que será adicionado ao objeto MOF do tipo XMLNodeText.
Listagem 5.6 - Código Java para gerar instâncias do metamodelo XML a partir de documentos XML