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

12 de jul. de 2010

Weblogic, um Message Driven Bean Simples

Escrevi em outras oportunidades sobre criação de filas ou tópicos JMS no Weblogic e de como este recurso é importante em um ambiente distribuído e corporativo. Para ilustrar vou postar aqui um exemplo simples de um MDB que consome de um tópico JMS simples. Não vou comentar sobre os elementos do MDB detalhadamente, vou focar na implementação. Para ilustrar vou utilizar para o exemplo uma página JSF que posta uma mensagem em um tópico e um MDB com annotations para consumir a mensagem.

Primeiro, para o exemplo funcionar deve-se criar no weblogic um topico simples com as seguintes configurações:

Nome: Exemplo MDB
Nome JNDI: jms.distributed.Topic

Se quiser ver detalhadamente como criar este tópico, fiz um tópico sobre esse assunto no link: http://mmaiacupofcoffee.blogspot.com/2010/02/weblogic-jms-parte-iii-criacao-de-fila.html. Bastando adaptar e criar um tópico(Topic) ao invés de uma fila(Queue).



Os trechos de código relevantes para o exemplo explico à seguir. A parte JSF do exemplo deve ser "empacotada" em um .war e o ejb em um .jar, conforme definido pela especificação.

O cliente de exemplo que publica no tópico é escrito com JSF, composto por uma página e uma Action.
Abaixo posto detalhes relevantes da página que publica a mensagem e define-se quantas vezes será postada. O ActionBean é registrado com o nome mensagemBean no deployment descriptor. O exemplo usa notação JSF simples e por isso não vou detalhar aqui:


    Texto da Mensagem:
Quantidade:


A segunda parte do cliente que publica a mensagem é o ActionBean que recebe os parâmetros dos campos da página e efetivamente posta a mensagem no tópico utilizando JMS. Perceba que um loop é criado para postar várias mensagens se desejado. Para o exemplo ficar mais claro não estou utilizando anottations para fazer injection de dependência de contexto.
package exemplo.action;

import java.util.logging.Logger;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class PublicaTopicoAction {
 
 private Logger log = Logger.getLogger(PublicaTopicoAction.class.getName());

 private String mensagem;
 private int quantidadeMensagens;
 
 protected Context ctx;
 protected TopicPublisher tpublisher;
 protected Topic topic;
 protected TextMessage msg;
 protected TopicConnection tcon;
 protected TopicSession tsession;
 
 public final static String JMS_FACTORY = "weblogic.jms.ConnectionFactory";
 
 public final static String TOPIC = "jms.distributed.Topic";

 protected TopicConnectionFactory tconFactory;
 
 public PublicaTopicoAction()
 {
  log.info("Construtor PublicaTopicoAction");
  try {
   ctx = new InitialContext();
   tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
   tcon = tconFactory.createTopicConnection();
   tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
   topic = (Topic) ctx.lookup(TOPIC);
   tpublisher = tsession.createPublisher(topic);
   tcon.start();
  } catch (NamingException e) {
   log.severe("Erro ao recuperar o contexto para fazer lookup");
   e.printStackTrace();
  } catch (JMSException e) {
   log.severe("Ocorreu um erro ao conectar no topico: " + e.getMessage());
   e.printStackTrace();
  }
 }
 
 public String enviaMensagem()
 {
  log.info("Entrou PublicaTopicoAction.publicaMensagem");
  for (int i = 0; i < quantidadeMensagens; i++) {
   publicaMensagemTopic(mensagem + "_" + i); 
  }
  log.info("Executou PublicaTopicoAction.publicaMensagem");
  return "OK";
 }
 
 private void publicaMensagemTopic(String mensagem) {
  try {
   log.info("Entrou PublicaTopicoAction.publicaMensagemTopic");
   msg = tsession.createTextMessage();
   msg.setText(mensagem);
      tpublisher.publish(msg);
   log.info("Executou PublicaTopicoAction.publicaMensagemTopic");
  } catch (Exception e) {
   log.severe("Ocorreu um erro ao postar mensagem na fila");
   e.printStackTrace();
  }
 }
 
 public String getMensagem() {
  return mensagem;
 }

 public void setMensagem(String mensagem) {
  this.mensagem = mensagem;
 }

 public int getQuantidadeMensagens() {
  return quantidadeMensagens;
 }

 public void setQuantidadeMensagens(int quantidadeMensagens) {
  this.quantidadeMensagens = quantidadeMensagens;
 }
 
}


