Arquivo

Archive for the ‘MiddleHeaven’ Category

Nosso novo blog

Já era hora, eu achei, de criar um novo blog para falar do MiddleHeaven.

Tenho dedicado meu muito escasso tempo livre a este projeto durantes os últimos anos e está na hora de o mostrar ao mundo (e ser criticado por isso …).

O blog em inglês não deslanchou e o site feito pelo maven é pesado para atualizar. A ideias são muito mais fluidas e, contando que a minha equipe jornalística sou eu mesmo é bem mais facil utilizar um blog. A volta ao blog do WordPress em deterimento do Blogstop é que o Wrodpress apresenta a muito útil capacidade de criar páginas estáticas além do blog.

Convido a todos a conhecerem o nosso novo blog para entender e desenvolver o MiddleHeaven.

A seu tempo vou colocar nele os textos já apresentados, em inglês, no blog antigo.
Espero que acabe havendo algum cross-siting entre os dois blogs especialmente em referências a padrões e coisas relacionadas ao Java em si. Isso não era possível com o blog antigo devido à diferença da língua. Espero que isso, também, seja uma vantagem.

Aproveito para informar o estado do projeto. Embora já seja possível criar telas swing e sites jsp ainda falta um pouco para que as peças principais estejam no lugar.  Recentemente integrei o NeoDatis e parece bastante promissor, contudo, leva a uma revisao do modelo de dominio baseado em anotações (sem ORM , não ha necessidade das anotações). Por outro lado, revisei o mecanismo de wiring (injeção automática) para ser possível encontrar pontos de injeção por outras vias que não annotações. Desta forma é possível análises mais dinâmicas. O mecanismo de persistência é o próximo a ser revisto. Espero que após isso uma versão do framework possa ser usada para aplicações web simples (a la Spring / Struts / Vraptor / Mentawai) .

Claro que, para isso, você precisa estar preparado para não usar o Hibernate… será que aguenta ? ;)

MiddleHeaven Pré-Alfa

Uma versão utilizável do MiddleHeaven já está disponivel. A versão é a 0.0.1 o que significa que é pre-alfa.

Este release não é de produção, nem muito menos está em estado de completo, mas isso é porque estou tomando em consideração todos os toolboxes.  Alguns toolboxes estão 90% terminados e alguns já são utilizáveis mesmo sem estarem completos.

O objetivo é deixar um jar disponível para que as pessoas possam experimentar o MiddleHeaven sem o esforço de baixar tudo do SVN e compilar em casa. Note-se que o MiddleHeaven tem muitas dependências externas. É bom dar uma olhada no arquivo POM dentro do jar.

É claro que nem todos os bugs foram corrigidos, mas tentei deixar corrigidos todos os que encontrei.

O blog de desenvolvimento do MiddleHeaven está aberto aos comentários de todos assim como os foruns.

MiddleHeaven Reloaded

Ha quase um ano o MiddleHeaven nasceu, mas a sua evolução anda um pouco lenta devido a minha falta de disponibilidade para trabalhar nele. Então vou fazer algumas alterações.

Primeiro, decidi criar um outro blog para falar do MiddleHeaven. Isto porque: a) não caberia neste blog pessoal falar com detalhe desse asunto e; b) precisava atingir uma comunidade maior e por isso decidi escrever o blog em inglês. O meu blog pessoal é em português por escolha e não caberia misturar as duas línguas.

No blog de desenvolvimento vou falar da estrutura, conceitos , idéias e trade-offs por detrás do MH e espero que isso ajude mais pessoas a entender OO e Java e me ajude a vislumbrar onde fiz a escolha errada.

O blog do MiddleHeaven não é pessoal, por isso, espero que no futuro possam existir mais pessoas colaborando com conteúdo para ele (em tese, os mesmos que colaboram com o código).

Convido a todos que estão interessados no projeto a seguir o novo blog.

Atualizações

Os artigos sobre exceções e coleções foram atualizados. Ao de coleções adicionei um fluxo de decisão de interfaces e implementações de coleções. São abrangidos os principais casos. Notei que existe pouco entendimento das diferenças entre cada implementação, então espero que isto ajude a clarificar as coisas. Um terceiro, prometido, artigo sobre exceções está na forja … segura firme.

