TCC

45
UNIVERSIDADE DE CAXIAS DO SUL DEPARTAMENTO DE INFORM ´ ATICA CURSO DE BACHARELADO EM CI ˆ ENCIA DA COMPUTAC ¸ ˜ AO MARCOS D. PETRY UML2Django: Gerador de C´ odigo para Framework Web MVC Prof. Jo˜ao L. Tavares Orientador Caxias do Sul, Dezembro de 2008

Transcript of TCC

Page 1: TCC

UNIVERSIDADE DE CAXIAS DO SUL

DEPARTAMENTO DE INFORMATICA

CURSO DE BACHARELADO EM CIENCIA DA COMPUTACAO

MARCOS D. PETRY

UML2Django: Gerador de Codigo

para Framework Web MVC

Prof. Joao L. Tavares

Orientador

Caxias do Sul, Dezembro de 2008

Page 2: TCC

“However, as every parent of a small child knows,

converting a large object into small fragments

is considerably easier than the reverse process.

— Andrew Stuart Tanenbaum

Page 3: TCC

AGRADECIMENTOS

Agradeco a Deus por ter me dado forcas para concluir este curso, me revitalizando

em todos os momentos de fraqueza.

Aos meus pais Ivan Luiz e Iana Fatima, por me entenderem a minha ausencia

devido ao trabalho e aos estudo, nao deixaram de estar do meu lado me apoiado

incondicionalmente.

Ao meu orientador, Professor Joao Luiz Tavares, pela paciencia, sabedoria, pe-

las suas correcoes e incentivo durante a implementacao do trabalho e redacao da

monografia.

A Universidade de Caxias do Sul, e ao docentes do departamento de informatica,

que durante os 7 anos de vida academica nesta instituicao, tive a honra de ser aluno.

Aos meus colegas de trabalho, que me ajudaram-me com meu TCC e na minha

carreira profissioal.

Agradeco aos amigos de minha cidade natal que me apoiaram em momentos que

precisei e me mostrando que a vida nao e so trabalho e estudo.

Aos amigos que fiz na Universidade: Joel, Alexandre, Fran, Vinıcius, Cristian,

Enor e muitos outros, por acompanharem minha trajetoria academica, e estarem

presentes em momentos complicados.

E por ultimo, mas nao menos importante, agradeco a minha querida e amada

namorada Letıcia, por ter me ajudado onde podia e ter me apoiado e me entendido

em momentos difıceis com muito amor e carinho.

Page 4: TCC

SUMARIO

LISTA DE ABREVIATURAS E SIGLAS . . . . . . . . . . . . . . . . . . . 6

LISTA DE FIGURAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

LISTA DE TABELAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

RESUMO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

ABSTRACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1 INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.1 Motivacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.3 Estrutura do Documento . . . . . . . . . . . . . . . . . . . . . . . . 13

2 CONCEITOS PRELIMINARES . . . . . . . . . . . . . . . . . . . . . . 15

2.1 Padrao de desenvolvimento MVC . . . . . . . . . . . . . . . . . . . 15

2.2 Ferramentas Graficas de Modelagem . . . . . . . . . . . . . . . . . 16

2.3 UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.3.1 Digramas de Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.4 Frameworks de desenvolvimento de aplicacoes . . . . . . . . . . . 18

2.4.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.5 Linguagem de programacao Python . . . . . . . . . . . . . . . . . 19

2.5.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3 DJANGO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.1 Caracterısticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.1.1 Persistencia de dados (model) . . . . . . . . . . . . . . . . . . . . . . 22

3.1.2 Visualizacao de dados (view) . . . . . . . . . . . . . . . . . . . . . . . 22

3.1.3 Controle de dados (Controller) . . . . . . . . . . . . . . . . . . . . . . 23

3.2 Fluxo de Execucao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Page 5: TCC

4 IMPLEMENTACAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4.1 Arquitetura geral da implementacao proposta . . . . . . . . . . . 25

4.2 Parametros XMI utilizados pelo Parser . . . . . . . . . . . . . . . 25

4.3 Mapeamento de objetos XMI - Django Model . . . . . . . . . . . 29

4.4 Analise lexico-sintatica . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.4.1 Extracao do XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.5 Analise semantica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

4.5.1 Algoritmo de geracao . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

5 EXPERIMENTOS E RESULTADOS . . . . . . . . . . . . . . . . . . . 35

5.1 Diagramas com uma Classe . . . . . . . . . . . . . . . . . . . . . . 35

5.2 Diagramas com duas Classes sem relacionamento . . . . . . . . . 35

5.3 Diagramas com duas Classes relacionadas . . . . . . . . . . . . . 36

5.4 Teste de Heranca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

5.5 Teste multiplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

6 CONCLUSAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.1 Validacao do projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.2 Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

7 ANEXOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

REFERENCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Page 6: TCC

LISTA DE ABREVIATURAS E SIGLAS

DRY Don’t repeat yourself

GLC Gramatica Livre-de-Contexto

HTML HyperText Markup Language

HTTP Hypertext Transfer Protocol

MVC Model-view-controller

OMG Object Management Group

PDF Portable Document Format

TCC Trabalho de Conclusao de Curso

UML Unified Modeling Language

URL Uniform Resource Locator

XML Extensible Markup Language

XMI XML Metadata Interchange

Page 7: TCC

LISTA DE FIGURAS

Figura 1.1: Imagem gerada pelo editor UML . . . . . . . . . . . . . . . . . . 12

Figura 3.1: Estrutura do framework Django . . . . . . . . . . . . . . . . . . . 22

Figura 3.2: Fluxo de Execucao do Framework Django . . . . . . . . . . . . . 24

Figura 4.1: Estrutura do parser XMI2Django . . . . . . . . . . . . . . . . . . 26

Figura 4.2: Diagrama de classes do sistema . . . . . . . . . . . . . . . . . . . 33

Figura 5.1: UML Representando uma classe . . . . . . . . . . . . . . . . . . . 35

Figura 5.2: UML Representando duas classes sem relacionamento . . . . . . . 36

Figura 5.3: UML representando duas classes relacionadas . . . . . . . . . . . 36

Figura 5.4: UML representando heranca . . . . . . . . . . . . . . . . . . . . . 37

Figura 5.5: Uml representando varias classes . . . . . . . . . . . . . . . . . . 38

Page 8: TCC

LISTA DE TABELAS

Tabela 4.1: Mapeamento de objetos XMI - Django Model . . . . . . . . . . . 30

Page 9: TCC

RESUMO

O desenvolvimento de aplicacoes WEB cresce contantemente e, como consequencia

disso, os recursos e as funcionalidades destas aplicacoes evolui. Portanto, desenvol-

ver aplicacoes de qualidade em um curto perıodo de tempo e um requisito cada vez

mais valorizado.

Uma maneira de melhorar o processo de desenvolvimento e a qualidade das

aplicacoes e utilizando frameworks de desenvolvimento. Utilizando frameworks, o

desenvolvedor pode focar-se de fato, no objetivo principal do sistema, evitando as-

sim, o trabalho repetitivo de outras aplicacoes, como por exemplo a construcao de

logins e controles de acesso. Um exemplo de framework que faz este trabalho e o

Django. Django constitui-se em um framework web de alto nıvel, escrito em Python,

que visa estimular o desenvolvimento rapido. Apesar de suas inumeras facilidades, o

Django nao possui uma ferramenta de geracao automatica de codigo a partir de di-

agramas graficos de modelagem, por exemplo. Esta funcionalidade auxiliaria muito

os desenvolvedores que, atualmente, precisam descrever manualmente a camada de

modelagem, dificultando tambem a documentacao estruturada, como por exemplo

atraves de diagrama de classes e padronizacoes ao estilo UML.

Focado nestas limitacoes, inerentes a qualquer ferramenta de software livre que

inicia sua evolucao no meio da producao de aplicacoes, este trabalho propoe uma fer-

ramenta que, aliada ao Django, tem a finalidade de gerar a camada de modelagem do

framework a partir de diagramas UML. Dessa forma o desenvolvedor consegue criar

o Model de forma mais rapida e facil, ao mesmo tempo que mantem a documentacao

de classes de seu sistema.

Palavras-chave: UML, VMC, Django, Framework, Python.

Page 10: TCC

ABSTRACT

UML2Django: a code generator for Web MVC Framework

The development of the WEB applications grows constantly, and, as a conse-

quence of that, the resources and the functionalities of these applications evolves