Finalmente o código do Message Driven Bean que é bem simples e assim que uma mensagem chega no tópico ele consome a mesma executando o método onMessage, conforme definido pela especificação. Perceba que o link com o Tópico é feito através de anottations no MDB e que para exemplos simples como este não é necessário a criação de arquivos xml de configuração, o deployment descriptor para EJBs é opcional na versão de EJB 3.0 ou posteriores.

package exemplo.mdb;

import java.util.logging.Logger;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic") }, mappedName = "jms.distributed.Topic")
public class TopicConsumerMDB implements MessageListener {

 Logger log = Logger.getLogger(TopicConsumerMDB.class.getName());

 public TopicConsumerMDB() {
  log.info("Construtor TopicConsumerMDB");
 }

 /**
  * @see MessageListener#onMessage(Message)
  */
 public void onMessage(Message message) {
  log.info("Entrou onMessage");
  try {
   TextMessage textMessage = (TextMessage) message;
   String messageID = textMessage.getJMSMessageID();
   log.info("ID da mensagem recuperada ==>> " + messageID);
   String mensagem = textMessage.getText();
   log.info("Mensagem recebida ==>> " + mensagem);
  } catch (JMSException e) {
   log.severe("Ocorreu um erro ao recuperar informacoes da mensagem ==>> "
       + e.getMessage());
   e.printStackTrace();
  }
  log.info("Executou onMessage");
 }
}


[]s

20 de fev. de 2010

Oracle Fusion Middleware 11g - Oracle Enterprise Pack for Eclipse (OEPE)

Após a instalação e configuração de domínio do weblogic vou mostrar a integração da ferramenta de desenvolvimento da Oracle OEPE que pode ser baixada no link: http://www.oracle.com/technology/software/products/oepe/index.html.

Após baixar e descompactar a ferramenta, basta entrar na pasta eclipse e utilizar o atalho "eclipse" existente neste diretório para executá-la. O vídeo abaixo mostra a integração da ferramenta com um domínio local de weblogic server na versão 11g(10.3.2).


[]s

25 de jan. de 2010

JBoss Seam - Configuração de ambiente

Estou começando alguns estudos sobre JBoss Seam. Já a alguns anos utilizo struts2 e previamente webwork, que é muito parecido com struts2 e no qual ele foi inspirado e utilizado como base. Ultimamente tenho visto muitos desenvolvedores que considero de alta qualificação falarem muito bem do JBoss Seam e por isso resolvi fazer alguns estudos e o primeiro desafio nestes casos é reunir tudo o que precisamos para configurar o ambiente de desenvolvimento para poder fazer alguns testes e aprofundar nos estudos. Neste post eu coloco os links de downloads que efetuei para deixar o ambiente pronto para trabalhar com o Seam.

Os softwares que utilizo para esta configuração são:
*Eclipse Galileo.
*JBoss 5.1.
*JBossTools para eclipse galileo. Utilizei o site configurado no eclipse galileo. A configuração que funcionou melhor no meu caso foi a Development. O update site é: http://download.jboss.org/jbosstools/updates/development/
*Seam 2.0.2.SP1 - Estou usando o 2.0 pois a maioria da documentação, atualmente, cobre essa versão.
*Mysql 5.1. - Baixei com o gerenciador de pacotes do Ubuntu.Foi necessário baixar também o driver JDBC do Mysql para configurar no JBoss Tools no eclipse.

