Mostrando postagens com marcador JME. Mostrar todas as postagens
Mostrando postagens com marcador JME. Mostrar todas as postagens

11 de mai. de 2009

Configuração do Kit desenvolvimetno Nokia com Eclipse Ganymede

Neste post irei mostrar o passo a passo para fazer a integração do kit de desenvolvimento nokia para plataforma S60 com Eclipse Ganymede. Atualmente utilizo para desenvolvimento JME a seguinte configuração:

* Eclipse Ganymede + MTJ(Mobile tools for java)

Com esta configuração e após deixar no meu projeto somente as APIs compatíveis para a plataforma S60 do meu celular(MIDP 2.0 e CLDC1.1) eu fui capaz de baixar e rodar minha aplicação no device, mas ainda com alguns erros e portanto o emulador da nokia se tornou essencial para que eu possa evoluir meu projeto.

Para instalar o kit é necessário também ter instalado o kit de desenvolvimento da nokia chamado Carbide.J que pode ser baixado aqui

O passo a passo(O SDK para S60 já deve ter sido instalado assim como o Eclipse Ganymede):

1) Instalar o Carbide.j 1.5
Este passo é bem simples para isso após baixar o arquivo .zip do Carbide.j descompacte em uma pasta e execute o setup.exe o processo de instalação é simples, basta seguir as instruções selecionando a versão para Eclipse no momento apropriado e apontando para o diretório de instalação do seu eclipse quando solicitado.

2) Configurar o debugger do eclipse
Neste passo no menu do eclipse vá em Windows > Preferences > Java > Debug . Nesta tela desmarque todas as opções de suspend debug e aumente o tempo de "Debug Timeout" para 50000 ms conforme orientação da nokia. Isto é necessário para que o timeout default configurado não impeça a execução do emulador.(ver imagem)


3) Adicionar o emulador do S60 ao eclipse.
Este passo foi o mais problemático no eclipse estranhamente tive que instalar novamente o Carbide.j para que o menu do eclipse apresentasse a opção correta(não reiniciei na segunda instalação). Para executar esse passo no menu do eclipse primeiro selecione um projeto JME na perspectiva java e depois ir em Tools > Carbide.j > Configure Emulators . Clique em add e selecione o diretorio de instalação do Kit de desenvolvimento para S60 e depois que ele aparecer na lista de Emuladores selecione a entrada dele e clique no botão Set as Default. Pronto o emulador está pronto para ser utilizado.

Para utilizá-lo selecione Tools > Carbide.j > Start Emulators
Na tela que irá abrir em Application aponte para um .jad de exemplo que vem com o SDK da plataforma S60 em %S60_HOME%\devices\S60_3rd_MIDP_SDK_FP1\S60examples\helloworldplus\bin e clique em Emulate. A aplicação deve aparecer após algum tempo. Tenha paciência pois isso pode levar alguns minutos dependendo da configuração da sua máquina.

No final consegui rodar minha aplicação no emulador mas fiquei um pouco decepcionado com a lentidão desse ambiente. []s

9 de mai. de 2009

Instalando kit desenvolvimento JME da Nokia

Para iniciar os testes com Java ME de minha aplicação estou utilizando um celular Nokia n96 que utiliza a plataforma para smartfones S60

Inicialmente tentei fazer upload direto da minha aplicação JME para meu servidor transferindo o .jar e o .jad e acessando pelo celular. A aplicação foi encontrada e eu confirmei a instalação mas ao terminar o aparelho informou que a aplicação não estava com a especificação correta para o device e por isso eu pesquisei até encontrar a plataforma de desenvolvimento fornecida pela nokia e irei começar a estudá-la.

Fiquei bastante satisfeito com o site destinado aos desenvolvedores da nokia.

Neste post irei descrever um guia rápido para instalação da plataforma de desenvolvimento provida pela Nokia para S60 em sistema operacional Windows XP.

Postei também um vídeo do processo de instalação.

1) Download do kit em um zip com instruções detalhadas e os arquivos necessários neste link.

2) Após o download descompacte o arquivo zip em uma pasta vazia em seu computador.

3) Execute o instalador (setup.exe)

O processo de instalação é bem amigável e não deve haver maiores dificuldades.

Depois irei postar sobre a utilização do kit.

[]s

11 de mar. de 2009

JME - Implementação de API para persistência de dados Floggy

Hoje finalmente encontro tempo para começar a fazer a migração da minha aplicação para utilizar a Floggy que é uma API de persistência para Java ME criada por brasileiros, mais detalhes em : http://floggy.sourceforge.net/ 