too. Therefore, to develop applications of quality in a short period of time is a

requirement more and more valuable.

Development frameworks aid to improve the process of development and the qual-

ity of the applications. Using frameworks, the developer can actually be focused on

the main objective of the system, preventing some repetitive work on other applica-

tions, as for instance, the implementaion of logins and controls of access. Djando is

one of this kind of framework. Django consists in a high level web framework (writing

in Python) that aims to stimulate the fast development. Although its innumerable

easinesses, the Django does not possess a tool of automatic generation of code from

graphical diagrams of modeling, for instance. This functionality would very assist

the developers that, currently, need to describe the modeling layer manually, also

making it difficult the structuralized documentation, as for example through class

diagrams and standardizations in UML style.

Focused on those limitations, inherent to any tool of free software that initiates

its evolution in the production of applications, this work proposes a tool that, allied

to the Django, has the goal to generate the framework modeling layer from UML

diagrams. In this way, the developer is able to create the Model Layer in a faster

and easy way, at the same time that it keeps the class documentation of the system.

Keywords: UML, MVC, Django, Framework, Python.

Page 11: TCC

11

1 INTRODUCAO

A cada dia que passa, a funcionalidade e os recursos dos sistemas produzidos

evolui, ao mesmo tempo em que e requerido uma maior agilidade no processo de

desenvolvimento dos mesmos. Desenvolver software em um curto perıodo de tempo

sempre foi um requisito desejavel para programadores e empresas.

Varios requisitos, padroes e tecnicas sao criados diariamente, com a finalidade

de aumentar a producao e melhorar o processo de construcao de sistemas. Como re-

sultado, foram criados diversas ferramentas e frameworks, varios processos e rotinas

repetitivas foram automatizados por eles e o tempo gasto no processo de imple-

mentacao de fato diminuiu. Em geral, um Framework, assim como web frameworks,

proporcionam uma infraestrutura de programacao para aplicacoes, de forma que o

projetista possa se concentrar na escrita de codigo eficiente e de facil manutencao.

Mas ainda ha diversos pontos a melhorar, ou pelo menos para facilitar o processo de

producao de codigo de forma automatizada, como por exemplo geracao automatica

de codigo nativo de um framework a partir do esquema de um diagrama de classes.

Os frameworks utilizados atualmente, seguem o padrao MVC (LEFF AVRAHAM; RAY-

FIELD, 2001), que e um padrao de arquitetura de aplicacoes que visa separar a logica

da aplicacao (Model), da interface do usuario (View) e do fluxo da aplicacao (Con-

troller). O uso deste tipo de framework permite que a mesma logica de negocios

possa ser acessada e visualizada por varias interfaces. Neste trabalho adotamos o

framework Django1 (MAURER, 2006), que utiliza o padrao MVC e tambem sua

arquitetura de desenvolvimento estimula o desenvolvedor a aproveitar ao maximo o

codigo ja feito, evitando a repeticao.

Como o objetivo de melhorar o processo de desenvolvimento com Django, este

trabalho propoe-se a gerar camada Model do framework Django, atraves de codigos

XML’s gerados por editores de diagramas de classe, permitindo assim alem de au-

mentar a velocidade de desenvolvimento de aplicacoes, a geracao e documentacao

basica do sistema.

1http://www.djangoproject.com/

Page 12: TCC

12

1.1 Motivacao

O Framework escolhido, o Django, recentemente ganhou bastante notoriedade no

mundo do software livre, devido a sua praticidade no desenvolvimento de aplicacoes,

foi adotado em diversas empresas e instituicoes, como por exemplo o Google, Go-

verno Brasileiro e a Universidade de Caxias do Sul.

Django e um framework web de alto nıvel escrito em Python que estimula o desen-

volvimento rapido e limpo, concentrando-se no maximo de automatizacao possıvel,

aderindo ao princıpio DRY (Don’t repeat yourself). Eliminando processos repetiti-

vos como criacao e autenticacao de formularios e tambem a geracao automatica de

interface de administracao, mecanismos de cache e internacionalizacao.

Atualmente, o desenvolvimento de aplicacoes em Django nao possui nenhuma

ferramenta que gere codigo a partir de ferramentas de modelagem, a camada de

modelagem e escrita manualmente. Desse modo, se a equipe necessitar de algum

tipo de documentacao, como por exemplo um diagrama de classes, ela tera que

repetir o processo de construcao.

1.2 Objetivos

O objetivo principal deste trabalho e o desenvolvimento de uma ferramenta para

a geracao automatica de codigo Python a partir da modelizacao de diagramas ge-

rados por ferramentas de modelagem UML. Esta ferramenta visa o aumento de

produtividade e tambem a diminuicao da possibilidade de erros de codificacao.

Nesta proposta, trataremos da implementacao desta ferramenta, integrada ao

framework Django, com o objetivo de gerar a classe de modelagem do framework

web a partir dos diagramas de classes criados pela ferramenta de criacao de modelos

UML.

Basicamente o processo desta geracao segue os seguintes passos:

1. Construcao dos diagramas de classes em uma interface grafica (ex. ArgoUML,

Umbrello), Por exemplo, o projeto de um diagrama de classes com seus res-

pectivos componentes para definicao de atributos, relacionamentos, cardinali-

dades, etc, conforme a Figura 1, abaixo:

Figura 1.1: Imagem gerada pelo editor UML

Page 13: TCC

13

2. Geracao do script XMI, padrao da OMG (grupo de gerenciamento de objetos)

(OMG, 2007), para troca de informacoes baseado em XML. O uso mais co-

mum e na troca facilitada de metadados entre as ferramentas de modelagem

(baseadas no UML). Um exemplo de um fragmento de script XMI e ilustrado

abaixo:

1 <?xml version = ’1.0’ encoding = ’UTF-8’ ?>

2 <XMI xmi.version = ’1.2’ xmlns:UML = ’org.omg.xmi.namespace.UML’

3 timestamp = ’Tue Sep 09 13:16:17 BRT 2008’>

4 <XMI.header> <XMI.documentation>

5 <XMI.exporter>ArgoUML (using Netbeans XMI Writer version 1.0)</XMI.exporter>

6 <XMI.exporterVersion>0.24(5) revised on $Date: 2006-11-06 19:55:22 +0100

7 (Mon, 06 Nov 2006) $ </XMI.exporterVersion>

8 &nbsp; </XMI.documentation>

9 &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp; <XMI.metamodel xmi.name="UML"

10 xmi.version="1.4"/></XMI.header>

11 <XMI.content>

12 <UML:Model xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077B’

13 name = ’untitledModel’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’

14 isAbstract = ’false’>

15 <UML:Namespace.ownedElement>

16 .

17 .

18 .

19 </UML:Namespace.ownedElement>

20 </UML:Model>

21 </XMI.content>

22 </XMI>

3. Tratamento das informacoes do XML e geracao de codigo no padrao do fra-

mework Django. O diagrama exemplificado na Figura 1 devera produzir o

seguinte codigo Python no framework Django:

1 class Pessoa_Email(models.Model):

2 endereco = EmailField()

3

4 class Pessoa(models.Model):

5 nome = models.CharField()

6 cidade = models.CharField()

7 nascimento = models.DateField()

8 enviar_mail = models.BooleanField()

9 endereco = models.ForeignKey(Pessoa_Email)

1.3 Estrutura do Documento

O presente trabalho esta dividido em 6 capıtulos:.

O capıtulo 1 apresenta uma introducao do trabalho, bem como a motivacao, os

objetivos, ferramentas de apoio e a estrutura do documento.

No Capıtulo 2, serao abordados alguns conceitos preliminares necessarios para

um melhor entendimento trabalho, onde apresentamos o padrao de desenvolvimento

Page 14: TCC

14

MVC, uma introducao basica sobre a linguagem python e frameworks de desenvol-

vimento.

O framework alvo da aplicacao, o Django, sera apresentado no capıtulo 3, onde

serao descritos detalhes de seus componentes mais usuais e como o padrao MVC e

aplicado a ele.

No capitulo 4, apresentamos o trabalho desenvolvido, onde e focado o parser

implementado no projeto, a estrutura do sistema, os elementos relevantes do arquivo

XMI, a gramatica utilizada para ler estes elementos e o processo de traducao para

a sintaxe da classe Django.

O capıtulo 5 e destinado a apresentar os testes com o sistema, onde diversos

