Oracle - Sun no fantástico mundo de Hardware

quinta-feira, 10 de setembro de 2009

Para quem pensava que a Oracle não iria investir em Hardware, saiu hoje no site da Oracle um comunicado aos cliente da Sun sobre alguns de seus planos, mais especificamente na parte de hardware, observe que final ainda tem um aviso para IBM,

Nós estamos nesta para ganhar.
IBM prepare-se, nós estamos nos preparando para competir com vocês no negócio de Hardware.

Larry Elisson
É esperar para ver !!! =)
Diversão garantida !

Just Java 2009 - O principal evento da comunidade Java Brasileira

quarta-feira, 9 de setembro de 2009



Nos dias 15, 16 e 17 de Setembro acontece em São Paulo o Just Java 2009. Será a 8a. edição do principal evento da Comunidade Java Brasileira.
A grade do evento já está disponível no site http://grade.justjava.com.br/
Esse ano vou apresentar a palestra "De Web Services RESTFul a aplicações Mashups: Como chegar lá".
Onde vou apresentar o conceitos de REST, falar sobre especificação da JSR-311 que define o JAX-RS , falar sobre frameworks de teste, como consumir serviços REST e finalmente falar sobre Mashups, e a importância de REST neste contexto.
 Para se inscrever, acesse o site do evento aqui.

Diversão Garantida!!!

Scrum + XP = Agilidade eXtrema

quarta-feira, 12 de agosto de 2009

Nos dias 07 e 28 de Julho foi realizado no auditório da Globalcode o minicurso Scrum + XP = Agilidade eXtrema, gostaria de agradecer a Globalcode pelo espaço concedido e pela força e também a todos que compareceram, pelo ótimo feedback que recebi.

Para maiores detalhes de como foi o mini-curso acesse o seguinte link no site da Globalcode.

Na apresentação, o intuito foi dar um enfoque teórico e prático de como funciona o Gerenciamento de Projetos Ágeis utilizando XP e Scrum, e no final uma explicação de como combinar as duas.

O que acabou agregando bastante a apresentação foi o próprio público, que iteragiu bastante, com perguntas sobre planejamento e estimativas em projetos ágeis. Foi apresentado alguns técnicas para "vender" Agile em um ambiente corporativo. Conversamos bastante sobre o papel de uma equipe de testes, como escrever os testes de aceite e unitário dentro do TDD, Refactoring, Integração Contínua, priorização dos itens de backlog, User Stories, Débito Técnico, enfim.. três horas pareceu pouco =)


Conforme solicitado pelos colegas, segue a apresentação.

Scrum + XP na prática

Ainda durante a apresentação, demonstrei um vídeo bem engraçado intitulado "O Alpinista", onde fiz uma analogia de um alpinista com gerentes de projeto.. momento bacana para quebrar um pouco o gelo. Segue abaixo o vídeo.



Bom, é isso aí pessoal, obrigado mais uma vez !!!

Scrum + XP = Diversão Garantida !!!

Introdução ao Google Wave - Tutorial e Primeiras Impressões

quarta-feira, 22 de julho de 2009

Como muitos devem saber, a Google está lançando um novo produto chamado Google Wave, que a alguns meses está disponível para beta-testers em um sandbox para desenvolvimento. Se a Google revolucionou a forma como utilizamos a web, agora com Wave eles querem reinventar o email. Tenho testado a ferramenta, e com o uso fui compilando o material que encontrei sobre o wave que irei disponibilizar neste artigo.
Para este post, adaptei grande parte do conteúdo do artigo Google Wave: A Complete Guide do Site Mashable.com com as minhas impressões. O site ainda possui diversos artigos interessantes sobre o Wave.

Para iniciar veja na Figura 1, a aparência do Google Wave.

Figura 1: Aparência do Google Wave.