Depois de baixar todos os softwares basta abrir o eclipse e criar um novo projeto do Seam. Alguns wizards irão aparecer para configurar os ambientes do JBoss App Server,JBoss Seam e Base de dados o driver do banco utilizado será necessário e a criação de uma base de dados com usuário e senha para utilizar durante os estudos. Com isso em mãos não tem segredo e depois é só começar a conhecer as ferramentas do JBoss Tools para começar os estudos.

Minha primeira impressão com o Seam foi bastante encorajadora. O ambiente do JBoss Tools parece bem amigável e fornece alguns wizards interessantes que facilitam e agilizam o desenvolvimento.
[]s

29 de set. de 2009

Scrum e ferramentas gratuitas - Pronto Agile

Em um projeto em que estou trabalhando foi definido que iríamos utilizar o modelo do scrum para realizar acompanhamento de projetos da equipe.
A equipe em questão não é uma equipe de desenvolvimento de software e portanto precisamos encontrar uma ferramenta que possa ser adaptada para a nossa realidade que é mais relacionadas a planejamento de ambiente e suporte a ambiente de produção. Com isso em mente comecei uma avaliação de várias ferramentas que dão suporte ao processo de desenvolvimento de software com XP e Scrum para avaliar a que seria a de mais fácil customização para adotarmos no nosso dia a dia. As ferramentas que avaliei foram:
XPlanner, IceScrum, Scarab e o Pronto.

Dentre estas a que mais agradou e que vamos customizar para atender à nossa demanda foi o Pronto. Os principais pontos que fizeram com que utilizássemos o Pronto é sua facilidade de configuração, open source, simples e também por ser um projeto de Brasileiros.

Durante a configuração de nosso ambiente seguimos as instruções de download e instalação no site do Pronto para baixar os fontes e gerar nosso ambiente.

Durante o processo de configuração do ambiente conforme descrito na documentação do pronto, ocorre um erro ao tentar executar um comando do maven como por exemplo: mvn eclipse:eclipse ou mvn package O erro é causado pois existe uma dependência documentada no pom.xml do projeto e que não é encontrada que é a do bliki.wiki . Este pacote vem junto com a distribuição de códigos-fonte do pronto e encontra-se sob o diretório WEB-INF/lib . A versão que vem distribuída é a 3.0.11 e a referência no pom.xml é para a 3.0.13. Para corrigir o problema temos 2 opções. O primeiro passo para ambas as situações é corrigir a referência do pom para a versão 3.0.11 então onde está no pom.xml a entrada:

       info.bliki.wiki
       bliki-core
       3.0.13
  


Deve ser corrigido para referenciar a versão 3.0.11 que vem com os fontes do pronto. Com isso a entrada no pom.xml fica assim:

 
       info.bliki.wiki
       bliki-core
       3.0.11
  


Feito isso temos duas opções, a primeira é instalar manualmente o pacote utilizando o comando do maven para tal e a segunda é encontrar um repositório que contenha as bibliotecas e registrá-la no nosso pom.xml. Procurei na web e não encontrei um repositório maven com a biblioteca do bliki.wiki em questão e por isso estou disponibilizando no meu repositório na internet. Para baixar essa lib do repositório basta registrar no pom.xml do projeto(entre as tags build e dependencies) o repositório com a seguinte entrada:


    
         maweb
         http://www.maweb.com.br/mvn_repo
    