diagramas de classes serao traduzidos para codigo Python do Django atraves da

ferramenta implementada neste trabalho.

O Capıtulo 6 e destinado a apreciacao das conclusoes final bem como das alter-

nativas de continuidade e trabalhos futuros da presente proposta.

Page 15: TCC

15

2 CONCEITOS PRELIMINARES

Neste Capıtulo, introduziremos alguns conceitos fundamentais necessarios ao en-

tendimento dos componentes utilizados no trabalho. Na secao 2.1 apresentamos uma

breve introducao sobre o padrao de desenvolvimento MVC. Introduzimos algumas

explicacoes sobre UML na secao 2.2. Na secao 2.3 serao abordados definicoes sofre

frameworks. Concluindo o capıtulo, sera feita uma breve explicacao sobre Python,

a linguagem utilizada neste trabalho.

2.1 Padrao de desenvolvimento MVC

MVC e um padrao de arquitetura de aplicacoes que visa separar a logica da

aplicacao (Model), da interface do usuario (View) e do fluxo da aplicacao (Control-

ler). Permite que a mesma logica de negocios possa ser acessada e visualizada por

varias interfaces.

O MVC tambem e utilizado em padroes de projetos de software, entretanto, MVC

abrange mais da arquitetura de uma aplicacao do que e tıpico para um padrao de

projeto.

Em um projeto de software baseado no padrao MVC , define-se uma arquitetura

basica com 3 camadas possivelmente abstratas:

• Model: Implementa o modelo representando a estrutura de baixo nıvel do

projeto, podendo ser o modelo objeto-relacional que implementa a camada de

dados. Um caso de MVC de Interface poderia guardar informacoes de estado

dos controllers, por exemplo;

• Controller: Implementa a camada responsavel pelo gerenciamentos de eventos

no projeto, tais como cliques do usuario, chamando a camada Model para

processar os eventos. Tambem pode manter informacoes de estado do usuario

na aplicacao;

• View: Gera a interface com usuario de modo que esta somente requisite o

processamento de eventos pelo Controller;

Page 16: TCC

16

Segundo (BEZERRA, 2007), Model-view-controller (MVC) e um padrao de ar-

quitetura de software. Com o aumento da complexidade das aplicacoes desenvol-

vidas torna-se fundamental a separacao entre os dados (Model) e o layout (View).

Desta forma, alteracoes feitas no layout nao afetam a manipulacao de dados, e estes

poderao ser reorganizados sem alterar o layout.

O model-view-controller resolve este problema atraves da separacao das tarefas

de acesso aos dados e logica de negocio, logica de apresentacao e de interacao com o

utilizador, introduzindo um componente entre os dois: o Controller. MVC e usado

em padroes de projeto de software, mas MVC abrange mais da arquitetura de uma

aplicacao do que e tıpico para um padrao de projeto.”

2.2 Ferramentas Graficas de Modelagem

A escolha de ferramentas de Geracao de Diagramas de classes foi definida tendo

como base dois criterios: ser software livre e possuir exportacao para XMI. Foram

encontradas as seguintes ferramentas que possuem estes requisitos: ArgoUML1 e

Umbrello2.

Umbrello UML Modeller permite a modelizacao de software atraves de diagramas

UML (Unified Modeling Language) originalmente para o ambiente KDE-Linux, com

extensoes recentes para Windows e MAC. Umbrello manipula todos os tipos de

diagramas UML e e capaz de gerar codigo para algumas linguagens como Java,

C++, Python, PHP, entre outras. No entanto, o codigo Python gerado a partir

dos diagramas do Umbrello ainda nao sao compatıveis com o framework Django,

necessitanto algumas adaptacoes manuais que, dependendo do tamanho do projeto,

pode tornar inviavel sua execucao.

ArgoUML e um software para modelagem UML escrito em Java. Possibilitando

ser instalado em qualquer plataforma com suporte a esta tecnologia. Possui suporte

completo para UML 1.4 padrao e oferece excelentes metodos para criacao e mani-

pulacao dos seus diagramas em UML. Oferece suporte para geracao de codigo Java