O Google Wave possui uma interface rica e intuitiva, onde começando da esquerda para a direita, temos a caixa de navegação com a Caixa de Entrada (Inbox), a opção Active apresenta as ondas que estão ativas, a opção All apresenta todas as ondas disponíveis, e assim por diante. Na caixa Contacts, temos a nossa lista de contatos. A coluna do meio (Inbox) apresenta a nossa caixa de entrada, ou a visão que estamos enxergando no momento, similar ao Gmail, que demonstra as mensagens de acordo com o filtro (se houver) estabelecido.
Na terceira coluna, vemos uma onda aberta similar a uma seção de chat.

Mas o que é o Google Wave?

Para resumir, o Google Wave é uma plataforma de comunicação em real-time, que combina diversos aspectos da Web 2.0 que utilizamos atualmente como mensagens instantâneas, blogs, wikis, redes social, sem falar de email =) tudo isso em seu browser.
Pode ser utilizado em diversas finalidades, para gerenciamento de projetos (ferramenta de colaboração), para compartilhar arquivos ou simplesmente iniciar uma conversa, ops , onda. As pessoas podem se comunicar e trabalhar em conjunto formatação de texto rich-text, fotos, vídeos, mapas, e muito mais.

Entre as diversas funcionalidades inovadoras, segue o resumo de algumas disponíveis:

  • Colaboração em Tempo Real: Tecnologia concorrente que permite que as pessoas em uma onda editem conteúdo de mídia ao mesmo tempo. (É possível ver o que a pessoa está escrevendo em tempo real.)
  • Ferramentas de Linguagem Nativa: Google Wave automaticamente corrige palavras escritas erroneamente, e o que achei mais impressionante, ele corrige erros de concordância.
  • Embutível: É possível embutir ondas em qualquer blog ou site. No GDD foi apresentado como publicar uma onda no blogspot, bem legal.
  • Aplicações e Extensões: Assim como o Facebook ou o iGoogle é possível criar aplicações para o wave, desde de robôs até complexas aplicações, gadgets. (Tanto em Java como em Python).
  • Suporte a Drag and Drop: É possível fazer drag and drop de documentos, fotos para a onda, no more attachments ;-)
  • Playback: Uma funcionalidade interessante, uma vez que a onde fica muito grande, se alguém entrar no meio da onda, pode ficar sem entender o histórico, para isso foi disponibilizado um botão (Playback), que é possível ver o que foi dito em qualquer parte da onda. E o melhor, o projeto é open source \o/
Terminologia

Para entrar na onda, é preciso entender o linguajar do Google Wave, que ajuda a definir e contextualizar essa nova plataforma de comunicação. Entender estes termos irá ajudar a compreender mais este novo projeto. Veja a Figura 2, que apresenta estes conceitos de maneira visual.

Figura 2: Entendendo os termos de uma Wave

  • Wave: A onda refere-se a uma thread especifica de uma conversação. Pode serincluída apenas uma pessoa, um grupo de usuários ou mesmo robôs. Que seria todo o histórico de conversação de um email.
  • Wavelet: Um wavelet é também uma thread de conversação, mas somente um subconjunto de uma grande conversação (ou uma onda).
  • Blip: Ainda menor que uma Wavelet, um Blip é uma única, mensagem individual. Blips podem conter outros blips anexados a ele. Para saber mais sobre Blips, acesse http://www.blippr.com/apps/337306-BLIP.
  • Documento: Refere-se ao conteúdo dentro de um blip. Podemos ser simples caracteres ou arquivos associados ao blip.
  • Extensões: Um extensão é uma mini-aplicação que opera dentro de uma onda. Existem dois tipos de extensão, os Gadgets e os Robots
  • Gadgets: Um gadget é uma aplicação onde os usuários podem utilizar em conjunto, a maioria é construída sobre a plataforma OpenSocial (da Google), podemos fazer uma comparação com os gadgets do iGoogle ou as aplicações do Facebook. Veja a Figura 3, para alguns exemplos de gadgets (Google Maps, Polls de pesquisa, um jogo de xadrez, entre outros).