O primeiro passo foi fazer a instalação do plugin para eclipse conforme descrito na documentação em: http://floggy.sourceforge.net/configuration/eclipse.html

A url para o eclipse é: http://floggy.sourceforge.net/eclipse e o plugin foi baixado corretamente e a versão instalada foi a 1.2.0 conforme a imagem abaixo:

Após isso, seguindo as instruções,  reiniciei o eclipse. Depois para adicionar as dependências ao meu projeto no eclipse foi só clicar com o botão direito sobre o projeto e selecionar Floggy > Add Floggy nature. Isso adicionou uma nova dependência ao meu projeto apontando para a library da Floggy, conforme imagem abaixo: 
Tudo bem tranquilo, sem nenhum problema. Lembro que no meu ambiente de desenvolvimento estou utilizando Eclipse Europa 3.3.2 com plugin do Eclipse ME: http://eclipseme.org/

Agora com o ambiente configurado estou pronto para iniciar o refactoring do código para substituir as chamadas diretas da API RMS pela utilização da API Floggy.

Para fazer a implementação estou seguindo os passos conforme documentação em: http://floggy.sourceforge.net/getting-started.html

A primeira coisa interessante que notei estudando os guias da API foi que irei retirar uma camada que existe atualmente no meu projeto destinada a persistência. No meu padrão de desenvolvimento JME eu defini uma camada RMS em um pacote conforme a figura abaixo:
Neste pacote eu defini uma classe base para todas as classes responsáveis pela persistência que é a classe AbstractDBME e para  user story do meu sistema eu implementava uma respectiva classe DBME conforme a imagem acima.  Estas classes são responsáveis pela persistência utilizando RMS onde existe código como: 

/**
* método que persiste o registro do login na base de dados local do device.
*
* @param loginME
*            inicializado e com parâmetros carregados.
*/
public void adicionaLogin(LoginME loginME) {
  log.debug("Entrou LoginDBME.adicionaLogin()");
  try {
    int idLoginME = baseDados.getNextRecordID();
    loginME.setId(idLoginME);
    byte[] b = loginME.toByteArray();
    baseDados.addRecord(b, 0, b.length);
  } 
  catch (Exception ioe) {
    ioe.printStackTrace();
  }
  log.debug("Executou LoginDBME.adicionaLogin()");
}

/**
* atualiza status do usuário ativo na base de dados. Somente um usuário
* ativo deve existir por vez em um device.
* 
* @param idLogin
*            o id
*/
  public void setAtivo(int idLogin) {
    log.debug("Entrou LoginDBME.setAtivo() setar para ativo o login " + idLogin);
    ObjectSet logins = recuperaRegistros();
    try {
      for (int i = 0; i < logins.size(); i++) {
 LoginME loginME = (LoginME) logins.get(i);
 // garante que somente o id passado estará como true.
 if (loginME.getIdUsuario() == idLogin) {
   log.debug("Setando para ativo o login ==>> " + loginME.getLogin() + " idUsuario: " + loginME.getIdUsuario());
   loginME.setAtivo(true);
   baseDados.save(loginME);
 } else{
   log.debug("Setando para inativo o login ==>> " + loginME.getLogin() + "idUsuario: " + loginME.getIdUsuario());
   loginME.setAtivo(false);
   baseDados.save(loginME);
 }
    }
  } catch (Exception e) 
  {
    log.error(e.getMessage());
    e.printStackTrace();
  }
    log.debug("Executou LoginDBME.setAtivo()");
}

No código original existem estes além de muitos outros métodos similares e no meu ponto de vista, mais complexos do que deveriam, o que dificulta muito a evolução e manutenção do meu sistema. 
 
A minha grande expectativa é que utilizando Floggy todo este pacote deixe de existir no meu projeto eliminando esta complexidade desnecessária.

Pelo que percebi a Floggy trabalha com um modelo de persistência muito parecido com o do hibernate e portanto o primeiro passo foi definir as classes do meu modelo que encontram-se no pacote br.com.maweb.controlepeso.jme.model e que são pojos simples com a única diferença que, para atender a uma demanda do RMS, eu havia implementado um padrão onde cada classe do meu modelo tinha a responsabilidade de serializar e recuperar as informações através de métodos fromByteArray e toByteArray. 
Exemplo da implementação nos pojos: 

