Académique Documents
Professionnel Documents
Culture Documents
Extenses Arquiteturais
com jCompany Extensions
6
A
herana, especialmente atravs do DP Template Method nas camadas de controle (*Action) e modelo
(*Manager ou *BO). Alm disso, vimos que o jCompany tambm traz uma arquitetura rica e extensvel
na camada viso, seja de "cliente" (Javascript, Ajax, CSS, HTML), seja de servidor (XHTML/Facelets,
JSF).
Mas em todas as prticas que simulamos at agora estvamos preocupados em solucionar um problema
de negcio especfico, em nvel de um Caso de Uso. No mundo real, muitas regras de negcio e
customizaes em geral tero utilidade para alm deste escopo, para certo nmero de casos de uso ou
mesmo para todos eles! Para cada um destes cenrios, um conjunto diferente de Design Patterns mais
apropriados deve ser utilizado.
Vejamos quais os principais cenrios de demanda por programao candidata ao reso - e respectivos
padres de implementao recomendados:
1.
2.
3.
4.
Conforme citado, neste captulo iremos discutir a nova possibilidade descrita no item trs, uma vez que
somente foi incorporada a partir do suporte ao padro CDI, iniciado nas verses 5.5.x e aprimorado no
ramo 6.0.x.
- Bridge x Extension
Mas por que no implementamos estes novos padres via DP Template Methods e os disponibilizamos na
camada Bridge, por exemplo?
A experincia em instalaes mais avanadas demonstra que, muito embora a Bridge seja uma soluo
bastante til para prover um espao para customizaes "globais" (ou, ao menos, teis para um portflio
inteiro de aplicaes), ela comea a oferecer limitaes quando um maior nmero de padres "opcionais"
comea a ser incorporado em seu nvel.
Os projetos que formam a Bridge so um "espao arquitetural" ideal para: regras de segurana,
logging/auditoria, customizaes de "web-design corporativo" (logo, topos de impresso, cores, etc.),
customizaes globais de mensagens, etc.. Ou seja, para implementaes corporativas ou de grande
amplitude de reso.
Aproveitar este mesmo espao para catalogar padres opcionais, digamos que sejam teis em trs ou
quatro casos de uso distintos de uma ou outra aplicao - pode levar a uma rpida deteriorao da
estabilidade desta camada. Isso se nota atravs de conflitos entre diferentes padres "competindo" pelos
mesmos "extentions points", por exemplo, onde evolues em um padro A acabam instabilizando um
padro B existente e j estvel. Ao final, pode-se sofrer com perda de coeso, tornando-se difcil
identificar e manter cada padro individualmente.
Por tudo isso e pelas facilidades adicionais de gerao de cdigo que preconizamos o uso do novo DP
Observer via jCompany Extension, para a categoria 3 do tpico anterior.
No novo padro proposto, alm de um novo boto de importao e um mtodo de controle padro
(disponvel para que o desenvolvedor implemente a importao em si*), queremos impedir que o usurio
exclua ou inclua novos itens. Ele poder, no entanto, alterar as descries dos itens importados.
Se este fosse um problema pontual, especfico de um Caso de Uso, ento o resolveramos como citamos
na introduo deste captulo, com DP Template Method e especializaes de camada viso. Porm, se
como Arquitetos de Software o julgarmos "arquiteturalmente significante" (haver um volume maior de
casos e h uma boa parcela repetitiva e onerosa de codificao similar), o melhor encaminhamento
generalizar parcialmente uma soluo na forma de um novo padro, para maximizar o ganho de escala.
Vamos ento iniciar a criao deste novo padro, como nosso primeiro "jCompany Extension":
1.
No Eclipse, acione o menu "File -> New Project -> Powerlogic jCompany Code Generator", e em
seguida "Criar novo mdulo de extension jCompany". Conforme a Figura G23.1.
2.
Preencha o prximo formulrio conforme a Figura G23.2. Note que o nome dado ao novo padro
"importacao".
*
Perceba que nosso foco aqui em reuso do arcabouo MVC2-P, organizao de classes e artefatos, etc. - e no em generalizar o
algoritmo de importao em si!
#1. Nome do novo projeto de extenso, conforme dito anteriormente o nosso padro chamar
"importacao".
#2. Diretrio em que a aplicao ser salva. Caso o checkbox "Use default" esteja marcado ela ser
enviada para o workspace do eclipse.
#3. Nome do pacote base do projeto. Usaremos o padro j citado no livro, uma vez que ele
garante a especificidade do projeto.
#4. Arquivo de template para o projeto de extenso jCompany. Selecione o arquivo padro
"jcompany_ini_extension.zip" encontrado na pasta "meus projetos" do Eclipse ou o arquivo
personalizado criado para sua empresa.
#5. Sigla do mdulo de extenso, usaremos "Imp". Esta sigla usada em algumas configuraes
que veremos mais a frente.
#6. Caminho da aplicao raiz. Usaremos a aplicao "rhtutorial".
3.
Figura G23.4. Diretrios padres gerados para o projeto jCompany Extension "importacao"
#1. Diretrio que deve conter o cdigo fonte (Java) do projeto jCompany Extension "importacao".
#2. Diretrio que deve conter arquivos com anotaes Java que representam "metadados" do
projeto jCompany Extension "importacao".
#3. Diretrio padro META-INF para JARs. Os arquivos deste diretrio so interpretados pelo plugin
"Gerador Dinmico" possibilitando o funcionamento dos assistente de gerao de cdigo
integrados ao projeto jCompany Extension "importacao".
Prover um novo boto padro para acionar a importao de arquivo e um mtodo de controle
padro para a implementao da importao em si (futuramente, o prprio algoritmo de
importao poderia ser tambm generalizado nesta extenso).
Tambm queremos impedir que o usurio exclua ou inclua novos itens. Ele poder, no entanto,
alterar as descries dos itens importados.
Para implementar a demanda acima ser necessrio criar duas classes, descritas abaixo:
Controlador: A classe "EmpImportacaoActionObserver.java" contem a implementao dos Observers do extension. A classe pode ser vista
package com.empresa.rhtutorial.importacao.controle.jsf;
...
public class EmpImportacaoActionObserver {
protected @Inject @QPlcDefault PlcMetamodelUtil metamodelUtil;
/**Mtodo responsavel por ocultar o botao F7-Novo e o check-box de excluso*/
public void trataBotoesConformeLogicaApos(
@Observes @PlcTrataBotoesConformeLogicaApos PlcBaseJsfAction action) throws PlcException {
PlcConfigImportacao configTabular = EmpImportacaoHelper.getInstance()
.getConfigTabularConsulta();
if (configTabular != null) {
if (configTabular.ehConsultaTabular()) {
PlcContextUtil contextUtil = PlcCDIUtil.getInstance()
.getInstanceByType(PlcContextUtil.class,QPlcDefaultLiteral.INSTANCE);
HttpServletRequest request = contextUtil.getRequest();
getServiceVisaoPlc().naoExibir(contextHelperPlc.getRequest(),
PlcConstantes.ACAO.EXIBE_BT_INCLUIR);
action.getVisaoJsfUtil().naoExibirComCorrelatos("indExcPlc");
}
}
}
/**Metodo responsavel por desabilitar a funcao do F7-Novo...*/
public void tabularNovoAntes( @Observes @PlcTabularNovoAntes PlcBaseJsfAction action)
throws PlcException {
PlcConfigImportacao configTabular = EmpImportacaoHelper.getInstance()
.getConfigTabularConsulta();
if (configTabular != null) {
if (configTabular.ehConsultaTabular()) {
action.setContinuaFluxo(false);
} else {
action.setContinuaFluxo(true);
}
} else {
action.setContinuaFluxo(true);
}
}
/**Metodo responsavel por impedir que novos registros sejam inseridos.*/
public void gravaTabularAntes(@Observes @PlcGravaTabularAntes PlcBaseJsfAction action)
throws PlcException {
PlcConfigImportacao configTabular = EmpImportacaoHelper.getInstance()
.getConfigTabularConsulta();
if (instance.getId() == null && StringUtils.isBlank(instance.getIdAux())) {
itensPlc.remove(i);
} else {
instance.setIndExcPlc(false);
instance.setIndExcPlc("N");
}
}
}
no package com.empresa.rhtutorial.importacao.controle.jsf;
...
public class EmpImportacaoActionObserver {
package com.empresa.rhtutorial.importacao.metadados;
...
@Documented
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
@PlcMetaConfig(raiz = true, escopo = Escopo.APP, camada = Camada.COMUNS)
@PlcMetaEditor(rotulo = "Consulta ManterClasse", descricao = "Configuraes complementares para
ManterClasse Somente Consulta")
// Configuraes globais de definio de logica manterclasse somente consulta
public @interface PlcConfigImportacao {
boolean ehConsultaManterClasse();
}
Cdigo G23.2:
package com.empresa.rhtutorial.importacao.metadados;
...
@Documented
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
@PlcMetaConfig(raiz = true, escopo = Escopo.APP, camada = Camada.COMUNS)
@PlcMetaEditor(rotulo = "Consulta ManterClasse", descricao = "Configuraes complementares para
ManterClasse Somente Consulta")
// Configuraes globais de definio de logica manterclasse somente consulta
public @interface PlcConfigImportacao {
boolean ehConsultaManterClasse();
}
Se isso ocorrer, as falhas potenciais durante o reso aumentam bastante. Nestes casos, para melhorar
nossas chances de reso bem sucedido por parte dos desenvolvedores, podemos suplementar as tcnicas
OO que utilizamos at aqui com tcnicas de gerao de artefatos, tambm previstas no mecanismo do
jCompany Extension.
Importante: no gostamos de usar o termo "gerador de cdigo" porque, em nossa estratgia, no
estamos gerando "cdigo java", que por ser generalizvel melhor tratado via OO. Como geramos
artefatos "no Java", no generalizveis, utilizamos o termo "gerador de artefatos".
Perceba que a unio das duas tcnicas em uma soluo de mais alto nvel bem a forma com que o
prprio jCompany trabalha. Pode parecer menos importante, mas a gerao de artefatos assistida e
integrada a uma soluo OO acelera o aprendizado e diminui erros nos resos iniciais.
...
<!--Declarao do script - Informao contendo o Titulo do Padro, exibido na tela inicial do wizard - Ex.:
(ManterClasse - Mestre Detalhe - Consulta)-->
<plc-padrao titulo="Caso de Uso Padrao 'Manter Classe Importao' (ManterClasse)">
<!--Exemplo de Utilizao do Plugin Dinmico para gerao de uma lgica ManterClasse Manter Classe
Somente Alterao. Neste script, voc encontrara exemplos de utilizao dos componentes do Plugin Dinmico.
- Definio de Telas - Definio de Campos - Invocao das tarefas para criao ou alterao dos arquivos.-->
<!-- Definio do cone que ser exibido na tela inicial -->
<padrao-imagem>
importacao/plcextension/img/comuns/folder_aberta.gif
</padrao-imagem>
<padrao-descricao>
Bem-vindo ao tutorial do jCompany para o Caso de Uso 'Manter Classe Importao'.
Neste tutorial voc ir gerar todos os artefatos necessrios para
realizar manuteno em registros de menor escala. Vamos comear!
</padrao-descricao>
<!-- Esteretipo utilizado internamente pelo Plugin Dinmico. Deve ter nome nico...-->
<padrao-estereotipo>
ManterClasse_importacao
</padrao-estereotipo>
<!-- Exemplo de definio de componentes da primeira pgina do gerador com um campo String-->
<pagina titulo="Pgina 1 - Definio do Caso de Uso">
<campo>
<codigo>projeto</codigo>
<rotulo>Projeto Selecionado: </rotulo>
<ajuda>Digite aqui o nome do projeto.</ajuda>
<dominio>STRING</dominio>
<obrigatoriedade>true</obrigatoriedade>
<valor-default></valor-default>
<script>groovy/comuns/ValoresDefault</script>
</campo>
</pagina>
...
<!-- Exemplo de definio de componentes da segunda pgina do nosso gerador com um campo String-->
<pagina titulo="Pgina 2 - Definio do Evento Especfico">
<campo>
<codigo>nomeEvento</codigo>
<rotulo>nomeEvento Especifico</rotulo>
< ajuda>
Digite o nome do Evento Especfico (Ex.: gravar, importar,
iniciarSincronizacao)
</ajuda>
< dominio>STRING</dominio>
< obrigatoriedade>true</obrigatoriedade>
< valor-default></valor-default>
</campo>
...
</pagina>
<!-- Exemplo de definio de componentes da terceira pgina do nosso gerador com um campo Grid-->
<pagina titulo="Pgina 3 - Definio componentes da tela">
...
<campo>
<codigo>propriedades</codigo>
<rotulo>Propriedades da Entidade</rotulo>
<ajuda>Propriedades da Entidade</ajuda>
<dominio>GRID</dominio>
<grid-def>
...
<campo>
<codigo>tipo</codigo>
<rotulo>Tipo Propriedade</rotulo>
<ajuda>Tipo da propriedade</ajuda>
<dominio>COMBO</dominio>
<dominioDiscreto>
<opcao>
<rotulo>Texto</rotulo>
<valor>texto</valor>
</opcao>
...
</dominioDiscreto>
...
</pagina>
<!-- Criao de uma pgina xhtml atravs da chamada a uma classe Groovy. O
Corpo do xhtml ser o contedo do template velocity/extensions/ManterClasse/corpo-xhtmlManterClasse.vm.
Possibilita ao usurio escolher o arquivo de destino. Exemplo de funcionamento em
CriarPagina.groovy-->
<acao>
<tipo-acao>groovy/comuns/PlcCriarPagina</tipo-acao>
<template-origem>
/scripts/velocity/extension/ManterClasse/corpo-xhtml-manterclasse-alteracao.vm
</template-origem>
<diretorio-arq-destino>
/src/main/webapp/WEB- INF/fcls/${subdiretorio} / ${casouso}Tab.xhtml
</diretorio-arq-destino>
</acao>
...
</plc-padrao>
Cdigo G23.3. Estrutura do arquivo de configurao com explicao de segmentos mais importantes.
O arquivo XML criado define um novo "assistente Eclipse" que coleta dados em trs passos e utiliza estes
dados para gerar todos os artefatos necessrios para execuo do novo padro. Nesta tcnica, cada
campo coletado no assistente pode ser referenciado por arquivos de template para gerao do resultado
final.
Os passos do assistente foram projetados segundo os objetivos abaixo (confira os comentrios no
arquivo XML para entender como cada objetivo foi atingido):
Passo um: o assistente pede informaes elementares para gerao do Caso de Uso, como nome
(identificador da URL), subdiretrio para armazenar as pginas XHTML geradas, ttulo do
formulrio e classe de entidade principal j devidamente mapeada
Passo dois: coleta de informaes referentes ao boto especfico JSF que ser criado para
importao, como o nome do evento e o rtulo do Boto, bem como o nome da Action que
abrigar o Template Method para implementao do algoritmo de importao em si (iremos
neste caso gerar uma classe Java, mas com fins arquiteturais, ou seja, sem algoritmo e focando
somente em sua estrutura).
Passo trs: coleta informaes sobre o formulrio, permitindo que o usurio personalize os
campos a serem gerados no XHTML prprio, e em conformidade com os dados da entidade
principal selecionada no passo um.
Para que o gerador dinmico utilize as entradas de dados fornecidas pelo usurio e gere artefatos
dinmicos com base nelas, preciso configurar as aes no arquivo
"manterclasse.importacao.padrao.xml".
Uma ao a execuo de um programa Groovy, que poder ou no invocar um template com instrues
Velocity que permite a gerao refinada de arquivos de vrios formatos. A aes mais comuns, tanto em
Groovy quanto em Velocity j so disponibilizadas na criao do projeto dentro do diretrio "METAINF/plcextension/script". Elas podem ser utilizadas diretamente, sem modificao, mas tambm so
totalmente personalizveis pelo desenvolvedor, que pode ainda criar outras, totalmente novas.
As aes Groovy disponibilizadas so:
o
PlcCriarClasse: Cria uma Classe Java com base em um modelo Velocity pr definido. Este
artefato pode ser utilizado em toda lgica que necessite da criao de Classes Java, como Beans
por exemplo.
PlcValoresDefault: Utilizado para preencher valores defaults nos campos do assistente. Este
artefato pode ser utilizado ao definir um campo para uma pgina, o usurio pode definir um
valor padro para esse campo.
Note que temos aes especializadas na gerao ou alterao da maioria dos artefatos tpicos da
arquitetura Java EE.
As linguagens Groovy e Velocity so linguagens populares de script, dinmicas e simples de se entender
e alterar. Recomendamos uma leitura e explorao de alteraes sobre os arquivos padres, para seu
pleno entendimento.
Portanto, conforme definido no template-origem para esta ao, precisamos criar o template Velocity
"corpo-xhtml-manterclasse-alteracao.vm" no diretrio padro indicado na Figura G23.7.
Cdigo G23.4. Note que, enquanto algumas estruturas so fixas (constantes), outras sero modificadas
dinamicamente pelo Velocity (textos inicados com "#" e "$"), conforme informaes coletadas no
value="#{item.${umaProp.nome}}" />
assistente.
...
<html>
<ui:composition>
<plcf:tabela tituloChave="${contexto.casouso}.titulo">
<plcf:linha>
<plcf:celula/>
#foreach ($umaProp in $contexto.entidade.listaPropriedades)
#if ($umaProp.gerar == 'S')
#if ( $umaProp.nome != 'hashCodePlc')
<plcf:celula>
plcf:titulo tituloChave="label.$umaProp.nome"/>
</plcf:celula>
#end
#end
#end
</plcf:linha>
<plcf:iteracao id="plcLogicaItens" value="#{plcLogicaItens.itensPlc}">
<plcf:linha>
<plcf:celula styleClass="celulaFormularioContador">
<plcf:contador>1.</plcf:contador>
</plcf:celula>
#foreach ($umaProp in $contexto.entidade.listaPropriedades)
#if ( $umaProp.gerar == 'S')
#if ( $umaProp.nome != 'hashCodePlc')
<plcf:celula styleClass="celulaFormularioCaixaMarcacao" rendered="#{empty
requestScope.visualizaDocumentoPlc}">
#if ($umaProp.nome == 'id')
<plcf:oid/>
#elseif ($umaProp.tipo == 'texto')
<plcf:texto id="${umaProp.nome}" value="#{item.${umaProp.nome}}" />
#elseif ($umaProp.tipo == 'inteiro')
<plcf:texto id="${umaProp.nome}" value="#{item.${umaProp.nome}}" />
#elseif ($umaProp.tipo == 'longo')
<plcf:texto id="${umaProp.nome}" value="#{item.${umaProp.nome}}" />
#elseif ($umaProp.tipo == 'data')
<plcf:data id="${umaProp.nome}" value="#{item.${umaProp.nome}}" />
#elseif ($umaProp.tipo == 'numerico')
<plcf:numerico id="${umaProp.nome}" value="#{item.${umaProp.nome}}" />
#elseif ($umaProp.tipo == 'boolean')
<plcf:caixaMarcacao id="${umaProp.nome}
value="#{item.${umaProp.nome}}" />
conter metadados de Casos de Uso Padres. Como sabemos, iremos precisar de dois destes arquivos:
um para o projeto principal (metadados de camada controle) e outros para o projeto de domnio
(metadados de camada comuns).
Como o segundo "package-info.java" no ser gerado no projeto Eclipse principal um atributo adicional
"<projeto-destino>" deve ser adicionado segunda declarao de ao, alterando o projeto no qual o
arquivo ser criado. Observe o uso do token na declarao da Figura G23.7.
Para satisfazer primeira "acao" definida, crie o arquivo "package-info-manterclasse-grupocontroleaction-especifica.vm" no mesmo diretrio que citamos no tpico anterior. O contedo do arquivo pode ser
conferido no Cdigo G23.5 abaixo.
/** Meta-dados para a camada de controle. Define preferncias e inverses de controle de uso somente da
camada controle */
@PlcConfigGrupoControle(
action = ${contexto.pacotebase}.controle.jsf.${contexto.nomeAction}.class,
/** Usa layout universal */
layoutUniversal = @PlcConfigLayoutUniversal(dirBaseFacelets = "/WEB-INF/fcls/${contexto.subdiretorio}"
),
#set ($flagDespresar = '')
#foreach ($umaProp in $contexto.propsentidade.listaPropriedades)
#if ($umaProp.nome != 'dataUltAlteracao' &&
$umaProp.nome != 'usuarioUltAlteracao' &&
$umaProp.nome != 'versao' && $umaProp.nome != 'id' &&
$umaProp.nome != 'hashCodePlc' && $umaProp.nome != 'indExcPlc')
#if ($flagDespresar == '')
#set ($flagDespresar = $umaProp.nome)
#end
#end
#end
tabular = @PlcConfigTabular(
propReferenciaDesprezar = "$flagDespresar",
testaDuplicataFlagDesprezar = true, numeroNovos = 4),
comportamento = @PlcConfigComportamento(detalheLembra = true)
)
package com.powerlogic.jcompany.config.app.${contexto.casouso};
...
Cdigo G23.5. Contedo do arquivo "package-info.java"para satisfazer a primeira "acao".
@PlcConfigGrupoAgregacao(
entidade = ${contexto.entidade}.class,
padrao = @PlcConfigPadrao(logica = PlcConfigPadrao.Logica.MANTERCLASSE,
complexidade = PlcConfigPadrao.Complexidade.SIMPLES,
exclusaoModo = PlcConfigPadrao.ExclusaoModo.FISICA)
)
@PlcConfigImportacao(ehConsultaManterClasse=true)
Package com.powerlogic.jcompany.config.dominio.app.${contexto.casouso};
...
Cdigo G23.6. Conteudo do arquivo "package-info.java" para satisfazer a segunda "acao".
- Criando template para classe Action (para estimular o uso do Template Method correto)
Conforme explicado no incio do captulo, esperado que seja definida uma classe que estende (herda)
de outra que implementa um DP Template Method, que prov um local padronizado para que o usurio
possa implementar o algoritmo de importao dos dados em si.
Um esqueleto desta classe pode ser gerado para adiantar este trabalho e estimular o uso correto por
parte do desenvolvedor. Note que, novamente, no h pretenso aqui de gerar "cdigo Java", mas
somente estruturas da soluo arquitetural - o que evita o anti-pattern "gerao de cdigo OO
generalizvel".
A figura abaixo ilustra a ao como deve ser declarada no XML de definio do assistente.
O groovy "PlcCriarClasse" ir utilizar como template o arquivo "action-evento-especifico-manterclassecriacao.vm", que est definido no cdigo abaixo.
package ${contexto.pacotebase}.controle.jsf;
...
@PlcTratamentoExcecao
public class ${contexto.nomeAction} extends AppAction {
protected static final Logger log = Logger.getLogger(${contexto.nomeAction}.class);
public String ${contexto.nomeEvento}() throws PlcException {
return PlcJsfConstantes.NAVEGACAO.IND_MESMA_PAGINA;
}
}
Cdigo G23.7. Contedo do template Velocity para gerao da classe.
Precisaremos ento criar o template Velocity "altera-geral-acoes.vm" conforme visto no Cdigo G23.8.
Importante: Alm disso, neste caso precisamos definir ainda um ponto de insero no arquivo
"geralAcoesComplemento.xhtml", para evitar erros de interpretao do gerador, em situaes onde
existam contedos complexos neste arquivo. Note que possvel se definir este ponto (um comentrio
padro) nos templates INI utilizados pela organizao, de modo que j venham pr-configurados em
todos os seus projetos:
Com isso, finalizamos todas as configuraes necessrias para disponibilizar nosso novo componente OO
com um assistente que apie decisivamente seu reso, inclusive gerando todas as partes especficas e
que no foram possvel de ser generalizadas.
Com isso, o mecanismo do jCompany Extension ir identificar e disponibilizar o novo padro, para que
aparea nos assistentes do Eclipse.
Caso a sua verso do jCompany tenha sido atualizada via "Eclipse Update (online)", a url correta para encontrar o plugin :
*
"[jcompany_base]/eclipse/plugins/com.powerlogic.jcompany.ide.geradordinamico_[versao]" .
Ao clicar em "next" vamos para a tela de seleo de assistente dinmicos. Perceba que todos os novos
padres so exibidos no segundo passo, conforme mostra a Figura G23.15.
Aps selecionar o Caso de Uso Padro "Manter Classe Importao" clique novamente em "Next" para
seguir para o primeiro passo do assistente dinmico, ilustrado na Figura G23.16.
Figura G23.16. Primeiro passo do assistente dinmico, exibindo campos conforme configuraes do arquivo XML.
Uma vez definida a entidade e informaes bsicas, vamos para o passo de configurao da classe de
Action. A Figura G23.17 mostra o resultado das configuraes feitas para o passo 2.
Clique novamente em "Next" para seguir para o ltimo passo. Note que este retorna todas as
propriedades da entidade selecionada no passo 1 e ainda fornece opes de configurao para gerao
para cada uma delas. A Figura G23.18 mostra este passo j devidamente preenchido.
Figura G23.18. ltimo passo, de edio de propriedades da Entidade para gerao do formulrio.
Aps clicar no boto "Finish", o gerador dinmico ir processar e executar as aes Groovy definidas ao
final do XML, conforme vimos, gerando ento todos os artefatos necessrios para que o desenvolvedor j
obtenha o Caso de Uso em estgio prximo ao final. Neste caso, restando apenas a implementao do
algortimo especfico de importao em si (futuramente o Arquiteto de Software tambm poderia
considerar generalizar at este algoritmo, at certo ponto).
Neste ponto, se o desenvolvedor desejar, ele ainda pode editar cada um dos artefatos gerados e efetuar
ajustes manuais para variaes sutis necessrias em cada caso especfico - mas se j fizer a liberao de
imediato ele pode comprovar que o resultado final j tem qualidade de produo e est bastante
finalizado e em conformidade com o padro definido!
Sumrio
Neste captulo introduzimos a nova tecnologia do jCompany Extensions, que permite aos Arquitetos de
Software criarem novos padres de alto nvel similares aos do jCompany, englobando generalizaes OO
(derivadas ou no de padres existentes) e, opcionalmente, opes complementares de gerao de
artefatos.
Experimentamos a flexibilidade de se especializar o comportamento do jCompany atravs do DP Observer
via novo padro CDI e discutimos em quais cenrios cada tcnica de especializao se encaixa melhor:
DP Template Method para soluo pontual; DP Template Method + DP Observer para reuso intra-projeto;
DP Template Method + DP Observer + DP Bridge para reuso corporativo; ou DP Observer para um reuso
inter-projetos mais escalvel.
Construimos um novo padro com base em uma primeira extenso bastante simples, porm ressaltando
as inmeras possibilidades de uso deste novo e poderoso recurso.