Figura 3: Gadgets para o Google Wave.

  • Robots: Robots são aplicações (robots) que participam de uma onda. Eles podem interagir com os usuários de uma onda, podem fornecer informações de fontes externas como o Twitter, ou podem tomar ações baseadas no conteúdo digitado pelos participantes de uma onda, um exemplo muito interessante é o robô Rosy Etta, que em tempo real traduz o conteúdo de uma onda para participantes de linguagens diferentes (ex: Japonês x Inglês) =) ,, na apresentação do GDD este ano, este foi um dos pontos altos da apresentação \o/. Veja na Figura 4 alguns robôs em ação.

Figura 4: Robôs em ação em uma onda.
  • Ondas Embutidas: Uma onda embutida é uma maneira de levar uma conversação de uma Wave para dentro de seu site ou blog. Sendo possível utilizar a mesma como chat ou uma maneira de se comunicar com você.

Figura 5: Exemplo de Ondas embutidas

É isso aí, esse é apenas um aperitivo que vem por aí, lembrando que o Google Wave não está disponível ainda para o grande público, se a ansiedade for grande demais =) , solicite acesso ao acesso Dev Preview, e torça para ganhar um convite.

No próximo vou demonstrar como criar um robô passo a passo para o Wave.

Diversão Garantida!!!

RESTful Web Services e a API JAX-RS na revista Mundo Java, nº 35

terça-feira, 9 de junho de 2009


No mês de Maio foi publicado mais um artigo meu na revista Mundo Java, sobre a REST desde o conceito proposto pelo Dr. Roy Fielding até a implementação JAX-RS em Java, com diversos exemplos práticos no Jersey.

Graças a Deus tenho recebido um bom feedback das pessoas, no artigo procurei demonstrar as tecnologias por trás de um serviço REST, onde fiz primeiro uma introdução ao HTTP, para auxiliar aos leitores que estão iniciando a compreender a dinâmica do serviço.

Ainda no artigo, apresentei um artigo bem completo sobre a API JAX-RS, e mostrando na prática com diversos códigos como se trabalhar com os recursos, tratamento de exceções, extração de parâmetros e valores da URI na requisição.
Como trabalhar o retorno dos métodos ao Cliente, dando uma visão geral dos Providers.

E por fim, apresentei um guia de ferramentas para teste, e como consumir serviços REST, utilizando a API JAXB para conversão dos dados em objetos, uso prático da biblioteca Jakarta Commons HTTP Client, o uso de bibliotecas JavaScript como o jQuery, e o uso de JavaScript / AJAX..

Sem dúvida, uma ótima pedida para quem esta iniciando o desenvolvimento de serviços REST.

Além do artigo, tem vários destaques na revista deste mês, conforme segue:

Projeto da Certificação SCEA 5
Um exemplo fictício de projeto para a segunda fase da cobiçada certificação de arquiteto Java EE.
Autores: Márcio Varchawski

Conhecendo a Plataforma JavaFX Mobile
Através deste artigo crie e compreenda seus primeiros aplicativos utilizando a plataforma Java- FX Mobile.
Autores: Ricardo da Silva Ogliari

Mundo OO: Padrões de Projeto com Generics
Aprenda como tirar vantagem de Generics na implementação de Padrões de Projeto em suas aplicações Java.
Autor: Alexandre Gazola, Alex Marques Campos

RESTful Web Services e a API JAX-RS
Conheça o poder dos serviços REST e a implementação de Referência da Sun, o Jersey.
Autor: Wagner Roberto dos Santos

ProfessorJ: Conhecendo os parâmetros de configuração mais utilizados da JVM
Aprenda como configurar a Máquina Virtual JAVA para evitar os indesejados estouros de memória.
Autores: Rodrigo de Azevedo

Tendências em Foco: Adotando o Open Source no Ensino da Computação
Entenda a estratégia de adoção do Open Source no ensino da computação e programação Java.
Autor: Cezar Taurion

SOA na Prática: Governança em SOA - Versionamento de Serviços
Aprendendo a lidar com questões de versionamento de serviços dentro de uma arquitetura SOA.
Autor: Ricardo Ferreira