Adicionei um novo artigo sobre as palavras reservadas do Java. Curiosamente nunca tinha parado para pensar que true, false e null são palavras reservadas. O estranho é que no site da Sun só se listam as palavras-chave e não as palavras reservadas. Acho estranho porque o conceito de palavra reservada é mais lato que o de palavra-chave.

Não tenho tido tempo para comentar sobre o projeto MiddleHeaven mas ele continua em desenvolvimento (alfa). Estou com alguns problemas logísticos para decidir onde colocar o código “official”. O sourceforge parecia bom, mas a conexão é lenta demais. O Google Code parece bem mais rápido mas não dá para usar o site que o Maven produz (dá?). No sourceforge tenho também o problema de não conseguir atualizar o ViewCVS que no Google Code funciona perfeitamente. Quem quiser dar uma olhada pode fazê-lo no Google Code, embora o código esteja menos atualizado.

Categories: Blog, Java, MiddleHeaven

Wire It to me

Como saberão estou – no meu pouco tempo livre – envolvido no projeto MiddleHeaven. Umas das capacidades mais interessantes do Middleheaven é ganhar independência de plataforma através do uso de serviços. Como comentei antes, “serviço” é uma modelo que está em alta e que parece fornecer encapsulamento, isolamento e desacoplamento por definição. Adicionamos a isso a programação para interfaces e os mecanismos de meta-programação (reflection, bytecode-rewrite) e temos um mecanismo muito poderoso para adicionar funcionalidade no sistema.

Ao trabalhar com serviços existem algums detalhes que precisam ser suportados por um framework. Primeiro, tem que existir uma forma de obter o serviço. Tudo bem que não sabemos qual a implementação do serviço – e não nos interessa – mas temos que a obter em algum momento. O padrão básico para isto é o Registry. A idéia é que a implementação é registrada “antes” e “depois” o serviço é recuperado. Esta mecânica existe em vários frameworks baseados em serviços como JMX ou OSGi. Este simples requisito (obter a implementação) é mais complexo do que parece. Acontece que um mesmo serviço pode funcionar diferentemente conforme algum parâmetro e podemos estar interessados em usar mais do que um serviço do mesmo tipo. Por exemplo, um serviço de dicionário tem vários tipos: um para cada língua. Ao pegar o serviço a interface não basta. É preciso (algumas vezes) adicionar algums parâmetros na busca. Dessa forma, é possivel dizer “obtenha a implementação do serviço dicionário para o francês” e depois repetir “obtenha a implementação do serviço para o inglês” e com isso construir um código que testa se uma certa palavra é homografa entre as línguas (como por exemplo weekend). Um mecanismo baseado em serviços tem que ser capaz de suportar diferentes “sabores” de um mesmo serviço. Até aqui parece simples. Basta passar os parâmetros durante a procura. Mas quais parâmetros são permitidos para cada serviço? Precisamos saber? Versão é um parâmetro?

O outro ponto é que usar um Registry para obter os serviços torna o código dependente do próprio registro e da forma de o acessar. Um mecanismo melhor seria usar injeção de dependência. Mas para ser realmente prático, uma implementação de um mecanismo destes teria que ser feito com base em anotações (compare Guice com Spring e veja a diferença entre usar anotações e XML). Isso é interessante porque não mais tenho que me preocupar com o mecanismo de procura , apenas espeficico o que quero. Algo assim:

@Wire @ServiceParams(“language=fr_FR”) Dicionario dicionarioFrances;
@Wire @ServiceParams(“language=en_UK”) Dicionario dicionarioIngles;

O mecanismo de injeção faria algo como

ServiceRegistry.getService(Dicionario.class, serviceProperties )

em que serviceProperties seria um mapa populado pela instrospeção de @ServiceParams.
Um mecanismo de injeção não demora a construir, embora demore a maturar para resolver problemas como referência cíclica e outros. Ou seja, em tese, não é pedir muito que o MiddleHeaven inclua um mecanismo de injeção e permita ao objetos pedir “Hey! MiddleHeaven, wire it to me!”