public void fromByteArray(byte[] dados) throws IOException {
  log.debug("Entrou LoginME.fromByteArray");
  ByteArrayInputStream bin = new ByteArrayInputStream(dados);
  DataInputStream din = new DataInputStream( bin );
  this.id = din.readInt();
  this.idUsuario = din.readInt();
  this.login = din.readUTF();
  this.password = din.readUTF();
  this.ativo = din.readBoolean();
  log.debug("ControlePesoME.fromByteArray()" + this.toString());
  din.close();
  log.debug("Executou LoginME.fromByteArray");
}
public byte[] toByteArray() throws IOException {
  log.debug("Entrou LoginME.toByteArray");
  ByteArrayOutputStream bout = new ByteArrayOutputStream();
  DataOutputStream dout = new DataOutputStream( bout );
  dout.writeInt(getId());
  dout.writeInt(getIdUsuario());
  dout.writeUTF(getLogin() );
  dout.writeUTF(getPassword());
  dout.writeBoolean(isAtivo());
  dout.close();
  log.debug("Dados retornados em array de bytes ==>> Id: " + getId() + ", ativo: " +  isAtivo()); 
 log.debug("Executou LoginME.toByteArray");
 return bout.toByteArray();
}

Essa implementação também deixou de ser necessária após a completa implementação da API Floggy, simplificando bastante o meu código.

Continuando com a implementação a primeira coisa que fiz foi retirar a referência para a interface de marcação que eu utilizava nos meu POJOs do device para garantir a implementação dos métodos toByteArray e fromByteArray que eu utilizava para persistência direta com RMS,retirada a interface e os métodos fromByteArray e toByteArray minha classe ficou então definida somente com os atributos e respectivos getters e setters para as propriedades.

Esta alteração causou problemas na classe de persistência que utilizava o método para fazer a persistência do objeto com RMS em rotinas como: 
byte[] b = loginME.toByteArray();
baseDados.addRecord(b, 0, b.length);

Este problema deverá ser resolvido substituindo as rotinas de persistência por chamadas de persistência da API Floggy.
Como mostra o fragmento de código acima eu tinha na minha classe LoginDBME uma referência RecordStore denominada baseDados o que fiz foi mudar esta referência para utilizar o PersistableManager da Floggy.
Também retirei as chamadas a métodos como conectaBase e fechaConexao o que deixou o código bem mais limpo.
Durante o procedimento tive que corrigir vários erros de compilação que apareceram e adaptar vários métodos que utilizavam API RMS.
Um dos pontos a destacar foi a alteração do método que recupera os registros que retornava um RecordEnumeration com todos os registros e agora retorna um ObjectSet com objetos do tipo desejado, isso possibilitou também que eu removesse outros métodos.

No final o que posso dizer é que o processo de implementação no meu caso de uso  não foi complexo, levou cerca de 2 horas de trabalho para acertar todas as arestas e o resultado final me agradou MUITO pois simplificou muito a manutenção e evolução do sistema além de ter diminuído considerávelmente a quantidade de código demandada para persistência e esse tempo de implementação com certeza será recuperado pela simplificação da manipulação da camada de persistência.

Pelo pouco que pude ver e fazer com a API recomendo a utilização da API  Floggy, sem sombra de dúvidas. Vale a pena!
Agora é implementar nos outros módulos do meu sistema.

[]s

P.S - O único problem que tive foi que a configuração da Floggy "desmarcou" no java build path do meu projeto eclipse a API MicroLog que também utilizo no projeto. Isso fez com que eu ao tentar testar tomasse erro de ClassNofFound apesar da API Microlog estar add no java build path. O que tive que fazer foi selecionar a aba Order and Export e selecionar novamente a API micrologger para ser incluída no meu pacote e tudo voltou a funcionar normalmente.

9 de mar. de 2009

JME - Implementação de Base de Dados para Device Floggy

Depois de vários dias pesquisando e debatendo em fóruns as alternativas de persistência em devices para Java ME decidi implementar a Floggy que é uma API que encapsula o RMS do Java ME tornando a manipulação e persistência destes dados mais simples. O que percebi nestes últimos dias foi que não consegui debater muito a fundo a utilização de base de dados ou deste tipo de API para JME por não ter encontrado ninguém com experiência disponível para um debate mais profundo nos fóruns e internet. Pesquisei em blogs, fóruns e encontrei muito pouca informação  e por isso ainda com um pequeno receio pela minha pouca experiência em JME decidi implementar a Floggy no meu projeto.
 