Made in Brazil: JColtrane - Parser XML com SAX + Anotações
Conheça essa alternativa nacional para processesar arquivos XML sem comprometer memória e a clareza do código.
Autor: Renzo Nuccitelli, Eduardo Guerra










Diversão Garantida !!!

Web Services WS-* vs REST.

quinta-feira, 14 de maio de 2009

Muitos sites, blogs e fóruns têm colocado seus pontos de vista em relação ao uso de web services REST e SOAP, gerando muitas vezes calorosas discussões.

Na verdade, não existe uma disputa entre eles, pois cada um possui uma proposta bem diferente. Vários estilos diferentes de aplicações tem sido utilizadas para integrar sistemas de informação corporativos, entre as opções, existem os banco de dados compartilhados, transferência de arquivos (EDI ), remote procedure call (RPC), ou troca de mensagens assíncronas via uma sistema de mensageria. Ao fazermos uma comparação entre REST e WS-* (pronucia-se ws-star), precisamos fazer uma comparação quantitativa baseado em princípios arquiteturais que envolvem questões relacionadas a cenário, tecnologia, métodos, formato dos dados trafegados, segurança, transação, entre outros fatores da sua aplicação. Devemos lembrar que estas tecnologias surgiram para suprir estes problemas recorrentes na maioria dos projetos de software, que é a interoperabilidade.

Foi quando começaram a surgir esforços da comunidade de buscar dos grandes players interoperabilidade entre suas plataformas, aplicações, e linguagens de programação. Foi quando surgiram as especificações WS-*, que atendem tanto ao estilo RPC quanto mensageria. A especificação SOAP não define como deve ser um message header, ou elementos do corpo do envelope, dessa maneira podemos ter aplicações que customizem o tipo de header que ela aceita, e o tipo de informação que deve estar vinculado ao body para uma operação em particular, sem falar que algumas dessas informações podem ser compartilhadas por diferentes aplicações, sem falar em questões de segurança, roteamento de mensagens, entre outros fatores.

As especificações WS-* definem padrões para mensagem, troca de metadados, segurança, entre outros. No mundo Java, para implementar este mundo de especificações, foi aberto o projeto WSIT (antigo projeto Tango) como parte do projeto Metro, que por sua vez faz parte do projeto Glassfish, veja a Figura 01 os padrões (em verde) utilizado no projeto WSIT.

Figura 1: Padrões de Web Services utilizados no WSIT.

É claro que para a maioria dos projetos, um web service simples resolveria, mas se começarmos a entrar mais a fundo no mundo orientado a serviços, começa a surgir a necessidade de integração com diversos sistemas, naturalmente teremos que utilizar estes padrões. É somente olhar para a figura 01 que já causa calafrios em muitos desenvolvedores, mesmo com suporte eficiente nos IDEs existentes.

Com isto, vemos claramente que a arquitetura de web services baseadas nas especificações WS-* é muito bem definida, com regras para trocas de dados, segurança, o que por conta de seu excesso de padrões acabou se tornando uma solução muito complexa.

Mesmo com toda a complexidade, serviços WS-* têm tomado cada vez mais espaço no mercado, graças aos projetos SOA que tem adotado largamente serviços WS-* por sua independência e transparência de protocolo. Por outro lado, REST é muito mais simples, como uma resposta para todos estes padrões e especificações, para utilizar REST basta ter um conhecimento razoável sobre HTTP e seus métodos.

Enquanto web services WS-* são orientados a atividade/serviço, serviços REST são orientados a recurso. Quando falamos em desenvolver serviços SOAP, estamos falando em criar APIs, contratos (WSDL), onde o WSDL descreve os detalhes de implementação, como as operações e os tipos de dados trafegados. REST por outro lado, conforme explicado no inicio diz respeito a utilizar o protocolo HTTP para manipular o estado de um recurso. Fazendo uma analogia, podemos dizer que assim como a linguagem de manipulação de dados (DML) do SQL é utilizada para manipular as informações de um banco de dados transacional, REST utiliza os métodos (verbos) do protocolo HTTP para manipular o estado de uma informação. Com estes verbos, podemos fazer praticamente tudo o que quisermos com os dados, independente se usarmos SQL ou HTTP.
Ao mapear os métodos HTTP (POST, DELETE, GET E PUT) com operações DML de um banco de dados temos a seguinte estrutura, conforme ilustra a tabela 01.