Com isso o arquivo pom.xml do pronto completo fica assim:



 4.0.0
 pronto-agile
 pronto-agile
 war
 Pronto!
 1.0.0
 http://www.bluesoft.com.br/pronto

 
  
   
   
    maven-compiler-plugin
    
     1.6
     1.6
     iso-8859-1
     true
    
   
  
 
 
  
   maweb
   http://www.maweb.com.br/mvn_repo
  
 
 
  
   org.hibernate
   hibernate
   ${hibernate.version}
   
    
     ejb
     javax.persistence
    
    
     jta
     javax.transaction
    
   
   provided
  

  
   org.hibernate
   hibernate-commons-annotations
   ${hibernate.commons.annotations.version}
  

  
   dom4j
   dom4j
   1.6.1
   provided
  

  
   org.hibernate
   hibernate-annotations
   ${hibernate.annotations.version}
   
    
     ejb
     javax.persistence
    
   
   provided
  

  
   log4j
   log4j
   ${log4j.version}
   provided
  

  
   cglib
   cglib
   ${cglib.version}
   provided
  

  
   commons-fileupload
   commons-fileupload
   1.2.1
  

  
   commons-codec
   commons-codec
   1.3
  

  
   commons-io
   commons-io
   1.4
  

  

  
   json-lib
   net.sf.json-lib
   0.9
  

  
   org.springframework
   spring-core
   2.5.6
  

  
   org.springframework
   spring-web
   2.5.6
  
  

  
   org.springframework
   spring-aop
   2.5.6
  

  
   org.springframework
   spring-webmvc
   2.5.6
  

  
   org.springframework
   spring-jdbc
   2.5.6
  

  
   hsqldb
   hsqldb
   1.8.0.7
  

  
   org.springframework
   spring-orm
   2.5.6
  

  
   junit
   junit
   4.4
   test
  

  
   javax.servlet
   jstl
   1.1.2
  

  
   taglibs
   standard
   1.1.2
  

  
   opensymphony
   sitemesh
   ${sitemesh.version}
  

  
   javax.mail
   mail
   ${javamail.version}
   provided
  

  
   javax.servlet
   jsp-api
   ${jsp.version}
   provided
  

  
   javax.servlet
   servlet-api
   ${servlet.version}
   provided
  

  
   com.google.collections
   google-collections
   1.0-rc2
  
        
        
            info.bliki.wiki
            bliki-core
            3.0.11
        
        
        
 

 
  3.2.1.ga
  3.0.0.ga
  3.0.0.ga
  3.2.5.ga
  2.2.1
  1.4
  2.4
  2.0
  2.1_3
  1.2.14
 



Após estas alterações os comandos do maven já irão funcionar corretamente como por exemplo:
mvn eclipse:eclipse - irá gerar arquivos de projeto para ser importado pelo eclipse. Se der algum erro tente rodar mvn eclipse:clean e então o mvn eclipse:eclipse
mvn package - gera um .war do projeto no diretório targets.

Pronto!

[]s

15 de set. de 2009

Gzip no Weblogic

Outro dia precisei que as aplicações rodando em weblogic server utilizassem recursos de compactação Gzip para conteúdos de texto, html, css e javascript. O Gzip compacta estes recursos para transimtir pela internet e posteriormente o browser descompacta o que pode aumentar sensivelmente a performance percebida pelo usuário final da aplicação em diversos casos.

No ambiente em questão o weblogic está configurado para servir também o conteúdo estático e neste caso a solução padrão no mundo java é utilizar a configuração por Filtros.

Felizmente já existe um filtro Open Source disponibilizado para o weblogic para este fim e por isso basta configurarmos o pacote para utilizá-lo. Segue um passo-a-passo.

1) Baixar o .jar com as classes do filtro Gzip que vc preferir ou então escrever e gerar seu .jar com o filtro. Se preferir utilizar um filtro já escrito seguem links com posts e código fonte para tal. Links em inglês. blog do Markus Eisele ou blog do Nagesh Susarla. Se você preferir desenvolver o seu filtro de compactação Gzip pode se basear em artigos já escritos a respeito filtros, gzip e performance no On Java, no JavaWorld ou no Java Boutique, dentre outros.