nativo e outras linguagens (C++, C# e PHP) atraves de plugins disponibilizados

em seu site. Infelizmente, a exportacao para codigo Python esta somente nos planos

de seus desenvolvedores.

As ferramentas acima salvam o diagrama no formato padrao XMI (XML Meta-

data Interchange) (OMG, 2007), que segundo Eduardo Bezerra, define XMI como

sendo:

”um padrao baseado em XML para exportar modelos definidos em

UML. Esse padrao e importante, pois permite a interoperabilidade

1http://argouml.tigris.org/2http://uml.sourceforge.net/

Page 17: TCC

17

entre diversas ferramentas CASE: um diagrama produzido em uma

ferramenta A pode ser importado para uma ferramenta B de outro

fabricante, considerando que os fabricantes A e B sao suporte ao

padrao XMI”(BEZERRA, 2007)

2.3 UML

A UML e uma linguagem visual para modelar sistemas orientados a objeto. Isso

quer dizer que a UML e uma linguagem que define elementos graficos que podem

ser utilizados na modelagem de sistemas. Esses elementos permitem representar os

conceitos de orientacao a objetos atraves dos diagramas criados. Seguindo a notacao

UML, e possivel representar diversas perspectivas do sistema. Ainda segundo (BE-

ZERRA, 2007), cada elemento grafico da UML possui sintaxe e uma semantica.

A sintaxe de um elemento corresponde a forma predeterminada de desenhar o ele-

mento. A semantica define o que significa o elemento e com que objeto ele deve ser

utilizado. Tanto a sintaxe quanto a semantica dos elementos sao extensıveis. Essa

extensibilidade permite que a UML seja adaptada as caracterısticas de cada projeto

de desenvolvimento.

Embora a UML possua diversos diagramas para representar o sistema (ativida-

des, casos de uso, colaboracao, sequencia, entre outros) o sistema desenvolvido utiliza

somente diagramas de classe, pois e o diagrama mais indicado para o proposito do

mesmo.

2.3.1 Digramas de Classe

Um diagrama de classes basicamente descreve a estrutura de um sistema, mos-

trando as classes implantadas, seus atributos, e as relacoes entre as classes. Cada

classe do diagrama possui um conjunto de objetos: Nome da classe, atributos, rela-

cionamentos e metodos.

2.3.1.1 Atributos

Definicao das caracterısticas da classe, cada elemento de sua lista de atributos

possui um nome e um tipo de dado.

2.3.1.2 Relacionamentos

Um relacionamento representa uma ligacao entre classes, e uma ligacao binaria

(com duas extremidades) onde cada extremidade e ligada a uma classe, atraves de

uma linha. Existem diferentes tipos de relacionamento: Agregacao, composicao,

Heranca.

Page 18: TCC

18

2.3.1.3 Metodos

Metodos sao funcoes requeridas a um objeto ou seja, as acoes que os objetos de

uma classe pode executar.

2.4 Frameworks de desenvolvimento de aplicacoes

Estamos em uma epoca onde as informacoes sao recebidas rapidamente, notıcias

de qualquer parte do mundo chegam as pessoas de forma quase instantanea. Grande

parte dessa informacao e veiculada atraves da WEB. Para isso o desenvolvimento

de aplicacoes web e muito explorado.

Apesar da quantidade de ferramentas de desenvolvimento ser bastante grande,

implementar aplicacoes para Internet nao e algo trivial. Construir uma aplicacao

web totalmente funcional a algo bastante trabalhoso. Muitas tarefas sao necessarias

para que tal feito seja completo: A Configuracao e a criacao de tabelas em base de

dados, criacao de consultas e relacionamentos para as mesmas, geracao de codigo

HTML, mapear as URL para ler os codigos, controle de usuarios, e estes itens sao

so a parte basica do desenvolvimento.

O desenvolvimento para WEB e muito repetitivo; os passos a serem seguidos

sao praticamente os mesmos para cada nova aplicacao a ser criada. Como tenta-

tiva de minimizar ao maximo estes repetitivos passos, foram criadas bibliotecas e

frameworks para facilitar o desenvolvimento de aplicacoes, fazendo com que o de-

senvolvedor focalize basicamente o objetivo do novo sistema, deixando a cargo do

framework manter as tarefas mais macantes.

Um framework e uma camada de abstracao na qual um determinado conjunto

de codigos implementa uma certa funcionalidade generica, facilmente customizada

pelo usuario, criando assim um funcionalidade expecifica. E funcao do framework

tambem, validar o codigo criado pelo usuario.

Os frameworks para desenvolvimento web geralmente seguem o padrao de arqui-

tetura de sistema MVC para separar as camadas de negocio, persistencia e interface.

2.4.1 Exemplos

A maioria das linguagens voltadas para o desenvolvimento WEB posuem fra-

meworks: Ruby possui um dos mais famosos framework WEB da atualidade, o

Ruby on Rails 3. Python possui uma gama consideravel de ferramentas como o

3http://www.rubyonrails.org

Page 19: TCC

19

Django, TurboGears4, Pylons5, Zope6/Plone7, web2py8 entre outros. PHP9 que e

uma das mais utilizadas linguagens para peogramacao WEB possui os frameworks

CakePHP10, CodeIgniter11, Prado12, symfony13, Zend14, entre outros. Perl possui o

Catalyst15, Maypole16, Jifty17, e a maioria deles segue o padrao MVC.

2.5 Linguagem de programacao Python

Python18 e uma linguagem de programacao de alto nıvel, interpretada, intera-

tiva, orientada a objetos e de tipagem dinamica e forte, lancada por Guido van

Rossum em 1991. Atualmente possui um modelo de desenvolvimento comunitario e

aberto gerenciado pela organizacao sem fins lucrativos Python Software Foundation.

Apesar de varias partes da linguagem possuırem padroes e especificacoes formais,

a linguagem como um todo nao e formalmente especificada. O padrao de imple-

mentacao e o CPython, o que significa que foi desenvolvida a partir da linguagem

C, mas existe tambem as variantes Jython e IronPython que sao reimplementacao

do Python produzidas em Java e .NET respectivamente.

A linguagem foi projetada com a filosofia de enfatizar a importancia do esforco do

programador sobre o esforco computacional. Prioriza a legibilidade do codigo sobre a

velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos

poderosos de sua biblioteca padrao e por modulos e frameworks desenvolvidos por

terceiros.

2.5.1 Exemplos

Atraves dos exemplo abaixo, e possivel verificar a simplicidade da linguagem:

2.5.1.1 Fibonacci

1 a =1

2 b =1

3 while a < 800:

4 print a ,

4http://turbogears.org5http://pylonshq.com6http://www.zope.org7http://www.plone.org8http://mdp.cti.depaul.edu9http://www.php.net

10http://www.cakephp.org11http://codeigniter.com12http://www.pradosoft.com13http://www.symfony-project.org14http://www.zend.com15http://www.catalystframework.org16http://maypole.perl.org17http://jifty.org18http://www.python.org

Page 20: TCC

20

5 a,b = b,a+b

2.5.1.2 Numeros Primos

1 ehprimo = True

2 numero = input ( " Informe o numero : " )

3 i = 2

4 while i < numero :

5 if numero % i == 0:

6 ehprimo = False

7 break

8 i += 1

9 if ehprimo :

10 print " Primo : " , numero

11 else :

12 print numero , ’ possui fator ’ , i

2.5.1.3 Calculo de Fatorial

1 n = int ( raw_input ( " Fatorial de : " ))

2 fatorial = 1

3 print " % d ! = " %n ,

4 i = n

5 while i > 0:

6 fatorial = fatorial * i

7 print " % d " %i ,

8 if i != 1: print " . " ,

9 i -= 1

Page 21: TCC

21

3 DJANGO

Django (DJANGO, 2008) e um framework para desenvolvimento rapido para

web, escrito em Python, que utiliza o padrao MVC (model-view-controller). Foi

criado originalmente como sistema para gerenciar um site jornalıstico na cidade de

Lawrence, no Kansas. Tornou-se um projeto de codigo aberto e foi publicado sob

a licenca BSD1 em 2005. O nome Django foi inspirado no musico de jazz Django

Reinhardt.

Django utiliza o princıpio DRY (Don’t Repeat Yourself), onde faz com que o

desenvolvedor aproveite ao maximo o codigo ja feito, evitando a repeticao.

Na secao 3.1, abordaremos as caracterısticas do framework, onde serao explicados

os componentes principais da ferramenta, tais como Controllers, Templates, Models,

Middlewares e URLDispacher. Na secao 3.2 sera explicado o fluxo de execucao de

uma requisicao no Django.

3.1 Caracterısticas

Atraves do ORM2 do Django e definida a modelagem de dados atraves de classes

em Python, clamadas modelos. Com isso e possıvel independente de qual banco

de dados escolhido, gerar suas tabelas e manipular seus dados sem necessidade de

utilizar linguagem SQL.

Os Models tambem possibilitam criar formularios automaticos e gerar uma inter-

face de administracao praticamente completa e facilmente configuravel e extensıvel,

aumentando ainda mais o desenvolvimento das aplicacoes.

O Django possui uma linguagem de templates muito extensıvel e amigavel. Atraves

dela e possivel fazer a separacao de design, conteudo e codigo Python.

A figura 3.1 ilustra a estrutura global do Django, exibindo a ligacao entre os

componentes principais do framework. Os componentes estao classificados em cores,

representando as camadas do sistema.

1http://www.opensource.org/licenses/bsd-license.php2Object-Relational Mapping

Page 22: TCC

22

Figura 3.1: Estrutura do framework Django

3.1.1 Persistencia de dados (model)

A Classe de Modelagem e basicamente, a fonte de todos os registros no projeto.

Ele contem todos os campos essenciais e relacoes de tudo que e armazenado no

Banco de dados. Geralmente, cada modelo mapeia uma unica tabela de dados.

3.1.2 Visualizacao de dados (view)

.

A visualizacao dos dados pelos usuarios e feita atraves das views e dos templates.

Sao atraves deles que os dados recebidos pelos models sao manipulados. Os acessos

aos dados sao feitos atraves das views.

As views sao as secoes do site, onde os dados recebidos pela camada de per-

sistencia sao apresentados, criados, editados e deletados por scripts python. Por

exemplo, em uma aplicacao de um blog, haveriam as seguintes views:

• Inıcio - exibicao das 5 ultimas postagens;

• Postagem - pagina para uma unica entrada;

• Postagem-Comentario - comentarios de uma determinada postagem;

• Ano-arquivo - exibe todos os meses com as inscricoes no ano determinado;

Page 23: TCC

23

• Mes-arquivo - exibe todos os dias com entradas do mes em questao;

• Dia-arquivo - exibe todas as entradas em determinado dia;

O sistema de templates do django e um modulo que visa separar a apresentacao dos

dados logicos do site. O Template define certos espacos onde sao definidos lacos de

repeticoes, condicionais e outras funcionalidades do django para manipular variaveis

passadas pela view. Normalmente, os templates sao utilizados para produzir docu-

mento HTML, mas os templates do Django sao capazes de gerar qualquer formato

de tipo texto tambem.

3.1.3 Controle de dados (Controller)

Entre a camada de visualizacao e o usuario, ha a camada de controle, responsavel

pelo processamento de acoes de requisicoes e resposta do usuario (HTTP Request e

HTTP Response). Para realizar este processamento o Django conta com Middlewa-

res e Url Dispatcher.

As middlewares sao trechos de codigo que analisam requisicoes feitas pelo usuario.

Atraves dele e possıvel enviar informacoes para view de forma transparente ao

usuario como, por exemplo, detalhes sobre secoes e autenticacao.

Depois de passar pelos middlewares, a requisicao e analisada pelo URL Dispat-

cher, que verifica o endereco que o usuario acessa e verifica se o mesmo consta no

arquivo de URLs da aplicacao. Cada URL esta associada a uma view, se a URL

requisitada nao se encontra no arquivo um erro do tipo 4043 e informado.

3.2 Fluxo de Execucao

Atraves de um browser, o usuario faz uma requisicao a um site Django, de acordo

com a URL informada. O Framework verifica se a mesma esta nos seus registros

de URL. Apos a localizacao da URL, uma view correspondente e invocada, a view

requisita informacoes a classe de modelagem que devolve os dados. Com os dados

recebidos da classe de modelagem, o Django armazena em variaveis e envia para um

template. O template recebe as variaveis da view e renderiza o template no formato

desejado (HTML, PDF). A pagina renderizada e exibida na tela para o usuario. O

processo detalhado pode ser visto na Figura 3.2.

3404 Error. The Page Was Not Found

Page 24: TCC

24

Figura 3.2: Fluxo de Execucao do Framework Django

Page 25: TCC

25

4 IMPLEMENTACAO

Neste Capıtulo abordamos a implementacao da proposta de geracao de codigo

python no framework Django a partir de modelos de diagramas de classes. Na secao

4.1 introduzimos a arquitetura geral do sistema proposto, mostrando seus compo-

nentes principais e seus relacionamentos. Na secao 4.2 mostramos a delimitacao do

escopo dos elementos XMI tratados pelo nosso gerador.

4.1 Arquitetura geral da implementacao proposta

A implementacao do Parser XMI-DjangoModel foi feita inteiramente utilizando

Python, a mesma linguagem do Framework web Django. Nao foi definida nenhuma

interface grafica, pois nao ha necessidade para tal. Basicamente o script recebe

como parametro o arquivo XML e gera a classe de modelagem. A Figura 4.1 ilustra

a arquitetura geral do analisador XMI2Django proposta neste trabalho.

Os principais modeladores de graficos UML possuem um metodo de exportacao

em arquivo texto para que os diagramas criados possam ser acessados em outro

modelador. O metodo que resulta este texto, esta escrito em padrao XMI, um

formato definido pela OMG para representacao, intercambio e compartilhamento de

objetos, modelos e meta-modelos utilizando XML.

Teoricamente, os dados XMI exportados em um modelador, deverao ser lidos

em outro sem maiores problemas, logo o parser do trabalho em questao, ira gerar

o codigo Django independente da ferramenta de modelagem UML utilizada, desde

que ele exporte o arquivo XMI

4.2 Parametros XMI utilizados pelo Parser

Boa parte das tags contidas no XML gerado pelo editor UML nao sao utilizadas

no parser, pois muitas delas sao geradas com a finalidade de exportacoes para outros

aplicativos (como por exemplo, outro editor UML). No trabalho em questao sao

utilizadas, para uma geracao correta da classe de modelagem do Django, os seguintes

elementos:

Page 26: TCC

26

Figura 4.1: Estrutura do parser XMI2Django

• UML:Namespace.ownedElement

O elemento raiz do xmi, e onde todos os itens do diagrama em questao

estao inseridos;

• UML:DataType

Lista de tipos de dados (name, xmi.id);

• UML:Class

Classes do diagrama de classes (name, xmi.id);

• UML:Classifier.feature

Tag XMI que contem a tag UML:Attribute;

• UML:Attribute

Atributos da classe (name, xmi.id);

• UML:ModelElement.taggedValue

Tag XMI que contem a tag XML:TaggedValue;

• UML:TaggedValue

Lista de valores marcados;

Page 27: TCC

27

• UML:TaggedValue.type

Tag XMI que contem a tag UML:TagDefinition;

• UML:TagDefinition

Apontador para o valor marcado (xmi.idref);

• UML:TaggedValue.dataValue

Valor do Valor Marcado (name);

• UML:StructuralFeature.type

Tag XMI que contem a tag UML:DataType;

• UML:DataType

Um apontador para um tipo de dado (xmi.idref);

• UML:Association

Lista de associacoes entre classes;

• UML:Association.connection

Tag XMI que contem a tag UML:AssociationEnd;

• UML:AssociationEnd

Tipo de associacao (Composicao, agregacao, heranca) (aggregation);

• UML:AssociationEnd.participant

Lista de objetos participantes da associacao, para o parser, ele trata apenas

classes;

• UML:Class

Um apontador para a classe (xmi.idref);

• UML:AssociationEnd.multiplicity

Tag XMI que contem a tag UML:Multiplicity;

• UML:Multiplicity

Tag XMI que contem a tag UML:Multiplicity.range;

• UML:Multiplicity.range

Tag XMI que contem a tag UML:MultiplicityRange;

• UML:MultiplicityRange

Multiplicidade da associacao (1 para n, 1 para 1) (lower, upper);

Page 28: TCC

28

• UML:TagDefinition

Nome do Valor Marcado (name, xmi.id).

Abaixo esta parte do codigo XMI gerado pelo editor UML que e utilizado pelo

parser. Nele esta modelado o diagrama UML apresentado no capıtulo de Introducao.

Duas classes, a primeira (Cidade) com um atributo (nome) e a segunda (Estado)

com dois atributos (Nome e Zona) e um relacionamento 1:n entre elas. O codigo

inteiro esta nos anexos:

1 <UML:Namespace.ownedElement>

2 <UML:Class xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077C’

3 name = ’Cidade’ visibility = ’public’ isSpecification = ’false’ isRoot = ’false’

4 isLeaf = ’false’ isAbstract = ’false’ isActive = ’false’>

5 <UML:Classifier.feature>

6 <UML:Attribute xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077F’

7 name = ’nome’ visibility = ’public’ isSpecification = ’false’ ownerScope = ’instance’

8 changeability = ’changeable’ targetScope = ’instance’>

9 <UML:StructuralFeature.type>

10 <UML:DataType xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000786’/>

11 </UML:StructuralFeature.type>

12 </UML:Attribute>

13 </UML:Classifier.feature>

14 </UML:Class>

15 <UML:DataType xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000786’

16 name = ’CharField’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’

17 isAbstract = ’false’/>

18 <UML:DataType xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000787’

19 name = ’IntegerField’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’

20 isAbstract = ’false’/>

21 <UML:Class xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000792’

22 name = ’Estado’ visibility = ’public’ isSpecification = ’false’ isRoot = ’false’

23 isLeaf = ’false’ isAbstract = ’false’ isActive = ’false’>

24 <UML:Classifier.feature>

25 <UML:Attribute xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000795’

26 name = ’nome’ visibility = ’public’ isSpecification = ’false’ ownerScope = ’instance’

27 changeability = ’changeable’ targetScope = ’instance’>

28 <UML:StructuralFeature.type>

29 <UML:DataType xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000786’/>

30 </UML:StructuralFeature.type>

31 </UML:Attribute>

32 <UML:Attribute xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007AF’

33 name = ’zona’ visibility = ’public’ isSpecification = ’false’ ownerScope = ’instance’

34 changeability = ’changeable’ targetScope = ’instance’>

35 <UML:StructuralFeature.type>

36 <UML:DataType xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000786’/>

37 </UML:StructuralFeature.type>

38 </UML:Attribute>

39 </UML:Classifier.feature>

40 </UML:Class>

41 <UML:Association xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C2’

42 name = ’’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’ isAbstract = ’false’>

43 <UML:Association.connection>

44 <UML:AssociationEnd xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C3’

45 visibility = ’public’ isSpecification = ’false’ isNavigable = ’true’ ordering = ’unordered’

46 aggregation = ’composite’ targetScope = ’instance’ changeability = ’changeable’>

47 <UML:AssociationEnd.multiplicity>

Page 29: TCC

29

48 <UML:Multiplicity xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C4’>

49 <UML:Multiplicity.range>

50 <UML:MultiplicityRange

51 xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C5’

52 lower = ’1’ upper = ’1’/>

53 </UML:Multiplicity.range>

54 </UML:Multiplicity>

55 </UML:AssociationEnd.multiplicity>

56 <UML:AssociationEnd.participant>

57 <UML:Class xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077C’/>

58 </UML:AssociationEnd.participant>

59 </UML:AssociationEnd>

60 <UML:AssociationEnd xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C6’

61 visibility = ’public’ isSpecification = ’false’ isNavigable = ’true’ ordering = ’unordered’

62 aggregation = ’none’ targetScope = ’instance’ changeability = ’changeable’>

63 <UML:AssociationEnd.multiplicity>

64 <UML:Multiplicity xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007CA’>

65 <UML:Multiplicity.range>

66 <UML:MultiplicityRange

67 xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C9’

68 lower = ’1’ upper = ’-1’/>

69 </UML:Multiplicity.range>

70 </UML:Multiplicity>

71 &nbsp;&nbsp; </UML:AssociationEnd.multiplicity>

72 <UML:AssociationEnd.participant>

73 <UML:Class xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000792’/>

74 </UML:AssociationEnd.participant>

75 </UML:AssociationEnd>

76 </UML:Association.connection>

77 </UML:Association>

78 </UML:Namespace.ownedElement>

4.3 Mapeamento de objetos XMI - Django Model

O gerador proposto tem como objetivo traduzir elementos XMI em codigo Python

segundo o framework Django. A Tabela 4.1 ilustra os componentes (tags) XMI con-

siderados e sua respectiva traducao no framework Django. Cada linha da tabela

podera ser gerada por uma ou varias regras de producao gramaticais aliadas a re-

gras semanticas para geracao de codigo Python.

4.4 Analise lexico-sintatica

O parser considerado neste projeto e um top-down descendente para gramaticas

do tipo LL1. Considerando o escopo delimitado na secao 2.2, a gramatica livre-de-

contexto (GLC) definida aqui compreende apenas a geracao de producoes relativas

aos componentes de representacao de Classe, atributos e relacionamentos do padrao

XMI. Para tanto, limitamos nossa gramatica a estas tags especıficas. Alem disso,

nao foi criada nenhuma validacao da sintaxe do XMI, pois, partimos do pressuposto

1Left-to-Right, Leftmost derivation com lookahead. Para isto, a gramatica livre-de-contextodeve estar livre de recursao a esquerda e deve estar fatorada.

Page 30: TCC

30

Tag XMI Django

UML:Class Classe DjangoUML:Attribute Atributo da Classe DjangoUML:DataType Tipo do atributoUML:Association, Geracao de um atributo da classe

UML:AssociationEnd, Django que representara a associacao, sejaUML:AssociationEnd.participant, ela chave Estrangeira ou umUML:MultiplicityRange mapeamento N para NUML:TagDefinition,

UML:TaggedValue.type, Parametros utilizados nos atributos da classeUML:TaggedValue.dataValue

Tabela 4.1: Mapeamento de objetos XMI - Django Model

que a mesma esteja correta, pois foi gerada automaticamente atraves de um sistema

ja consolidado.

Como a estrutura do XMI e basicamente uma estrutura em forma de arvore, a

gramatica utilizada no parser e bem simples. A seguir apresentamos a GLC proposta

em formato BNF:

1 <UML:Namespace.ownedElement> ::= <UML:DataType> <UML:Class> <UML:Association>

2 <UML:DataType> ::= name "=" "’" valor "’" xmi.id "=" "’" valor "’"

3 | xmi.idref "=" "’" valor "’"

4 <UML:Class> ::= UML:Classifier.feature name "=" "’" valor "’" xmi.id "=" "’" valor "’"

5 | xmi.idref = "valor"

6 <UML:Class> ::= UML:Class name "=" "’" valor "’" xmi.id "=" "’" valor "’" <UML:Classifier.feature>

7 <UML:Class> ::= UML:Class xmi.idref "=" "’" valor "’"

8

9 <UML:Classifier.feature> ::= <UML:Attribute>

10 <UML:Attribute> :: = UML:ModelElement.taggedValue UML:StructuralFeature.type"

11 name "=" "’" valor "’" xmi.id "=" "’" valor "’"

12 <UML:ModelElement.taggedValue> ::= "UML:TaggedValue"

13 <UML:TaggedValue> :: = "UML:TaggedValue.type" "UML:TaggedValue.dataValue"

14 <UML:TaggedValue.type> ::= "UML:TagDefinition"

15 <UML:TagDefinition> ::= xmi.idref "=" "’" valor "’"

16 <UML:TaggedValue.dataValue> ::= name "=" "’" valor "’"

17 <UML:StructuralFeature.type> ::= "UML:DataType"

18 <UML:Association> ::= "UML:Association.connection"

19 <UML:Association.connection> ::= "UML:AssociationEnd" "UML:AssociationEnd.participant"

20 "UML:AssociationEnd.multiplicity"

21 <UML:AssociationEnd> ::= aggregation "=" "’" valor "’"

22 <UML:AssociationEnd.participant> ::= "UML:Class"

23 <UML:AssociationEnd.multiplicity> ::= "UML:Multiplicity.range"

24 <UML:Multiplicity.range> ::= UML:MultiplicityRange

25 <UML:MultiplicityRange> ::= lower "=" "’" valor "’" upper "=" "’" valor "’"

Para auxiliar a extracao de dados relevantes do XML, foi utilizado o pacote

padrao do Python, o xml.dom.minidom. Com ele foi possıvel tratar os nomes de

tags e diferencas entre os atributos das mesmas. Embora existam outros parsers

Page 31: TCC

31

XML escritos em Python, como por exemplo o ElementTree2 e o BeautifulSoup3 o

pacote padrao da linguagem foi o escolhido. A justificativa desta escolha se deve

ao fato do pacote padrao ja fazer parte da distribuicao atual do Python, sendo

assim, o sistema tende a manter uma maior compatibilidade com futuras versoes do

interpretador.

4.4.1 Extracao do XML

A extracao dos dados e feita atraves do pacote xml.dom.minidom, como referido

acima, uma implementacao mais leve da interface DOM4. E uma implementacao

mais simples que o DOM padrao e significativamente menor. O Minidom analiza

o codigo no arquivo XML e cria a estrutura DOM, sendo esta mais facil para ma-

nipulacao dos itens dos arquivos XML. Uma vez tendo o objeto DOM, e possivel

acessar partes de seu documento XML atraves das suas propriedades e metodos.

Estas propriedades sao definidas na especificacao DOM5. A principal propriedade

do objeto e a documentElement, responsavel pela extracao das tags expecıficas do

XML. O exemplo pode ser visto abaixo:

>>> from xml.dom import minidom

>>> dom = minidom.parseString("<myxml>Some data</myxml>")

>>> dom.documentElement.nodeValue

>>> print dom.documentElement.tagName

u’myxml’

Tambem foi criada uma funcao em Python chamada finditem com a finalidade

de buscar e retornar uma lista de itens-filho, de uma tag expecıfica, de acordo com

o nome enviado por parametro:

1 def findItem(raiz,item):

2 return [x for x in raiz.childNodes if x.nodeName == item]

A busca dos elementos principais do diagrama (classes, tags, tipo de dados e

associacoes) e feita atraves do item raiz (UML:Namespace.ownedElement):

1 def findItem(raiz,item):

2 return [x for x in raiz.childNodes if x.nodeName == item]

3

4 raiz = doc.documentElement.getElementsByTagName(’UML:Namespace.ownedElement’)[0] #elemento raiz

5

6 xmi_tipos = findItem(raiz,"UML:DataType") #lista de tipos

7 lst_tipos = TipoDados(xmi_tipos)

8

2http://effbot.org/zone/element-index.htm3http://www.crummy.com/software/BeautifulSoup/4Document Object Model interface5http://www.w3.org/DOM/

Page 32: TCC

32

9 xmi_tags = findItem(raiz,"UML:TagDefinition") #valores marcados

10 lst_tags = TipoTags(xmi_tags)

11

12 xmi_classes = findItem(raiz,"UML:Class") #lista de classes

13 xmi_associacoes = findItem(raiz,"UML:Association") #lista de associac~oes

14 xmi_herancas = findItem(raiz,"UML:Generalization") #lista de herancas

15 classes = ListaClasses(xmi_classes,lst_tipos,lst_tags,xmi_associacoes,xmi_herancas)

Para cada classe encontrada no XMI, e feita a extracao do nome de identificador

da classe e tambem e realizada a busca dos atributos da mesma.

1 def findItem(raiz,item):

2 return [x for x in raiz.childNodes if x.nodeName == item]

3

4 for classe in xmi_classes:

5 nome = classe.attributes.get(’name’).value

6 container = findItem(classe,’UML:Classifier.feature’)[0]

7 xmi_atributos = findItem(container,’UML:Attribute’)

A cada atributo encontrado, e extraıdo o nome e o identificador do tipo do

atributo. O nome do tipo do atributo e buscado na lista de tipos, extraıda anteri-

ormente:

1 xmi_atributos = findItem(container,’UML:Attribute’)

2 for att in xmi_atributos:

3 container_tipo = findItem(att,’UML:StructuralFeature.type’)[0]

4 container_tipo2 = findItem(container_tipo,’UML:DataType’)[0]

5 nome = att.attributes.get(’name’).value

6 valor= lst_tipos.get_nome(container_tipo2.attributes.get(’xmi.idref’).value)

4.5 Analise semantica

A traducao para codigo Django, utiliza uma estrutura intermediaria de dados,

utilizando programacao orientada a objeto escrita em Python, para assim gerar o

codigo Django. A figura 4.5 representa o diagrama desta estrutura intermediaria.

De acordo com os dados contidos no arquivo XML, e feita a busca de elementos

e extraıdo os dados relevantes. Estes dados sao armazenadas em forma de objetos

python de acordo com a Figura 4.5. Quando a leitura estiver completa, os objetos

python sao lidos e escritos na tela, ja no padrao de modelagem da camada Model do

Django.

4.5.1 Algoritmo de geracao

A geracao das classes e realizada atraves da busca das classes do objeto Klasse

(Figura 4.5), onde o objeto possui uma variavel que informa se a classe herda de

outra ou nao, pois o codigo traduzido de uma classe herdada e diferente.

Page 33: TCC

33

Figura 4.2: Diagrama de classes do sistema

1 for cl in self.classes.lista:

2 if cl.herda_de:

3 yield ’class %s(%s):’ % (cl.nome,cl.herda_de)

4 else:

5 yield ’class %s(models.Model):’ % cl.nome

Para cada classe, e verificado se a mesma possui atributos, cada atributo e escrito

como uma variavel da classe recebendo como valor, o tipo de campo Field do Django.

E verificado tambem se o atributo possui valores marcados, se possuir, estes sao

escritos como parametros do Field.

1 yield ’class %s(models.Model):’ % cl.nome

2 for att in cl.atributos:

3 extra = ""

4 if len(att.extras):

5 for ex in att.extras:

6 extra+="%s=%s," %(ex[’nome’],ex[’valor’])

7 yield ’ %s = models.%s(%s)’ % (att.nome, att.valor,extra[:-1])

As Associacoes da classe sao geradas de forma semelhante aos atributos, pois sao

escritas tambem como variaveis da classe. Alem da verificacao de valore marcados,

e verificado o tipo de cardinalidade. Se a cardinalidade for “um para muitos” (1:n)

e gerado um campo ForeignKey, se for uma relacao “muitos para muitos” (n:n) e

gerado um campo ManyToMany.

1 for rel in cl.associacoes:

2 extra = ""

Page 34: TCC

34

3 if len(rel.extras):

4 for ex in rel.extras:

5 extra+=", %s=’%s’" %(ex[’nome’],ex[’valor’])

6 if rel.cardinalidade[0] == ’*’ and rel.cardinalidade[1] == ’*’:

7 yield ’ %s = models.ManyToManyField(%s%s)’ % \

8 (str.lower(str(rel.classe)), rel.classe, extra)

9 for rel in cl.associacoes:

10 extra = ""

11 if len(rel.extras):

12 for ex in rel.extras:

13 extra+=", %s=’%s’" %(ex[’nome’],ex[’valor’])

14 if rel.cardinalidade[0] == ’*’ and rel.cardinalidade[1] == ’*’:

15 yield ’ %s = models.ManyToManyField(%s%s)’ % \

16 (str.lower(str(rel.classe)), rel.classe, extra)

17 else:

18 yield ’ %s = models.ForeignKey(%s%s)’ % \

19 (str.lower(str(rel.classe)), rel.classe, extra)

Page 35: TCC

35

5 EXPERIMENTOS E RESULTADOS

As classes criadas pelo Parser, foram testadas no Django. Foram criados diversos

diagramas, contendo uma grande variedade de tipos de dados, atributos, agregacoes

e heranca. Em todos os casos abaixo foram gerados codigos, sendo estes perfeita-

mente aplicados no framework.

5.1 Diagramas com uma Classe

Primeiro teste feito com o Parser, e o mais simples, verifica a classe “Pessoa”

contida no XML e lista os atributos (nome) e (nascimento), conforme a figura 5.1.

Figura 5.1: UML Representando uma classe

O codigo gerado corresponde a Classe do Django com o nome “Pessoa” e com

as variaveis (nome) e (nascimento) representando seus atributos, conforme o quadro

abaixo:

1 # coding: utf-8

2 # Este ~A c© um modulo de auto gera~A§~A£o de classes django.

3

4 from django.db import models

5

6 class Pessoa(models.Model):

7 nome = models.CharField(max_length=15)

8 nascimento = models.DateField()

5.2 Diagramas com duas Classes sem relacionamento

Basicamente o mesmo teste que o anterior, criado para testar varias classes. Nele

sao geradas duas classes, a classe “Cidade”, com um atributo (nome) e a Classe

“Estado” com dois atributos (nome) e (zona)

Page 36: TCC

36

Figura 5.2: UML Representando duas classes sem relacionamento

O codigo gerado contem duas classes Django com os nomes “Cidade” e “Estado”.

A classe “Cidade” possui o atributo (nome) e a classe “Estado” possui os atributos

(nome) e (zona), conforme o quadro abaixo:

1 ## coding: utf-8

2 # Este ~A c© um modulo de auto gera~A§~A£o de classes django.

3

4 from django.db import models

5

6 class Cidade(models.Model):

7 nome = models.CharField(max_length=15)

8

9 class Estado(models.Model):

10 nome = models.CharField(max_length=25)

11 zona = models.CharField(max_length=2)

5.3 Diagramas com duas Classes relacionadas

O mesmo teste que o anterior, agora testando associacoes entre classes. Neste

caso foi utilizado um relacionamento 1:n, este relacionamento e representado pelo

atributo do tipo ForeignKey da classe Django

Figura 5.3: UML representando duas classes relacionadas

Neste caso o codigo gerado e semelhante ao do teste 5.2, mas, como pode ser

visto na linha 12, foi acrescentado uma variavel do tipo ForeignKey representando

um relacionamento.

1 ## coding: utf-8

2 # Este ~A c© um modulo de auto gera~A§~A£o de classes django.

3

4 from django.db import models

5

Page 37: TCC

37

6 class Cidade(models.Model):

7 nome = models.CharField(max_length=15)

8

9 class Estado(models.Model):

10 nome = models.CharField(max_length=25)

11 zona = models.CharField(max_length=2)

12 cidade = models.ForeignKey(Cidade)

5.4 Teste de Heranca

O teste abaixo foi realizado para representar as herancas de classes Django. Sao

representadas tres classes, uma classe principal chamada “Pessoa”, e outras duas

classes que descendem da classe anterior, “Fisica” e “Jurıdica”.

Figura 5.4: UML representando heranca

No codigo gerado, o parser gerou a Classe “Pessoa” herdando da classe Django

e as classes “Fisica” e “Jurıdica” herdando de “Pessoa”.

1 # coding: utf-8

2 # Este ~A c© um modulo de auto gera~A§~A£o de classes django.

3

4 from django.db import models

5

6 class Pessoa(models.Model):

7 nome = models.CharField(max_length=45)

8

9 class Fisica(Pessoa):

10 cpf = models.IntegerField()

11

12 class Juridica(Pessoa):

13 cnpj = models.IntegerField()

Page 38: TCC

38

5.5 Teste multiplo

Este exemplo ilustra um sistema real, contendo varias classes e varios tipos de

campos e associacoes.

Figura 5.5: Uml representando varias classes

O codigo gerado pode ser visto no quadro a seguir:

1 # coding: utf-8

2 # Este ~A c© um modulo de auto gera~A§~A£o de classes django.

3

4 from django.db import models

5

6 class Estado(models.Model):

7 nome = models.CharField(max_length=10)

8 zona = models.IntegerField()

9

10 class Usuario(models.Model):

11 username = models.CharField(max_length=10)

12 password = models.CharField(max_length=20)

13

14 class Cidade(models.Model):

15 nome = models.CharField(max_length=30)

16 estado = models.ForeignKey(Estado)

17

18 class Pessoa(models.Model):

19 nome = models.CharField(max_length=40)

20 cidade = models.ForeignKey(Cidade)

21 usuario = models.ForeignKey(Usuario, unique=’True’)

Page 39: TCC

39

22 fotos = models.ManyToManyField(Fotos)

23

24 class Fotos(models.Model):

25 foto = models.ImageField(upload_to=’/upload/teste/’)

26 data = models.DateField(auto_now_add=True)

27

28 class PessoaFisica(Pessoa):

29 rg = models.IntegerField()

30 nascimento = models.DateField()

31

32 class PessoaJuridica(Pessoa):

33 cnpj = models.IntegerField()

34

Page 40: TCC

40

6 CONCLUSAO

6.1 Validacao do projeto

O principal objetivo deste trabalho foi alcancado. O objetivo central de gerar

uma classe Django a partir de um diagrama de classes foi completamente atingido.

Praticamente todos os elementos Model que o Django suporta (Classes, atributos,

Valores de atributos, Chaves estrangeiras, relacionamentos N:N e heranca) foram

extraidos com sucesso.

Com a utilizacao do gerador de codigo, a criacao da camada logica do sistema

ficou muito mais facil de ser desenvolvida, pois agora o usuario possui uma visua-

lizacao grafica de todo o sistema, facilitando a visualizacao da estrutura do sistema

a ser desenvolvido.

Apesar do sistema conseguir extrair perfeitamente os dados do XMI, os testes

mais profundos da ferramenta foram feitos utilizando o modelador ArgoUML, por

isso, a compatibilidade com outros modeladores, como por exemplo o Umbrello, nao

esta completamente garantida.

6.2 Trabalhos Futuros

A intencao e que os trabalhos com o parser possam continuar, atraves da criacao

de outros testes utilizando diferentes modeladores UML e comparando seu resultado

com o desenvolvido ate o momento.

Ha interesse em disponibilizar o parser como software livre, tendo como principal

meta, a evolucao do sistema adicionando novas funcoes, melhorias de performance

no codigo e no gerador, uma atualizacao do mesmo com possıveis mudancas da

estrutura de modelagem do framework Django

Atualmente ha uma projeto de implementacao de maquina de workflow em

django chamado GoFlow 1. Uma das possibilidades de trabalho futuro, seria a

integracao de diagramas de estados com uma maquina de workflow. A proposta se-

ria de a partir de diagramas de estado serem gerados rotinas de workflow, da mesma

1http://code.google.com/p/goflow/

Page 41: TCC

41

forma que hoje sao geradas classes a partir de diagramas de classe.

Page 42: TCC

42

7 ANEXOS

1 <?xml version = ’1.0’ encoding = ’UTF-8’ ?>

2 <XMI xmi.version = ’1.2’ xmlns:UML = ’org.omg.xmi.namespace.UML’ timestamp = ’Tue Sep 09 13:16:17 BRT 2008’>

3 <XMI.header> <XMI.documentation>

4 <XMI.exporter>ArgoUML (using Netbeans XMI Writer version 1.0)</XMI.exporter>

5 <XMI.exporterVersion>0.24(5) revised on $Date: 2006-11-06 19:55:22 +0100 (Mon, 06 Nov 2006) $ </XMI.exporterVersion>

6 </XMI.documentation>

7 <XMI.metamodel xmi.name="UML" xmi.version="1.4"/></XMI.header>

8 <XMI.content>

9 <UML:Model xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077B’

10 name = ’untitledModel’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’

11 isAbstract = ’false’>

12 <UML:Namespace.ownedElement>

13 <UML:Class xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077C’

14 name = ’Cidade’ visibility = ’public’ isSpecification = ’false’ isRoot = ’false’

15 isLeaf = ’false’ isAbstract = ’false’ isActive = ’false’>

16 <UML:Classifier.feature>

17 <UML:Attribute xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077F’

18 name = ’nome’ visibility = ’public’ isSpecification = ’false’ ownerScope = ’instance’

19 changeability = ’changeable’ targetScope = ’instance’>

20 <UML:StructuralFeature.multiplicity>

21 <UML:Multiplicity xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007BF’>

22 <UML:Multiplicity.range>

23 <UML:MultiplicityRange xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007BE’

24 lower = ’1’ upper = ’1’/>

25 </UML:Multiplicity.range>

26 </UML:Multiplicity>

27 </UML:StructuralFeature.multiplicity>

28 <UML:StructuralFeature.type>

29 <UML:DataType xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000786’/>

30 </UML:StructuralFeature.type>

31 </UML:Attribute>

32 </UML:Classifier.feature>

33 </UML:Class>

34 <UML:DataType xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000786’

35 name = ’CharField’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’

36 isAbstract = ’false’/>

37 <UML:DataType xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000787’

38 name = ’IntegerField’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’

39 isAbstract = ’false’/>

40 <UML:Class xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000792’

41 name = ’Estado’ visibility = ’public’ isSpecification = ’false’ isRoot = ’false’

42 isLeaf = ’false’ isAbstract = ’false’ isActive = ’false’>

43 <UML:Classifier.feature>

44 <UML:Attribute xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000795’

45 name = ’nome’ visibility = ’public’ isSpecification = ’false’ ownerScope = ’instance’

Page 43: TCC

43

46 changeability = ’changeable’ targetScope = ’instance’>

47 <UML:StructuralFeature.multiplicity>

48 <UML:Multiplicity xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C1’>

49 <UML:Multiplicity.range>

50 <UML:MultiplicityRange xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C0’

51 &nbsp; lower = ’1’ upper = ’1’/>

52 </UML:Multiplicity.range>

53 </UML:Multiplicity>

54 &nbsp; </UML:StructuralFeature.multiplicity&amp;amp;gt;

55 &amp;nbsp;&nbsp; <UML:StructuralFeature.type>

56 <UML:DataType xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000786’/>

57 </UML:StructuralFeature.type>

58 </UML:Attribute>

59 <UML:Attribute xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007AF’

60 name = ’zona’ visibility = ’public’ isSpecification = ’false’ ownerScope = ’instance’

61 changeability = ’changeable’ targetScope = ’instance’>

62 <UML:StructuralFeature.multiplicity>

63 <UML:Multiplicity xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007BD’>

64 <UML:Multiplicity.range>

65 <UML:MultiplicityRange xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007BC’

66 lower = ’1’ upper = ’1’/>

67 </UML:Multiplicity.range>

68 </UML:Multiplicity>

69 </UML:StructuralFeature.multiplicity>

70 <UML:StructuralFeature.type>

71 <UML:DataType xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000786’/>

72 </UML:StructuralFeature.type>

73 </UML:Attribute>

74 </UML:Classifier.feature>

75 </UML:Class>

76 <UML:Association xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C2’

77 name = ’’ isSpecification = ’false’ isRoot = ’false’ isLeaf = ’false’ isAbstract = ’false’>

78 <UML:Association.connection>

79 <UML:AssociationEnd xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C3’

80 visibility = ’public’ isSpecification = ’false’ isNavigable = ’true’ ordering = ’unordered’

81 aggregation = ’composite’ targetScope = ’instance’ changeability = ’changeable’>

82 <UML:AssociationEnd.multiplicity>

83 <UML:Multiplicity xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C4’>

84 <UML:Multiplicity.range>

85 <UML:MultiplicityRange xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C5’

86 lower = ’1’ upper = ’1’/>

87 </UML:Multiplicity.range>

88 </UML:Multiplicity>

89 </UML:AssociationEnd.multiplicity>

90 <UML:AssociationEnd.participant>

91 <UML:Class xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:000000000000077C’/>

92 </UML:AssociationEnd.participant>

93 </UML:AssociationEnd>

94 <UML:AssociationEnd xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C6’

95 visibility = ’public’ isSpecification = ’false’ isNavigable = ’true’ ordering = ’unordered’

96 aggregation = ’none’ targetScope = ’instance’ changeability = ’changeable’>

97 <UML:AssociationEnd.multiplicity>

98 <UML:Multiplicity xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007CA’>

99 <UML:Multiplicity.range>

100 <UML:MultiplicityRange xmi.id = ’127-0-1-1--2d55673f:11c47d175d4:-8000:00000000000007C9’

101 lower = ’1’ upper = ’-1’/>

102 </UML:Multiplicity.range>

103 </UML:Multiplicity>

104 &nbsp;&nbsp; </UML:AssociationEnd.multiplicity>

Page 44: TCC

44

105 <UML:AssociationEnd.participant>

106 <UML:Class xmi.idref = ’127-0-1-1--2d55673f:11c47d175d4:-8000:0000000000000792’/>

107 </UML:AssociationEnd.participant>

108 </UML:AssociationEnd>

109 </UML:Association.connection>

110 </UML:Association>

111 </UML:Namespace.ownedElement>

112 </UML:Model>

113 </XMI.content>

114 </XMI>

Page 45: TCC

45

REFERENCIAS

BEZERRA, E. Princıpios de Analise e Projeto de Sistemas com Uml. [S.l.]:

Campus, 2007.

DJANGO. Django — the web framework for perfectionists with deadlines.

http://www.djangoproject.com/.

LEFF AVRAHAM; RAYFIELD, J. T. Web-Application Development using the Mo-

del/View/Controller Design Pattern. , v.1, n.1, 2001.

MAURER, I. Python Web Frameworks, part 1: Develop for the Web with Django

and Python. , v.1, n.1, july 2006.

OMG. Object manager group - MOF 2.0/XMI Mapping, Version 2.1.1. , v.1, n.1,

2007.