Métodos HTTP / Operações CRUD
GET -> SELECT
POST -> INSERT, UPDATE
PUT -> INSERT, UPDATE
DELETE ->DELETE

Tabela 01. Associação dos métodos HTTP com operações CRUD.
Na tabela podemos notar que podemos ter mais de uma operação relacionada a um verbo HTTP, como por exemplo, o método POST, que pode ser utilizado para diversas ações. O método PUT nos dá a possibilidade de criar um novo recurso, ou substituir por outro mais atualizado. Apesar dos diversos tutoriais e exemplos que encontramos na internet sobre REST que envolvem operações CRUD, isso não quer dizer que temos que ficar presos somente a estes tipos de operações. Por conta de sua própria natureza, REST é mais fácil e funciona muito bem com CRUDs, mas podemos em nosso design criar serviços REST. Web Services RESTful.



Pontos Positivos
Pontos Negativos
  • Linguagem e plataforma agnóstica.
  • Simplicidade, interface imutável.
  • Interação assíncrona, não possui estado.
  • Facilidade de adoção, pois não requer uma grande infra-estrutura, muito menos um middleware para WS-* ou camada intermediária adicional.
  • Utiliza a própria web como meio de transporte, sendo assim uma carga baixa para a rede.
  • Utilizada por grande parte das aplicações Web 2.0. (Google, Flickr, Amazon, etc..). Portanto, ótimo para mashups.
  • Curva de aprendizagem baixa.

  • Faltam padrões.
  • Falta de segurança (dados sigilosos não deveriam ser enviados como parâmetros na URI).
  • Não é indicado para trafegar grandes volumes de parâmetros via URI, no caso de PUT/POST para inclusão de dados, por exemplo.
  • Em muitas empresas apenas os métodos GET e POST do HTTP são liberados em proxies e firewalls. Dentro desta limitação, muitos preferem utilizar os métodos GET para requisições de consulta e POST para todo o resto.
  • Não há mecanismos de transação (Do it yourself)
  • Não existe um padrão como UDDI para service discovery.

Tabela 02: Pontos positivos e negativos de REST

SOAP


Pontos Positivos
Pontos Negativos


  • Diversas ferramentas de desenvolvimento.
  • Tipagem forte e um vocabulário bem definido.
  • Quando utilizado sobre HTTP, dificilmente é bloqueado por proxies e firewalls.
  • Permite o uso de diferentes tipos de protocolos.
  • Plataforma independente.
  • Linguagem independente.
  • Diversos padrões.
  • Complexidade dos padrões.
  • Performance.
  • Mensagens podem ficar muito extensas, por serem codificadas com XML
Tabela 03: Pontos positivos e negativos com SOAP.

Fazendo esta pequena análise, chegamos á conclusão de que ambas as soluções são úteis, e a utilização de cada uma depende do contexto em que será aplicada.

Referências (Links):

[Parley] A Little REST and Relaxation: http://tinyurl.com/cm33t2
Estilo SOAP vs Estilo REST: http://www.ibm.com/developerworks/webservices/library/ws-restvsoap/
Descrevendo Serviços REST com WSDL 2.0: http://www.ibm.com/developerworks/webservices/library/ws-restwsdl/
Bruno Pereira: http://brunopereira.org/2008/05/14/precisamos-de-um-descritor-de-servicos-rest/

XP - Extreme Programming - Embrace Change Summary

sexta-feira, 17 de abril de 2009

As you may already know, XP is a lightweight methodology created by Kent Beck, for small-to-medium-sized teams developing software in the face of vague or rapidly changing requirements.