2) O segundo passo é configurar o seu filtro no web.xml da apliação web que irá utilizar o Gzip, essa configuração deve variar um pouco depedendo do filtro que for ser utilizado conforme mencionado no passo 1, portanto segue um exemplo meramente ilustrativo abaixo:


  

    GZIPFilter

    weblogicx.servlet.gzip.filter.GZIPFilter

  



  

  

    GZIPFilter

    /*.html

  



  

    GZIPFilter

    /*.htm

  



  

    GZIPFilter

    /*.log

  

  

  

    GZIPFilter

    /*.txt

  



Finalmente, para checar a compactação utilizo o web developer toolbar do firefox em Information > View Document Size mostra a compactação de cada recurso carregado em uma página. Ver exemplo nas 2 imagens abaixo(ilustrativo).

Outra possibilidade é utilizar o plugin do Apache para Weblogic Server e habilitar a configuração de compactação do Apache para recursos estáticos. []s

17 de jun. de 2009

Open Flash Chart - Utilizando JOFC para executar em um projeto Struts 2

No primeiro post sobre o Open Flash Chart 2 eu mostrei como fazer um primeiro exemplo utilizando um html simples e um arquivo JSON para gerar um gráfico em Flash. Neste post vou demonstrar a utilização do JOFC2 que é uma API para utilização do OFC 2 com java. O arquivo open-flash-chart.swf já deve ter sido colocado na raiz do projeto web do appfuse conforme descrito no primeiro post sobre esse assunto.

Passo a passo:
1) Faça o download do JOFC neste link.

2)Crie uma User librarie no struts com a biblioteca do JOFC e adicione como dependência do seu projeto do Appfuse. Para executar esse passo no eclipse vá em Window > Preferences vá em User libraries de Java e adicione uma nova librarie chamada Jofc2 e nesta librarie adicione o jar do Jofc e a dependência XStream conforme a imagem abaixo.



Não se esqueça de adicionar essa nova librarie como dependência no seu projeto do Appfuse, para isso clique com o botão direito do mouse sobre o nome do projeto no eclipse e depois properties , procure java build path e adicione a librarie como dependência no projeto.

3)Crie uma Action e registre no struts.xml

Para criar a action vá na estrutura do projeto sob a estrutura do projeto do appfuse src>main>java , selecione o diretório das actions e com botão direito do mouse selecione new>Class e crie uma action chamada JOFC2Action conforme o código mostrado abaixo(os imports foram omitidos para simplificar):

package br.com.maweb.webapp.action;

import...

public class JOFC2Action extends BaseAction {

 private static final long serialVersionUID = 4486376620652216855L;

 public String processaOFC() {
  Chart chart = new Chart();
  chart.setTitle(new Text("Java OFC test"));
  chart.setBackgroundColour("#FFFFFF");
  
  LineChart lc = new LineChart();
  lc.setText("Text 1");
  lc.addDots(new Dot(7, "#0000FF", 2, 2));
  lc.addValues(5, 6, 7, 8, 7);
  
  LineChart lc2 = new LineChart();
  lc2.setColour("#000000");
  lc2.setText("Text 2");
  lc2.addDots(new Dot(2, "#FF0000", 2, 2));
  lc2.addValues(1, 2);
  
  BarChart bc3 = new BarChart(BarChart.Style.NORMAL);
//  bc3.setAlpha(0.3f);
  Bar b2 = new Bar(5.0);
  Bar b3 = new Bar(6.0);
  Bar b4 = new Bar(4.0);
  bc3.addBars(b2, b3, b4);
  
  
  chart.addElements(bc3, lc, lc2);
  
  YAxis ya = new YAxis();
  ya.setGridColour("#DDDEE1");
  ya.setColour("#96A9C5");
  ya.setOffset(false);
  chart.setYAxis(ya);
  
  XAxis xa = new XAxis();
  xa.setGridColour("#DDDEE1");
  xa.setColour("#96A9C5");
  chart.setXAxis(xa);
  
  chart.setFixedNumDecimalsForced(true);
  chart.setDecimalSeparatorIsComma(true);
  
  
  String grafico = chart.toString();
  try {
   grafico = URLEncoder.encode(grafico, "UTF-8");
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  getRequest().getSession().setAttribute("grafico", chart.toString());
  return SUCCESS;
 }

}



Esta Action do struts 2 faz a geração de um gráfico DEMO para utilizarmos no exemplo e coloca o resultado gerado que é um JSON na sessão com a chave grafico que será recuperada depois. Após gerar a action temos que registrá-la no struts.xml do projeto conforme trecho de código abaixo:


    /jofc2.jsp



Isso fará que um acesso a url http://localhost:8080/jofc2.html execute a action e após isso irá direcionar para a página chamada jofc2.jsp que criaremos no próximo passo.

4)Crie uma página chamada jofc2.jsp. No projeto do eclipse sob a pasta src/main/webapp crie uma página chamada jofc2.jsp com o seguinte código(as tags html, head e script foram alteradas para compatibilidade com o post neste blog e vc deve corrigí-las antes de executar o exemplo):

html>
head>
 
script type="text/javascript" src="swfobject.js">/script>
script type="text/javascript">
swfobject.embedSWF(
  "open-flash-chart.swf", "my_chart", "550", "300",
  "9.0.0", "expressInstall.swf",
{"data-file":"json.jsp"});
/script>
script type="text/javascript">
swfobject.embedSWF(
  "open-flash-chart.swf", "chart", "550", "300",
  "9.0.0", "expressInstall.swf",
{"data-file":"json.jsp"});
/script>
 
/head>
body>
 
 

Separador de gráfico

/body> /html>


Nesta página declaramos o elemento do Open Flash Chart e fazemos referência a uma página onde o json deve ser recuperado chamada json.jsp.

5)Crie uma página para colocar o JSON gerado chamada json.jsp . Crie uma página jsp com o nome json.jsp no mesmo diretório da página jofc2.jsp que irá recuperar a string JSON colocada pela action na sessão:

<%=session.getAttribute("grafico")%>


O código desta página é só esta linha mesmo. O interessante é que esta foi a única notação que funcionou para o Open Flash Chart, experimentei as notações do JSTL como c:out ou mesmo ${session.grafico} que imprimem EXATAMENTE a mesma String JSON e simplesmente não funciona. Acredito que seja alguma coisa no engine do JSTL do Jetty que cause a incompatibilidade.

6)Configure o projeto do Appfuse para não utilizar o decorator para a página do json. O projeto do Appfuse com struts 2 utiliza o Sitemesh para configurar as páginas, na página json.jsp não queremos que o template default seja utilizado pois queremos somente a String JSON para configuração do gráfico por isso deve-se acrescentar ao arquivo decorators.xml uma linha excluindo a página json.jsp da aplicação do template, segue código do arquivo decorators.xml.

    
        /40*.jsp
        /*ajax=true*
        /scripts/dojo/*
        /struts/dojo/* 
        /resources/*
        /json.jsp
     
    
        /*
    



7)Disponibilizar as libs do jofc para o maven: Registrar repositório e incluir dependências no pom.xml do projeto. Como ainda não encontrei um repositório público do maven com as bibliotecas necessárias para rodar o JOFC 2 disponibilizei no meu servidor da maweb. Por isso para poder baixar as libs do projeto e a dependência temos que registrar no pom.xml do projeto onde estas libs podem ser encontradas. Faremos isso declarando um novo repositório que irá apontar para www.maweb.com.br e registrando as libs que precisamos. Edite o pom.xml adicionando o trecho de código a seguir do repositório e das 2 libraries necessárias respectivamente:


     maweb
     http://www.maweb.com.br/mvn_repo


    jofc2
    jofc2
    1.0-0


     xstream
     xstream
     1.3.1



8)Disponibilizar na sua aplicação o javascript do JOFC (swfobject.js). O approach que utilizo neste tutorial depende de um javascript chamado swfobjec.js que vem no pacote do download do JOFC 2 e portanto copie este arquivo para o mesmo diretório das páginas criadas acima no projeto. Pronto, finalmente estamos prontos para rodar o exemplo para isso abra um console do seu sistema operacional e navegue para o diretório raiz do seu projeto, onde tem o pom.xml e rode o jetty utilizando o comando:
mvn jetty:run


Depois é só acessar a aplicação passando pela action conforme descrito no último passo abaixo. 9) Acessar a aplicação utilizando a url http://localhost:8080/jofc2.html , você deverá ver uma página com um gráfico simples renderizado conforme imagem mostrada abaixo:



Este é um gráfico de demostração para atingir o objetivo deste post, em um ambiente de projeto profissional pode-se utilizar um interceptor do struts para gerar o JSON o que facilitará quando precisarmos ter mais de um gráfico em uma página. Vários outros tipos de gráficos mais complexos podem ser gerados com esta API conforme mostrado nas páginas oficiais do projeto com exemplos em PHP neste link.

[]s

11 de jun. de 2009

Appfuse - Script para criação de projeto Appfuse / Struts2

Escrevi este post com o intuito de acelerar a criação de projetos do Appfuse que fossem funcionais no ambiente eclipse. O Appfuse é um excelente projeto que ajuda na integração de vários projetos opent source e com isso acelera o início do ciclo de desenvolvimento. Para criar um projeto com Appfuse é utilizado o maven e portanto para executar o script deste post o maven deve estar configurado no seu ambiente e deve ter um JDK 1.5 ou superior configurado.

Após alguma experiência com o Appfuse cheguei a um padrão na criação de projetos e portanto para acelerar o procedimento consolidei em um script.

O script cria um projeto de testes e para mudar o pacote e nome do projeto criado basta alguma edição no script. O script está bem documentado e é auto-explicativo. É um script que foi testado no ambiente linux com java 6 e para reutilizá-lo basta uma rápida adaptação para utilizar o JDK de sua preferência, o JDK deve ser 1.5 ou superior. Segue o script.

PATH=/home/mmaia/tools/jdk1.6.0_13/bin:${PATH}
export PATH
echo ${PATH}

#cria o projeto, o maven deve estar configurado no ambiente para funcionar.
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=br.com.maweb -DartifactId=TestesJOFC2

#entra no diretório do projeto criado
cd TestesJOFC2

#baixa o código do core do appfuse para possibilitar evolução no seu projeto posteriormente.
mvn appfuse:full-source

#baixa todas as dependências para o repositório do maven executa todos os testes unitários do projeto.
mvn

#baixa parte web do projeto
mvn war:inplace

#remove no linux libraries para rodar aplicativo com container jetty de forma expandida o que facilita durante o desenvolvimento por refletir mais diretamente as alterações.
rm -r src/main/webapp/WEB-INF/lib/
rm -r src/main/webapp/WEB-INF/classes/struts.xml

#configura projeto para ser importado pelo eclipse.
mvn eclipse:eclipse


Após a execução do script o projeto criado pode ser importado como um projeto do eclipse normalmente. Abra o pom.xml do projeto criado e configure a os dados de usuário e senha da base de dados que irá ser utilizada no projeto sendo a default a mysql com usuário root e sem senha, se tiver dificuldades veja este post. Após configurar a base de dados então em um comando de linha para testar basta inicializar o jetty utilizado no desenvolvimento com o seguinte comando:

mvn jetty:run


Para ver o projeto acesse com o browser http://localhost:8080 e utilize usuário/senha = user/user.

Bem se o script não foi alterado teremos um projeto chamado TestesJOFC2 que é um projeto de testes para uma librie de geração de gráficos chamada Open Flash Chart que descrevo em outro post.

[]s

8 de jun. de 2009

Open Flash Chart - Configuração e primeiras impressões

Durante o desenvolvimento de um projeto pessoal sempre tive um sentimento de que os gráficos que estava utilizando que são gerados utilizando a Google chart api que é excelente mas por se basear em imagem não fornece o nível de gráficos que eu desejo para o meu projeto. Após alguma pesquisa encontrei a API Open Flash Chart 2 que pelas minhas pesquisas apresenta funcionalidades muito mais próxima das que eu desejo para o projeto. Este post tem por objetivo mostrar a configuração necessária e também minhas primeiras impressões na utilização da API Open Flash Chart 2 em meu projeto.

O projeto que estou desenvolvendo e onde irei testar a integração desta API utiliza a estrutura fornecida pelo Appfuse com Struts 2.

Na própria página do projeto existe uma referência a uma librarie java que pode ser utilizada para integrar o Open Flash Chart em um projeto J2EE, que é o meu caso, decidi então utilizar a librarie chamada jofc2 no projeto por considerar que é a que está mais evoluída. Neste primeiro post sobre o assunto vou demonstrar a configuração básica do OFC com um projeto do AAFuse utilizando HTML simples e um arquivo JSON seguindo o exemplo 1 dos tutoriais do JOFC2.

Como esta API é em flash seu funcionamento se baseia em baixar um arquivo flash já pronto e depois configurá-lo utilizando Json. A API jofc2 que irei utilizar permite que fiquemos abstraídos do JSon utilizando somente java para configurar os gráficos.

Para iniciar os testes o primeiro passo é criar um projeto funcional do appfuse. Após o projeto ser criado vamos executar um primeiro exemplo simples de gráfico OFC utilizando html puro e json.

Para isso copie para a raiz web do seu projeto do appfuse criado o arquivo do pacote OFC chamado open-flash-chart.swf e crie os arquivos chart.htm e data.json na estrutura do projeto e copie o arquivo open-flash-chart.swf colocando-os sob o diretório src/main/webapp conforme mostrado na imagem abaixo:


Segue código a ser inserido no arquivo chart.htm(as tags de abertura e fechamento de html e body do código foram omitidas para compatibilidade de postagem com o blogspot e devem ser corrigidas antes de rodar o exemplo) :
html>
body>
 

Hello World

/body> html>


E o código do arquivo data.json:

{
  "title":{
    "text":  "Many data lines",
    "style": "{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"
  },
 
  "y_legend":{
    "text": "Open Flash Chart",
    "style": "{color: #736AFF; font-size: 12px;}"
  },
 
  "elements":[
    {
      "type":      "bar",
      "alpha":     0.5,
      "colour":    "#9933CC",
      "text":      "Page views",
      "font-size": 10,
      "values" :   [9,6,7,9,5,7,6,9,7]
    },
    {
      "type":      "bar",
      "alpha":     0.5,
      "colour":    "#CC9933",
      "text":      "Page views 2",
      "font-size": 10,
      "values" :   [6,7,9,5,7,6,9,7,3]
    }
  ],
 
  "x_axis":{
    "stroke":1,
    "tick_height":10,
    "colour":"#d000d0",
    "grid_colour":"#00ff00",
    "labels": {
        "labels": ["January","February","March","April","May","June","July","August","Spetember"]
    }
   },
 
  "y_axis":{
    "stroke":      4,
    "tick_length": 3,
    "colour":      "#d000d0",
    "grid_colour": "#00ff00",
    "offset":      0,
    "max":         20
  }
}



Após ter configurado estes 3 arquivos para ver o seu primeiro gráfico OFC funcionando execute o projeto do Appfuse gerado com o comando mvn jetty:run e acesse a url: http://localhost:8080/chart.htm?ofc=data.json

Se tudo tiver sido feito corretamente um gráfico como o mostrado na imagem abaixo deverá ser renderizado. Em um próximo post irei detalhar como utilizar a biblioteca JOFC para renderizar os gráficos utilizando struts2 e jsp.



[]s