Tudo muito bem, mas existe ainda um outro fator nesta história. Decidir quais implementações dos serviços devem ser usadas. Esta decisão depende de vários fatores. Serviços de infra como transações e comunicação remota dependem do contexto em que a aplicação corre. Dentro de um container jee é apenas adaptar o serviço provido pelo próprio container, enquanto que em standalone precisamos de implementar o próprio mecanismo ou delegar a alguma biblioteca de terceiros. A aplicação também pode decidir que precisa de um certo serviço ( por exemplo, serviço de reports). Esse serviço tem que estar presente para a aplicação funcionar, mas não é essencial nem utilizado sempre e nem depende do contexto. Além desses, temos serviços externos como serviços de cotação ou B2B que a aplicação usuará.

A este ponto deve estar pensando que já ouvi esta conversa em relação a SOA. SOA é orientado a comunicar sistema fora do mesmo “processo de negocio”. Mas podemos trazer o conceito para dentro e utilizar um design baseado em componentes que funcionam como serviços uns dos outros. Claro que isso é mais facil dito que feito.

Como os serviços necessários à aplicação podem ser adicionadas conforme necessário eles podem também ser removidos ou subtituídos (especialmente os de terceiros) quando necessário. Isto pode significar que depois que a variável foi connectada à implementação, a implementação muda. E muda em runtime. O objeto que a variável aponta não é mais válido. Obviamente isto implica no uso do padrão Observer mas como não há interação com o registro de serviços, o próprio mecanismo de injeção tem que conter alguma lógica especial ou melhor, ser possível injetar alguma lógica especial no mecanismo de injeção ;-) . Ou seja, temos que aliar AOP com o mecanismo de injeção para trabalhar com serviços errantes.

Indo mais fundo no problema, a apliação em si mesma pode ser entendida como um conjunto de serviços. Normalmente chamamos as partes de um aplicação de módulos. A idéia é criar uma aplicação criando um conjunto de módulos. Um módulo “principal” contém o coração da aplicação. O que esse módulo faz (o seu serviço) depende de outros módulos e/ou pode ser estendido por outros modulos.

Um exemplo classico são os ERP. Uma compra gera um conjunto de eventos de negócio. Cada módulo (contabilidade, financeiro, etc..) enxerga esse evento de forma diferente e o processa de forma diferente. Para um sistema básico a implementação do módulo pode simplesmente ignorar o evento ou apenas persisti-lo para tratamento posterior. Um módulo mais avançado não apenas produziria informação com base no evento, como ainda disponibilizaria seus serviços para serem consultados por outros modulos/sistemas (via webservice, por exemplo). Um módulo mais avançado poderia alterar o serviço de UI da aplicação para incluir mais telas que permitem ao usuário interagir com o módulo, e alterar o serviço de permissões para restringir o acesso dos usuários. Os módulos seriam então configuradores de serviços, conscientes dos outros módulos de que eles dependem e fornecendo novos serviços para serem consumidos por outros módulos, aplicações ou sistema.

Esta é a idéia por detrás do MiddleHeaven como um framework orientado ao negócio. A aplicação é apenas mais um serviço, composto por outros serviços. O detalhe agora é saber como colocar tudo isto no mesmo caldeirão e funcionar.

A minha idéia era, como comentei antes, utilizar frameworks como o OSGi ou o ainda não estreado Java Module System para cuidar da localização e registro de serviços, mas hoje parece-me que esse mecanismos podem não ser compativeis e/ou não seguir o caminho necessário para o MiddleHeaven. Ou serem mais abrangentes que esse caminho. Enfim, abstrair esses mecanismo parece uma boa idéia para manter a independência do MiddleHeaven mas parece complicado demais…

Padrões

Uma das mais inimitáveis características do ser humano é ser capaz de reconhecer padrões. Não apenas padrões de cor, forma ou som, mas também padrões em idéias, conceitos e abstrações. A matemática não seria possível sem essa capacidade.