To help the understand of the basis, i'm providing a summary and a mind map of the book eXtreme Programming - Embrace Change, by Kent Beck, as you can see below. Enjoy it!

Figure 1: Extreme Programming Mind Map

XP - Embrace Change is a small book, quite fast and easy to read, it took me only two days to finish it.
As Kent Beck said "XP is a philosophy of software development based on the values of communication, feedback, simplicity, courage, and respect."

The Basic Problem

Software development fails to deliver, and fails to deliver value. This failure behind software development has a huge economic and human impact. So it was the reason to find ways to develop software.

First recognize risks and try to address it applying some XP practices, like short release cycles to limit scope, one to four week iterations of features requests from customer, it will give you a fine-grained feedback about progress.
Economics of Software Development

Create a strategy for maximizing the economic value of the project, spending less, earning more (depends strategy), spending later and earning sooner, increase probability that the project will stay alive.

In projects we have to control five variables: cost, time, quality and scope, like PMBoK scope is the best way to achieve control. KEEP FOCUS ON SCOPE.
Cost of Change

The cost of changing a program rises exponentially over time. Figura 2 shows that the longer it takes you to find a defect then on average the more expensive it is to address.

Figure 2 - Cost of Change [Scott W. Ambler, 2006]

To overtake problems related to cost of change, after years of production some factors became clear like a simple design, intensive use of automated tests, refactoring code and design, incremental design, continuous integration.
Learning to drive.

Everything in software changes. requirements, design, business, technology, team members change. The problem
isn't change, the problem, rather, is the inability to cope with change when it comes.

Learn to control the development of software by making many small adjustments, not by making a few large adjustments, kind of like driving a car.


The driver of a software project is the customer. If the software doesn't do what they want it to do,
you have failed. Of course, they don't know exactly what the software should do. That's why
software development is like steering, not like getting the car pointed straight down the road. Our
job as programmers is to give the customer a steering wheel and give them feedback about
exactly where we are on the road.

XP Values

  • Communication: Ensured an effective comunication of your team and your organization core values.
  • Simplicity: Search for simple solutions.
  • Feedback: Work with your customers at your side, seat the team together.
  • Courage: Throw code possible whenever itŽs possible (keeping your code simple). Courage to change, to assume your faults.

PUT ALL THESE VALUES IN PRACTICE.

The Four Basic Activities

  • Coding: Code is the one artifact that development absolutely cannot live without, it gives you a chance to communicate clearly and concisely.
  • Testing: Writing every test you can imagine.
  • Listening: Learn to listen your customer, he knows about the business not you.
  • Designing: Good design ensures that every piece of logic in the system has one and only one home.

Figure 3 - XP Overview.
The Practices

Primary Practices
------------------------
-Integration
  • Ten minute build: Automatically build the whole system and run all of the tests in ten minutes.
  • Continuous integration: Integrate and test changes after no more than a couple of hours.
-Whole Team: Create cross-functional teams. Create a team with all the skills necessary for the project to succeed.
-Programming
  • Test-First Programming: [TDD] Test -> Code -> Refactor
  • Incremental Design: Keep the design investment in proportion to the needs of the system.
  • Pair Programming: Help to:
  1. Keep each other on task.
  2. Brainstorm refinements to the system.
  3. Clarify ideas.
  4. Lower frustration.
  5. Hold each other accountable

-Energized Work: Take care and respect yourself.

-Planning
  • Weekly Cycle: Plan work a week at a time, have meeting at the beginning of every week. During meetings, review progress, ask your customer to pick some stories to implement and break stories into tasks.
  • Monthly Cycle: Plan work quarter at a time, Identify bottlenecks, Initiate repairs, Plan the theme, pick the stories.
  • Stories: Write the stories on index cards and put them on a wall.
  • Slack: Include some minor tasks that can be dropped if you get behind in your plan.

