Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. Introduo
Um dos objetivos da Engenharia de Software aumentar a produtividade, seja pela
adoo de uma arquitetura que possibilite o reuso, seja pela utilizao de tcnicas que
permitam um especificao mais abstrata, sem detalhes de implementao, e que
possibilitem a gerao de cdigo consistente, de qualidade e que permita responder as
necessidades de mudana com facilidade [1][2]. O uso de linguagens especficas de
domnio, ou do ingls domain-specific language (DSL), tem possibilitado aumentar a
abstrao [3], criando solues voltadas para resolver problemas especficos do
domnio. Os geradores de aplicao, por exemplo, so uma categoria de suma
importncia para o reuso de software, e muitos deles utilizam DSLs como idioma de
entrada [4].
2. Background
2.1. Domain-Specific Languages
Ao longo da histria de desenvolvimento de software, os engenheiros de software
procuraram melhorar a produtividade aumentando a abstrao [9]. Linguagem
especfica de domnio uma linguagem pequena, usualmente declarativa, que oferece
poder expressivo focado em um domnio de um problema particular [3]. Uma DSL
pode aumentar o nvel de abstrao muito alm das linguagens de programao atuais,
criando solues especficas baseadas no domnio do problema.
Linguagem especfica de domnio no um conceito novo e foi observado pela primeira
vez no final da dcada de 50 com a linguagem automatically programmed tools (APT),
que era uma DSL para programao de ferramentas controladas numericamente [10].
Atualmente, linguagens como SQL (utilizada em bancos de dados), HTML (utilizada
em pginas da web) e LaTeX (utilizada na produo de textos matemticos e
cientficos) so exemplos de DSL amplamente utilizadas.
Por outro lado, as linguagens de programao de propsito geral, do ingls generalpurpose programming languages (GPLs), combinadas com bibliotecas de aplicao,
podem ter um comportamento parecido com uma DSL, no entanto, ganhos notveis e
substanciais em expressividade e facilidades de uso so obtidos quando uma DSL
2
Mernik et al. [4] identifica duas dimenses ortogonais nas abordagens de projetos de
DSL: Uma onde h uma relao com linguagens j existentes e outra onde uma nova
linguagem criada sem nenhuma relao com outra existente. Basear uma DSL em uma
3
Processamento e Macro-processamento:
onde novas construes so
traduzidas para declaraes na linguagem base por um pr-processamento[3].
Mernik et al. [4] afirma que o desenvolvimento de DSL difcil, exigindo tanto
conhecimento do domnio quanto experincia no desenvolvimento de linguagens e que
este processo pode ser facilitado com a adoo de ferramentas de desenvolvimento de
DSL. As ferramentas podem variar de um simples verificador de consistncia e
interpretador at um ambiente integrado de desenvolvimento, do ingls integrated
development environment (IDE), formado por um editor de texto syntax-directed
(dirigido pela sintaxe), um prettyprinter (exibindo o texto em diferentes cores baseado
na sintaxe), um verificador de inconsistncia (incremental), ferramentas de anlise, um
interpretador ou compilador/gerador de aplicaes e um depurador.
Geralmente, a entrada para estas ferramentas so metalinguagens com informaes
sobre os vrios aspectos da DSL entre eles sintaxe, prettyprinting, verificao de
4
Sistemas Operacionais
Suportados
MetaEdit+ (MetaCase)
No
Windows, Linux e
Mac OS X
GME (Vanderbilt
University)
Sim
Windows
Ferramenta
Dependncias
No
Windows
MPS (JetBrains)
Sim
Windows, Linux e
Mac OS X
Eclipse Modeling
Project (Eclipse)
Sim
Windows, Linux e
Mac OS X
Xtext
Sim
Windows, Linux e
Mac OS X
de sites ou aplicaes existentes para criar novas aplicaes com foco em situaes e
problemas efmeros.
Os maiores provedores de servio da internet como Google, Amazon e eBay tem
provido application programming interfaces (APIs) como servios da web (do ingls
web services) para que usurios e desenvolvedores possam criar novas aplicaes a
baixo custo ou gratuitamente [8]. O nmero de empresas provendo APIs para uso
pblico vem crescendo exponencialmente. Segundo DuVander [18] o diretrio de APIs
Programmable Web registrou o marco de 8000 APIs em novembro de 2012,
principalmente impulsionado pela adoo de APIs abertas por grandes empresas.
Outro acelerador do crescimento do nmero de APIs foi a evoluo dos smartphones e
dispositivos conectados a internet. Existe uma grande chance que qualquer aplicativo
no seu telefone faa alguma coisa interessante usando uma API[19].
O Rich Site Summary (RSS), tecnologia que permitiu que o usurio se inscrevesse para
receber o contedo que quer ler, apresentou novas formas de consumir informaes e
servios da web [5]. A popularizao do RSS fez com que servios web antes somente
disponibilizados atravs do formalismo do Simple Object Access Protocol (SOAP), que
transporta XML atravs do protocolo HTTP, passassem a ser oferecidos de formas
alternativas, mais leves e diretas, como os servios REST (Representational State
Transfer) tambm conhecidos com RESTful services [20]. Uma outra mudana que
veio com a adoo de servios REST foi a adoo de um formato leve de intercmbio
de dados chamado JSON como alternativa ao formato XML, utilizado nos servios
SOAP e XML-RPC.
DuVander [21] aponta que como atualmente existem mais servios REST que SOAP,
XML-RPC ou outros protocolos, o formato JSON vem crescendo e ganhando espao
em utilizao frente ao formato XML (Figura 1). Segundo DuVander [21] o formato
JSON o formato preferido pelos desenvolvedores atualmente e com isso est se
tornando tambm a escolha dos provedores de API. O formato JSON pode ser
facilmente analisado pela maioria das linguagens de programao, principalmente em
JavaScript por ser nativo e quando a API oferece suporte a JSONP (JSON with padding,
tcnica de programao JavaScript que permite solicitar dados em um domnio
diferente), esta pode ser consumida diretamente do navegador. O formato JSON, sem
abrir e fechar tags, mais leve sendo apreciado por desenvolvedores e provedores de
servios [21].
Porcentagem+de+novas+APIs++
com+suporte+somente+a+JSON+
Porcentagem de APIs
com suporte a XML
95%$
25%#
90%$
20%#
85%$
15%#
10%#
80%$
5%#
75%$
0%#
70%$
2006#
2007#
2008#
2009#
2010#
2011#
2009$
2010$
2011$
Muita coisa mudou desde que o eBay lanou sua primeira API no ano 2000. A
utilizao de APIs se tornou a principal forma de conectar dados e funcionalidades entre
aplicaes. Hoje as APIs so o centro da estratgia do Google (que conta com mais de
90 APIs) e aceleradores de crescimento de servios com Twitter e Facebook [22].
Pense na web de 1995. Havia uma abundncia de empresas sem sites.
Muito rapidamente, todas essas empresas perceberam que precisavam para
ter um site para competir. Vimos a mesma coisa com as mdias sociais e
este o caminho que as APIs esto seguindo. Uma srie de grandes
empresas acrescentado APIs em 2011, incluindo as trs principais
empresas norte-americanas de carto de crdito[22].
O universo das APIs ainda muito novo, muita coisa ainda est em evoluo e no
existem padres definidos. O caos de um universo de APIs em expanso vai levar
algum para procurar por ordem. E um pouco de ordem provavelmente necessria
[22]. As APIs SOAP so mais ordenadas, auto documentas e fceis de serem
desenvolvidas, uma vez que existem ferramentas de apoio. No entanto, a leveza e a
simplicidade do REST tem facilitado a implementao de APIs por provedores de
servios e o consumo por parte dos desenvolvedores, levando o nmero de APIs REST
crescer e cada vez mais e se sobrepor percentualmente em relao as APIs SOAP
(Figura 2).
Protocolos usados por Web APIs
SOAP
23%
OUTROS
2%
JavaScript
5%
XML-RPC
2%
REST
68%
A utilizao de APIs uma tendncia, que se popularizou pelo uso em redes sociais,
posteriormente com o crescimento do mercado de aplicaes mveis, e agora com a
adoo de APIs abertas pelas Enterprises. A utilizao de APIs no mais um
diferencial tcnico, uma necessidade. Recentemente, um novo modelo de negcio
emergiu, backend-as-service [24], provendo a desenvolvedores recursos como
armazenamento na nuvem, gerenciamento de usurios, operaes de CRUD,
notificaes push, integrao com redes sociais, entre outros.
Independente da tecnologia, protocolo ou formato de intercmbio utilizado (Figura 3), o
mais importante do que API que est exposta so os dados que ela acessa. A facilidade
de uso, uma boa documentao de seus recursos e utilizao, funcionalidades
exclusivas, a qualidade e confiabilidade dos dados gerenciados, so os verdadeiros
diferenciais, que se transformam em vantagem competitiva [25].
35,40%
34,60%
29,20%
13,10%
12,30%
11,50%
10,00%
8,50%
6,90%
2,30%
85,40%
11
13
14
Para atender essa premissa, foi adicionado ferramenta um console, onde os erros de
compilao podem ser exibidos, permitindo que os usurios corrijam os mesmos
rapidamente.
Na inicializao da ferramenta uma verificao realizada nos arquivos de linguagem e
plug-ins. Caso sejam encontrados erros, o console apresenta o nome do arquivo e o erro
encontrado.
O processo de validao dos plug-ins feito inicialmente pela prpria engine JavaScript
do navegador, uma vez que estes so escritos na linguagem JavaScript nativa. O
resultado dessa validao um objeto JavaScript instanciado que corresponde ao
prprio plug-in. A ferramenta ento verifica se esse objeto est de acordo com as
diretivas de definio de plug-ins da ferramenta. Caso algum erro seja encontrado
tambm ser informado no console, caso contrrio, o mtodo de inicializao do plug-in
executado.
Para os arquivos de linguagens especficas de domnio e para os programas DSL, que
so escritos no formato JSON, o processo de validao feito pelo DSL Processor,
descrito no item 3.1.5, e as excees levantadas durante este processo so exibidas no
console.
No processo de gerao de cdigo o console utilizado para informar tambm os
resultados de operaes positivas, como por exemplo o nome dos arquivos gerados pela
operao e o contedo da transformao.
3.1.9. Hot-spots
A ferramenta DSL Encoder se prope a ser um ambiente integrado de desenvolvimento
extensvel e reutilizvel, onde usurios possam estend-la, no s pela alterao de seu
cdigo fonte como tambm em tempo de execuo atravs de plug-ins. Para isso, a
ferramenta foi projetada na forma de um framework orientado a objeto.
Frameworks podem reduzir os custos de desenvolvimento de aplicaes
uma vez que estes permitem projetistas e implementadores reutilizar suas
experincias na soluo de problemas no nvel de projeto e
codificao[37].
Os hot-spots so as partes flexveis de um framework, so os pontos extensveis que os
desenvolvedores utilizam para adicionar o seu cdigo e para especificar novas
funcionalidades. A ferramenta foi projetada de forma modularizada e permite que o
usurio estenda o seu funcionamento atravs de hot-spots bem definidos. Estes pontos
de extenso so tradados no item 3.2.2.
3.1.10. Plug-ins
A utilizao de plug-ins do suporte a extensibilidade, a customizao e a evoluo da
ferramenta. Adotar um sistema de plug-ins permite que a ferramenta seja estendida,
reconfigurada e adaptada em tempo de execuo [38].
A adaptao em tempo de execuo tem recebido considervel ateno nas reas de
pesquisa, tais como arquitetura de software, engenharia de linha de produto ou sistema
auto-adaptativos [38] e requisito necessrio em ambientes de desenvolvimento como
16
17
Clientes
Servidor de Aplicao
DSL Encoder
Internet
Servidor de API
de Terceiros
Servidor de API
de Terceiros
Comunicao com a Ferramenta
Comunicao com API de terceiros
3.2.1. Componentes
A ferramenta possui um componente principal chamado ide que funciona como um
framework e composto por outros componentes independentes, sendo cada um deles
um hot-spot da ferramenta, podendo ser reutilizados, na criao de plug-ins ou na
alterao do cdigo do fonte, por usurios que desejam estender a ferramenta para
atender a sua necessidade. Um dos principais objetivos da engenharia de software o
reuso [1] e uma arquitetura baseada em framework habilita o reuso, diminui os
esforos de desenvolvimento e aumentam a qualidade do software. Os principais
componentes do framework so:
19
IDE!
Sistema de
Arquivos!
DSL Processor!
Gerar!
Obter Linguagem!
org.dsle.Math.json!
Linguagem!
Obter Templates!
Templates!
Arquivos Gerados!
20
4. Uso da Ferramenta
4.1. Especificando uma DSL com JSON
Os arquivos que representam DSL so escritos no formato JSON. Um arquivo JSON
que representa uma DSL deve conter as propriedades descritas na Tabela 2.
Tabela 2. Propriedades JSON para Linguagem Especfica de Domnio
Propriedade
Tipo
Descrio
id
string
name
string
description
string
A descrio da linguagem.
templates
Array
<DslTemplateOptions>
types
Array <DslType>
main
DslType
O objeto
linguagem.
principal
DslType
da
Tipo
Descrio
id
string
file
string
prefix
string
suffix
string
extension
string
engine
string
21
Tipo
Descrio
name
string
primitiveType
string
required
boolean
items
Array
<DslTypeItem>
Se o tipo primitivo do DslType for OBJECT, significa que este tipo formado por um
ou mais DslTypes. Para especificar este objeto necessrio preencher a propriedade
items com um array de DslTypeItem, as propriedades do objeto DslTypeItem so
descritas na Tabela 5.
Tabela 5. Propriedades JSON para DslTypeItem
Propriedade
Tipo
Descrio
type
string
required
boolean
22
Um novo projeto deve ser criado para que o uso da ferramenta possa ser iniciado. O
usurio deve clicar no boto New Project na barra de tarefas e digitar um nome para o
projeto na caixa de dilogo conforme a Figura 8.
Uma vez que o projeto est criado, ele aparecer no painel esquerdo, chamado Project
Explorer (Figura 9). O usurio deve clicar no boto New File na barra de
ferramentas para criar um novo arquivo, no projeto selecionado ou no ncleo da
ferramenta.
A janela New File (Figura 10) permite que o usurio escolha o tipo de arquivo que
est tentando criar. Ele poder criar um novo programa DSL para o seu projeto atual ou
estender a ferramenta criando novas linguagens, templates e plug-ins.
Para criar uma nova linguagem, o usurio deve selecionar o tipo Domain-Specific
Language e digitar um nome para o arquivo. A extenso .dsl ser adicionada
automaticamente, e o arquivo ser salvo no diretrio /core/languages/. Como
exemplo, ser utilizado o nome de arquivo org.dsle.Math.
23
Ao clicar no boto Ok uma nova aba ser aberta para edio do arquivo
org.dsle.Math.dsl. O cdigo a seguir dever ser adicionado ao arquivo. Ao salvar o
arquivo org.dsle.Math.dsl, este representar uma nova linguagem no sistema,
identificado pela propriedade id do objeto JavaScript contido no arquivo.
{
"id": "org.dsle.Math",
"description": "",
"name": "Math",
"templates": [{
"id": "org.dsle.Math",
"file": "org.dsle.Math.tpl",
"prefix": "",
"suffix": "",
"extension": "html",
"engine": "JAVASCRIPT"
}],
"types": [{
"name":"name",
"primitiveType": "STRING",
"required": true
},{
"name":"number1",
"primitiveType": "NUMERIC",
"required": true
},{
"name":"number2",
"primitiveType": "NUMERIC",
"required": true
},{
"name":"operator",
"primitiveType": "STRING",
"required": true
},{
"name":"math",
"primitiveType": "OBJECT",
"items":[
{
"type": "name",
"required": true
},
{
"type": "number1",
"required": true
},
{
"type": "operator",
"required": true
},
{
"type": "number2",
"required": true
}
]
}],
"main":"math"
}
24
%}
var result;
switch (o.operator) {
case '+':
result = o.number1 +
break;
case '-':
result = o.number1 break;
case '*':
result = o.number1 *
break;
case '/':
result = o.number1 /
break;
default:
result = 'invalid';
}
o.number2;
o.number2;
o.number2;
o.number2;
<html>
{% if (result == 'invalid')
{ %}
26
Caso haja algum problema nas etapas de validao, como por exemplo se o valor da
propriedade number2 for trocado de um valor numrico para um valor booleano (ex:
true) uma mensagem de erro ser exibida no console informando o que deve ser
corrigido como na Figura 12.
27
5. Estudo de Caso
A fim de destacar o possvel ganho de produtividade com a utilizao da ferramenta, foi
realizado um estudo de caso em uma empresa que trabalha com o desenvolvimento de
aplicaes mveis. Para este estudo de caso, foi escolhido o domnio especfico de
campos de formulrios em interfaces do usurio.
A equipe de front-ends da empresa trabalha com o framework jQuery Mobile [39] para
aplicaes web mveis, e com Appcelerator Titanium [40] para o desenvolvimento de
aplicaes mveis nativas para as plataformas iOS e Android.
No primeiro momento foi realizada uma anlise do domnio para identificar quais
campos de formulrio so mais utilizados pela empresa e so comuns a todos os
frameworks, e posteriormente foi identificado qual elemento representa cada um destes
campos. A Tabela 6 mostra o resultado desta anlise.
Tabela 6. Campos de Formulrio - Mapeamento entre Frameworks
Campos
jQuery Mobile
Appcelerator Titanium
Window
<div data-role="page"/>
Titanium.UI.Window
Form
<form/>
Titanium.UI.View
Label
<label/>
Titanium,UI,Label
Textfield
<input type=text/>
Titanium.UI.TextField
Textarea
<textarea/>
Titanium.UI.TextArea
Select
<select/>
Titanium.UI.Picker
Select Option
<option/>
Titanium.UI.PickerRow
Radio Group
<fieldset datarole="controlgroup"/>
<input type="radio"/>
Titanium.UI.Picker
Titanium.UI.PickerRow
Radio Button
Check Box
<input type="checkbox"/>
Titanium.UI.Switch
Slider
<input type="range"/>
Titanium.UI.Slider
Button
<input type="button"/>
Titanium.UI.Button
28
jQuery Mobile
Appcelerator Titanium
Background color
style="background-color:;"
backgroundColor
Background image
style="background-image:;"
backgroundImage
Background repeat
style="backgroundrepeat:;"
backgroundRepeat
Border color
style="border-color:;"
borderColor
Border radius
style="border-radius:;"
borderRadius
Border width
style="border-width:;"
borderWidth
Enabled
disabled=""
enabled
Font family
style="font-family:;"
Font.fontFamily
Font size
style="font-size:;"
Font.fontSize
Font style
style="font-style:;"
Font.fontStyle
Font weight
style="font-weight:;"
Font.fontWeight
Height
style="height:;"
height
Id
id=""
Margin bottom
style="margin-bottom:;"
bottom
Margin left
style="margin-left:;"
left
Margin right
style="margin-right:;"
right
Margin top
style="margin-top:;"
top
Opacity
style="opacity:;"
opacity
Text align
style="text-align:;"
textAlign
Text color
style="color:;"
color
Visible
style="display:;"
visible
Width
style="width:;"
width
jQuery Mobile
Appcelerator Titanium
Text
<label>{text}</label>
text
29
jQuery Mobile
Appcelerator Titanium
Editable
readonly="
editable
Hint text
placeholder=""
hintText
Max length
maxlength=""
maxLength
Password
type="password"
passwordMask
Value
value=""
value
jQuery Mobile
Appcelerator Titanium
Editable
readonly="
editable
Hint text
placeholder=""
hintText
Max length
maxlength=""
maxLength
Value
<textarea>{value}</textarea>
value
jQuery Mobile
Appcelerator Titanium
Value
value
Appcelerator
Titanium
Text
<option>{text}</option>
title
Selected
selected=""
Value
value="
Propriedade
jQuery Mobile
Appcelerator Titanium
Value
value
30
jQuery Mobile
Appcelerator Titanium
Checked
checked=""
Text
title
Value
value=""
jQuery Mobile
Appcelerator Titanium
Text
title
Value
value=""
value
Appcelerator Titanium
Min
min=""
min
Max
max=""
max
Value
value=""
value
Propriedade
jQuery Mobile
Appcelerator Titanium
value=""
title
Aps essa anlise foi criada uma linguagem especfica de domnio utilizando os jarges
utilizados pelos front-ends, abstraindo as implementaes de cada um dos frameworks.
A linguagem recebeu o nome de FormUI e o id org.dsle.FormUI. Os DslTypes
criados para a esta linguagem so apresentados na Tabela 18.
31
DslType
PrimitiveType
DslType
PrimitiveType
align
STRING
password
BOOLEAN
background
OBJECT
radioGroup
OBJECT
border
OBJECT
radioOptions
ARRAY
bottom
STRING
radius
STRING
button
OBJECT
readOnly
BOOLEAN
checkbox
OBJECT
repeat
STRING
checked
BOOLEAN
right
STRING
color
STRING
select
OBJECT
enabled
BOOLEAN
selected
BOOLEAN
family
STRING
selectOptions
ARRAY
font
OBJECT
size
STRING
form
OBJECT
slider
OBJECT
formFields
ARRAY
style
STRING
height
STRING
text
STRING
hint
STRING
textarea
OBJECT
id
STRING
textfield
OBJECT
image
STRING
title
STRING
label
OBJECT
top
STRING
left
STRING
value
STRING
max
NUMERIC
visible
BOOLEAN
maxLength
NUMERIC
weight
STRING
min
NUMERIC
width
STRING
opacity
STRING
window
OBJECT
option
OBJECT
32
Para cada DslType do tipo primitivo OBJECT criado, foi necessrio especificar quais
DslTypeItems compe o mesmo. O trecho de cdigo abaixo faz parte do arquivo de
definio da DSL org.dsle.FormUI.dsl e mostra como exemplo a definio do tipo
formfield dos qual os demais tipos so estendidos. O arquivo completo de definio
da DSL pode ser observado no Anexo I.
{
"name": "formfield",
"primitiveType": "OBJECT",
"items": [{
"type": "align",
"required": false
}, {
"type": "background",
"required": false
}, {
"type": "border",
"required": false
}, {
"type": "bottom",
"required": false
}, {
"type": "color",
"required": false
}, {
"type": "enabled",
"required": false
}, {
"type": "font",
"required": false
}, {
"type": "height",
"required": false
}, {
"type": "id",
"required": true
}, {
"type": "left",
"required": false
}, {
"type": "opacity",
"required": false
}, {
"type": "readOnly",
"required": false
}, {
"type": "right",
"required": false
}, {
"type": "size",
"required": false
}, {
"type": "style",
"required": false
}, {
"type": "top",
"required": false
}, {
"type": "visible",
"required": false
}, {
"type": "weight",
"required": false
}, {
"type": "width",
"required": false
}]
}
Depois da criao da DSL, foram criados dois templates para gerao de cdigo, um
que gera um arquivo de marcao HTML, para o framework jQuery Mobile e outro que
gera um arquivo JavaScript, para ser utilizado no Appcelerator Titanium. Esses
templates podem visualizados no Anexo II.
De maneira a auxiliar a gerao de cdigo pelos templates foram desenvolvidos dois
plug-ins, um que transforma os objetos (DSLType) em notaes HTML, sendo chamado
diretamente do template para jQuery Mobile, e outro que transforma os objetos
(DSLType) em notaes JavaScript, sendo chamado diretamente do template para
Appcelerator Titanium. Esses plug-ins podem visualizados no Anexo III.
Para testar o ganho de produtividade, foi solicitado a um desenvolvedor front-end,
apenas familiarizado com marcaes HTML, que utilizasse a ferramenta para escrever
um programa DSL que descrevesse um formulrio de criao de conta em um servio,
seguindo as diretrizes da DSL especificada. Foram passados ao desenvolvedor front-end
os campos necessrios e os atributos de cada um deles, definidos pelo designer de
interfaces. O programa DSL foi nomeado create_account.json e continha o seguinte
cdigo:
{
"language":"org.dsle.FormUI",
"main": {
"id":"winCreateAccount",
"title": "Create Account",
"form": {
"id": "frmCreateAccount",
"formItems": [{
"type":"label",
"id": "lblEmail",
"text":"E-mail:",
"for": "email"
},{
"type":"textfield",
"id":"email",
"hint": "enter your e-mail"
},{
"type":"label",
"id": "lblPassword",
"text":"Password:",
"for": "password"
},{
"type":"textfield",
"id":"password",
"hint": "enter your password",
"password": true
},{
"type":"checkbox",
"id":"accept",
"text": "I accept this terms.",
"checked": false
},{
"type":"button",
"id":"btCreateAccount",
"text": "create account"
}
]
}
}
}
},{
"type":"label",
"id": "lblFullname",
"text":"Full Name:",
"for": "fullname"
"type":"textfield",
"id":"fullname",
"hint": "enter your full name"
34
7. Referncias
[1] Barreto, C. G. (2006). Agregando Frameworks de Infra-Estrutura em uma
Arquitetura Baseada em Componentes: Um Estudo de Caso no Ambiente
AulaNet. Rio de Janeiro.
[2] Herrington, Jack (2003). Code-Generation Techniques for Java. Online
http://www.onjava.com/pub/a/onjava/2003/09/03/generation.html.
[3] Van Deursen, A., Klint, P., & Visser, J. (2000). Domain-specific languages: an
annotated bibliography. ACM Sigplan Notices, 35(6), 26-36.
[4] Mernik, M., Heering, J., & Sloane, A. M. (2005). When and how to develop
domain-specific languages. ACM computing surveys (CSUR), 37(4), 316-344.
[5] Oreilly, T. (2007). What is Web 2.0: Design patterns and business models for
the next generation of software. Communications & strategies, (1), 17.
[6] Taivalsaari, A., & Mikkonen, T. (2011, August). The web as an application
platform: The saga continues. In Software Engineering and Advanced
Applications (SEAA), 2011 37th EUROMICRO Conference on (pp. 170-174).
IEEE.
[7] Meira, S. R., Buregio, V. A., Nascimento, L. M., Figueiredo, E., Neto, M.,
Encarnao, B., & Garcia, V. C. (2011, July). The Emerging Web of Social
Machines. In Computer Software and Applications Conference (COMPSAC),
2011 IEEE 35th Annual (pp. 26-27). IEEE.
36
[8] Yu, S., & Woodard, C. J. (2009, January). Innovation in the programmable web:
Characterizing the mashup ecosystem. In Service-Oriented ComputingICSOC
2008 Workshops (pp. 136-147). Springer Berlin Heidelberg.
[9] Kelly, S., & Tolvanen, J. P. (2008). Domain-specific modeling: enabling full
code generation. Wiley-IEEE Computer Society Press.
[10] Ross, D. T. (1978, June). Origins of the APT language for automatically
programmed tools. In History of programming languages I (pp. 279-338). ACM.
[11] Knuth, D. E. (1964). Backus normal form vs. backus naur form.
Communications of the ACM, 7(12), 735-736.
[12] Fowler, M. (2010). Domain-specific languages. Addison-Wesley Professional.
[13] Bray, T., Paoli, J., Sperberg-McQueen, C. M., Maler, E., & Yergeau, F. (1997).
Extensible markup language (XML). World Wide Web Journal, 2(4), 27-66.
[14] JavaScript Object Notation JSON. Online http://www.json.org/.
[15] Ben-Kiki, O., Evans, C., & Ingerson, B. (2001). YAML Ain't Markup
Language (YAML) Version 1.1. Working Draft 2008-05, 11.
[16] Fowler, M. (2005). A language workbench in action-MPS. Online
http://martinfowler.com/articles/mpsAgree.html.
[17] Maximilien, E. M., Ranabahu, A., & Gomadam, K. (2008). An online platform
for web apis and service mashups. Internet Computing, IEEE, 12(5), 32-43.
[18] Duvander, Adam (2012). 8,000 APIs: Rise of the Enterprise. Online
http://blog.programmableweb.com/2012/11/26/8000-apis-rise-of-the-enterprise/.
[19] Duvander, Adam (2012). The New API: Apps, Partners, Income. Online
http://blog.programmableweb.com/2012/06/13/the-new-api-apps-partnersincome.
[20] Fielding, R. (2000). Representational state transfer. Architectural Styles and the
Design of Netowork-based Software Architecture, 76-85.
[21] Duvander, Adam (2011). 1 in 5 APIs Say Bye XML. Online
http://blog.programmableweb.com/2011/05/25/1-in-5-apis-say-bye-xml/.
[22] Duvander, Adam (2012). 5,000 APIs: Facebook, Google and Twitter Are
Changing the Web. Online http://blog.programmableweb.com/2012/02/06/5000apis-facebook-google-and-twitter-are-changing-the-web/.
[23] Programmable
Web.
API
http://www.programmableweb.com/apis/.
Dashboard.
Online
[24] Duvander, Adam (2012). 6,000 APIs: Its Business, Its Social and Its
Happening
Quickly.
Online
http://blog.programmableweb.com/2012/05/22/6000-apis-its-business-its-socialand-its-happening-quickly.
[25] Brandon, Lorinda (2013). APIs as a Competitive Advantage. Disponvel em
http://blog.programmableweb.com/2013/01/09/apis-as-a-competitiveadvantage/.
37
[26] Maia,
Bruno.
DSL
JavaScript
https://github.com/brunoleaomaia/dsl.js.
Framework.
Online
[27] Raymond, E. (1999). The cathedral and the bazaar. Knowledge, Technology &
Policy, 12(3), 23-49.
[28] The BSD 2-Clause License. Online http://opensource.org/licenses/BSD-2Clause/.
[29] OReilly, Tim (1999). Lessons From Open-Source Software Development.
Communications of the ACM, 42(4), 32-37.
[30] The RedMonk (2012). Programming Language Rankings.
http://redmonk.com/sogrady/2012/09/12/language-rankings-9-12/.
Online
[31] World Wide Web Consortium (2011). HTML5 Specification. W3C Working
Draft. Online http://www.w3.org/TR/html5/.
[32] Raymond, D. R. (1992). Flexible text display with lector. Computer, 25(8), 4960.
[33] Ace - The High Performance Code Editor for the Web. Online
http://ace.ajax.org.
[34] D'souza, D. F., & Wills, A. C. (1998). Objects, components, and frameworks
with UML: the catalysis approach (Vol. 1). Reading: Addison-Wesley.
[35] JSON Templates. Online https://code.google.com/p/json-template/.
[36] JavaScript Template. Online https://github.com/blueimp/JavaScript-Templates/.
[37] Crespo, S., Fontoura, M., & Lucena, C. J. Using Viewpoints, Frameworks, and
Domain-Specific Languages to Enhance Software Reuse. In European Reuse
Workshop-ERW (Vol. 98).
[38] Wolfinger, R., Reiter, S., Dhungana, D., Grunbacher, P., & Prahofer, H. (2008,
February). Supporting runtime system adaptation through product line
engineering and plug-in techniques. In Composition-Based Software Systems,
2008. ICCBSS 2008. Seventh International Conference on (pp. 21-30). IEEE.
[39] jQuery Mobile: Touch-Optimized Web Framework for Smartphones & Tablets.
Online http://jquerymobile.com/.
[40] Appcelerator
Inc.
The
http://www.appcelerator.com/
Mobile
First
Platform.
Online
38
39
"name": "password",
"primitiveType": "BOOLEAN"
}, {
"name": "radius",
"primitiveType": "STRING"
}, {
"name": "readOnly",
"primitiveType": "BOOLEAN"
}, {
"name": "repeat",
"primitiveType": "STRING"
}, {
"name": "right",
"primitiveType": "STRING"
}, {
"name": "selected",
"primitiveType": "BOOLEAN"
}, {
"name": "size",
"primitiveType": "STRING"
}, {
"name": "style",
"primitiveType": "STRING"
}, {
"name": "text",
"primitiveType": "STRING"
}, {
"name": "title",
"primitiveType": "STRING"
}, {
"name": "top",
"primitiveType": "STRING"
}, {
"name": "value",
"primitiveType": "STRING"
}, {
"name": "visible",
"primitiveType": "BOOLEAN"
}, {
"name": "weight",
"primitiveType": "STRING"
}, {
"name": "width",
"primitiveType": "STRING"
}, {
"name": "background",
"primitiveType": "OBJECT",
"items": [{
"type": "color",
"required": false
}, {
"type": "image",
"required": false
}, {
"type": "repeat",
"required": false
}]
}, {
"name": "background",
"primitiveType": "OBJECT",
"items": [{
"type": "color",
"required": false
}, {
"type": "image",
"required": false
}, {
"type": "repeat",
"required": false
}]
}, {
"name": "border",
"primitiveType": "OBJECT",
"items": [{
"type": "color",
"required": false
}, {
"type": "width",
"required": false
}, {
"type": "radius",
"required": false
}]
}, {
"name": "font",
40
"primitiveType": "OBJECT",
"items": [{
"type": "family",
"required": false
}, {
"type": "size",
"required": false
}, {
"type": "style",
"required": false
}, {
"type": "weight",
"required": false
}]
}, {
"name": "formItems",
"primitiveType": "ARRAY",
"arrayType": "OBJECT",
"defaultType": "textfield"
}, {
"name": "formfield",
"primitiveType": "OBJECT",
"items": [{
"type": "align",
"required": false
}, {
"type": "background",
"required": false
}, {
"type": "border",
"required": false
}, {
"type": "bottom",
"required": false
}, {
"type": "color",
"required": false
}, {
"type": "enabled",
"required": false
}, {
"type": "font",
"required": false
}, {
"type": "height",
"required": false
}, {
"type": "id",
"required": true
}, {
"type": "left",
"required": false
}, {
"type": "opacity",
"required": false
}, {
"type": "readOnly",
"required": false
}, {
"type": "right",
"required": false
}, {
"type": "size",
"required": false
}, {
"type": "style",
"required": false
}, {
"type": "top",
"required": false
}, {
"type": "visible",
"required": false
}, {
"type": "weight",
"required": false
}, {
"type": "width",
"required": false
}]
}, {
"name": "label",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
41
"type": "text",
"required": true
},{
"type": "for",
"required": false
}]
}, {
"name": "textfield",
"primitiveType": "OBJECT",
"extends": "formfield",
"items": [{
"type": "hint",
"required": false
},{
"type": "maxLength",
"required": false
},{
"type": "password",
"required": false
},{
"type": "readOnly",
"required": false
},{
"type": "value",
"required": false
}]
}, {
"name": "textarea",
"primitiveType": "OBJECT",
"extends": "formfield",
"items": [{
"type": "hint",
"required": false
},{
"type": "maxLength",
"required": false
},{
"type": "readOnly",
"required": false
},{
"type": "value",
"required": false
}]
}, {
"name": "option",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
"type": "selected",
"required": false
},{
"type": "text",
"required": true
},{
"type": "value",
"required": false
}]
}, {
"name": "selectOptions",
"primitiveType": "ARRAY",
"arrayType": "OBJECT",
"defaultType": "option"
}, {
"name": "select",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
"type": "value",
"required": false
},{
"type": "selectOptions",
"required": true
}]
}, {
"name": "checkbox",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
"type": "text",
"required": true
},{
"type": "checked",
"required": true
},{
"type": "value",
42
"required": false
}]
}, {
"name": "slider",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
"type": "min",
"required": true
},{
"type": "max",
"required": true
},{
"type": "value",
"required": false
}]
}, {
"name": "button",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
"type": "text",
"required": true
}]
}, {
"name": "form",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
"type": "formItems",
"required": true
}]
}, {
"name": "window",
"primitiveType": "OBJECT",
"extends":"formfield",
"items": [{
"type": "form",
"required": true
}, {
"type": "title",
"required": true
}]
}],
"main": "window"
}
43
Anexo II Templates
org.dsle.FormUi.jQueryMobile.tpl
<!DOCTYPE html>
<html>
<head>
<title>{%=o.title%}</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.1/jquery.mobile1.3.1.min.css" />
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.js"></script>
</head>
<body>
<div data-role="page" id="{%=o.form.id%}">
<div data-role="header">
<h1>{%=o.title%}</h1>
</div>
<div data-role="content">
<form>
{%
for (var i = 0; i < o.form.formItems.length; i++) {
print('\t\t\t\t' + ide.formUi.getHtml(o.form.formItems[i]) + '\n',true)
}
%}
</form>
</div>
</div>
</body>
</html>
org.dsle.FformUi.Titanium.tpl
function {%=o.id%} () {
var main = Ti.UI.createWindow({
backgroundColor: '#fff'
});
var _{%=o.id%} = Ti.UI.createWindow({
backgroundColor: '#fff',
title: '{%=o.title%}'
});
var _{%=o.form.id%} = Ti.UI.createScrollView({
layout: 'vertical'
});
{%
for (var i = 0; i < o.form.formItems.length; i++) {
print('\t'+ide.formUi.getTitanium(o.form.formItems[i])+'\n', true)
print('\t_'+o.form.id+'.add(_'+o.form.formItems[i].id+');\n\n', true)
}
%}
_{%=o.id%}.add(_{%=o.form.id%});
if (Ti.Platform.osname == 'iphone') {
var navGroup = Ti.UI.iPhone.createNavigationGroup({
window:_{%=o.id%}
});
main.add(navGroup);
return main;
} else {
return _{%=o.id%};
}
}
module.exports = {%=o.id%};
44
45
});
break;
//TEXTFIELD
case 'textfield':
_a('type',((item.password)?'password':'text'));
if (item.value) _a('value', item.value);
if (item.maxLength) _a('maxlength', item.maxLength);
return this.getHtmlTag({
tag:'input',
attrs: attrs,
style: style,
selfClose: true
});
break;
//TEXTAREA
case 'textarea':
return 'var _'+item.id+';';
if (item.maxLength) _a('maxlength', item.maxLength);
return this.getHtmlTag({
tag:'textarea',
attrs: attrs,
style: style,
text: item.value || '',
selfClose: false
});
break;
//OPTION
case 'option':
return 'var _'+item.id+';';
if (item.value) _a('value', item.value);
if (item.selected) _a('selected', 'selected');
return this.getHtmlTag({
tag:'option',
attrs: attrs,
style: style,
text: item.text || '',
selfClose: false
});
break;
//SELECT
case 'select':
return 'var _'+item.id+';';
item.text = '';
for (var i = 0; i < item.selectOptions.length; i++) {
if (typeof item.value !== 'undefined') {
if (item.value === item.selectOptions[i].value)
item.selectOptions[i].selected = true;
}
item.selectOptions[i].type = 'option';
item.text += this.getHtml(item.selectOptions[i]);
};
return this.getHtmlTag({
tag:'select',
attrs: attrs,
style: style,
text: item.text || '',
selfClose: false
});
break;
//CHECKBOX
case 'checkbox':
_a('type', 'checkbox');
if (item.value) _a('value', item.value);
if (item.checked) _a('checked', 'checked');
return this.getHtmlTag({
tag: 'fieldset',
attrs: [],
style: [],
selfClose: false,
text: this.getHtmlTag({
tag:'input',
attrs: attrs,
style: style,
selfClose: true
}) + this.getHtmlTag({
tag:'label',
attrs:[{name: "for", value: item.id}],
style:[],
text: (item.text) || '',
selfClose: false
46
})
});
break;
//SLIDER
case 'slider':
_a('type', 'range');
if (item.value) _a('value', item.value);
if (item.max) _a('max', item.max);
if (item.min) _a('min', item.min);
return this.getHtmlTag({
tag:'input',
attrs: attrs,
style: style,
selfClose: true
});
break;
//BUTTON
case 'button':
_a('type','button');
if (item.text) _a('value', item.text);
return this.getHtmlTag({
tag:'input',
attrs: attrs,
style: style,
selfClose: true
});
break;
default:
return '<!-- TYPE ['+item.type+'] NOT FOUND -->';
}
}
}
org.dsle.FormUi.Titanium.js
{
id: 'org.dsle.FormUI.Titanium',
name: 'FormUI Titanium',
load: function() {
ide.formUi = ide.formUi || {};
ide.formUi.getTitaniumObject = function(o) {
var js = '';
js += 'var _'+o.id+' = Ti.UI.'+o.createFn+'('+JSON.stringify(o.config)+');'
return js;
}
ide.formUi.getTitanium = function(item) {
var config = {};
function _c(name, value){
config[name] = value;
}
if (item.align) _c('textAlign', item.align);
if (item.background && item.background.color) _c('backgroundColor',
item.background.color);
if (item.background && item.background.image) _c('backgroundImage',
item.background.image);
if (item.background && item.background.repeat) _c('backgroundRepeat',
item.background.repeat);
if (item.bottom) _c('bottom', item.bottom);
if (item.border && item.border.color) _c('borderColor', item.border.color);
if (item.border && item.border.width) _c('borderWidth', item.border.width);
if (item.border && item.border.radius) _c('borderRadius', item.border.radius);
if (item.color) _c('color',item.color);
if (item.enabled === false) _c('enabled', false);
if (item.font) _c('font', {});
if (item.font && item.font.family) config.font.fontFamily = item.font.family;
if (item.font && item.font.size) config.font.fontSize = item.font.size;
if (item.font && item.font.style) config.font.fontStyle, item.font.style;
if (item.font && item.font.weight) config.font.fontWeight, item.font.weight;
if (item.hint) _c('hintText', item.hint);
if (item.height) _c('height',item.height);
if (item.left) _c('left', item.left);
47
if
if
if
if
if
if
switch(item.type) {
//LABEL
case 'label':
_c('text', item.text || '');
return this.getTitaniumObject({
id: item.id,
createFn: 'createLabel',
config: config
});
break;
//TEXTFIELD
case 'textfield':
_c('passwordMask',(item.password));
if (item.value) _c('value', item.value);
if (item.maxLength) _c('maxlength', item.maxLength);
if (!item.border) _c('borderStyle', 'rounded');
return this.getTitaniumObject({
id: item.id,
createFn: 'createTextField',
config: config
});
break;
//TEXTAREA
case 'textarea':
if (item.value) _c('value', item.value);
if (item.maxLength) _c('maxlength', item.maxLength);
if (!item.border) _c('borderStyle', 'rounded');
return this.getTitaniumObject({
id: item.id,
createFn: 'createTextArea',
config: config
});
break;
//CHECKBOX
case 'checkbox':
var js = '';
_c('layout', 'horizontal');
_c('height', 'size');
js = this.getTitaniumObject({
id: item.id,
createFn: 'createView',
config: config
});
js += '\n\t';
js += this.getTitaniumObject({
id: '_'+item.id,
createFn: 'createSwitch',
config: { value: (item.checked) }
});
js += '\n\t';
js += this.getTitaniumObject({
id: '__'+item.id,
createFn: 'createLabel',
config: { text: item.text || '' }
});
js += '\n\t';
js += '_'+item.id+'.add(__'+item.id+');'
js += '\n\t';
js += '_'+item.id+'.add(___'+item.id+');'
return js;
break;
//SLIDER
case 'slider':
if (item.value) _c('value', item.value);
if (item.max) _c('max', item.max);
if (item.min) _c('min', item.min);
return this.getTitaniumObject({
id: item.id,
createFn: 'createSlider',
config: config
});
break;
48
//BUTTON
case 'button':
_c('title', item.text || '');
return this.getTitaniumObject({
id: item.id,
createFn: 'createButton',
config: config
});
break;
default:
return 'var _'+item.id+'; //TYPE NOT FOUND';
}
}
}
49
create_account.js
function winCreateAccount () {
var main = Ti.UI.createWindow({
backgroundColor: '#fff'
});
var _winCreateAccount = Ti.UI.createWindow({
backgroundColor: '#fff',
title: 'Create Account'
});
var _frmCreateAccount = Ti.UI.createScrollView({
layout: 'vertical'
});
var _lblEmail = Ti.UI.createLabel({"text":"E-mail:"});
_frmCreateAccount.add(_lblEmail);
var _email = Ti.UI.createTextField({"hintText":"enter your email","borderStyle":"rounded"});
_frmCreateAccount.add(_email);
var _lblPassword = Ti.UI.createLabel({"text":"Password:"});
_frmCreateAccount.add(_lblPassword);
var _password = Ti.UI.createTextField({"hintText":"enter your
password","passwordMask":true,"borderStyle":"rounded"});
_frmCreateAccount.add(_password);
var _accept = Ti.UI.createView({"layout":"horizontal","height":"size"});
var __accept = Ti.UI.createSwitch({"value":false});
var ___accept = Ti.UI.createLabel({"text":"I accept this terms."});
_accept.add(__accept);
_accept.add(___accept);
_frmCreateAccount.add(_accept);
50
_winCreateAccount.add(_frmCreateAccount);
if (Ti.Platform.osname == 'iphone') {
var navGroup = Ti.UI.iPhone.createNavigationGroup({
window:_winCreateAccount
});
main.add(navGroup);
return main;
} else {
return _winCreateAccount;
}
}
module.exports = winCreateAccount;
51