Skip to content

Commit 126c6eb

Browse files
committed
Adição de .gitignore. Remoção de arquivos desnecessários. Organização dos exemplos
1 parent 6abcff0 commit 126c6eb

File tree

13 files changed

+193
-26
lines changed

13 files changed

+193
-26
lines changed

.classpath

Lines changed: 0 additions & 6 deletions
This file was deleted.

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
*.jar
2+
*.class
3+
.classpath
4+
.settings/
5+
/bin/

.settings/org.eclipse.jdt.core.prefs

Lines changed: 0 additions & 12 deletions
This file was deleted.

README

Lines changed: 0 additions & 8 deletions
This file was deleted.

README.md

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
## Introducão
2+
3+
XML é um padrão internacional da W3C para intercâmbio de dados, amplamente utilizado e conhecido. Tal formato permite a troca de dados entre sistemas heterogêneos, garantindo a interoperabilidade entre os mesmos. No entanto, em aplicações interativas para o Sistema Brasileiro de TV Digital, desenvolvidas em NCL e Lua, tem-se uma alternativa bem mais simples que o uso de arquivos XML para a representação, armazenamento e troca de dados: [os arquivos de dados em formato Lua](http://manoelcampos.com/2010/06/08/aplicacao-de-tv-digital-usando-arquivos-de-dados-em-lua/), como já mostrei em [neste post](http://manoelcampos.com/2010/06/08/aplicacao-de-tv-digital-usando-arquivos-de-dados-em-lua/).
4+
5+
O uso de tais arquivos traz vários benefícios como: tamanho menor (menos bytes), simplicidade de manipulação com uso dos recursos nativos da linguagem Lua (os dados armazenados nos arquivos são tratados como tabelas Lua, estrutura de dados disponibilizada pela linguagem, que funciona como vetores e structs), uso mínimo de processamento para manipular os dados (diferente dos parsers XML como o SAX, que demandam maior capacidade de processamento).
6+
7+
Por demandar uma capacidade mínima de processamento, o uso de arquivos de dados em formato Lua é ideal para ambientes de recursos de hardware restritos como os equipamentos de recepção de TV Digital, além de simplificar o código da aplicação para a manipulação de tais dados.
8+
9+
10+
## O problema
11+
12+
O uso de arquivos XML em aplicações NCL/Lua para a TVD (enviadas via broadcast) é perfeitamente possível desde que tenha-se um parser escrito inteiramente em Lua, como o [LuaXML](https://github.com/manoelcampos/LuaXML) (veja o [Leitor de RSS em NCLua](https://github.com/manoelcampos/NCLuaRSS-Reader)). Tal parser converte um arquivo XML para uma tabela Lua, armazenando a mesma em RAM. Desta forma, a manipulação dos dados fica mais fácil. No link anterior existe uma versão do parser, adaptada por mim, que funciona com Lua 5 (a versão utilizada no subsistema Ginga-NCL do middleware Ginga).
13+
14+
No entanto, tal abordagem pode ser problemática quando se precisa carregar tal arquivo XML do disco, usando Lua. A norma ABNT NBR 15606-2 versão 3 (atualizada em 2009) na seção "10.1 Linguagem Lua - Funções removidas da biblioteca de Lua" mostra que nenhuma função do módulo IO de Lua (que permite a manipulação de arquivos em disco) deve estar disponível para aplicações de TVD. Uma atualização de 2011 da norma (ABNT NBR 15606-2 2011 Ed2) passou a incluir o módulo IO, no entanto, muitas das implementações de Ginga existentes no mercado são anteriores a esta revisão da norma. Assim, se os fabricantes seguiram a norma vigente na época, o módulo IO não deve estar disponível.
15+
16+
Apesar de ser possível a atualização do middleware, sabemos que nem todos os usuários se preocuparão com isso, e as formas de atualização podem variar de fabricante para fabricante, sendo que alguns podem requerer conexão da TV/conversor à Internet para tal atualização.
17+
18+
Desta forma, usar arquivos XML localmente não garante que a aplicação executará em qualquer implementação de Ginga.
19+
20+
21+
## A solução
22+
23+
24+
Para resolver tal problema, estou disponibilizando uma aplicação console em Java para converter um arquivo XML para o formato Lua. A aplicação utiliza o parser DOM (que se não estou errado é padrão no JDK e JRE) para percorrer os elementos do arquivo XML e assim poder gerar um arquivo Lua com os dados contidos no primeiro.
25+
26+
Para tal conversão, poderia ser utilizada qualquer linguagem de programação, até mesmo Lua, com uso do [LuaXML](https://github.com/manoelcampos/LuaXML) (para fazer o parse do XML) e o [table.save](http://lua-users.org/wiki/SaveTableToFile) (para salvar a tabela Lua, gerada a partir do XML, em disco). No entanto, o arquivo lua gerado com o table.save não ficou muito organizado e incluiu muito lixo, dificultando a manipulação dos dados. Por este motivo, resolvi implementar a ferramenta em Java.
27+
28+
A implementação realizada está disponível no final do artigo, juntamente com toda a documentação e código fonte.  Ela possui uma ferramenta de linha de comando (para ser usada antes de enviar a aplicação NCL/Lua via broadcast) para fazer a conversão do XML para Lua. Além disto, existe também uma classe Java que pode ser usada em qualquer outra aplicação (Desktop ou Web), permitindo a integração de tal implementação em sistemas já existentes, para, por exemplo, automatizar a conversão dos arquivos XML para Lua, para assim poderem ser enviados pelo carrossel para transmissão em broadcast.
29+
30+
31+
## Usando a ferramenta
32+
33+
34+
Para usar a ferramenta de linha de comando há duas opções. A primeira é entrar no diretório bin em um terminal e executar:
35+
36+
```bash
37+
java com.manoelcampos.Xml2LuaApp NomeArquivoXML
38+
```
39+
40+
41+
Note que deve-se informar o nome de um arquivo XML. A aplicação gerará um arquivo Lua de mesmo nome, dentro do diretório atual (bin).
42+
43+
Outra forma de uso é por meio do pacote xml2lua.jar (que contém todos os arquivos dos subdiretório de bin, facilitando a distribuição da aplicação). Para executá-lo, no terminal digite:
44+
45+
```bash
46+
java -jar xml2lua.jar NomeArquivoXML
47+
```
48+
49+
50+
## Estudo de caso
51+
52+
53+
Para exemplificar o uso da ferramenta, vamos imaginar que temos uma aplicação NCL/Lua de uma loja virtual, que precisa exibir uma lista de produtos na tela. As informações de tais produtos estão em um arquivo XML que será convertido para um arquivo Lua.
54+
55+
Para isto, usaremos um arquivo de nome produtos.xml, com o conteúdo a seguir (tal arquivo está disponível no pacote para download).
56+
57+
```xml
58+
<produtos>
59+
<produto id="12">
60+
<descricao>TV 32''</descricao>
61+
<marca>Samsung</marca>
62+
<preco>1200</preco>
63+
</produto>
64+
<produto id="150">
65+
<descricao>Netbook</descricao>
66+
<marca>Asus</marca>
67+
<preco>900</preco>
68+
</produto>
69+
<produto id="198">
70+
<descricao>Impressora Laser</descricao>
71+
<marca>Samsung</marca>
72+
<preco>399</preco>
73+
</produto>
74+
<produto id="201">
75+
<descricao>Resma de Papel A4 (500 folhas)</descricao>
76+
<marca>Office</marca>
77+
<preco>9</preco>
78+
</produto>
79+
<produto id="17">
80+
<descricao>Resma de Papel A4 (100 folhas)</descricao>
81+
<marca>Office</marca>
82+
<preco>3</preco>
83+
</produto>
84+
</produtos>
85+
```
86+
87+
Para converter tal arquivo para Lua, entre no diretório bin por um terminal e execute:
88+
89+
```bash
90+
java -jar xml2lua.jar produtos.xml
91+
```
92+
93+
Isto considerando que o arquivo produtos.xml está no diretório bin.
94+
95+
Como pode ser visto no XML anterior, cada produto tem um atributo id na tag produto. Este id identifica unicamente cada produto.
96+
Como as tabelas da linguagem Lua possuem a excelente característica de poderem funcionar como vetores e terem índices de qualquer tipo e valor, além de não terem a obrigatoriedade de os mesmos serem sequenciais, a ferramenta Xml2Lua desenvolvida usa tal atributo id do XML como o índice de cada produto na tabela lua (gerada a partir do XML).
97+
98+
Assim, o código Lua gerado no arquivo produtos.lua ficará como mostrado a seguir:
99+
100+
```lua
101+
return {
102+
[12]={
103+
descricao = "TV 32''", marca = "Samsung", preco = "1200",
104+
},
105+
[150]={
106+
descricao = "Netbook", marca = "Asus", preco = "900",
107+
},
108+
[198]={
109+
descricao = "Impressora Laser", marca = "Samsung", preco = "399",
110+
},
111+
[201]={
112+
descricao = "Resma de Papel A4 (500 folhas)", marca = "Office", preco = "9",
113+
},
114+
[17]={
115+
descricao = "Resma de Papel A4 (100 folhas)", marca = "Office", preco = "3",
116+
},
117+
}
118+
```
119+
120+
Os valores entre chaves são os índices da tabela. Desta forma, nossa tabela não tem índices sequenciais (1, 2, 3...) e sim 12, 150, 198, 201 e 17. O nome do atributo que será usado como índice da tabela Lua deve ser id, mas o código Java pode ser alterado para o nome de atributo que desejar (ao até mesmo alterado para passar tal informação por parâmetro para a aplicação).
121+
122+
Tal recurso é de fundamental importância, considerando agora o seguinte cenário: a aplicação de TVD em NCL/Lua precisa exibir na tela inicial apenas os produtos em destaque. Tais produtos estão relacionados em outro arquivo XML de nome destaques.xml, cujo conteúdo é apresentado a seguir (também disponível no pacote para download).
123+
124+
```xml
125+
<destaques>
126+
<destaque id="150" />
127+
<destaque id="17" />
128+
<destaque id="198" />
129+
</destaques>
130+
```
131+
132+
No exemplo, de todos os produtos a serem exibidos na aplicação de TVD (no nosso exemplo são um total de 5), apenas 3 devem ser exibidos na tela inicial. Os outros produtos existentes poderiam ser encontrados pelo usuário por meio de um campo de busca na aplicação.
133+
134+
Com o requisito apresentado, o uso do id do produto como índice da tabela Lua (gerada a partir do XML de produtos) facilita a implementação de tal requisito. Se os índices da tabela produtos fossem sequenciais, para cada produto em destaque, seria preciso fazer um for dentro da tabela de produtos para encontrar tal produto e poder exibir seus dados na tela. Considerando nossos 3 produtos em destaque e 5 produtos cadastrados, teríamos um total de 15 iterações.
135+
136+
Usando o id dos produtos como índice da tabela produtos, para exibir os produtos em destaque, precisamos fazer um for apenas na tabela de destaques. Como o arquivo destaques.xml (apresentado anteriormente) não possui nenhum sub-elemento, tendo apenas o atributo id, tal atributo não é usado como índice da tabela destaques e sim como um campo normal. Assim, os índices da tabela destaque serão sequenciais. Desta forma, o código Lua gerado a partir do destaques.xml será como mostrado abaixo:
137+
138+
```lua
139+
return {
140+
{
141+
id=150
142+
},
143+
{
144+
id=17
145+
},
146+
{
147+
id=198
148+
},
149+
}
150+
```
151+
152+
A partir de um for em tal tabela, pegando-se o valor do campo id, pode-se acessar a tabela produtos diretamente (sem precisar fazer um for nela) na posição do id da tabela destaques. Assim, serão apenas 3 iterações.
153+
154+
155+
## Código da aplicação Lua
156+
157+
158+
Após terem sido convertidos os arquivos produtos.xml e destaques.xml para Lua, podemos ter uma aplicação Lua  para carregar tais arquivos Lua e exibir os dados, como pode ser visto no trecho de código a seguir. A aplicação não possui interface gráfica pois isto está fora do escopo do artigo. Ela apenas exibe os dados no terminal. Tal código está disponível no arquivo app.lua, no pacote para download.
159+
160+
```lua
161+
local produtos = dofile("produtos.lua")
162+
local destaques = dofile("destaques.lua")
163+
164+
local prod = {}
165+
for i, dest in pairs(destaques) do
166+
prod = produtos[dest.id]
167+
print("Id: ", dest.id, "Marca:", prod.marca, "Preço:", prod.preco, "Descrição:", prod.descricao)
168+
end
169+
```
170+
171+
As duas primeiras linhas carregam os arquivos de dados Lua e armazenam a tabela contida neles em variáveis locais. Em seguida é feito um for na tabela de destaques, pegando o id de cada produto em destaque, e por meio dele, acessando diretamente os dados do produto na tabela produto, exibindo-os no terminal.
172+
173+
Como tal aplicação é apenas de exemplo e não usa nenhum recurso do Ginga-NCL, a mesma pode ser executada fora dele, em um terminal (obviamente tendo o interpretador Lua instalado) com o comando:
174+
175+
```bash
176+
lua app.lua
177+
```
178+
179+
180+
## Conclusão
181+
182+
183+
Como as aplicações de TVD (por exemplo, as de comércio eletrônico) podem ser apenas uma nova interface gráfica para sistemas já existentes que usam XML, WebServices e outras tecnologias como a base da arquitetura destes, implementar a geração de arquivos de dados Lua em tais arquiteturas pode ser algo trabalhoso.
184+
185+
Assim, com a implementação apresentada, pode-se utilizar os arquivos XML que por ventura já sejam gerados por sistemas existentes, e convertê-los para arquivos Lua para uso em uma aplicação para a TV Digital, sem precisar necessariamente alterar os sistemas existentes.
186+
187+
Com isto, o equipamento de TVD fica livre do overhead do parse do arquivo XML, por menor que este seja com o uso do [LuaXML](https://github.com/manoelcampos/LuaXML).

bin/com/manoelcampos/Xml2Lua.class

-5.39 KB
Binary file not shown.
-811 Bytes
Binary file not shown.

bin/app.lua renamed to exemplo/app.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#!/usr/bin/env lua
12
---Aplicação para carregar arquivos lua convertidos a partir de um XML e exibir os dados no terminal.
23
--@author Manoel Campos da Silva Filho - http://manoelcampos.com
34
local produtos = dofile("produtos.lua")
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)