The Planning Game:
  1. List the items of work that may need to be done.
  2. Estimate the items.
  3. Set a budget for the planning cycle.
  4. Agree on the work that needs to be done within the budget. As you negotiate, don't change the estimates or the budget.

Corollary Practices
--------------------------


-Business Negociated Scope Contract: Try a sequence of short contracts instead of one long one.
  • Pay-per-use: Charge for every time the system is used.
  • Daily Deployment: Put new software into production every night.
-Incremental Deployment: Find a little piece of functionality and deploy it.
-Programming
  • Single Code Base: Keep only one code stream.
  • Code & Tests: Mantain Code and tests as permanent artifacts.
  • Shared Code: Anyone on the team can improve any part of the system at any time.
-Root Cause Analysis: Eliminate defect and its cause. To find the Root cause, apply Taiichi Ohno's exercise, called "Five Whys":
  • Why did we miss this defect?
  • Why didn't we know?
  • Why isn't she part of the team?
  • Why doesn't anyone else know how?
  • Why isn't it a management priority?

-Real Customer Involvement: Put your customer at your side.
-Team
  • Team Continuity: Keep effective teams together.
  • Shrinking Teams: Lean Thinking, reduce the size.





If you like it, buy the book here..

Diamond Powder for NetBeans

segunda-feira, 23 de março de 2009

Last year, i have created a NetBeans plugin to an interesting framework, called Diamond Powder, it was developed by a friend of mine, Renato Bellia .
To explain what Diamond Powder is, i´ve extracted a briefly introduction from his blog,

What is it ?

It's a Java ME framework to quickly build data collector forms. Further, it is able to manage the persistence of collected data into RMS records.

Data Collector ?

It is about user input.

Suppose you develop a MIDP application that helps car drivers to maintain records about fuel consume in his/her car: The driver stops by at the gas station and gets his mobile device to take note about odometer value, supplied fuel amount , price of fuel, gas station name, and the current date. Later on the driver needs to recover such data. This is a data collector, and Diamond Powder can help you to do so.

Your MIDP application could go further, doing some math with such data, plotting charts, sending it over the internet and the like, but this is up to you.

How does it work ?

Read this step-by-step and the glossary bellow:
  1. Define a Schema
  2. Create a Collector suppling with a display, a schema and a flow name
  3. Add regular LCDUI commands to the collector
    1. at least an OK Command, and a BACK Command
    2. other Commands can be provided
  4. Swicht the MIDlet display to the Collector
  5. At the end of Colletor´s job you may persist collected data with a StorageManager.
Glossary:

term

definition

Schema

A Hashtable that describes the data collector fields, and its organization.

A schema contains a name, a version number, and at least one Flow.

Flow

A sequence pages that the application user can browse through.

Page

A top level field container, to display to the user, as a data collector step.

Can be reused among flows.

Can be associated with a help screen.

Field

Regular LCDUI items: StringItem, TextField, DateField, ChoiceGroup

+ Filter : a special component to deal with huge ChoiceGroups

Collector

A collector manages the display of a Flow of Pages, and gathers all user input.

It extends LCDUI Form.

StorageManager

It is the Diamond Powder persistence component.

It helps to preserve user input data gathered by a Collector into RMS records.

It also helps to restore a Collector with previously saved RMS records.


NetBeans Plugin

Now, it´s time to talk about my collaboration in this project, if you get a look at this framework, you will realize that it simplifies a lot the development of a data collector on java me.