Venho elaborando descrições do padrões mais importantes (a lista não pode ser exaustiva porque existem bastantes ) em orientação a objetos em java hoje em dia. Claro que a implementação é naturalmente orientada para java, mas os padrões em si mesmos são abstratos e podem ser implementados em qualquer linguagem O.O. ( a maioria, pelo menos).

Os padrões são resultado da estricta e repetida aplicação do Principio de Separação de Responsabilidade e são, na realidade, uma expressão utilitária desse principio.

Espero apresentar uma vasta gama de padrões (pelo menos os usados no MiddleHeaven) mas não é um trabalho rápido devido ao imenso numero de padrões que existem.

Categories: MiddleHeaven, Patterns

Orientação a Serviços

Muitas coisas aconteceram desde a ultima mensagem. Esta vida corrida demanda demais.

O projeto Middleheaven continua. Um dos seus pontos fortes é o uso de serviços para fornecer funcionalidade. Serviços são interfaces que estabelecem contratos. A sua implementação é desconhecida, apenas sabemos que funciona. Desta forma a aplicação pode ser totalmente isolada de mecanismos de infraestrutura e, até, de outras aplicações sem que ela saiba.

A ideia de usar serviços veio da api de JMX que é complemente orientada a componentes de serviço: os MBeans. Com o passar do tempo eu queria aumentar o nível e ser capaz de dizer que o serviço x depende do y de forma que o sistema tomasse conta da organização e avisasse quando o serviço não está disponível. Este controle de dependência mostrou-se muito complexo.

Perquisando na net encontrei uma coisa chamada OSGi framework. Também baseado no conceito de serviço com implementações separadas surge a ideia de o incorporar ao MiddleHeaven. Existem várias implementações do OSGi framework e escolhi o Apache Felix para começar. Contudo existe uma JSR (JSR 277) prevista para breve que faz algo semelhante. Por isso ainda não decidi qual dos mecanismo adotar. O JSR 277 promete ser o novo padrão java muito em breve, mas o OSGi já existe hoje. O OSGi framework tem alguns problemas como classloading que o novo padrão pretende resolver.

WebServices e SOA são outras ideias que nos levam a um mecanismo de serviços como componentes, mas agora de forma remota. A implementação do serviço pode ser remota com a API de webservices fazendo a ponte. A famosa consulta de cep poderia muito bem se aproveitar disto.

Parece-me que o MiddlHeaven está no bom caminho no que toca a usar serviços como peças fundamentais para prover funcionalidades …

Categories: Java, MiddleHeaven

MiddleHeaven

Decidi trocar o host do MiddleHeaven para o SourceForge já que o Java.net não oferece a simplicidade de um webserver onde colocar a documentação e outras coisas. Como o projeto usa o Maven o site é criado e colocado online automáticamente.

Esta configuração do Maven é uma mão na roda quando está certa, mas é um complexo de configurar tudo da forma que se quer… O codigo está online

Nasce o MiddleHeaven

Depois de muito , muito, tempo prepando o terreno decidi que é hora de lançar o projeto.

A minha ideia original era trabalhar no projeto até ter uma fundação sólida para depois o libertar como open source. Mas devido ao pouco tempo que disponho decidi lançar por partes, conforme vai ficando pronto. A base de código contém tudo, mas apenas algumas partes são utilizáveis.

A ideia por detrás do MiddleHeaven não é criar um framework web, nem mais um framework.É criar um Business Framework. Um framework orientado aos negocios. A diferença fundamental para outros frameworks é que visa implementar um conjunto de padrão de aplicação além dos comuns padrões de projeto. A ideia é fazer o sistema depender de um único framework e o framework depender de um conjunto de outros frameworks de infraestrutura. Por exemplo, abstrair se o log é feito no Log4J ou não, se a persistencia é feita em banco de dados , e em qual, se o sistema correm em JBoss, Tomcat ou standalone, etc…

Em certa forma é uma implementação prove of concept mas espero que seja funcional.

 

Seguir

Get every new post delivered to your Inbox.