Um dos principais motivos que me levou a escolher a Floggy é que ela é um projeto de Brasileiros, o que me deixa muito contente. O link oficial desta API é http://floggy.sourceforge.net/ e nas próximas linhas irei detalhar os passos que segui para implementação deste Framework.

Uma primeira coisa que me agradou bastante e veio de encontro ao que preciso foi a disponibilidade de instalar como um plugin do eclipse, conforme instruções no link:  
Oooops... Encontrei um problema, a versão atual da Floggy conforme descrito no site no dia de hoje e que baixei manualmente é a versão 1.2.0 e a versão disponível no plugin do eclipse é a versão 1.1.3 e por isso suspendi a instalação através do plugin do eclipse e estou procurando alternativas para utilizar a última versão via eclipse. 

Vou tentar fazer um post na lista de discussão da Floggy sobre o problema e espero resolver a questão em breve para poder dar continuidade a este projeto de implementação da API. Portanto momentâneamente vou suspender a utilização mas pretendo, ainda esta semana, voltar a este ponto pois estou sentindo forte necessidade, conforme já descrito em outros posts, de simplificar o processo de utilização de persistência nos devices e o RMS não está atendendo às minhas expectativas. Assim que eu retomar esta implementação no meu projeto irei complementar este post com minhas impressões e o procedimento executado para implementar a Floggy.


E devido a este problema estou retomando os estudos das opções disponíveis, mas ainda inclinado a utilizar a Floggy mesmo. Infelizmente não posso postergar mais que uma semana esta questão para não atrasar o meu projeto então até o final da semana farei outro post sobre minha decisão final e o feedback da lista de discussão da Floggy.

IMPORTANTE - A resposta no fórum e solução do problema pelo time do projeto Floggy foi bem rápido(em cerca de 2 horas) , o que me dá bastante confiança na utilização da Floggy. Fique MUITO satisfeito com a rápida solução do problema pelo time do projeto e amanhã irei fazer um novo post sobre o passo a passo da implementação no meu projeto pois hoje estou sem mais tempo hábil. Por ser um projeto bastante ativo e pela ótima resposta que tive no fórum irei mesmo utilizar essa API. Parabéns aos envolvidos no projeto. Fico muito contente em conhecer mais um projeto Open Source promissor desenvolvido por um time Brasileiro.

[]s

8 de mar. de 2009

JME - Implementação API MicroLog para devices

Iniciei a implementação da API de log para devices MicroLog em um projeto. Vou colocar aqui como foi a experiência e minhas considerações até o momento.

Para desenvolvimento JME estou utilizando o Eclipse Europa 3.3.2 com plugin EclipseME www.eclipseme.org e portanto vou focar nesta configuração:

1) Baixei o pacote do MicroLog no link: https://sourceforge.net/project/showfiles.php?group_id=138008&package_id=277155&release_id=664332 a versão .zip para utilizar no windows.

2) Criei uma entrada no projeto no eclipse : botão direito > properties > java build path uma librarie com o jar do microlog. (imagem)  microlog-logger-1.1.1-me.jar.

Feito isto as APIs da MicroLogger que eu queria utilizar já estavam disponíveis no meu projeto JME no eclipse. 

3) Criei um arquivo chamado microlog.properties mínimo conforme documentação para configurar o logger que vou utilizar. Coloquei este arquivo na pasta "res" do meu projeto JME no eclipse. Neste arquivo somente as entradas de configuração mínima: 

microlog.level=DEBUG
microlog.appender=net.sf.microlog.appender.ConsoleAppender
# End of file. Do not remove this line.

4) Alterei o código do midlet adicionando 2 variáveis estáticas:
private static final Logger log = Logger.getLogger(LoginMidlet.class);
private static boolean firstTime = true;

E no método startApp do midlet: 

// Configura para carregar propriedades da api MicroLog só uma vez
if (firstTime) {
  Properties properties = new Properties(this);
  log.configure(properties);
  log.info("startApp() primeira vez");
  firstTime = false;
  } 
else {
  log.info("startApp() novamente");
  }

Isso foi o necessário para configurar um log básico, nos métodos eu pude então utilzar chamadas normais no log. 

log.debug("texto do debug aqui!!!");

5) Nas classes utilizadas no midlet bastou então definir a variável estática, por exemplo: 
//api de log
private static final Logger log = Logger.getLogger(LoginDBME.class);

E pronto, pude utilizar as chamadas de log padrão na classe. Bem simples e a utilização é bem parecida com o Log4j inclusive as saídas no console do WLTK. 