On the other hand, the heart of the framework, the "Schema", as stated in the glossary, it is a Hashtable that describes the data collector fields, flow, name and version of your application. Let´s see on listing 1, a snippet of the schema code from the hello world example, extracted from diamond powder blog.
public Hashtable getSchema() {
Hashtable schema = new Hashtable();

//schema declaration: name;version
schema.put("schema", "fuelControl;2");
//flow declaration: page1;page2;...
schema.put("flow.basicRecord", "numbers;extra");
//page declaration: title;field1;field2;...
schema.put("page.numbers", "The Numbers;date;odometer;fuelAmount;fuelPrice");
schema.put("page.extra", "Gas Station;gasStationName;gasStationBrand");
//help for page: help text
schema.put("help.numbers", "Enter the odometer mark, the supplied fuel amount and the fuel price");
schema.put("help.extra", "Enter the gas station name and brand");

//text field declaration: field type;label;size;mask
schema.put("field.odometer","textfield;odometer;6;numeric");
schema.put("field.fuelAmount","textfield;fuel amount;5;decimal");
schema.put("field.fuelPrice","textfield;fuel price;5;decimal");
// dateField;label;{date|time|date_time}"
schema.put("field.date","datefield;when;date_time");
schema.put("field.gasStationName","textfield;gas station;40;initial_caps_word");

//choice gorup declaration: field type;label;list model;mode
schema.put("field.gasStationBrand",
"choicegroup;brand;allBrands;exclusive");
//list model declaration: value1;label1;value2;label2;...
schema.put("listmodel.allBrands",
"999;undefined;1;Atlantic;2;Chevron;3;Esso;4;Texaco");

return schema;
}

Listing 1: Schema method example.

As you can see in the example, it can be a problem if you want a more complex application, as your schema evolves it can became inconvenient and error-prone, as you add more fields, or even new pages.
Diamond Powder for NetBeans it´s a plugin, that comes to fill this gap, and helps to create a Schema code, avoiding spelling error in variable names. Now let´s see how to install it.

Download and Installation

To install Diamond Powder for NetBeans, you can visit plugin Portal on NetBeans website, or you can download it directly from java.net site project. The easiest way to download it, is directly from NetBeans,
To install DP from NetBeans, select "Tools > Plugins", open the Setting category and click Add button, in Name field enter "Diamond Powder", and URL enter "https://diamond-powder.dev.java.net/files/documents/9072/108868/updates.xml", and click OK to create a new Update Center source.

Figure 1: Configuration of Update Centers.

Now, to install the plugin, select "Available Plugins" category and install the Diamond Powder plugin, during instalation it will generate a warning, stating that the module is not signed, but it´s ok..

Generating the Schema
There are two ways to create a schema, creating a new file, selecting "New File > MIDP > Diamond Powder - Schema Generator" from a Java ME Project, or you can invoke Diamond Powder wizard from the source code editor, selecting menu popup "Refactor > Diamond Powder - Schema Generator"..

Figure 2: Creating a new Schema file

Start by creating a Diamond Powder Schema file, as shown in Figure 3. Let´s create the schema defined in listing 1, so name the schema "fuelControl", set version 2 and click next to go the panel shown in Figure 4:
Figure 3: Naming the Schema file.

Here we can define our application fields, , let´s define the odometer, fuelAmount, fuelPrice, date, gasStationName and gasStationBrand. Note, that for gastStationBrand is a choicegroup field, to define our list values, click the Editor button, and create the list model defined in Figure 5.

Figure 4: Fields Configuration

Enter "allBrands" to List Model and click New Button, to include a value to the allBrands list model, select it in the list and click Add button, to cancel an item just click cancel, and to finish it, close the window.

Figure 5: List Model editor.

In the Pages Configuration step, let´s create our pages number and extra adding the related fields and entering the properly information like page name, title and help, like Figure 6.

Figure 6: Pages Configuration.


Click Next to our final step, now we going to define the sequence pages that our application will browse through. Enter basicRecord for Flow Name, and add the two pages created earlier (Figure 7).
Check the "Save to File?" option and click browser, this option will persist all fields created to an user defined file.

Figure 7: Flow Definition.

Note: You can retrieve these values, loading the file in the Fields Configuration step (see Figure 4).

Click Finish to generate the schema class. After generation, you should see the Java class, Schema, in the hello.schema package.

References:
Diamond Powder (java.net): https://diamond-powder.dev.java.net/
Diamond Powder Blog: http://diamond-powder.blogspot.com/
NetBeans Plugin: http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=17094
NetBeans: http://www.netbeans.org/

Try it !!