tag:blogger.com,1999:blog-19289644915235277352024-03-05T00:50:28.433-08:00Brandão.orgBrandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-1928964491523527735.post-76307398305067400392018-09-05T08:46:00.000-07:002018-09-06T13:49:51.749-07:00Entenda o funcionamento das transações do Entity File ManagerEntity file manager é um recurso que permite persistir entidades em arquivos estruturados. Ele foi desenvolvido com a finalidade de dar suporte à persistência de dados no BRCache.<br />
<br />
<h2>
Transações</h2>
<br />
Uma transação é uma coleção de operações que desempenha uma função lógica única. Ela tem que ter as seguintes propriedades:<br />
<br />
<ul>
<li>atomicidade: todas as operações contidas na transação são tratadas como uma única unidade. Todas as operações são feitas ou nada é feito.</li>
<li>consistência: uma transação concluída deixa o sistema em um estado interno consistente.</li>
<li>isolamento: em um ambiente de múltiplas transações, uma não interfere na outra.</li>
<li>durabilidade: os resultados das transações são armazenadas permanentemente no sistema.</li>
</ul>
<br />
O entity file Manager permite que transações confirmadas possam ser efetivadas em paralelo com transações em execução. Também favorece a redução das operações de I/O, pois ele permite atualizações em lote. Todas as operações de inserção e atualização são executadas em um arquivo temporário num primeiro momento e depois em segundo plano no arquivo original.<br />
<div>
<br /></div>
<div>
<h2>
Insert/Update</h2>
<div>
<br /></div>
<div>
As transações confirmadas são gravadas no arquivo recoverylogX e os dados das entidades também são gravadas no arquivo temporário. Elas são inseridas sempre no final do arquivo. Este método reduz o I/O em updates, pois toda atualização também é uma inserção e pode ser feito em lote. No momento em que não existir nenhum transação sendo processada, o arquivo temporário é sincronizado com o arquivo original.</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<span id="docs-internal-guid-67c8cac9-7fff-48b1-a785-b14077a41bd7" style="margin-left: 1em; margin-right: 1em;"><img height="300" src="https://lh4.googleusercontent.com/OUUs5wQTOij-rcq4fqiCc-sX-mjvhHR_M-6GfZA_eDyFuW5s-HFsjzv7HCbkbqPfH9JUvdRNKCG4xBgxHC8U3nb0CHu4iIKsBkabwyzhdXShHw3ddVMCHnXJ4aJK1wSIAnWl6X6h2uQ" width="400" /></span></div>
<div>
</div>
<div>
<br /></div>
<div>
<h2>
Select</h2>
<div>
<br /></div>
<div>
Quando um arquivo está envolvido em uma transação, a pesquisa sempre ocorre primeiro no arquivo temporário e depois no arquivo original. A pesquisa ocorre sempre primeiro no arquivo temporário, porque nele ficam armazenadas as alterações feitas pelas transações anteriores depois da última sincronização com o arquivo original.</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<span id="docs-internal-guid-3d6407f4-7fff-1440-a3f9-9a19d78dc661" style="margin-left: 1em; margin-right: 1em;"><img height="300" src="https://lh3.googleusercontent.com/hQ8gmldNPKi2_11s_o43IJ7MKgbudjyiKYtMEtYFVkdmAwgaohcbfRSg1YSOo856begXDOaSdL0IPpCAnlxp7n5d8Wq9zHCIcedU1jzob3aN_A74yBPqV8uHHtvj-dejKUtSqI7VnRY" width="400" /></span></div>
<div>
</div>
<div>
<br /></div>
<div>
<h2>
Efetivando as transações</h2>
<div>
<br /></div>
<div>
Quando o arquivo recoverylogX atinge o seu tamanho máximo, ele é fechado e enviado para um processo paralelo que aplica as alterações no arquivo original. O arquivo temporário é sincronizado com o arquivo original somente quando não houver transações ativas.</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<span id="docs-internal-guid-b5aa9b4f-7fff-0e88-4af4-8280f29adf05" style="margin-left: 1em; margin-right: 1em;"><img height="300" src="https://lh6.googleusercontent.com/mueKAh5bufG17Oi9xBHgqcXi_eFE7UhZ3PU7fapBlChx7P_F6kKAiRgCAJqQsNzQUyVA0GHVLL0xXpdjyvxxtCC33QlHRTF6QMr7yAVY8YhoaeKBRR6sg8kWIfv9zgSsVD3bm0Y1DyI" width="400" /></span></div>
<div>
</div>
<div>
<br /></div>
Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-61402931702276245932018-09-04T18:29:00.000-07:002018-09-05T08:22:08.878-07:00Entity file manager (subprojeto do BRCache)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLcpNZDyOb75GMzkA_-SsYw1VldES6BsYqWXNrxb-9AFfWlbONv9oRA82ILrYwxd-Pr5w503G5QUYs0uf_yiR8VdN14QmaQ535aEO3njb9GRRq2bLoYkI2ot-n5-GfMNkv1_iedGyYWB8/s1600/entity+file+manager.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="362" data-original-width="814" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLcpNZDyOb75GMzkA_-SsYw1VldES6BsYqWXNrxb-9AFfWlbONv9oRA82ILrYwxd-Pr5w503G5QUYs0uf_yiR8VdN14QmaQ535aEO3njb9GRRq2bLoYkI2ot-n5-GfMNkv1_iedGyYWB8/s400/entity+file+manager.png" width="400" /></a></div>
<br />
<br />
<div style="text-align: justify;">
Entity file manager é um recurso que permite persistir entidades em arquivos estruturados. Ele foi desenvolvido com a finalidade de dar suporte à persistência de dados no BRCache. Ele basicamente é composto pelas classes EntityFileManager, EntityFile, EntityFileAccess e EntityFileTransactionManager.</div>
<div style="text-align: justify;">
<br /></div>
<h2>
1. EntityFileManager</h2>
<br />
<div style="text-align: justify;">
A classe EntityFileManager provê todos os recursos necessários para a manipulação de entidades. Ela trabalha em conjunto com EntityFileAccess para armazenar as entidades no arquivo e EntityFileTransactionManager para manter a consistência. </div>
<div style="text-align: justify;">
Para cada operação de inserção, atualização e seleção, é necessário que sempre tenha uma transação explicita.</div>
<div style="text-align: justify;">
São providas somente instâncias da EntityFile associadas a uma transação. As operações executadas nela são delegadas ao EntityFileTransactionManager que faz as o necessárias para manter a consistência do arquivo.</div>
<br />
<div>
<h2>
2. EntityFile</h2>
<div style="text-align: justify;">
<br />
A classe EntityFile provê recursos que permitem manipular um tipo específico de entidade. Com ela é possível inserir, atualizar, apagar e selecionar uma entidade. Ao inserir uma entidade, o EntityFile envia uma requisição ao EntityFileTransactionManager solicitando que a entidade seja incluída no arquivo. Depois de inserida, é obtida uma identificação única. A identificação indica a posição da entidade dentro do arquivo.</div>
<div style="text-align: justify;">
Na atualização, o EntityFile envia uma requisição ao EntityFileTransactionManager solicitando que ela seja atualizada no arquivo. Então ocorre seu bloqueio, atualização e posterior liberação após o fim da transação.</div>
<div style="text-align: justify;">
A exclusão de uma entidade é, em síntese, uma atualização. A operação vai depender do EntityFileAccess. Este pode apenas inserir um entidade vazia ou também mapear a lacuna para uma posterior inserção.<br />
Na seleção, o EntityFile envia uma requisição ao EntityFileTransactionManager solicitando a entidade e ele devolve a entidade ou null que pode ser obtido diretamente do arquivo ou de um outro local temporário. O bloqueio nesse caso é opcional.</div>
<div>
<br /></div>
<h2>
3. EntityFileTransactionManager</h2>
<div>
<span style="text-align: justify;"><br /></span><span style="text-align: justify;">A classe EntityFileTransactionManager é responsável por manter a consistência dos arquivos após sua alteração. Ele recebe as requisições do EntityFile e as processa. A forma como o processamento de tais requisições é feita, vai depender da implementação utilizada.</span></div>
<div style="text-align: justify;">
O EntityFileTransactionManager pode gerar dois tipos de logs. O recoverylog que permite recuperar as transações após parada abrupta da aplicação e o binlog que tem a função de permitir a replicação das operações em outra aplicação.</div>
<div style="text-align: justify;">
Os dois logs possuem o seguinte formato:</div>
<div>
<br />
<span style="font-family: "courier new" , "courier" , monospace;">****************************************************************</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| | corpo | |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">****************************************************************</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| | | | |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| ml (8 bytes)| nt (8 bytes) | t (nt - nl - 8) | chk (8 bytes) |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| | | | |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">****************************************************************</span></div>
<div>
<ul>
<li>ml: marcação da transação. Ele indica um novo registro e seu valor é o ponteiro obtido após sua leitura no arquivo;</li>
<li>nt: apontamento para o próximo registro do log ou final do arquivo;</li>
<li>t: dados da transação, tem o tamanho (nt-nl-8) bytes;</li>
<li>chk: conjunto de 8 bytes usado para validar o corpo do registro.</li>
</ul>
</div>
<div>
Os dados da transação (t) tem o seguinte formato:</div>
<div>
<br /></div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">**********************************************************************</span><br />
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">| | | | | | | |</span></div>
<div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">| st | to | id | i | flg | ef | efd |</span></div>
<div>
<div>
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">|(1 byte)|(8 bytes)|</span><span style="font-family: "courier new" , "courier" , monospace;">(8 bytes)</span><span style="font-family: "courier new" , "courier" , monospace;">|</span><span style="font-family: "courier new" , "courier" , monospace;">(1 bytes)|</span><span style="font-family: "courier new" , "courier" , monospace;">(1 bytes)</span><span style="font-family: "courier new" , "courier" , monospace;">|(</span><span style="font-family: "courier new" , "courier" , monospace;">1 bytes)|(n</span><span style="font-family: "courier new" , "courier" , monospace;"> bytes)</span><span style="font-family: "courier new" , "courier" , monospace;">|</span></span></div>
<div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">| | | | | | | |</span></div>
<div>
</div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">**********************************************************************</span></div>
<div>
<ul>
<li>st: status da transação;</li>
<li>to: timeout original da transação;</li>
<li>id: identificação da transação;</li>
<li>i: isolamento da transação;</li>
<li>flg: flags que indicam se a transação foi confirmada, cancelada e iniciada;</li>
<li>ef: indica a continuidade ou o fim da lista de EntityFile utilizados na transação. O valor -1 indica o final da lista;</li>
<li>efd: dados do EntityFile manipulado na transação.</li>
</ul>
</div>
<div>
Os dados do EntityFile na transação tem o seguinte formato:</div>
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">****************************************************************</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">| | | |</span></div>
<div>
<div>
</div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">| cabeçalho | dados | eof |</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">| (n bytes) | </span><span style="font-family: "courier new" , "courier" , monospace;">(n bytes)</span><span style="font-family: "courier new" , "courier" , monospace;"> |</span><span style="font-family: "courier new" , "courier" , monospace;">(n bytes)</span><span style="font-family: "courier new" , "courier" , monospace;">|</span></div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">| | | |</span></div>
<div>
<div>
</div>
</div>
<span style="font-family: "courier new" , "courier" , monospace;">****************************************************************</span></div>
<div>
<ul>
<li>cabeçalho: cabeçalho do EntityFile. O tamanho é o mesmo do cabeçalho original;</li>
<li>dados: lista das entidades manipuladas na transação;</li>
<li>eof: indicação do final do EntityFile. O tamanho é o mesmo do eof original.</li>
</ul>
</div>
<div>
<br /></div>
<h3>
3.1 AsyncRecoveryTransactionLog</h3>
<div>
<span style="text-align: justify;"><br /></span>
<br />
<div>
<span style="text-align: justify;">A classe AsyncRecoveryTransactionLog é a implementação padrão do recovery log. Permite que transações confirmadas possam ser efetivadas em paralelo com transações em execução. Também favorece a redução das operações de I/O, pois ele permite atualizações em lote. Todas as operações de inserção e atualização são executadas em um arquivo temporário num primeiro momento e depois em segundo plano no arquivo original.</span></div>
<div style="text-align: justify;">
Uma transação confirmada é gravada no arquivo recoverylogX e as alterações dela também são gravadas no arquivo temporário. </div>
<div style="text-align: justify;">
Quando o arquivo recoverylogX atinge o seu tamanho máximo, ele é fechado e enviado para um processo paralelo que aplica as alterações no arquivo original. O arquivo temporário é sincronizado com o arquivo original somente quando não houver transações ativas.</div>
<div style="text-align: justify;">
Em caso de parada abrupta da aplicação, o log de transação pode ser cortado na última transação válida. Isso é possível porque as transações são registradas de forma sequencial no arquivo e sua estrutura permite avaliar a integridade da transação. Este corte não ocorre de forma automática e precisa ser autorizado antes da aplicação ser iniciada. É possível definir como padrão o corte do arquivo de log. </div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
<h2 style="text-align: justify;">
4. EntityFileAccess</h2>
<br />
<div style="text-align: justify;">
A classe EntityFileAccess provê recursos que permitem manipular diretamente o arquivo. Ele é responsável por gravar e ler os dados das entidades. A estrutura do arquivo é definida pelo EntityFileAccessHandler que codifica e decodifica o cabeçalho e as entidades em dados.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://github.com/brandaof/entity-file-manager">https://github.com/brandaof/entity-file-manager</a><br />
<div>
<br /></div>
</div>
<div style="text-align: justify;">
</div>
</div>
</div>
Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-90566462642259813052018-08-16T14:16:00.001-07:002018-08-16T14:16:21.135-07:00 Nova versão do Brutos Framework liberada!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfdhJDexN9Mlf9EKEB_-ZqDh2Uz1Tsa24v1P95OGmicUfotTUVv1_bh-aLqsZ-BDflZmlKEWn8OQQ4GsxOF9VZiT4INN_ju9OtYqCQYQv4Vs-5REHJc6KCfdvIKip7L_e7YNyMnAoRLYU/s1600/logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="100" data-original-width="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfdhJDexN9Mlf9EKEB_-ZqDh2Uz1Tsa24v1P95OGmicUfotTUVv1_bh-aLqsZ-BDflZmlKEWn8OQQ4GsxOF9VZiT4INN_ju9OtYqCQYQv4Vs-5REHJc6KCfdvIKip7L_e7YNyMnAoRLYU/s1600/logo.jpg" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Liberada a versão 2.0 rc3 do Brutos Framework. O dowload da nova versão pode ser feita na página de <a href="http://www.brutosframework.com.br/download.html">download</a> e as alterações estão descritas no changelog.</div>
<div>
<br /></div>
<div>
O Brutos Framework é um controlador MVC desenvolvido em Java. Projetado para reduzir a complexidade do desenvolvimento web, com mapeamento configurável, resolução de vista, bem como suporte ao upload e download de arquivos. Podendo ser configurado usando XML, anotações e CoC.</div>
<div>
<br /></div>
<h2>
Quais as vantagens em utilizá-lo?</h2>
<div>
<br /></div>
<div>
<ul>
<li>leve;</li>
<li>baixo acoplamento;</li>
<li>produtivo;</li>
<li>geração de componentes testáveis;</li>
<li>suporte avançado de mapeamento;</li>
<li>fácil aprendizado.</li>
</ul>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h2>
Obtendo o pacote</h2>
<div>
<br /></div>
<div>
Os pacotes de liberação estão hospedados no sistema de arquivos da SourceForge em formato ZIP. </div>
<div>
Cada pacote contém jars, exemplos, código fonte e entre outros. Seu download pode ser feito a partir da url <a href="http://sourceforge.net/projects/brutos/files/brutos/">http://sourceforge.net/projects/brutos/files/brutos/</a>.</div>
<div>
<br /></div>
<h3>
Repositório de artefatos Maven</h3>
<div>
<br /></div>
<div>
<ul>
<li>brutos-core: artefato principal, necessário para construir aplicações usando o Brutos APIs nativo.</li>
<li>brutos-annotation: artefato opcional que permite a construção de aplicações usando anotações. Este artefato depende do brutos-core.</li>
<li>brutos-web: artefato opcional que permite a construção de aplicações web. Este artefato depende do brutos-core.</li>
</ul>
</div>
<div>
<br /></div>
<div>
O repositório oficial do Brutos Framework é <a href="http://www.brutosframework.com.br/maven/2">http://www.brutosframework.com.br/maven/2</a>.</div>
<div>
<br /></div>
<h2>
Como configurá-lo?</h2>
<div>
<br /></div>
<h3>
Registrar o listener no web.xml</h3>
<div>
<br /></div>
<div>
<span id="docs-internal-guid-9c98f174-7fff-43e8-be8a-e3c7b4b6c89b"><img src="https://lh4.googleusercontent.com/_r9TJUhcMcRrqVzxu8TOUcaBPWfJWxIll5wseQESLsjS2EH_SqWllW-KFLeLbK1y2i6aeIgd0qEd2rVI3EjAIgO1f0PYg1PFohcEh6HvpKt-1WHLGqF9dNCgeBrG2QnN-rFgK5SybF8" /></span></div>
<div>
<br /></div>
<div>
Atenção: Se estiver sendo usado um container que suporte a especificação Servlet 3.0, o registro do ContextLoadListener não será necessário. Ele é automaticamente registrado. </div>
<div>
<br /></div>
<h3>
Registrar o filtro no web.xml</h3>
<div>
<span><br /></span></div>
<div>
<span id="docs-internal-guid-3cc3f9b1-7fff-a42f-4e56-1ed08e5376fb"><img src="https://lh3.googleusercontent.com/GE6oNrz0tiB239pHIucDqb_HLofAyMAAb_WWMiQHYeEgR70J3Znfqk2ASmGZ2KySaJnr0DP6lgOGUgFzgsC07QsJz33Tbo7eO389X4UTeUTjPCc4FxenFxuyw47xrri2EKsIpTRgYik" /></span></div>
<div>
<br /></div>
<div>
Atenção: Se estiver sendo usado um container que suporte a especificação Servlet 3.0, o registro do BrutosRequestFilter não será necessário. Ele é automaticamente registrado. </div>
<div>
<br /></div>
<h2>
Opções de configuração</h2>
<div>
<br /></div>
<div>
<ul>
<li>Anotações</li>
<li>XML</li>
<li>CoC (Convenção sobre configuração)</li>
</ul>
</div>
<div>
<br /></div>
<h2>
Principais anotações</h2>
<div>
<br /></div>
<div>
<ul>
<li>@Controller: indica um controlador;</li>
<li>@Action: indica uma ação;</li>
<li>@RequestMethod: associa uma ação a um determinado método HTTP;</li>
<li>@ResponseStatus: define o status HTTP da resposta de uma ação;</li>
<li>@ResponseError: define o status HTTP da resposta quando é lançada uma exceção;</li>
<li>@AcceptRequestType: indica os formatos de requisição suportados por uma ação;</li>
<li>@ResponseType: indica os formatos de resposta suportados por uma ação;</li>
<li>@Any: especifica o mapeamento de polimorfismo;</li>
<li>@View: define a vista de uma ação;</li>
<li>@Basic: especifica o mapeamento básico de um bean;</li>
<li>@Intercepts: especifica um interceptor.</li>
</ul>
</div>
<div>
<br /></div>
<div>
site: <a href="http://www.brutosframework.com.br/">http://www.brutosframework.com.br/</a></div>
<div>
download: <a href="https://sourceforge.net/projects/brutos/files/latest/download">https://sourceforge.net/projects/brutos/files/latest/download</a></div>
<div>
<br /></div>
Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-39981607391837552542018-05-22T04:25:00.000-07:002018-05-22T04:25:24.221-07:00Exemplo de Brutos MVC com Spring (Brutos 2.0 + Spring 5.0.6)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf7fvJuxIvJYU4ldCTSKAeF_xh7dYd5-sQMzsmNXtxGXm6Hain_K80zHShgKQeHamh_3LiHfXhYS00jBrMxv7L1Z8LFM4OJcg_pOIR8NoaloO9YJjqTQNpOXNHFbfFcEwM3wcLfjg9g8w/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="88" data-original-width="548" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf7fvJuxIvJYU4ldCTSKAeF_xh7dYd5-sQMzsmNXtxGXm6Hain_K80zHShgKQeHamh_3LiHfXhYS00jBrMxv7L1Z8LFM4OJcg_pOIR8NoaloO9YJjqTQNpOXNHFbfFcEwM3wcLfjg9g8w/s320/b.png" width="320" /></a></div>
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;">Exemplo de Brutos MVC com Spring</span>. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: <span style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><a href="https://github.com/brandaof/brutos-spring">https://github.com/brandaof/brutos-spring</a></span><br />
<br />Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-67070520650227905042018-05-19T16:05:00.000-07:002018-05-19T16:05:00.097-07:00Exemplo de formulário com senha. (Brutos + Bootstrap 4 + Hibernate Validator + Weld)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9rKeygKtbOggpLexWwIe1t_EZL5lASTs6lvhPfXk7HxwipSQutcRleLXGE5D9R_0e5yttWY1w7zhb17Xt5QiLxcAl_cyyBJOFM9UZ9smVJO4tD2p1GcgoqMxjjBWGk6YRmlgDHaoPCuE/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9rKeygKtbOggpLexWwIe1t_EZL5lASTs6lvhPfXk7HxwipSQutcRleLXGE5D9R_0e5yttWY1w7zhb17Xt5QiLxcAl_cyyBJOFM9UZ9smVJO4tD2p1GcgoqMxjjBWGk6YRmlgDHaoPCuE/s320/a.png" width="320" /></a></div>
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">Exemplo de formulário com senha</span>. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: <span style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><a href="https://github.com/brandaof/brutos-password-form">https://github.com/brandaof/brutos-password-form</a></span><br />
<br />
<br />Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-7831489999431518602018-05-17T04:03:00.000-07:002018-05-17T04:03:17.627-07:00Enviando um formulário com múltiplas linhas para um List com Brutos MVC (Brutos + Bootstrap 4)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDG_mrMsSLY4JW0-XkRAPIzGC9x1TpHYYtJ4-UAA6weTtJNliRGqmRysEpO0tIOwF89G7VGE1DVWNaRyXLXjGG2X7qTgmZ3fzo8pCkfLUdQJrXE-XK7STnVQcjuSeBpCNdMFr0b1412rc/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="438" data-original-width="814" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDG_mrMsSLY4JW0-XkRAPIzGC9x1TpHYYtJ4-UAA6weTtJNliRGqmRysEpO0tIOwF89G7VGE1DVWNaRyXLXjGG2X7qTgmZ3fzo8pCkfLUdQJrXE-XK7STnVQcjuSeBpCNdMFr0b1412rc/s320/a.png" width="320" /></a></div>
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;">Enviando um formulário com múltiplas linhas para um List com Brutos MVC</span>. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: <a href="https://github.com/brandaof/brutos-multiple-row-form">https://github.com/brandaof/brutos-multiple-row-form</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgazuXLm3p7GRHPPVGyLyZ2flntq4SvwaXRTt6YzZCrNBhizhdlfHiaj_M-F7C0dv9EEfS8s5MN8X3E_vLEW5fyPFA9v6BUHXoKf9DLpjQZlwlddIQbPFZO1jD6ZqUcfH5oftKLpsPQ_d0/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="438" data-original-width="814" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgazuXLm3p7GRHPPVGyLyZ2flntq4SvwaXRTt6YzZCrNBhizhdlfHiaj_M-F7C0dv9EEfS8s5MN8X3E_vLEW5fyPFA9v6BUHXoKf9DLpjQZlwlddIQbPFZO1jD6ZqUcfH5oftKLpsPQ_d0/s200/a.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDMlwjuhwTiJD9PhlkYCeT11Bqhd4vmLIhw-Ybgv7WJdVDeL__uC1upV1Bfoo7es1qv6iki0GWRC5Y7vDcy-0rD3QYdGlAAil_YshlJEnAgcZ0D22Rn3ipfE178fkqk8B5mMrjgELZe_A/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDMlwjuhwTiJD9PhlkYCeT11Bqhd4vmLIhw-Ybgv7WJdVDeL__uC1upV1Bfoo7es1qv6iki0GWRC5Y7vDcy-0rD3QYdGlAAil_YshlJEnAgcZ0D22Rn3ipfE178fkqk8B5mMrjgELZe_A/s200/b.png" width="200" /></a></div>
<br />Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-39611295435463863922018-05-16T04:05:00.000-07:002018-05-16T04:30:04.335-07:00Exemplo de post de formulário em Map com Brutos MVC (Brutos + Bootstrap 4 + Weld)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-y56IYFe-0vod6r07dEj4I_CC8YKUikhwbGHZK8SBqYgy0qQQJXHt27k8QUn2miCS49BmAoPKxedWXg_8H8hk8TxTSmtmCB-urpZ8l6VA7el3oZ5oFUzE5ksoMxEsoJDQ-TAQqQIzgbw/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="245" data-original-width="425" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-y56IYFe-0vod6r07dEj4I_CC8YKUikhwbGHZK8SBqYgy0qQQJXHt27k8QUn2miCS49BmAoPKxedWXg_8H8hk8TxTSmtmCB-urpZ8l6VA7el3oZ5oFUzE5ksoMxEsoJDQ-TAQqQIzgbw/s320/a.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Exemplo de post de formulário em Map com Brutos MVC. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: <span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;"><a href="https://github.com/brandaof/brutos-value-key-map-form">https://github.com/brandaof/brutos-value-key-map-form</a></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-y56IYFe-0vod6r07dEj4I_CC8YKUikhwbGHZK8SBqYgy0qQQJXHt27k8QUn2miCS49BmAoPKxedWXg_8H8hk8TxTSmtmCB-urpZ8l6VA7el3oZ5oFUzE5ksoMxEsoJDQ-TAQqQIzgbw/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="245" data-original-width="425" height="115" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-y56IYFe-0vod6r07dEj4I_CC8YKUikhwbGHZK8SBqYgy0qQQJXHt27k8QUn2miCS49BmAoPKxedWXg_8H8hk8TxTSmtmCB-urpZ8l6VA7el3oZ5oFUzE5ksoMxEsoJDQ-TAQqQIzgbw/s200/a.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvdOuzjfHWfY3QMq0yCLQirSf2zO4bKnyiO3PU2gUerkIPk96pSpDEQhphgzK496sJpKWtyKQkK3Zt4KGtQajxMAs_8-VS3J8tf1pzkfw_sZHuT0fbyoLsgdcg_NfVcRtTqtFPJxQRass/s1600/d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="376" data-original-width="641" height="115" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvdOuzjfHWfY3QMq0yCLQirSf2zO4bKnyiO3PU2gUerkIPk96pSpDEQhphgzK496sJpKWtyKQkK3Zt4KGtQajxMAs_8-VS3J8tf1pzkfw_sZHuT0fbyoLsgdcg_NfVcRtTqtFPJxQRass/s200/d.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0eP6FO9NVGNSrb3IoChYmcQrbCfDhi7A_Ih1UzBhFqE55HVxdaHVgTIL9HcCevTlI0XSNuSSErqxfJ9O-sBS47kPSt8RjW_O075izBJVzKzodhxkx_0dur8RcpgRF9YgvcPmglBLmRP0/s1600/c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0eP6FO9NVGNSrb3IoChYmcQrbCfDhi7A_Ih1UzBhFqE55HVxdaHVgTIL9HcCevTlI0XSNuSSErqxfJ9O-sBS47kPSt8RjW_O075izBJVzKzodhxkx_0dur8RcpgRF9YgvcPmglBLmRP0/s200/c.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQCg-nBf57HGTYbJpfEJhRcGfIw_ZrVq4RNyfwGQQjHCBNE2LG9v15G_8f0-Ebrp-12XNUuLyrmEEpxlf_IKmPH50h14Ui43eYiOqFJKP7f0PT-mXmm3mV-TEiwZe-nKkI-K4Q2XYWpn4/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQCg-nBf57HGTYbJpfEJhRcGfIw_ZrVq4RNyfwGQQjHCBNE2LG9v15G_8f0-Ebrp-12XNUuLyrmEEpxlf_IKmPH50h14Ui43eYiOqFJKP7f0PT-mXmm3mV-TEiwZe-nKkI-K4Q2XYWpn4/s200/b.png" width="200" /></a></div>
<br />Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-5468043001338704672018-05-15T03:38:00.000-07:002018-05-15T03:38:08.319-07:00Exemplo de dropdown box com Brutos MVC (Brutos + Bootstrap 4 + Hibernate Validator + Weld)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwgLP-F8ir5p70vy3Pjw6kMeYie1nYlEbUACTehhccSaFZjRPBOKJm3dyO4LJfrCzCUcJHwH3sRrNsieSHa8KuqHScjY9RIHVSTqv3qK3vSYSaKO9ZM01tamIO3vTKm4jtS7sm6cZGCD8/s1600/form-view.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwgLP-F8ir5p70vy3Pjw6kMeYie1nYlEbUACTehhccSaFZjRPBOKJm3dyO4LJfrCzCUcJHwH3sRrNsieSHa8KuqHScjY9RIHVSTqv3qK3vSYSaKO9ZM01tamIO3vTKm4jtS7sm6cZGCD8/s320/form-view.png" width="320" /></a></div>
<br />
Exemplo de dropdown box com Brutos MVC. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: <a href="https://github.com/brandaof/brutos-dropdown-box">https://github.com/brandaof/brutos-dropdown-box</a>Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-41805340405023538812018-05-14T03:49:00.000-07:002018-05-14T03:49:51.685-07:00Exemplo de uso do hibernate com Brutos MVC (Brutos + Bootstrap 4 + Hibernate + Weld + MySQL)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgOt2c1o_6_09en1qeo1P9M7MYp98ooXIicap5PE5HlXZIE4WHQfQXPgpAR34AZOlZVyKcvL_-LP-F7dfw8KPNMoHjIG_EgEoNTscnd0EvsnIy3jFwWPqo4Tot3_AVPgp6YgwgxUOoM-A/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgOt2c1o_6_09en1qeo1P9M7MYp98ooXIicap5PE5HlXZIE4WHQfQXPgpAR34AZOlZVyKcvL_-LP-F7dfw8KPNMoHjIG_EgEoNTscnd0EvsnIy3jFwWPqo4Tot3_AVPgp6YgwgxUOoM-A/s320/a.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
Exemplo de uso do hibernate com Brutos MVC. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: https://github.com/brandaof/brutos-hibernate-mysql<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgOt2c1o_6_09en1qeo1P9M7MYp98ooXIicap5PE5HlXZIE4WHQfQXPgpAR34AZOlZVyKcvL_-LP-F7dfw8KPNMoHjIG_EgEoNTscnd0EvsnIy3jFwWPqo4Tot3_AVPgp6YgwgxUOoM-A/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgOt2c1o_6_09en1qeo1P9M7MYp98ooXIicap5PE5HlXZIE4WHQfQXPgpAR34AZOlZVyKcvL_-LP-F7dfw8KPNMoHjIG_EgEoNTscnd0EvsnIy3jFwWPqo4Tot3_AVPgp6YgwgxUOoM-A/s200/a.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9xkAT8iw-u2RtwvawqpEPsyRj76KgVw7PnE_18dyxMn0tuUn2uIq09MGqp6FCsEkWDgYvdlBWK_WARPhhQDrBH7SYOsWM8aTIMGZdFHyh_Fluwk2uSlrG1YcZJbbPebsojYc5Q6vU7P4/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9xkAT8iw-u2RtwvawqpEPsyRj76KgVw7PnE_18dyxMn0tuUn2uIq09MGqp6FCsEkWDgYvdlBWK_WARPhhQDrBH7SYOsWM8aTIMGZdFHyh_Fluwk2uSlrG1YcZJbbPebsojYc5Q6vU7P4/s200/b.png" width="200" /></a></div>
<br />Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-88719900913804796292018-05-12T08:01:00.000-07:002018-05-13T05:34:07.835-07:00Exemplo de uso de JTA com Brutos MVC (Brutos + Weld + Hibernate + narayana + Tomcat)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRM2Cmnm7kmnsZIj9CcLc9aMFUU20VHVKUHfNwlLbA2OhNskG8CQoHI9eAH1BMY9x0VpzQn0uAl_2wLfNUFSX_fu1SuysEH-odANwlsMw1yfqxvBUttib83hLZw_GcjDlrSdBC6ona85s/s1600/d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRM2Cmnm7kmnsZIj9CcLc9aMFUU20VHVKUHfNwlLbA2OhNskG8CQoHI9eAH1BMY9x0VpzQn0uAl_2wLfNUFSX_fu1SuysEH-odANwlsMw1yfqxvBUttib83hLZw_GcjDlrSdBC6ona85s/s320/d.png" width="320" /></a></div>
<br />
Exemplo de uso de JTA com Brutos MVC. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: https://github.com/brandaof/brutos-jta-cdi-hibernate<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKToP2Oc8UUMNOal4UxL4eOO09onIcLqGytiVzHnwsR4zjAVE7fx_siYcenr5OZnwaegARclALHC3bNJzg3oEMJI8AOXQOs1RebTxUY_VaE8JyQT21AYKwjGyEjerJ1BxY0YNDXshxgPM/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKToP2Oc8UUMNOal4UxL4eOO09onIcLqGytiVzHnwsR4zjAVE7fx_siYcenr5OZnwaegARclALHC3bNJzg3oEMJI8AOXQOs1RebTxUY_VaE8JyQT21AYKwjGyEjerJ1BxY0YNDXshxgPM/s200/b.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwi1tVbSbzzOuwGCT4FX8F6B_hZ3j7HUJFqmouGcr-hg5bGPtV09hez_n6rQj_jp5aN0sO2zw06KlzDSSq53V2VKJzpHFAEv74L7eP3OpgOaOmkgx_KX3itdddSmCMdTetqA3BT1CXv5M/s1600/d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwi1tVbSbzzOuwGCT4FX8F6B_hZ3j7HUJFqmouGcr-hg5bGPtV09hez_n6rQj_jp5aN0sO2zw06KlzDSSq53V2VKJzpHFAEv74L7eP3OpgOaOmkgx_KX3itdddSmCMdTetqA3BT1CXv5M/s200/d.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTcg3Ii1ZkZKKSkR0vBuxjxhX4WOlYkIiaP1_0Wg5rQkWUGFMhn_gJVB82pvzNFZRfjw0xf2aCoklt3Yi1xSFDdKIUcgzUW0sus7KgkUzmbzC7qNvvHMIkHzHOgJMUDYKELWjvAgEewSg/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="297" data-original-width="551" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTcg3Ii1ZkZKKSkR0vBuxjxhX4WOlYkIiaP1_0Wg5rQkWUGFMhn_gJVB82pvzNFZRfjw0xf2aCoklt3Yi1xSFDdKIUcgzUW0sus7KgkUzmbzC7qNvvHMIkHzHOgJMUDYKELWjvAgEewSg/s200/a.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh3aD2jlzbd-F8RhnVebONuvVyuvDq5ppBFBaM94FaXQrFAq60jMyVJOpUFkaFskGttU3Y_qWuP6CGvihH-BifMglUAaRj87BZ4E7-F5Uj3f2GOQA0lrdwtsTgXDV7TcedYtrxFfX5NK8/s1600/c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh3aD2jlzbd-F8RhnVebONuvVyuvDq5ppBFBaM94FaXQrFAq60jMyVJOpUFkaFskGttU3Y_qWuP6CGvihH-BifMglUAaRj87BZ4E7-F5Uj3f2GOQA0lrdwtsTgXDV7TcedYtrxFfX5NK8/s200/c.png" width="200" /></a></div>
<br />
http://www.brutosframework.com.br/Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-1570677202437011882018-05-12T05:45:00.000-07:002018-05-12T05:45:04.242-07:00Exemplo de uso de polimorfismo com Brutos (Brutos + Weld).<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVL_PgcLVrFzW7qGCgEMbBtIFgC6Ks2sbz7rpE6eXAvikbNJj0M6wRaS33yr3sIZ2R1HLQ7wqRYGnFvVUvs7HlSsN27ZtX2xRztE2EO79gFWA6QwIENSOTsgfHgQli9fjdUzVhqsK8mAg/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="477" data-original-width="703" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVL_PgcLVrFzW7qGCgEMbBtIFgC6Ks2sbz7rpE6eXAvikbNJj0M6wRaS33yr3sIZ2R1HLQ7wqRYGnFvVUvs7HlSsN27ZtX2xRztE2EO79gFWA6QwIENSOTsgfHgQli9fjdUzVhqsK8mAg/s320/a.png" width="320" /></a></div>
<br />
Exemplo de polimorfismo com Brutos MVC. O código fonte dos exemplos estão hospedados no <a href="https://github.com/brandaof">GitHub</a>.<br />
<br />
Código fonte: https://github.com/brandaof/brutos-polymorphic-mapping<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiMQ9fjsyapsi_trJZij5KC5hnkU4grlseTMhRu7EjDLYHxF7Vy50Ul9xRMPIBnuheuBPzcitjXR9RxoVAy14L6ux4da7k69IYzu2PjBio5u5iRBv0IPb8Bx9DrH25Dds-vU5lZtAxWEs/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiMQ9fjsyapsi_trJZij5KC5hnkU4grlseTMhRu7EjDLYHxF7Vy50Ul9xRMPIBnuheuBPzcitjXR9RxoVAy14L6ux4da7k69IYzu2PjBio5u5iRBv0IPb8Bx9DrH25Dds-vU5lZtAxWEs/s200/b.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmrUTcH7Mjd3OoEdpx-o1gthJWnFR_6cpXx1a8jDcd9JxPxbxxtFQpGxHk7G13picSxYj53UlFKW2utvtE0pCMpgIvpIHMUUrp5Cibd3mAHnyu3G8UwS_Q1tYxK1Eimxy-pvHtQaRuiDU/s1600/d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1024" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmrUTcH7Mjd3OoEdpx-o1gthJWnFR_6cpXx1a8jDcd9JxPxbxxtFQpGxHk7G13picSxYj53UlFKW2utvtE0pCMpgIvpIHMUUrp5Cibd3mAHnyu3G8UwS_Q1tYxK1Eimxy-pvHtQaRuiDU/s200/d.png" width="200" /></a>
</div>
<br />
http://www.brutosframework.com.br/Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-9693377159936338422018-05-09T17:12:00.001-07:002018-05-09T17:23:48.394-07:00Brutos framework 2.0 RC2 liberado<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfdhJDexN9Mlf9EKEB_-ZqDh2Uz1Tsa24v1P95OGmicUfotTUVv1_bh-aLqsZ-BDflZmlKEWn8OQQ4GsxOF9VZiT4INN_ju9OtYqCQYQv4Vs-5REHJc6KCfdvIKip7L_e7YNyMnAoRLYU/s1600/logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="100" data-original-width="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfdhJDexN9Mlf9EKEB_-ZqDh2Uz1Tsa24v1P95OGmicUfotTUVv1_bh-aLqsZ-BDflZmlKEWn8OQQ4GsxOF9VZiT4INN_ju9OtYqCQYQv4Vs-5REHJc6KCfdvIKip7L_e7YNyMnAoRLYU/s1600/logo.jpg" /></a></div>
<br />
O Brutos framework é um controlador MVC desenvolvido em Java. Projetado para reduzir a complexidade do desenvolvimento web com mapeamento configurável, resolução de vista, suporte ao upload e download de arquivos. Podendo ser configurado usando XML, anotações e suas convenções de configuração. </div>
<div style="text-align: justify;">
<br /></div>
Destaques da versão 2.0 RC2:<br />
<br />
<ul>
<li>incluída a anotação @DetachedName;</li>
<li>resolvido o problema de parâmetros com regex que contém '{';</li>
<li>alterada a forma da resolução de vista;</li>
<li>alterado o prefixo da vista de /WEB-INF para /WEB-INF/views;</li>
<li>incluído Type.toString(Object);</li>
<li>incluído suporte a coleções simples;</li>
<li>incluído a anotação @RequestMethod;</li>
<li>incluído suporte ao mapeamento de resultado de ação;</li>
<li>incluído a anotação @ResponseStatus;</li>
<li>incluído a anotação @ResponsError e @ResponsErrors;</li>
<li>descontinuado o ControllerResolver;</li>
<li>action resolver assume o papel do ControllerResolver;</li>
<li>o valor default do Enum passou a ser AUTO;</li>
<li>incluído type default para classe concreta no @Any;</li>
<li>alterado o atributo view-resolved para resolved-view em controller, action e throw-safe;</li>
<li>incluído o atributo rendered em controller, action e throw-safe;</li>
<li>incluído lazy-load em property controller, property action, constructor-arg, parameter action;</li>
<li>descontinuado o escopo controller;</li>
<li>alterada as opções de MappingTypes de SIMPLE e COMPLEX para VALUE e OBJECT;</li>
</ul>
<br />
<br />
http://www.brutosframework.com.br/Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-35972931109645072632016-10-20T20:05:00.000-07:002018-04-24T13:11:23.225-07:00BRCache vs. Memcached Benchmark<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjw8zKAHJQlud_Oqe0eWF9HGE5lecDP7kCwgPN67JsYn6OiYfmEz69cRsCf3s536cpbtfI7Zz0OpCA3njWBXBt8Wg_dn-_VtYBCepI5_VAvSwhw7Wx6KpgcN35-eD0fzClW1wgEigwkSg/s1600/brcache_x_memcached.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjw8zKAHJQlud_Oqe0eWF9HGE5lecDP7kCwgPN67JsYn6OiYfmEz69cRsCf3s536cpbtfI7Zz0OpCA3njWBXBt8Wg_dn-_VtYBCepI5_VAvSwhw7Wx6KpgcN35-eD0fzClW1wgEigwkSg/s320/brcache_x_memcached.png" width="320" /></a></div>
<br />
<br />
Em experimento realizado, o BRCache demonstrou ser mais rápido que o Memcached.<br />
O experimento está disponível no repositório de arquivos do SourceForge (<a href="https://sourceforge.net/projects/brcache/files/">https://sourceforge.net/projects/brcache/files/</a>).<br />
<div>
<br /></div>
<h4>
O experimento</h4>
<br />
No experimento somente foi considerado o armazenamento em memória. A instância de cada servidor foi configurada para consumir no máximo 8GB. Os métodos testados foram o de escrita e leitura. Nenhum cliente foi utilizado. Foram criados métodos que geram as solicitações e processam as respostas.<br />
O experimento foi dividido em duas etapas. A primeira etapa escreve os dados no cache. Cada registro tem um tamanho fixo de 1k. São utilizados grupos de 50 até 300 clientes, com 50 de frequência. Cada cliente faz 50 registros únicos. Cada agrupamento de clientes é executado três vezes e o resultado com menor tempo médio de resposta é considerado. A segunda etapa lê os dados do cache. Cada leitura tem um tamanho fixo de 1k, gerado na primeira etapa. São utilizados grupos de 50 até 300 clientes, com 50 de frequência. Cada cliente lê 50 registros únicos. Cada agrupamento de clientes é executado três vezes e o resultado com menor tempo médio de resposta é considerado.<br />
<br />
<h4>
O hardware</h4>
<br />
O cliente e o servidor foram executados na mesma máquina com a seguinte configuração:<br />
<br />
<ul>
<li>processador Intel(R) Core(TM) i3-2100 (3.10GHz 64bits)</li>
<li>16GB de memória.</li>
</ul>
<br />
<h4>
O servidor de cache</h4>
<br />
O experimento foi feito com a versão 1.4.5 64bit do Memcached e a versão 1.0 beta 4 do BRCache sobre Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode).<br />
<br />
<h4>
A configuração de arranque</h4>
<br />
Para o experimento, o servidor Memcached foi iniciado usando os parâmetros de linha de comando m igual a 8000 e t igual a 8.<br />
<br />
<b><i>memcached -m 8000 -t 8</i></b><br />
<br />
O servidor BRCache foi iniciado usando os parâmetros de linha de comando server e XX:ParallelGCThreads igual a 8.<br />
<br />
<b><i>java -server -XX:ParallelGCThreads=8 -jar brcache-server-1.0-b4.jar</i></b><br />
<br />
<h4>
As configurações adicionais do cache</h4>
<br />
O Memcached não necessitou de configurações adicionais e o BRCache foi configurado como se segue abaixo:<br />
<br />
<i>port=9090</i><br />
<i>max_connections=1024</i><br />
<i>swapper_thread=2</i><br />
<i>memory_access_type=unsafe</i><br />
<i>timeout_connection=1024</i><br />
<i>reuse_address=false</i><br />
<i>data_path=/mnt/brcache</i><br />
<i>nodes_buffer_size=1024m</i><br />
<i>nodes_page_size=1k</i><br />
<i>nodes_swap_factor=0.1</i><br />
<i>index_buffer_size=512m</i><br />
<i>index_page_size=1k</i><br />
<i>index_swap_factor=0.1</i><br />
<i>data_buffer_size=4000m</i><br />
<i>data_page_size=8k</i><br />
<i>data_block_size=1k</i><br />
<i>data_swap_factor=0.1</i><br />
<i>write_buffer_size=16k</i><br />
<i>read_buffer_size=16k</i><br />
<i>max_size_entry=128m</i><br />
<i>max_size_key=64</i><br />
<i>transaction_support=false</i><br />
<div>
<br /></div>
<br />
<br />
<h4>
O cálculo</h4>
<br />
A quantidade de operações por segundo foi obtida com a <span id="docs-internal-guid-09d7cb13-f947-435e-421c-c0f88d5f44f8"><span style="font-family: Arial; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;">fórmula</span></span>: <b>ops = (</b><b>1000000000*i)/t</b>, onde:<br />
<br />
<br />
<ul>
<li><b>t</b>: tempo total, em nano segundos, que o agrupamento de clientes demora para executar todas as operações.</li>
<li><b>i</b>: quantidade total de operações executadas pelo agrupamento de clientes.</li>
<li><b>1000000000</b>: constante que representa um segundo em nano segundos.</li>
</ul>
<br />
<br />
<br />
<h4>
Resultado</h4>
<br />
O método de escrita do BRCache demonstrou ser mais rápido que o Memcached ao passo que a quantidade de clientes aumentava. Demonstrada pela curva ascendente do gráfico abaixo.<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfPXNAsqt582l0o3xUV-wkCmdXeuFTce3RXexSZFdG_k67FJUQ4aDimU5gRU2-z1ey5oYRro9eQsB8CLvqroCoGmogp3F_RBHEc5HUckQ773xZ2KaG9VhhdUAjAOwo3QwU3sQ2SwPrxfQ/s1600/graph-put.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfPXNAsqt582l0o3xUV-wkCmdXeuFTce3RXexSZFdG_k67FJUQ4aDimU5gRU2-z1ey5oYRro9eQsB8CLvqroCoGmogp3F_RBHEc5HUckQ773xZ2KaG9VhhdUAjAOwo3QwU3sQ2SwPrxfQ/s400/graph-put.png" width="400" /></a></div>
<div style="text-align: center;">
<i>Escritas por segundo</i></div>
<br />
O método de leitura do BRCache é tão rápido quanto o do Memcached. Demonstrado pelo entrelaçamento das linhas do gráfico abaixo.<br />
Foram feitos testes usando milissegundo como unidade de tempo. Nesse caso, os resultados demonstraram que o BRCache foi mais rápido em ambos os métodos. Isso sugere que a diferença de performance, no caso do método de leitura, está na base de nano segundos.<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn_6hlNLsQoGcNnzny76_7NwTfaTiyhu9MdAmCoQ1A6ik4DxQy_3hDmP4spR1wCeGUGEXl-qiIpnIwcrpqVWlYGPYj4wd1lJT_Ds3TvvJdT8GWYlLRtRTGhyG0_QSnvPCAbKc3pqluJ78/s1600/graph-get.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn_6hlNLsQoGcNnzny76_7NwTfaTiyhu9MdAmCoQ1A6ik4DxQy_3hDmP4spR1wCeGUGEXl-qiIpnIwcrpqVWlYGPYj4wd1lJT_Ds3TvvJdT8GWYlLRtRTGhyG0_QSnvPCAbKc3pqluJ78/s400/graph-get.png" width="400" /></a></div>
<div style="text-align: center;">
<i>Leituras por segundo</i></div>
<br />
<h4>
Variação nos resultados</h4>
<br />
Foram feitos inúmeros testes e a performance de ambos os servidores variaram para mais ou menos de 70.000 operações por segundo. Chegando a passar de 200.000 mil operações por segundo. Fazendo uma análise preliminar, essa variação se deve a sensibilidade do experimento e ao modo como os dados trafegam, mesmo o cliente e o servidor estando em uma mesma máquina, Por exemplo, o laço da linha 67, do método de leitura, em ambos clientes variavelmente foi executado mais de uma vez.<br />
<div>
<br /></div>
<br />
Conclusão<br />
<br />
Mesmo se tratando de uma versão beta, o BRCache demonstrou ser tão ou mais rápido que a última versão estável do Memcached. Outros experimentos ainda serão feitos.<br />
<br />Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-76459252104020215182016-08-21T17:29:00.002-07:002016-08-21T17:34:42.651-07:00Named-Lock version 1.0 B2 was released<div style="text-align: center;">
<div style="text-align: left;">
Named-Lock version 1.0 B2 was released</div>
</div>
see more <a href="http://namedlock.brandao.org/">http://namedlock.brandao.org/</a>.<br />
<br />
<h2>
1. Quick Reference.</h2>
<br />
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;">The named-lock is a utility for acquiring named locks.</span><br />
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<br />
<h3>
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;">1.1 Named factory.</span></h3>
<br />
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><b>
Main class
</b></span><br />
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<br />
<pre class="brush: java;">public class Test {
public static void main(String[] args) throws InterruptedException{
NamedLockFactory lockFactory = new NamedLockFactory();
System.out.println("start test");
Lock lock = lockFactory.getLock("lock_name");
lock.lock();
try{
Task task = new Task(lockFactory);
task.start();
Thread.sleep(1000);
System.out.println("1");
}
finally{
lock.unlock();
}
Thread.sleep(1000);
System.out.println("end test");
}
}
</pre>
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><b>
Task class
</b></span><br />
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<br />
<pre class="brush: java;">public class Task extends Thread{
private NamedLockFactory lockFactory;
public Task(NamedLockFactory lockFactory){
this.lockFactory = lockFactory;
}
public void run(){
Lock lock = lockFactory.getLock("lock_name");
lock.lock();
try{
System.out.println("2");
}
finally{
lock.unlock();
}
}
}
</pre>
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;">
</span>
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><b>output:</b></span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">start test</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">1</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">2</span></span><br />
<span style="color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;">end test</span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>
<br />
<h3>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">1.2 Named lock.</span></span></h3>
<br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">
</span></span>
<br />
<pre class="brush: java;">NamedLock namedLock = new NamedLock()
Serializable refLock = namedLock.lock("lock_name");
try{
// manipulate protected state
}
finally{
namedLock.unlock(refLock, "lock_name");
}
</pre>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">
</span></span>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-62316847654983372022016-08-11T17:14:00.000-07:002016-08-11T17:20:16.628-07:00jBRGates version 1.1 B1 was released<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTLbJYfylzA9CO6uE15GTHGHQPEX4UfOql4o9ECdGW-e8e8HNkTUzwazfafWLkzK3gdGgFpJN2lvoMG6JOnE7tJNZ9DQs-XiFC2PUZz0GpyN6b6Hck0ZwaN5eElEQOLu6mJBohDVVm1B8/s1600/logo-original.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTLbJYfylzA9CO6uE15GTHGHQPEX4UfOql4o9ECdGW-e8e8HNkTUzwazfafWLkzK3gdGgFpJN2lvoMG6JOnE7tJNZ9DQs-XiFC2PUZz0GpyN6b6Hck0ZwaN5eElEQOLu6mJBohDVVm1B8/s320/logo-original.png" width="320" /></a></div>
<br />
jBRGates version 1.1 B1 was released<br />
see more <a href="http://jbrgates.brandao.org/">http://jbrgates.brandao.org/</a>.<br />
<br />
<h2>
1. Quick Reference.</h2>
<br />
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;">The jBRGates is a lightweight library for serializing beans, maps, collections, arrays and Enum to Json and back again to beans.</span><br />
<span style="background-color: white; color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<br />
<h3>
<span style="color: #555555; font-family: sans-serif;"><span style="background-color: white; font-size: 13px; line-height: 18px;">1.1. </span><span style="font-size: 13px; line-height: 18px;">Convert Java object to JSON.</span></span></h3>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">The method JsonContext.encode(Object) convert a java object to json object.</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Ex:</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> double[] javaObject = new double[]{1.0,25.0};</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> JsonContext context = new DefaultJsonContext();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> String jsonObject = context.encode(javaObject);</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> </span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Output:</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> [1.0, 25.0]</span></span><br />
<br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Ex2:</span></span><br />
<br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> MyObject javaObject = new MyObject();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> javaObject.filed1 = 12L;</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> javaObject.field2 = "Test";</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> </span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> JsonContext context = new DefaultJsonContext();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> String jsonObject = context.encode(javaObject);</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> </span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Output:</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> {"field1": 12, "field2": "Test"}</span></span><br />
<br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Ex3:</span></span><br />
<br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> MyObject javaObject = new MyObject();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> javaObject.filed1 = new Date();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> javaObject.filed2 = MyEnum.VALUE1;</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> </span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> JsonContext context = new DefaultJsonContext();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> String jsonObject = context.encode(javaObject);</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> </span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Output:</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> {"field1": "2016-08-06T12:30:00.000Z", "field2": "VALUE1"}</span></span><br />
<br />
<h3>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">1.2. Convert JSON to Java object.</span></span></h3>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">The method </span></span><span style="color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;">JsonContext.</span><span style="color: #555555; font-family: sans-serif; font-size: 13px; line-height: 18px;">decode(String) convert a json object to java object.</span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Ex:</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> String jsonObject = "[1.0, 25.0]";</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> JsonContext context = new DefaultJsonContext();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> double[] javaObject = context.decode(jsonObject, double[].class);</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> </span></span><br />
<br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> Ex2:</span></span><br />
<br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> String jsonObject = "{\"field1\": 12, \"field2\": \"Test\"};</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> JsonContext context = new DefaultJsonContext();</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="background-color: white; font-size: 13px; line-height: 18px;"></span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> MyObject javaObject = context.decode(jsonObject, MyObject.class);</span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>
<br />
<h3>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">2. jBRGates Dependency.</span></span></h3>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"><br /></span></span>
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;">
<dependency></span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> <groupId>org.brandao</groupId></span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> <artifactId>jbrgates</artifactId></span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"> <version>1.1-b1</version></span></span><br />
<span style="color: #555555; font-family: sans-serif;"><span style="font-size: 13px; line-height: 18px;"></dependency>
</span></span>
Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-19145983654176864962016-01-31T05:03:00.000-08:002016-01-31T05:03:16.545-08:00BRCache version 1.0 B2 was released<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-FJ3xDmG5Nx67rrMBaf0Cm14idEfi32fBmmkjg-9xzeGhKWbsrpeBGvKSweXECXkf9qyfSFNBS4G8mUeS9kQ0QxqzUxA2CmPzjTHIDJB5AZW3fxIze07Zu_y2ltC_0zuDBpSANUq6pc8/s1600/original-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-FJ3xDmG5Nx67rrMBaf0Cm14idEfi32fBmmkjg-9xzeGhKWbsrpeBGvKSweXECXkf9qyfSFNBS4G8mUeS9kQ0QxqzUxA2CmPzjTHIDJB5AZW3fxIze07Zu_y2ltC_0zuDBpSANUq6pc8/s1600/original-logo.png" /></a></div>
<br />
BRCache version 1.0 B2 was released<br />
see more <a href="http://brcache.brandao.org/doc/1.0-b2/html/index.html">http://brcache.brandao.org/doc/1.0-b2/html/index.html</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-88691045296633432772015-07-21T12:04:00.000-07:002017-03-17T04:20:51.748-07:00Mapeamento de polimorfismo com @Any no Brutos MVC<div style="text-align: justify;">
O mapeamento de polimorfismo, introduzido na versão 2.0, é uma solução que permite a um entidade ser mapeada para mais de um tipo. É implementado com a anotação @Any. Este tipo de mapeamento requer que, além do mapeamento da entidade, seja informado o metabean, uma variável que contém o identificador da entidade associada. Pode ser usado em um bean nas propriedades ou nos argumentos de um construtor e em um controlador nas propriedades ou nos parâmetros de uma ação.</div>
<br />
<br />
<pre class="brush: java;">@Target({ElementType.METHOD,ElementType.PARAMETER,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Any {
Basic metaBean() default @Basic;
Class metaType() default String.class;
EnumerationType metaEnumerated() default EnumerationType.ORDINAL;
String metaTemporal() default BrutosConstants.DEFAULT_TEMPORALPROPERTY;
MetaValue[] metaValues() default {};
Class metaValuesDefinition() default MetaValuesDefinition.class;
}</pre>
<br />
<br />
<ul>
<li>metaBean(): variável que contém os metadados.</li>
<li>metaType(): tipo da variável que contém os metadados.</li>
<li>metaEnumerated(): usado quando o metadado for uma enumeração.</li>
<li>metaTemporal(): usado quando o metadado for uma data.</li>
<li>metaValues(): associa um valor a um bean.</li>
<li>metaValuesDefinition(): Permite em tempo de execução associar um valor a um bean.</li>
</ul>
<br />
Abaixo um exemplo de uso da anotação @Any em uma propriedade de um bean.<br />
<br />
<pre class="brush: java;">public class TestBean{
@Basic(bean="property")
@Any(
metaBean=@Basic(bean="property_type")
metaValues={
@MetaValue(name="Decimal", target=DecimalProperty.class),
@MetaValue(name="Set", target=SetProperty.class)
}
)
private Property property
...
}</pre>
<br />
Abaixo um exemplo de uso da anotação @Any em um construtor de um bean.<br />
<br />
<pre class="brush: java;">public class TestBean{
public TestBean(
@Basic(bean="property")
@Any(
metaBean=@Basic(bean="property_type")
metaValues={
@MetaValue(name="Decimal", target=DecimalProperty.class),
@MetaValue(name="Set", target=SetProperty.class)
}
)
Property property){
...
}
}</pre>
<br />
Abaixo um exemplo de uso da anotação @Any em uma propriedade de um controlador.<br />
<br />
<pre class="brush: java;">@Controller("/test")
public class TestController{
@Basic(bean="property")
@Any(
metaBean=@Basic(bean="property_type")
metaValues={
@MetaValue(name="Decimal", target=DecimalProperty.class),
@MetaValue(name="Set", target=SetProperty.class)
}
)
private Property property
...
}</pre>
<br />
Abaixo um exemplo de uso da anotação @Any em uma ação.<br />
<br />
<pre class="brush: java;">@Controller("/test")
public class TestController{
@Action("/")
public void testAction(
@Basic(bean="property")
@Any(
metaBean=@Basic(bean="property_type")
metaValues={
@MetaValue(name="Decimal", target=DecimalProperty.class),
@MetaValue(name="Set", target=SetProperty.class)
}
)
Property property){
...
}
}</pre>
<br />
Um exemplo da vida real seria um cenário de venda, onde um operador turístico vende diferentes serviços.
<br />
<div style="text-align: justify;">
O exemplo irá permitir registrar um serviço aéreo ou de hospedagem por transação.</div>
<br />
<b>Dowload link</b>: <a href="http://sourceforge.net/projects/brutos/files/brutos/2.0/examples/2.0-RC1/polymorphic-mapping.zip/download">http://sourceforge.net/projects/brutos/files/brutos/2.0/examples/2.0-RC1/polymorphic-mapping.zip/download</a><a href="https://www.blogger.com/"></a><br />
<br />
<b>Source code</b>: <a href="http://sourceforge.net/p/brutos/code/HEAD/tree/trunk/examples/polymorphic-mapping/">http://sourceforge.net/p/brutos/code/HEAD/tree/trunk/examples/polymorphic-mapping/</a><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpr7Kwi5txOPHaYybV4I9i1bMBQDKTiA2Xa4UBXJINLZRaHHZ7HOpqpVTcz5gSB-auU7yp7v_F4VpHzWNaYtANY01qEPIafQZKwaSDs6w08Ac8k_AaclVUkIDGbI0bmKFHcVikmDHgGEs/s1600/Class+Diagram0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpr7Kwi5txOPHaYybV4I9i1bMBQDKTiA2Xa4UBXJINLZRaHHZ7HOpqpVTcz5gSB-auU7yp7v_F4VpHzWNaYtANY01qEPIafQZKwaSDs6w08Ac8k_AaclVUkIDGbI0bmKFHcVikmDHgGEs/s400/Class+Diagram0.png" width="400" /></a></div>
<div style="text-align: center;">
<i>Diagrama das entidades da aplicação.</i></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
Durante cada transação de venda, apenas um serviço será vendido. Podendo ser um serviço de hospedagem ou aéreo.<br />
<br />
<span style="font-size: 24px; font-weight: bold;">Classes</span><br />
<br />
<pre class="brush: java;">public class SaleTransaction {
private Long id;
@Transient
private Date date;
private Long price;
@Any(
metaBean =
@Basic(bean = "serviceType"),
metaType=
String.class,
metaValues = {
@MetaValue(name = "air", target = AirService.class),
@MetaValue(name = "hosting", target = HostingService.class)
}
)
private Service service;
//gets e sets
...
}</pre>
<div style="text-align: center;">
<span style="font-weight: normal;"><i>SaleTransaction.java</i></span></div>
<br />
A anotação @Any indica que a propriedade service receberá uma instâncias da AirService, se o parâmetro serviceType for igual a "air", ou HostingServices, se o parâmetro serviceType for igual a "hosting".<br />
<br />
<pre class="brush: java;">public interface Service {
void setPrice(Long value);
Long getPrice();
String getServiceType();
}</pre>
<div style="text-align: center;">
<i>Service.java</i></div>
<br />
<pre class="brush: java;">public abstract class AbstractService
implements Service{
protected Long price;
public void setPrice(Long value) {
this.price = value;
}
public Long getPrice() {
return this.price;
}
}</pre>
<div style="text-align: center;">
<i>AbstractService.java</i></div>
<br />
<pre class="brush: java;">public class AirService extends AbstractService{
private String airplane;
private String seat;
@Temporal("yyyy-MM-dd hh:mm")
private Date departureDate;
@Temporal("yyyy-MM-dd hh:mm")
private Date arrivalDate;
public String getAirplane() {
return airplane;
}
//gets e sets
...
}</pre>
<div style="text-align: center;">
<i>AirService.java</i></div>
<br />
<pre class="brush: java;">public class HostingService extends AbstractService{
private String hotel;
@Temporal("yyyy-MM-dd")
private Date checkin;
@Temporal("yyyy-MM-dd")
private Date checkout;
private String mealPlan;
private String room;
//gets e sets
...
}</pre>
<div style="text-align: center;">
<i>HostingService.java</i></div>
<br />
<pre class="brush: java;">@Controller("/sales")
@Action(value="/new", view=@View("new"))
@RequestScoped
public class SalesController {
@Inject
@Transient
private SalesMemoryEntityAccess salesMemoryEntityAccess;
@Action("/save")
@Result("entity")
public SaleTransaction save(@Basic(bean="entity")
SaleTransaction entity){
this.salesMemoryEntityAccess.save(entity);
return entity;
}
...
}</pre>
<div style="text-align: center;">
<i>SalesController.java</i></div>
<br />
<br />
<h2>
View</h2>
<br />
<pre class="brush: xml;"><form method="POST"
action="${pageContext.servletContext.contextPath}/sales/save">
<table>
<tbody>
<tr>
<td>Id</td>
<td>${entity.id}</td>
</tr>
<tr>
<td>Price</td>
<td><input type="text" name="entity.price"
value="${entity.price}"></td>
</tr>
<tr>
<td>Service type</td>
<!-- campo do metaBean serviceType -->
<td><select id="serviceType" name="entity.service.serviceType"
onchange="javascript:showServiceDataundefined)">
<option ${entity.service.serviceType == 'air'? "selected " : ""} value="air">Air</option>
<option ${entity.service.serviceType == 'hosting'? "selected " : ""} value="hosting">Hosting</option>
</select></td>
</tr>
<!-- inicio do formulário do serviço aéreo -->
<tr id="air">
<td>
<table width="100%">
<tbody>
<tr>
<td>Airplane</td>
<td><input type="text" name="entity.service.airplane"
value="${entity.service.serviceType != 'air'? null : entity.service.airplane}"></td>
</tr>
<tr>
<td>Departure date</td>
<td><input type="text" name="entity.service.departureDate"
value="<fmt:formatDate value="${entity.service.serviceType != 'air'? null : entity.service.departureDate}" pattern="yyyy-MM-dd hh:mm" />"></td>
</tr>
<tr>
<td>Arrival date</td>
<td><input type="text" name="entity.service.arrivalDate"
value="<fmt:formatDate value="${entity.service.serviceType != 'air'? null : entity.service.arrivalDate}" pattern="yyyy-MM-dd hh:mm" />"></td>
</tr>
</tbody>
</table>
</td>
</tr>
<!-- inicio do formulário do serviço de hospedagem -->
<tr id="hosting">
<td>
<table width="100%">
<tbody>
<tr>
<td>Hotel</td>
<td><input type="text" name="entity.service.hotel"
value="${entity.service.serviceType != 'hosting'? null : entity.service.hotel}"></td>
</tr>
<tr>
<td>Checkin</td>
<td><input type="text" name="entity.service.checkin"
value="<fmt:formatDate value="${entity.service.serviceType != 'hosting'? null : entity.service.checkin}" pattern="yyyy-MM-dd" />"></td>
</tr>
<tr>
<td>Checkout</td>
<td><input type="text" name="entity.service.checkout"
value="<fmt:formatDate value="${entity.service.serviceType != 'hosting'? null : entity.service.checkout}" pattern="yyyy-MM-dd" />"></td>
</tr>
<tr>
<td>Mealplan</td>
<td><input type="text" name="entity.service.mealPlan"
value="${entity.service.serviceType != 'hosting'? null : entity.service.mealPlan}"></td>
</tr>
<tr>
<td>Room</td>
<td><input type="text" name="entity.service.room"
value="${entity.service.serviceType != 'hosting'? null : entity.service.room}"></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td><c:if test="${!empty entity.id}">
<input type="hidden" name="entity.id" value="${entity.id}">
</c:if> <input type="submit" value="Submit"></td>
</tr>
</tfoot>
</table>
</form>
</pre>
<br />
<br />
<a href="http://www.brutosframework.com.br/">http://www.brutosframework.com.br/</a><br />
<div class="MsoNormal">
<span lang="EN-US"><o:p></o:p></span></div>
Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0tag:blogger.com,1999:blog-1928964491523527735.post-83528862963871076372015-07-05T08:45:00.007-07:002015-07-23T17:23:58.520-07:00Brutos Framework 2.0 RC1 Released The Brutos Application Framework is MVC controller developed in Java. Designed to reduce the complexity of web development, with configurable mapping, view resolution as well as support for uploading and downloading files. Can be configured using XML, annotations and CoC.<br />
<br />
<b>Highlights of the 2.0 RC1 release: </b><br />
<br />
<ul>
<li>added support to polymorphic mapping. </li>
<li>Bean Validation is the default validator provider. </li>
<li>CDI is the default object provider. </li>
</ul>
<br />
<a href="http://www.brutosframework.com.br/">http://www.brutosframework.com.br/</a>Brandãohttp://www.blogger.com/profile/16620862208396036901noreply@blogger.com0