<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Roberto Furutani &#187; Java</title>
	<atom:link href="http://www.furutani.com.br/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.furutani.com.br</link>
	<description>O site de um computólogo curioso!</description>
	<lastBuildDate>Fri, 20 Jan 2012 00:25:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cuidado com parse de String para Date</title>
		<link>http://www.furutani.com.br/2011/08/cuidado-com-parse-de-string-para-date/</link>
		<comments>http://www.furutani.com.br/2011/08/cuidado-com-parse-de-string-para-date/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 00:12:48 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[SimpleDateFormat]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=744</guid>
		<description><![CDATA[Olá Esse post é só uma dica para você que usa o SimpleDateFormat para converter String em Date. Não sei por que razão (para falar a verdade também não pesquisei) mas o SimpleDateFormat não lança uma exceção quando passamos um data que não existe no calendário. Por exemplo 31 de setembro e 32 de setembro. [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Esse post é só uma dica para você que usa o SimpleDateFormat para converter String em Date.<br />
Não sei por que razão (para falar a verdade também não pesquisei) mas o SimpleDateFormat não lança uma exceção quando passamos um data que não existe no calendário. Por exemplo 31 de setembro e 32 de setembro. Ele simplesmente converte para um dia do próximo mês.</p>
<p>Veja os exemplos abaixos:</p>
<pre class="brush: java">
    SimpleDateFormat sdf = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);
    System.out.println(sdf.parse(&quot;30/09/2011&quot;));
    System.out.println(sdf.parse(&quot;31/09/2011&quot;));
    System.out.println(sdf.parse(&quot;32/09/2011&quot;));

    // Saídas
    // Fri Sep 30 00:00:00 BRT 2011
    // Sat Oct 01 00:00:00 BRT 2011
    // Sun Oct 02 00:00:00 BRT 2011
</pre>
<p>Dica do Tadashi:<br />
Para validar a data use o método <a href="http://download.oracle.com/javase/1.5.0/docs/api/java/text/DateFormat.html#setLenient(boolean)" title="setLenient" target="_blank">setLenient(false)</a></p>
<p>Dessa forma um ParseException será lançada!</p>
<p>Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2011/08/cuidado-com-parse-de-string-para-date/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lendo valores RGB de uma imagem com java</title>
		<link>http://www.furutani.com.br/2011/02/lendo-valores-rgb-de-uma-imagem-com-java/</link>
		<comments>http://www.furutani.com.br/2011/02/lendo-valores-rgb-de-uma-imagem-com-java/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 00:14:05 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=723</guid>
		<description><![CDATA[Olá Programinha para identificar valores RGB e gerar imagens pixel a pixel pelo valor RGB. import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import java.util.*; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.event.*; public class IdentificadorRGB extends JFrame implements MouseMotionListener { private JLabel l_imagem, l_red, l_green, l_blue, l_r, l_g, l_b; private BufferedImage imagem, img_red, img_blue, [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Programinha para identificar valores RGB e gerar imagens pixel a pixel pelo valor RGB. </p>
<pre class="brush: java">
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.*;  

public class IdentificadorRGB extends JFrame implements MouseMotionListener {  

   private JLabel l_imagem, l_red, l_green, l_blue, l_r, l_g, l_b;
   private BufferedImage imagem,
   img_red, img_blue, img_green;
   Container c;  

   IdentificadorRGB() {
      super(&quot;Identificador de valores RGB pixel a pixel&quot;);
      try {
         //Leitura da imagem do disco
         imagem = ImageIO.read(new File(&quot;imagem.png&quot;));
         img_blue = ImageIO.read(new File(&quot;imagem.png&quot;));
         img_red = ImageIO.read(new File(&quot;imagem.png&quot;));
         img_green = ImageIO.read(new File(&quot;imagem.png&quot;));
      } catch (IOException e) {
         e.printStackTrace();
      }
      getContentPane().setLayout(null);
      c = getContentPane();  

      l_r = new JLabel();
      l_r.setBounds(300, 0, 270, 185);
      c.add(l_r);  

      l_g = new JLabel();
      l_g.setBounds(300, 190, 270, 185);
      c.add(l_g);  

      l_b = new JLabel();
      l_b.setBounds(5, 245, 270, 185);
      c.add(l_b);  

      l_imagem = new JLabel();
      l_imagem.setIcon(new ImageIcon(imagem));
      l_imagem.setBounds(0, 0, 270, 185);
      c.add(l_imagem);  

      l_red = new JLabel();
      l_red.setText(&quot;R:&quot;);
      l_red.setBounds(5, 190, 100, 15);
      c.add(l_red);  

      l_green = new JLabel();
      l_green.setText(&quot;G:&quot;);
      l_green.setBounds(5, 210, 100, 15);
      c.add(l_green);  

      l_blue = new JLabel();
      l_blue.setText(&quot;B:&quot;);
      l_blue.setBounds(5, 225, 100, 15);
      c.add(l_blue);  

      WritableRaster raster = imagem.getRaster();
      int pixels[] = new int[4];
      for (int i = 0; i &lt; imagem.getWidth(); i++)
         for (int j = 0; j &lt; imagem.getHeight(); j++) {
            raster.getPixel(i, j, pixels);
            img_red.setRGB(i, j, setR(pixels[0] ));
            img_green.setRGB(i, j, setG(pixels[1] ));
            img_blue.setRGB(i, j, setB(pixels[2] ));  

         }  

      c.validate();
      l_r.setIcon(new ImageIcon(img_red));
      l_g.setIcon(new ImageIcon(img_green));
      l_b.setIcon(new ImageIcon(img_blue));
      addMouseMotionListener(this);
      setSize(600, 500);
      setResizable(false);
      show();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

   }
   /* métodos que transforma valores inteiros do RGB para um numero hexadecimal
    *
    * Por exemplo 255,000,255  fica em hexadecimal 0x00FF00FF
    *
    * O dois primeiros 00 são valores do ALPHA que é responsavel pela
    * transparencia
    *     *
    */
   private int setR(int r) {
      return 0
         &lt;&lt; 24
            | ((r &lt;&lt; 16) &amp; 0x00FF0000)
            | ((0 &lt;&lt; 8 ) &amp; 0x0000FF00)
            | (0 &amp; 0x000000FF);
   }
   private int setG(int g) {
      return 0
         &lt;&lt; 24
            | ((0 &lt;&lt; 16) &amp; 0x00FF0000)
            | ((g &lt;&lt; 8 ) &amp; 0x0000FF00)
            | (0 &amp; 0x000000FF);
   }
   private int setB(int b) {
      return 0
         &lt;&lt; 24
            | ((0 &lt;&lt; 16) &amp; 0x00FF0000)
            | ((0 &lt;&lt; 8 ) &amp; 0x0000FF00)
            | (b &amp; 0x000000FF);
   }  

   public static void main(String[] args) {
      new IdentificadorRGB();
   }  

   public void mouseDragged(MouseEvent arg0) {
   }  

   public void mouseMoved(MouseEvent arg0) {  

      WritableRaster raster = imagem.getRaster();
      int pixels[] = new int[4];
      if (arg0.getX() &lt; imagem.getWidth()
         &amp;&amp; arg0.getY() &lt; imagem.getHeight()) {
         raster.getPixel(arg0.getX() - 3, arg0.getY() - 23, pixels);
         //Mostras os valores na tela
         l_red.setText(&quot;R: &quot; + pixels[0] );
         l_green.setText(&quot;G: &quot; + pixels[1] );
         l_blue.setText(&quot;B: &quot; + pixels[2] );
      }
   }  

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2011/02/lendo-valores-rgb-de-uma-imagem-com-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boas Práticas – Dica nº 4</title>
		<link>http://www.furutani.com.br/2010/10/boas-praticas-dica-n%c2%ba-4/</link>
		<comments>http://www.furutani.com.br/2010/10/boas-praticas-dica-n%c2%ba-4/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 22:45:38 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Boas Práticas]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=673</guid>
		<description><![CDATA[Olá Nunca altere o estado dos objetos passados por parâmetro de um método, utilize uma variável temporária quando alterar o valor de algum atributo do objeto. Essa prática é para evitar erros diante de uma confusão causada pelo tipo de passagem de valores que o Java adota. Java sempre faz a passagem por valor. Abaixo [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p><strong>Nunca altere o estado dos objetos passados por parâmetro de um método, </strong>utilize uma variável temporária quando alterar o valor de algum atributo do objeto.</p>
<p>Essa prática é para evitar erros diante de uma confusão causada pelo tipo de passagem de valores que o Java adota. Java sempre faz a passagem por valor.</p>
<p>Abaixo um exemplo de erro que levamos a cometer quando alteremos o estado de um objeto.</p>
<p>Nós temos um objeto do tipo ItemPedido que possui os atributos quantidade e preço. Passamos esse objeto para o método totalizarPedido(), que para seu calculo interno subtrai um caso o parâmetro promoLeveUmGratis for true.</p>
<pre class="brush: java">if(promoLeveUmGratis){

item.setQuantidade(item.getQuantidade().subtract(BigDecimal.ONE));

}</pre>
<p>Observe que estamos atribuindo o resultado da subtração no mesmo objeto que recebemos por parâmetro para o cálculo na linha abaixo.</p>
<pre class="brush: java">return item.getQuantidade().multiply(item.getPreco());</pre>
<p>Em seguida os métodos calcularFrete() e darBaixaNoEstoque() são invocados.</p>
<pre class="brush: java">ex.totalizarPedido(ip, true);
ex.calcularFrete(ip);
ex.darBaixaNoEstoque(ip);</pre>
<p>Coloquei alguns sysout´s para ilustrar o problema.</p>
<p><span style="font-family: courier new,courier;">Quantidade de itens no pedido:   10</span></p>
<p><span style="font-family: courier new,courier;">Quantidade de itens no frete:    9</span></p>
<p><span style="font-family: courier new,courier;">Quantidade de itens a dar baixa: 9</span></p>
<p>Note que para os dois métodos seguintes a quantidade <strong>que chegou foi alterada</strong>, não era essa a intenção. Isso traria sérios problemas para nós.</p>
<p>Downloads: <a href="http://www.furutani.com.br/a/Exemplo.java_.txt" title="Baixado: 195 vezes. Tamanho: 1.36 kB">Exemplo.java</a>  <a href="http://www.furutani.com.br/a/ItemPedido.java_.txt" title="Baixado: 180 vezes. Tamanho: 586 bytes">ItemPedido.java</a> </p>
<p>Até mais,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/10/boas-praticas-dica-n%c2%ba-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boas Práticas &#8211; Dica nº 3</title>
		<link>http://www.furutani.com.br/2010/10/boas-praticas-dica-n%c2%ba-3/</link>
		<comments>http://www.furutani.com.br/2010/10/boas-praticas-dica-n%c2%ba-3/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 21:26:42 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Boas Práticas]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=659</guid>
		<description><![CDATA[Olá Acrescentando e removendo parâmetros, todo desenvolvedor já precisou algum dia fazer essa alteração no código-fonte, esse é o tipo de refatoração mais comum na nossa vida. Pode parecer simples quando o projeto é pequeno e pouco reaproveitado, mas precisamos ter muito cuidado ao fazer isso em grandes projetos cujo método é altamente reusado para [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p><strong>Acrescentando e removendo parâmetros</strong>, todo desenvolvedor já precisou algum dia fazer essa alteração no código-fonte, esse é o tipo de refatoração mais comum na nossa vida.</p>
<p>Pode parecer simples quando o projeto é pequeno e pouco reaproveitado, mas precisamos ter muito cuidado ao fazer isso em grandes projetos cujo método é altamente reusado para não correr o risco de tomar um <span style="text-decoration: underline;">NoSuchMethodException</span> em produção.</p>
<p>O procedimento é parecido para os dois tipos de refatoração.</p>
<p>1.       Crie um novo método com o novo parâmetro (ou sem o parâmetro se estiver removendo). Geralmente é um Ctrl+C e Ctrl+V do método existente apenas alterando a lista de parâmetros.</p>
<p>2.       Agora você deve copiar o corpo do método existente para o método novo.</p>
<p>3.       No método que já existia efetue a chamada do método novo. No caso de acréscimo de parâmetro você terá que passar um valor padrão para o parâmetro novo, eu geralmente uso <em>null</em>.</p>
<p>4.       Altere os demais códigos para que chame o método novo. Tente procurar pelo máximo de referencias.</p>
<p>5.       Execute o aplicativo e teste.</p>
<p>6.       Você pode apagar o método antigo, mas se isso não for possível por que o método faz parte de uma <em>facade</em> (<em>interface</em>) mantenha-o e coloque um <strong>@deprecated</strong> no javadoc dele.</p>
<p>Se precisar alterar o método com mais de um parâmetro, o ideal é fazer tudo de uma vez só para evitar retrabalho depois.</p>
<p>Muitos não têm o costume de retirar parâmetros, mesmo que não sejam mais usados. Eles mantêm o parâmetro <em>boiando</em> (inclusive eu  :-D ) com a premissa de que não vai dar problema no comportamento do método, nisso temos razão, mas com certeza dará problema no seu entendimento ou no do pobre coitado alguns dias depois quando for dar manutenção.</p>
<p>Até mais,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/10/boas-praticas-dica-n%c2%ba-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boas Práticas &#8211; Dica nº 2</title>
		<link>http://www.furutani.com.br/2010/09/boas-praticas-dica-n%c2%ba-2/</link>
		<comments>http://www.furutani.com.br/2010/09/boas-praticas-dica-n%c2%ba-2/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 00:07:33 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Boas Práticas]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=657</guid>
		<description><![CDATA[Olá, A dica de hoje é mover números mágicos do código para constantes com nomes sugestivos para facilitar a leitura por quem for dar manutenção futuramente. No exemplo abaixo, o valor utilizado para converter km/h em m/s e vice-versa é 3.6, ao invés de repetir esse número várias vezes, colocamos em uma constante e usamos [...]]]></description>
			<content:encoded><![CDATA[<p>Olá,</p>
<p>A dica de hoje é mover <strong>números mágicos</strong> do código para constantes com nomes sugestivos para facilitar a leitura por quem for dar manutenção futuramente.<br />
No exemplo abaixo, o valor utilizado para converter km/h em m/s e vice-versa é <strong>3.6</strong>, ao invés de repetir esse número várias vezes, colocamos em uma constante e usamos ela em todos os lugares que precisamos.</p>
<pre class="brush: java">
public double converterKMH2MS(double velocidade){
	return velocidade / 3.6;
}

public double converterMS2KMS(double velocidade){
	return velocidade * 3.6;
}
</pre>
<p>O código melhorado ficaria assim:</p>
<pre class="brush: java">

//
public static final double FATOR_CONVERSAO_KMH_MS = 3.6;

public double converterKMH2MS(double velocidade){
	return velocidade / FATOR_CONVERSAO_KMH_MS;
}

public double converterMS2KMS(double velocidade){
	return velocidade * FATOR_CONVERSAO_KMH_MS;
}</pre>
<p>Dependendo da quantidade de constantes que você tem no seu sistema é bom agrupá-las em uma <em>interface</em>.</p>
<p>Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/09/boas-praticas-dica-n%c2%ba-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boas Práticas &#8211; Dica nº 1</title>
		<link>http://www.furutani.com.br/2010/09/boas-praticas-dica-n%c2%ba-1/</link>
		<comments>http://www.furutani.com.br/2010/09/boas-praticas-dica-n%c2%ba-1/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 13:41:26 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Boas Práticas]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=651</guid>
		<description><![CDATA[Bom dia, Ter um blog não é nada fácil, este aqui por exemplo está abandonado já faz quase um mês. A maior dificuldade é encontrar assuntos pra postar. Por isso tive uma idéia, postar uma série de dicas de boas práticas de codificação. A idéia é mostrar com dicas simples como melhorar o código, evitando [...]]]></description>
			<content:encoded><![CDATA[<p>Bom dia,</p>
<p>Ter um blog não é nada fácil, este aqui por exemplo está abandonado já faz quase um mês. A maior dificuldade é encontrar assuntos pra postar. Por isso tive uma idéia, postar uma série de dicas de boas práticas de codificação.<br />
A idéia é mostrar com dicas simples como melhorar o código, evitando erros e melhorando a codificação.</p>
<p>Nesta primeira dica, mostrarei como evitar um <strong>NullPointerException</strong> toda vez em que fazemos uma comparação com objetos com uma constante. Muita gente já conhece essa técnica, principalmente os mais experientes, mas nunca é demais lembrar.</p>
<p><strong>A dica é: Sempre coloque a constante à esquerda (ou o objeto que você terá certeza que não estará nulo) da condição.</strong></p>
<p>Veja o exemplo abaixo:</p>
<pre class="brush: java">
public boolean validar(String result) {

	if (&quot;OK&quot;.equals(result)) {
		return true;
	} else {
		return false;
	}

}</pre>
<p>O código acima compara o parâmetro <strong>result </strong> com a constante <em>OK</strong></em> que está a esquerda da condição.<br />
Se <strong>result </strong> for nulo o método retornará <em>false</em>.</p>
<p>Já dei manutenção em código que estava assim:</p>
<pre class="brush: java">
public boolean validar(String result) {
	if (result == null) {
	        result = &quot;&quot;;
        }
	if (&quot;OK&quot;.equals(result)) {
		return true;
	} else {
		return false;
	}

}</pre>
<p>Percebam que colocaram um <strong>if</strong> desnecessário só para atribuir uma string vazia ao parâmetro, afim de evitar o <strong>NullPointerException</strong> no próximo <strong>if</strong>. Além de ser feio fazer <em>atribuições aos parâmetros</em>, aumenta a complexidade de uma futura manutenção.</p>
<p>Por hoje é só.</p>
<p>Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/09/boas-praticas-dica-n%c2%ba-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Simplificando cálculos com datas com Joda Time &#8211; Java</title>
		<link>http://www.furutani.com.br/2010/02/simplificando-calculos-com-datas-com-joda-time-java/</link>
		<comments>http://www.furutani.com.br/2010/02/simplificando-calculos-com-datas-com-joda-time-java/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 01:01:40 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[joda time]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=623</guid>
		<description><![CDATA[Olá! Quem precisou fazer contas com java.util.Date ou java.util.Calendar saber o trabalho que dá e como a API nativa do Java (até o Java 6 pelo menos) não ajuda muito a fazer coisas simples como adicionar horas na data atual. A API Joda Time veio para simplificar o trabalho com datas no Java, tanto é [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Quem precisou fazer contas com java.util.Date ou java.util.Calendar saber o trabalho que dá e como a API nativa do Java (até o Java 6 pelo menos) não ajuda muito a fazer coisas simples como adicionar horas na data atual. A API <a href="http://joda-time.sourceforge.net/" target="_blank">Joda Time</a> veio para simplificar o trabalho com datas no Java, tanto é que muitas idéias dessa API tem grande chance de estarem no Java 7 através da <a href="http://today.java.net/pub/a/today/2008/09/18/jsr-310-new-java-date-time-api.html" target="_blank">JSR-310</a>.</p>
<p>O que eu mais gostei do Joda Time são os método toString() que aceitam como parâmetro o padrão de formatação (não preciso criar mais SimpleDateFormat para formatar os benditos java.util.Date!!! parecido com o do <a href="http://msdn.microsoft.com/en-us/library/aa326721%28VS.71%29.aspx" target="_blank">C#</a>),  inicialização do objeto com String e o uso de <a href="http://www.martinfowler.com/bliki/FluentInterface.html" target="_blank">interfaces fluentes</a>.</p>
<p>Abaixo exemplos de uso.</p>
<ul>
<li><strong>Inicialização do objeto com String</strong></li>
</ul>
<pre class="brush: java">DateTime date = new DateTime(&quot;2010-2-21T20:19:45.000-03:00&quot;);
System.out.println(date.toString(&quot;dd/MM/yyyy HH:mm:ss&quot;));</pre>
<ul>
<li><strong>Soma de dias escolhendo o ano</strong></li>
</ul>
<pre class="brush: java">LocalDate localDate = new LocalDate();
LocalDate moreDays = localDate.withYear(2008).plusDays(8);
System.out.println(moreDays.toString(&quot;dd/MM/yyyy&quot;));
// 29/02/2008</pre>
<ul>
<li><strong>Dia da semana por extenso</strong></li>
</ul>
<pre class="brush: java">DateTime dateTime = new DateTime();

String dayOfMonth = dateTime.dayOfWeek().getAsText();
System.out.println(dayOfMonth);
// Domingo</pre>
<ul>
<li><strong>Quantidade de dias entre um dia e outro</strong></li>
</ul>
<pre class="brush: java">DateTime inicio = new DateTime(2010, 2, 21, 0, 0, 0, 0);

DateTime fim = new DateTime(2010, 2, 22, 13, 30, 0, 0);
System.out.println(Days.daysBetween(inicio, fim).getDays());
// 1
System.out.println(Hours.hoursBetween(inicio, fim).getHours());
// 37
System.out.println(Minutes.minutesBetween(inicio, fim).getMinutes());
// 2250</pre>
<ul>
<li><strong>Diferença de horas entre fusos horários.</strong></li>
</ul>
<pre class="brush: java">DateTime agora = new DateTime();
DateTime saoPaulo =
agora.withZoneRetainFields(DateTimeZone.forID(&quot;America/Sao_Paulo&quot;));
DateTime rioBranco =
agora.withZoneRetainFields(DateTimeZone.forID(&quot;America/Rio_Branco&quot;));
DateTime japao =
agora.withZoneRetainFields(DateTimeZone.forID(&quot;Asia/Tokyo&quot;));
DateTime londres =
agora.withZoneRetainFields(DateTimeZone.forID(&quot;Europe/London&quot;));

System.out.println(Hours.hoursBetween(japao, saoPaulo).getHours());
System.out.println(Hours.hoursBetween(londres, saoPaulo).getHours());
System.out.println(Hours.hoursBetween(rioBranco, saoPaulo).getHours());
// Diferença de horas entre Japão e São Paulo: 12

// Diferença de horas entre Londre e São Paulo: 3

// Diferença de horas entre Rio Branco/AC e São Paulo: -1</pre>
<p>Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/02/simplificando-calculos-com-datas-com-joda-time-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Alterando a saída do System.out.println()</title>
		<link>http://www.furutani.com.br/2009/12/alterando-a-saida-do-system-out-println/</link>
		<comments>http://www.furutani.com.br/2009/12/alterando-a-saida-do-system-out-println/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 21:16:26 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=585</guid>
		<description><![CDATA[Olá! Quando criamos um programa em java e queremos mostrar alguma mensagem no console usamos inconscientemente o System.out.println(), mas e para gravar essas mesmas mensagens em um arquivo texto? Muito simples, basta dar um System.setOut() passando o PrintStream desejado. No exemplo abaixo alteramos a saída padrão, que era no console, para um arquivo texto. String [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Quando criamos um programa em java e queremos mostrar alguma mensagem no console usamos inconscientemente o System.out.println(), mas e para gravar essas mesmas mensagens em um arquivo texto? Muito simples, basta dar um System.setOut() passando o PrintStream desejado. No exemplo abaixo alteramos a saída padrão, que era no console, para um arquivo texto.</p>
<pre class="brush: java">
String path = &quot;D:\\saida.txt&quot;;
FileOutputStream fileOutputStream = null;
	try {
		fileOutputStream = new FileOutputStream(path);
		System.setOut(new PrintStream(fileOutputStream, true));
		System.out.println(&quot;Teste&quot;);
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}
</pre>
<p>Até mais<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2009/12/alterando-a-saida-do-system-out-println/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exemplo de Message Driven Bean</title>
		<link>http://www.furutani.com.br/2009/11/exemplo-de-message-driven-bean/</link>
		<comments>http://www.furutani.com.br/2009/11/exemplo-de-message-driven-bean/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 01:48:32 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jms]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=574</guid>
		<description><![CDATA[Olá! Faz tempo que eu não posto nada no blog, então hoje vou deixar um exemplo bem simples de serviço de mensageria JMS. JMS &#8211; Java Messaging Service é uma arquitetura existente no universo J2EE que permite troca de mensagens de maneira assíncrona. Este exemplo consiste em duas classes, Main que envia um MDB (Message [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Faz tempo que eu não posto nada no blog, então hoje vou deixar um exemplo bem simples de serviço de mensageria JMS.</p>
<p>JMS &#8211; Java Messaging Service é uma arquitetura existente no universo J2EE que permite troca de mensagens de maneira assíncrona.</p>
<p>Este exemplo consiste em duas classes, Main que envia um MDB (Message Drive Bean) e a JMSProcessBean que recebe a mensagem e exibe no console o valor do atributo &#8220;nome&#8221;.</p>
<p>No projeto JMSTester verificar se as bibliotecas abaixos estão corretamente referenciadas. Utilizei a instalação padrão do netbeans 6.7.1 e do glassfish v2.1.</p>
<p><span style="font-size: x-small;"><span style="font-family: verdana,geneva;">C:\Sun\AppServer\lib\appserv-admin.jar<br />
C:\Sun\AppServer\lib\appserv-rt.jar<br />
C:\Sun\AppServer\imq\lib\imq.jar<br />
C:\Sun\AppServer\lib\install\applications\jmsra\imqjmsra.jar<br />
C:\Sun\AppServer\lib\j2ee.jar<br />
C:\Sun\AppServer\lib\install\applications\jaxr-ra\jaxr-ra.jar<br />
C:\Sun\AppServer\imq\lib\jms.jar</span></span></p>
<p>Na administração do Glassfish é possível verificar se o JMS foi corretamente implantado.</p>
<p><a href="http://www.furutani.com.br/wp-content/uploads/2009/11/jms-glassfish.jpg"><img class="aligncenter size-medium wp-image-576" title="jms-glassfish" src="http://www.furutani.com.br/wp-content/uploads/2009/11/jms-glassfish-208x300.jpg" alt="jms-glassfish" width="208" height="300" /></a></p>
<p>Ao executar a classe Main teremos a saída abaixo (observe a última linha):</p>
<p><span style="font-family: courier new,courier;">run:<br />
13/11/2009 23:10:58 com.sun.appserv.naming.RoundRobinPolicy setClusterInstanceInfo<br />
WARNING: NAM1005 : No Endpoints selected. Please specify using system property com.sun.appserv.iiop.endpoints.<br />
13/11/2009 23:10:58 com.sun.appserv.naming.RoundRobinPolicy getEndpointForProviderURL<br />
WARNING: NAM1001: No Endpoints selected in com.sun.appserv.iiop.endpoints property. Using JNDI Provider URL iiop://127.0.0.1:3700 instead<br />
13/11/2009 23:10:59 com.sun.appserv.naming.RoundRobinPolicy setClusterInstanceInfo<br />
INFO: endpoint.weight after checking isWeight = 10<br />
13/11/2009 23:10:59 com.sun.appserv.naming.RoundRobinPolicy setClusterInstanceInfo<br />
INFO: sumOfAllWeights = 10<br />
13/11/2009 23:10:59 com.sun.appserv.naming.S1ASCtxFactory getCorbalocURL<br />
INFO: list[i] ==&gt; 127.0.0.1:3700<br />
13/11/2009 23:10:59 com.sun.appserv.naming.S1ASCtxFactory getCorbalocURL<br />
INFO: corbaloc url ==&gt; iiop:1.2@127.0.0.1:3700<br />
13/11/2009 23:11:00 com.sun.messaging.jms.ra.ResourceAdapter start<br />
INFO: MQJMSRA_RA1101: SJSMQ JMS Resource Adapter starting&#8230;<br />
13/11/2009 23:11:00 com.sun.messaging.jms.ra.ResourceAdapter start<br />
INFO: MQJMSRA_RA1101: SJSMQ JMSRA Started:REMOTE<br />
13/11/2009 23:11:00 com.sun.messaging.jms.ra.ManagedConnectionFactory setAddressList<br />
INFO: MQJMSRA_MF1101: setAddressList:NOT setting default value=localhost<br />
13/11/2009 23:11:00 com.sun.messaging.jms.ra.ManagedConnectionFactory setPassword<br />
INFO: MQJMSRA_MF1101: setPassword:NOT setting default value<br />
13/11/2009 23:11:00 com.sun.messaging.jms.ra.ManagedConnectionFactory setUserName<br />
INFO: MQJMSRA_MF1101: setUserName:NOT setting default value=guest<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=1:xacId=6281999144483361280:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=2:xacId=6281999144483371776:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=3:xacId=6281999144483379200:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=4:xacId=6281999144483388416:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=5:xacId=6281999144483394816:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=6:xacId=6281999144483402752:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=7:xacId=6281999144483408896:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
13/11/2009 23:11:01 com.sun.messaging.jms.ra.ManagedConnection &lt;init&gt;<br />
INFO: MQJMSRA_MC1101: constructor:Created mcId=8:xacId=6281999144483415808:Using xacf config={imqOverrideJMSPriority=false, imqConsumerFlowLimit=1000, imqOverrideJMSExpiration=false, imqAddressListIterations=3, imqLoadMaxToServerSession=true, imqConnectionType=TCP, imqPingInterval=30, imqSetJMSXUserID=false, imqConfiguredClientID=, imqSSLProviderClassname=com.sun.net.ssl.internal.ssl.Provider, imqJMSDeliveryMode=PERSISTENT, imqConnectionFlowLimit=1000, imqConnectionURL=http://localhost/imq/tunnel, imqBrokerServiceName=, imqJMSPriority=4, imqBrokerHostName=localhost, imqJMSExpiration=0, imqAckOnProduce=, imqEnableSharedClientID=false, imqAckTimeout=0, imqAckOnAcknowledge=, imqConsumerFlowThreshold=50, imqDefaultPassword=guest, imqQueueBrowserMaxMessagesPerRetrieve=1000, imqDefaultUsername=guest, imqReconnectEnabled=true, imqConnectionFlowCount=100, imqAddressListBehavior=RANDOM, imqReconnectAttempts=3, imqSetJMSXAppID=false, imqConnectionHandler=com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler, imqSetJMSXRcvTimestamp=false, imqBrokerServicePort=0, imqDisableSetClientID=false, imqSetJMSXConsumerTXID=false, imqOverrideJMSDeliveryMode=false, imqBrokerHostPort=7676, imqQueueBrowserRetrieveTimeout=60000, imqSetJMSXProducerTXID=false, imqSSLIsHostTrusted=false, imqConnectionFlowLimitEnabled=false, imqReconnectInterval=5000, imqAddressList=mq://Furutani:7676/, imqOverrideJMSHeadersToTemporaryDestinations=false}<br />
Mensagens enviadas!</span></p>
<p>No console do Glassfish v2.1 teremos a seguinte saída:</p>
<p><span style="font-family: courier new,courier;">13/11/2009 23:08:51 com.sun.enterprise.admin.servermgmt.launch.ASLauncher buildCommand<br />
INFO:<br />
C:/Program Files/Java/jdk1.6.0_11\bin\java<br />
-Dcom.sun.aas.instanceRoot=C:/Sun/AppServer/domains/domain1<br />
-Dcom.sun.aas.ClassPathPrefix=<br />
-Dcom.sun.aas.ClassPathSuffix=<br />
-Dcom.sun.aas.ServerClassPath=<br />
-Dcom.sun.aas.classloader.appserverChainJars.ee=<br />
-Dcom.sun.aas.classloader.appserverChainJars=admin-cli.jar,admin-cli-ee.jar,j2ee-svc.jar<br />
-Dcom.sun.aas.classloader.excludesList=admin-cli.jar,appserv-upgrade.jar,sun-appserv-ant.jar<br />
-Dcom.sun.aas.classloader.optionalOverrideableChain.ee=<br />
-Dcom.sun.aas.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar<br />
-Dcom.sun.aas.classloader.serverClassPath.ee=Does not exist/lib/hadbjdbc4.jar,C:/Sun/AppServer/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,Does not exist/lib/dbstate.jar,Does not exist/lib/hadbm.jar,Does not exist/lib/hadbmgt.jar,C:/Sun/AppServer/lib/SUNWmfwk/lib/mfwk_instrum_tk.jar<br />
-Dcom.sun.aas.classloader.serverClassPath=C:/Sun/AppServer/lib/install/applications/jmsra/imqjmsra.jar,C:/Sun/AppServer/imq/lib/jaxm-api.jar,C:/Sun/AppServer/imq/lib/fscontext.jar,C:/Sun/AppServer/imq/lib/imqbroker.jar,C:/Sun/AppServer/imq/lib/imqjmx.jar,C:/Sun/AppServer/lib/ant/lib/ant.jar,C:/Sun/AppServer/lib/SUNWjdmk/5.1/lib/jdmkrt.jar<br />
-Dcom.sun.aas.classloader.sharedChainJars.ee=appserv-se.jar,appserv-ee.jar,jesmf-plugin.jar,Does not exist/lib/dbstate.jar,Does not exist/lib/hadbjdbc4.jar,jgroups-all.jar,C:/Sun/AppServer/lib/SUNWmfwk/lib/mfwk_instrum_tk.jar<br />
-Dcom.sun.aas.classloader.sharedChainJars=javaee.jar,C:/Program Files/Java/jdk1.6.0_11/lib/tools.jar,install/applications/jmsra/imqjmsra.jar,com-sun-commons-launcher.jar,com-sun-commons-logging.jar,C:/Sun/AppServer/imq/lib/jaxm-api.jar,C:/Sun/AppServer/imq/lib/fscontext.jar,C:/Sun/AppServer/imq/lib/imqbroker.jar,C:/Sun/AppServer/imq/lib/imqjmx.jar,C:/Sun/AppServer/imq/lib/imqxm.jar,webservices-rt.jar,webservices-tools.jar,mail.jar,appserv-jstl.jar,jmxremote_optional.jar,C:/Sun/AppServer/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,activation.jar,appserv-rt.jar,appserv-admin.jar,appserv-cmp.jar,C:/Sun/AppServer/updatecenter/lib/updatecenter.jar,C:/Sun/AppServer/jbi/lib/jbi.jar,C:/Sun/AppServer/imq/lib/imqjmx.jar,C:/Sun/AppServer/lib/ant/lib/ant.jar,dbschema.jar<br />
-Dcom.sun.aas.configName=server-config<br />
-Dcom.sun.aas.configRoot=C:/Sun/AppServer/config<br />
-Dcom.sun.aas.defaultLogFile=C:/Sun/AppServer/domains/domain1/logs/server.log<br />
-Dcom.sun.aas.domainName=domain1<br />
-Dcom.sun.aas.installRoot=C:/Sun/AppServer<br />
-Dcom.sun.aas.instanceName=server<br />
-Dcom.sun.aas.processLauncher=SE<br />
-Dcom.sun.aas.promptForIdentity=true<br />
-Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory<br />
-Dcom.sun.enterprise.overrideablejavaxpackages=javax.help,javax.portlet<br />
-Dcom.sun.enterprise.taglibs=appserv-jstl.jar,jsf-impl.jar<br />
-Dcom.sun.enterprise.taglisteners=jsf-impl.jar<br />
-Dcom.sun.updatecenter.home=C:/Sun/AppServer/updatecenter<br />
-Ddomain.name=domain1<br />
-Djava.endorsed.dirs=C:/Sun/AppServer/lib/endorsed<br />
-Djava.ext.dirs=C:/Program Files/Java/jdk1.6.0_11/lib/ext;C:/Program Files/Java/jdk1.6.0_11/jre/lib/ext;C:/Sun/AppServer/domains/domain1/lib/ext;C:/Sun/AppServer/javadb/lib<br />
-Djava.library.path=C:\Sun\AppServer\lib;C:\Sun\AppServer\lib;C:\Sun\AppServer\bin;C:\Sun\AppServer\bin<br />
-Djava.security.auth.login.config=C:/Sun/AppServer/domains/domain1/config/login.conf<br />
-Djava.security.policy=C:/Sun/AppServer/domains/domain1/config/server.policy<br />
-Djava.util.logging.manager=com.sun.enterprise.server.logging.ServerLogManager<br />
-Djavax.management.builder.initial=com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder<br />
-Djavax.net.ssl.keyStore=C:/Sun/AppServer/domains/domain1/config/keystore.jks<br />
-Djavax.net.ssl.trustStore=C:/Sun/AppServer/domains/domain1/config/cacerts.jks<br />
-Djdbc.drivers=org.apache.derby.jdbc.ClientDriver<br />
-Djmx.invoke.getters=true<br />
-Dsun.rmi.dgc.client.gcInterval=3600000<br />
-Dsun.rmi.dgc.server.gcInterval=3600000<br />
-client<br />
-XX:+UnlockDiagnosticVMOptions<br />
-XX:MaxPermSize=192m<br />
-Xmx512m<br />
-XX:NewRatio=2<br />
-XX:+LogVMOutput<br />
-XX:LogFile=C:/Sun/AppServer/domains/domain1/logs/jvm.log<br />
-cp<br />
C:/Sun/AppServer/lib/jhall.jar;C:\Sun\AppServer\lib\appserv-launch.jar<br />
com.sun.enterprise.server.PELaunch<br />
start<br />
CORE5076: Using [Java HotSpot(TM) Client VM, Version 1.6.0_11] from [Sun Microsystems Inc.]<br />
SEC1002: Security Manager is OFF.<br />
Using MQ RA for Broker lifecycle control<br />
SEC1143: Loading policy provider com.sun.enterprise.security.provider.PolicyWrapper.<br />
WEB0114: SSO is disabled in virtual server [server]<br />
WEB0114: SSO is disabled in virtual server [__asadmin]<br />
REgistering Custom ContextConfig<br />
REgistering Custom Context<br />
JTS5014: Recoverable JTS instance, serverId = [3700]<br />
ADM1079: Initialization of AMX MBeans started<br />
ADM1504: Here is the JMXServiceURL for the Standard JMXConnectorServer: [service:jmx:rmi:///jndi/rmi://Furutani:8686/jmxrmi].  This is where the remote administrative clients should connect using the standard JMX connectors<br />
ADM1506: Status of Standard JMX Connector: Active = [true]<br />
JMS Service Connection URL is :mq://Furutani:7676/<br />
MQJMSRA_RA1101: SJSMQ JMS Resource Adapter starting&#8230;<br />
MQJMSRA_EB1101: EMBEDDED broker started with code =0<br />
MQJMSRA_RA1101: SJSMQ JMSRA Started:DIRECT<br />
LDR5010: All ejb(s) of [MEjbApp] loaded successfully!<br />
EJB5109:EJB Timer Service started successfully for datasource [jdbc/__TimerPool]<br />
LDR5010: All ejb(s) of [__ejb_container_timer_app] loaded successfully!<br />
endpoint.determine.destinationtype<br />
LDR5010: All ejb(s) of [JMSProcess-ejb] loaded successfully!<br />
JBIFW0010: JBI framework ready to accept requests.<br />
WEB0302: Starting Sun-Java-System/Application-Server.<br />
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 8080<br />
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 8181<br />
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 4848<br />
SMGT0007: Self Management Rules service is enabled<br />
Application server startup complete.<br />
MQJMSRA_MF1101: setAddressList:NOT setting default value=localhost<br />
MQJMSRA_MF1101: setPassword:NOT setting default value<br />
MQJMSRA_MF1101: setUserName:NOT setting default value=guest<br />
Jundi<br />
Furutani<br />
Roberto</span></p>
<p>O que realmente importa são as três últimas linhas, elas indicam que as mensagens foram corretamentes enviadas e processadas.</p>
<p>Link: <a href="http://www.furutani.com.br/a/NetBeansProjects.zip" title="Baixado: 194 vezes. Tamanho: 38.7 KB. Versão: 1.00">Exemplo JMS</a> - 13/11/2009</p>
<p>Saiba mais sobre JMS acessando o tutorial da SUN neste <a href="http://java.sun.com/products/jms/tutorial/" target="_blank">link</a>.</p>
<p>Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2009/11/exemplo-de-message-driven-bean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capturando printscreen de sites</title>
		<link>http://www.furutani.com.br/2009/10/capturando-printscreen-de-sites/</link>
		<comments>http://www.furutani.com.br/2009/10/capturando-printscreen-de-sites/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 00:32:37 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=554</guid>
		<description><![CDATA[Olá! Nada como um bom projeto open source para facilitar a nossa vida. Hoje fiz um teste com o Flying Saucer para capturar um screenshot (printscreen) de um site. É muito, mas muito fácil fazer isso com esse projeto. Basicamente só é preciso das três linhas abaixo. BufferedImage buff = null; buff = Graphics2DRenderer.renderToImageAutoSize(&#34;htt://www.furutani.com.br&#34;, 1024); [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Olá!</p>
<p style="text-align: left;">Nada como um bom projeto open source para facilitar a nossa vida. Hoje fiz um teste com o <a href="https://xhtmlrenderer.dev.java.net/">Flying Saucer</a> para capturar um screenshot (printscreen) de um site.</p>
<p style="text-align: left;">É muito, mas muito fácil fazer isso com esse projeto.</p>
<p style="text-align: left;">Basicamente só é preciso das três linhas abaixo.</p>
<pre class="brush: java">BufferedImage buff = null;
buff = Graphics2DRenderer.renderToImageAutoSize(&quot;htt://www.furutani.com.br&quot;, 1024);
ImageIO.write(buff, &quot;PNG&quot;, new File(&quot;d:/site.png&quot;));</pre>
<p style="text-align: left;">Para testar a geração de imagens de um site você pode usar essa aplicação que fiz: <a href="http://www.furutani.com.br/Html2Image/" target="_blank">http://www.furutani.com.br/Html2Image/</a></p>
<p style="text-align: left;">O parser dele é bem rigorso, o site não pode ter nenhuma tag faltando fechar senão a imagem não é gerada.</p>
<p style="text-align: left;">Até mais,</p>
<p style="text-align: left;">Roberto</p>
<p style="text-align: center;">
<p style="text-align: center;">
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<h1>Flying SaucerFlying Saucer</h1>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2009/10/capturando-printscreen-de-sites/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