O mais interessante é que esta API dá opções de envio via sms, http, smtp, vale a pena dar uma olhadinha na documentação e nos exemplos.
 Segue o link mais uma vez: http://microlog.sourceforge.net/site/

[]s

7 de mar. de 2009

JME - API de log para devices

Durante meu trabalho com Java ME outra necessidade que logo senti foi uma api de log para o projeto, System.out nunca é uma boa opção . Esta foi mais fácil já defini que irei utilizar a MicroLog que, apesar de novo e com pouca documentação, me parece um projeto bem consistente e em atividade. No projeto estou utilizando MIDP 2.0 e CLDC 1.1 esta última pré-requisito para utilização da MircoLog. Se estiver utilizando CLDC 1.0 ela não é compatível(pelo menos é o que está  descrito na documentação). 
[]s

JME - Lista de Bases de Dados

Devido a algumas limitações conforme descrito na documentação da base de dados Floggy que estive analisando decidi postergar e estudar melhor as opções. Encontrei uma boa lista no fórum do javaranch, no link: http://www.coderanch.com/t/230853/Java-Micro-Edition/Mobile/List-Database-J-ME
Após um dia inteiro de leitura e análise das opções ainda estou entre 2 : A Floggy  já mencionada e que é feita por Brasileiros o que é muito legal e a Perst Lite. Preciso resolver ainda esta noite pois tenho urgência no meu projeto. Descartei algumas da lista citada acima por não serem orientada a objetos e por inatividade nos respectivos projetos.
[]s

3 de mar. de 2009

JME - RMS Como fazer os dados persistentes durante o desenvolvimento

Estou trabalhando em um projeto que envolve Java ME e me deparei com um problema, que acredito, seja bastante comum. Durante o desenvolvimetno senti a necessidade de que a base de dados de testes para o emulador JME do device fosse persistente e não fosse recriada para cada vez que eu tiver que executar o client para testes.

Explicando melhor,  é o caso, por exemplo que enfrento no momento. Na aplicação o usuário deve se autenticar na primeira vez que for utilizar o device para iteragir com o servidor, neste momento faço a persistência do usuário, caso a autenticação seja OK, no device, para que nas próximas vezes o usuário não tenha que se autenticar novamente. 
Posteriormente quando  o usuário vai fazer alguma outra operação do sistema recupero o usuário já autenticado e ativo no device para associar a operação sendo executada com o usuário corretamente. 
O problema é que durante o desenvolvimento como o midlet de login e de outras operações são codificados separadamente a base de dados não contém mais o usuário autenticado o que causa um NullPointerException em uma rotina para recuperar o usuário similar a: 

// recupera usuario ativo no device.
LoginDBME loginDBME = new LoginDBME(true);
int idUsuario = loginDBME.getLoginAtivo().getIdUsuario();


Isso tem se mostrado bastante frustrante durante o desenvolvimento e por isso preciso encontrar um meio de fazer com que a base de dados do emulador de device(utilizo o da sun) fique permanentemente armazenada no meu computador. 

Pesquisei muito sobre esta questão e infelizmente não consegui achar nada realmente útil na internet. A única solução que encontrei para o problema foi encontrar a base de dados temporária gerada pelo emulador, no meu caso no windows logado como Administrador se encontrava no C:\Documents and Settings\Administrator\j2mewtk\2.5.2\appdb onde é criada uma pasta com nome temp.DefaultColorPhonexx .
Após localizar a base o que fiz pode-se dizer que foi um "gato" ou POG(programação orientada a gambiarras) tendo eu que locar o arquivo para que quando o emulador fosse fechado não tivesse permissão para apagar o mesmo. 

Para mim essa não é uma solução aceitável e devido a este e a vários outros problemas com o desenvolvimento utilizando RMS decidi começar a avaliar a utilização de uma base de dados para devices(JME) . Meus requisitos para utilização são portabilidade e que a mesma seja gratuita. Inicialmente estou estudando a Floggy: http://floggy.sourceforge.net/ e provavelmente irei refatorar meu código para utilizá-la. Deixarei aqui posteriormente minhas impressões sobre ela.


FINALMENTE UMA SOLUÇÃO (DATA 31/03/2009)
Hoje finalmente encontrei uma solução bastante simples e já disponível no WTK 2.5.2 que estou utilizando. O que deve ser feito é abriar o WTK e ir em Edit > Preferences > Storage e nesta aba preencher a pasta onde se quer colocar a base de dados do device no campo: Storage root directory . Isto irá fazer com que a configuração seja persistente não mais utilizando as bases temporárias default do WTK.