<?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>Thiago Galbiatti Vespa</title>
	<atom:link href="http://www.thiagovespa.com.br/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thiagovespa.com.br/blog</link>
	<description>Precisando é só avisar!</description>
	<lastBuildDate>Fri, 18 May 2012 22:44:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Singleton no Java</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/24/singleton-no-java/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/24/singleton-no-java/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 19:52:33 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[padrões de projeto]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2352</guid>
		<description><![CDATA[O padrão de projeto Singleton é um padrão que tem como objetivo garantir que apenas uma única instância da classe alvo é criada. É um dos padrões de projetos mais utilizados. Outro fator interessante do uso do Singleton é quando precisamos ter um único ponto de acesso global para a instância de classe. Por exemplo, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O padrão de projeto Singleton é um padrão que tem como objetivo garantir que apenas uma única instância da classe alvo é criada. É um dos padrões de projetos mais utilizados. Outro fator interessante do uso do Singleton é quando precisamos ter um único ponto de acesso global para a instância de classe. Por exemplo, alguma classe que possui dados de configuração que são únicos para toda a aplicação.</p>
<p><span id="more-2352"></span></p>
<p style="text-align: justify;">Existem algumas maneiras de implementar o Singleton. A maneira mais comum é a seguinte:</p>
<pre class="brush: java; title: ; notranslate">
public class SingletonUm {
	private static final SingletonUm instance = new SingletonUm();
	private SingletonUm() {
	}
	public static SingletonUm getInstance() {
		return instance;
	}
}
</pre>
<p style="text-align: justify;">O construtor privado (linha 3) impossibilita a criação de novas instâncias, pois, por ser privado, só pode ser referenciado dentro da mesma classe. O método getInstance() (linha 5) fornece o acesso à instância criada na linha 2. Ele é estático para poder ser acessado sem ter a instância (já que o construtor é privado e queremos que a instância seja única). Então para obtermos acesso à classe é só chamar: SingletonUm.getInstance();</p>
<p style="text-align: justify;">O problema dessa abordagem é que se não formos utilizar a instância ou se formos utilizar ela posteriormente, a aplicação terá um objeto desnecessário em memória. Então para termos uma instanciação tardia, devemos adotar outra abordagem. Outra implementação bastante comum é a seguinte:</p>
<pre class="brush: java; title: ; notranslate">
public class SingletonDois {
	private static SingletonDois instance;
	private SingletonDois() {
	}
	public static SingletonDois getInstance() {
		if (instance == null) {
			instance = new SingletonDois();
		}
		return instance;
	}
}
</pre>
<p style="text-align: justify;">Com essa verificação  a instância só será criada após chamado o método getInstance(). Para torná-lo thread-safe, é só colocar o modificador synchronized no método. O problema dessa inclusão é o gargalo que teremos ao transformar o método em synchronized, além de outros possíveis problemas. <a title="Double Checked Locking" href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html" target="_blank">Nesse link</a> tem maiores descrições desses problemas. Para resolver, o Bill Pugh (um dos autores do artigo citado), desenvolveu a seguinte solução:</p>
<pre class="brush: java; title: ; notranslate">
public class SingletonBillPugh {
	private SingletonBillPugh() {
	}
	private static class SingletonHolder {
		public static final SingletonBillPugh instance = new SingletonBillPugh();
	}
	public static SingletonBillPugh getInstance() {
		return SingletonHolder.instance;
	}
}
</pre>
<p style="text-align: justify;">Baseado no modelo de inicialização do Java, o código da linha 05 só é chamado após a invocação do método getInstance() (linha 07). Dessa maneira garantimos instanciação tardia e o código ser thread-safe.</p>
<p style="text-align: justify;">Outra maneira mais elegante de se fazer Singleton é o citado no livro Effective Java:</p>
<pre class="brush: java; title: ; notranslate">
public enum SingletonEnum {
	INSTANCE;
	// Operações do Enum aqui!
}
</pre>
<p style="text-align: justify;">O enum não pode ser instanciado, só tem uma instância única, que é o nosso Singleton. O único problema dessa abordagem é que temos alguns limitantes no enum, como a impossibilidade de se fazer herança e não temos instanciação tardia.</p>
<p style="text-align: justify;">As dúvidas agora permanecem quando utilizar uma solução ou outra. Minha recomendação é a seguinte. Se não é necessário ter inicialização tardia, utilizar a solução SingletonEnum, desde que a classe alvo não tenha problemas com os limitantes do enum, caso contrário, utilizar a solução SingletonUm. Se é necessário ter instanciação tardia utilizar a solução SingletonBillPugh, desde que não seja necessário realizar tratamento de erros ao chamar o getInstance(), caso contrário, utizar a solução SingletonDois.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/24/singleton-no-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Encontrando JAR à partir do nome da classe</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/11/encontrando-jar-a-partir-do-nome-da-classe/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/11/encontrando-jar-a-partir-do-nome-da-classe/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 19:39:15 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[aplicativos]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2339</guid>
		<description><![CDATA[Um problema que sempre atormentou minha vida foi tentar descobrir em qual JAR está uma determinada classe. Até o momento eu recorria ao http://www.findjar.com, http://www.jarfinder.com/ ou Google. O problema é que nem sempre o JAR é encontrado ou está em versão errada. Para resolver esse tormento resolvi criar um programinha que consiste em buscar à partir de um caminho [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Um problema que sempre atormentou minha vida foi tentar descobrir em qual JAR está uma determinada classe. Até o momento eu recorria ao <a href="http://www.findjar.com/">http://www.findjar.com</a>, <a href="http://www.jarfinder.com/">http://www.jarfinder.com/</a> ou Google. O problema é que nem sempre o JAR é encontrado ou está em versão errada. Para resolver esse tormento resolvi criar um programinha que consiste em buscar à partir de um caminho todos os arquivos JAR e procurar dentro dele à classe que eu quero.</p>
<p><span id="more-2339"></span></p>
<p style="text-align: justify;">Primeiro eu busco por arquivos JAR recursivamente:</p>
<pre class="brush: java; title: ; notranslate">
	protected void searchForJars(File path, List&lt;String&gt; resultado) {
		for (File f : path.listFiles(filter)) {
			if (breakIfFound &amp;&amp; found)
				return;
			if (f.isDirectory()) {
				searchForJars(f, resultado);
			} else {
				List&lt;String&gt; res = searchInsideJar(f);
				if (res != null) {
					resultado.addAll(res);
					found = true;
				}
			}
		}
	}
</pre>
<p style="text-align: justify;">Se eu encontrar um arquivo JAR, eu busco dentro dele a informação que eu quero:</p>
<pre class="brush: java; title: ; notranslate">
	protected List&lt;String&gt; searchInsideJar(File f) {
		List&lt;String&gt; resultado = null;
		try {
			JarFile jar = new JarFile(f);
			Enumeration&lt;JarEntry&gt; entries = jar.entries();
			while (entries.hasMoreElements()) {
				String entry = entries.nextElement().getName();
				if (entry.contains(classToFind)) {
					if (resultado == null) {
						resultado = new ArrayList&lt;String&gt;();
					}
					resultado.add(f.getPath() + &quot;:&quot; + entry);
					if (breakIfFound) {
						return resultado;
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return resultado;
	}
</pre>
<p style="text-align: justify;">Se eu encontrar algum arquivo que tenha a String que eu quero, adiciono o resultado numa lista. Para quem só precisa do utilitário, vou <a title="ClassFinder" href="http://www.thiagovespa.com.br/apps/thiago-vespa-utils-classfinder.jar">disponibizá-lo aqui</a>. Para usar é necessário Java 7 e depois é só digitar:</p>
<blockquote><p> java -jar thiago-vespa-utils-classfinder.jar &lt;CAMINHO&gt; &lt;CLASSE COMPLETA OU TRECHO&gt; &lt;BREAK&gt;</p></blockquote>
<p style="text-align: justify;">Por exemplo:</p>
<blockquote><p> java -jar thiago-vespa-utils-classfinder.jar /opt/Oracle111150/Middleware/Oracle_SOA1/soa/modules Record</p></blockquote>
<p style="text-align: justify;">Ou</p>
<blockquote><p> java -jar thiago-vespa-utils-classfinder.jar /opt/Oracle111150/Middleware/Oracle_SOA1/soa/modules oracle.tip.adapter.api.record.RecordElement break</p></blockquote>
<p style="text-align: justify;">O break serve para informar que é para parar ao encontrar o primeiro. Se não digitar break ele vai encontrar todas as referências da classe especificada.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/11/encontrando-jar-a-partir-do-nome-da-classe/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Re-lançamento de erro mais preciso e possíveis problemas (Java 7)</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/11/re-lancamento-de-erro-mais-preciso-e-possiveis-problemas-java-7/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/11/re-lancamento-de-erro-mais-preciso-e-possiveis-problemas-java-7/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 12:28:13 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java7]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2332</guid>
		<description><![CDATA[Ao capturar e lançar os erros capturados o Java 7 tem uma verificação mais precisa. Ele consegue descobrir em tempo de compilação quais são os erros mais específicos e ao invés de fazer o lançamento de um erro genérico, você pode fazer o lançamento dos erros específicos. Esse recurso é conhecido como: more precise rethrow. Parece [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ao capturar e lançar os erros capturados o Java 7 tem uma verificação mais precisa. Ele consegue descobrir em tempo de compilação quais são os erros mais específicos e ao invés de fazer o lançamento de um erro genérico, você pode fazer o lançamento dos erros específicos. Esse recurso é conhecido como: more precise rethrow. Parece meio complicado de se entender, mas na prática é mais simples. Então vamos ver um exemplo.</p>
<p><span id="more-2332"></span></p>
<p style="text-align: justify;">Nas versões anteriores de Java quando queríamos relançar os erros ocorridos fazíamos da seguinte maneira:</p>
<pre class="brush: java; highlight: [1,5,7,10,12]; title: ; notranslate">
	public void metodoQueLancaExcecao() throws AException, BException {
		try {
			int a = 0;
			if (a == 0) {
				throw new AException();
			} else {
				throw new BException();
			}
		} catch (AException e) {
			throw e;
		} catch (BException e) {
			throw e;
		}
	}
</pre>
<p style="text-align: justify;">Ou quando tínhamos  várias possíveis exceptions, podíamos capturar com uma mais genérica e relançar ela. Por exemplo:</p>
<pre class="brush: java; highlight: [1,5,7,10]; title: ; notranslate">
	public void metodoQueLancaExcecao() throws Exception {
		try {
			int a = 0;
			if (a == 0) {
				throw new AException();
			} else {
				throw new BException();
			}
		} catch (Exception e) {
			throw e;
		}
	}
</pre>
<p style="text-align: justify;">O problema dessa última solução é que o tratamento da classe que chama esse método se torna pior, pois não sabemos qual erro poderá ocorrer, e na primeira solução se tivermos um número muito grande de exceções a serem re-lançadas o código se torna extenso. Para resolver esse problema, no Java 7 podemos fazer da seguinte maneira:</p>
<pre class="brush: java; highlight: [1,5,7,10]; title: ; notranslate">
	public void metodoQueLancaExcecao() throws AException, BException {
		try {
			int a = 0;
			if (a == 0) {
				throw new AException();
			} else {
				throw new BException();
			}
		} catch (Exception e) {
			throw e;
		}
	}
</pre>
<p style="text-align: justify;">Esse código não compila no Java 6 e inferiores, pois o compilador irá informar que a exceção Exception não está sendo tratada. No Java 7 ele &#8220;percebe&#8221; que as única exceções que estão sendo lançadas são a AException e a BException e portanto não obriga o tratamento de nenhuma outra.</p>
<p style="text-align: justify;">Entretanto esse novo recurso pode trazer problemas de incompatibilidades na compilação de códigos feitos nas outras versões de Java, por exemplo:</p>
<pre class="brush: java; highlight: [7]; title: ; notranslate">
	public void metodoQueLancaExcecao() throws A {
		try {
			throw new FilhaDeA();
		} catch (A e) {
			try {
				throw e;
			} catch (OutraFilhaDeA anotherException) { // Não alcançável
				System.out.println(&quot;Deu pau!&quot;);
			}
		}
	}
</pre>
<p style="text-align: justify;">Esse código compila na versão Java 6 e inferiores, mas não compila na versão 7. Isso pra mim é um perigo muito grande. Pois no Java 7 o último catch nunca será executado, pois eu sei que o &#8220;throw e&#8221; é do tipo FilhaDeA e como o tratamento é mais preciso, eu sei que nunca vou capturar erros do tipo OutraFilhaDeA. Já no Java 6 e inferiores isso não ocorre (eu posso tratar erros mais específicos).</p>
<p>Segundo a especificação do Project Coin/JSR 334:</p>
<blockquote><p>An examination of millions of lines of code in a diverse set of projects, including dozens of members of the Qualitas Corpus and the JDK, found no instances where these conditions occurred.</p></blockquote>
<p>Ou seja, eles nunca encontraram código em que isso ocorria. Se por acaso ao tentar compilar um programa existente do Java 6 ou inferior em Java 7 e tiver um erro parecido com esse:</p>
<blockquote><p>Unreachable catch block for OutraFilhaDeA. This exception is never thrown from the try statement body</p></blockquote>
<p>Já sabe o que pode ser.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/11/re-lancamento-de-erro-mais-preciso-e-possiveis-problemas-java-7/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Diamante no Java (Java 7)</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/11/diamante-no-java/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/11/diamante-no-java/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 11:14:08 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java7]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2320</guid>
		<description><![CDATA[Continuando nossa sequencia de posts do Java 7, vamos abordar agora o uso do diamante &#60;&#62;. Com esse operador eliminamos a necessidade de redundâncias dos tipos em classes parametrizadas. Na especificação do Java 7 está descrito como um melhoria na inferência de tipos na criação de instâncias de genéricos. Na prática, a gente transforma código [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Continuando nossa sequencia de posts do Java 7, vamos abordar agora o uso do diamante &lt;&gt;. Com esse operador eliminamos a necessidade de redundâncias dos tipos em classes parametrizadas. Na especificação do Java 7 está descrito como um melhoria na inferência de tipos na criação de instâncias de genéricos.</p>
<p><span id="more-2320"></span></p>
<p style="text-align: justify;">Na prática, a gente transforma código assim:</p>
<pre class="brush: java; title: ; notranslate">		List&lt;String&gt; listaStringDiamante = new ArrayList&lt;String&gt;();
		Map&lt;String, Integer&gt; dicionario = new HashMap&lt;String, Integer&gt;();</pre>
<p style="text-align: justify;">Em código assim:</p>
<pre class="brush: java; title: ; notranslate">		List&lt;String&gt; listaStringDiamante = new ArrayList&lt;&gt;();
		Map&lt;String, Integer&gt; dicionario = new HashMap&lt;&gt;();
</pre>
<p style="text-align: justify;">Você pode se perguntar, mas antes eu podia fazer assim:</p>
<pre class="brush: java; title: ; notranslate">List&lt;String&gt; listaString = new ArrayList();</pre>
<p style="text-align: justify;">Para demonstrar que isso é um problema, veja o seguinte código:</p>
<pre class="brush: java; title: ; notranslate">		List&lt;String&gt; listaString = new ArrayList();
		listaString.add(&quot;String&quot;);
		List&lt;Integer&gt; listaInteger = new ArrayList(listaString); // Sem uso de diamante
		List&lt;Integer&gt; listaIntegerDiamante = new ArrayList&lt;&gt;(listaString); // Com uso de diamante
</pre>
<p style="text-align: justify;">Na linha 3 o compilador permite a inclusão de uma lista de String em uma lista de Integer. Já no caso do operador diamante o compilador infere que o novo ArrayList criado é do tipo Integer e portanto no construtor do generics só vai aceitar coleções que tenham elementos que herdam de Integer. Então na linha 4 temos um erro de compilação. Dessa forma evitamos códigos incorretos!</p>
<p style="text-align: justify;">Outros exemplos possíveis:</p>
<pre class="brush: java; title: ; notranslate">
		List&lt;?&gt; listaDeAlgo = new ArrayList&lt;&gt;();
		List listaSemGenerics = new ArrayList&lt;&gt;();
</pre>
<p style="text-align: justify;">O último exemplo não é recomendado, mas é possível. Um outro ponto, é que não podemos utilizar o operador diamante em classes anônimas. Sem operador diamante isso é possível, por exemplo:</p>
<pre class="brush: java; title: ; notranslate">
		new List&lt;String&gt;() {
		...
		}
</pre>
<p style="text-align: justify;">Só implementar os métodos necessários para o List e a classe anônima funcionará corretamente. O mesmo não é possível com operador diamante:</p>
<pre class="brush: java; title: ; notranslate">
		new List&lt;&gt;() {
		...
		}
</pre>
<p style="text-align: justify;">Nesse caso temos um erro de compilação.</p>
<p style="text-align: justify;">Pontos importantes:</p>
<ol>
<li style="text-align: justify;">Não pode ser utilizado em classe anônima, pois é impossível inferir os tipos.</li>
<li style="text-align: justify;">Você pode colocar espaços no operador diamante, mas por questão de estilo não é recomendado.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/11/diamante-no-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi-catch (Java 7)</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/10/multi-catch-java-7/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/10/multi-catch-java-7/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 16:06:39 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java7]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2312</guid>
		<description><![CDATA[Algo chato que tínhamos que fazer nas versões anteriores de Java era o tratamento individual de cada exceção ou utilizar uma classe mais abrangente (Exception, por exemplo) para realizar o tratamento de todas as possíveis exceções. Nessa versão podemos colocar dentro de um único catch, várias Exceptions apenas separando pelo &#8220;ou&#8221; (pipe &#8220;&#124;&#8221;). De maneira [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Algo chato que tínhamos que fazer nas versões anteriores de Java era o tratamento individual de cada exceção ou utilizar uma classe mais abrangente (Exception, por exemplo) para realizar o tratamento de todas as possíveis exceções. Nessa versão podemos colocar dentro de um único catch, várias Exceptions apenas separando pelo &#8220;ou&#8221; (pipe &#8220;|&#8221;). De maneira sucinta, podemos transformar isso:<br />
<span id="more-2312"></span></p>
<pre class="brush: java; title: ; notranslate">
		try {
			System.out.println(10 / 0);
		} catch (ArithmeticException e) {
			System.out.println(&quot;Erro: &quot; + e.getMessage());
		} catch (IllegalArgumentException e) {
			System.out.println(&quot;Erro: &quot; + e.getMessage());
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println(&quot;Erro: &quot; + e.getMessage());
		}
</pre>
<p style="text-align: justify;">No seguinte código:</p>
<pre class="brush: java; title: ; notranslate">
		try {
			System.out.println(10 / 0);
		} catch (ArithmeticException | IllegalArgumentException | ArrayIndexOutOfBoundsException e) {
			System.out.println(&quot;Erro: &quot; + e.getMessage());
		}
</pre>
<p style="text-align: justify;">Pontos importantes:</p>
<ol style="text-align: justify;">
<li>A variável declarada dentro do catch é sempre final. Ou seja, não podemos atribuir valores à ela.</li>
<li>Como nas outras versões do Java, as variáveis dentro do catch precisam ser filhas de Throwable</li>
<li>Se mais de uma variável for declarada, elas não podem ser do mesmo subtipo da outra. Por exemplo: se A está declarada FilhaDeA (extends A) não pode ser declarada no mesmo catch.</li>
</ol>
<p style="text-align: justify;">Portanto o seguinte código não compila:</p>
<pre class="brush: java; title: ; notranslate">
		try {
			int a = 0;
			if(a==0) {
				throw new FilhaDeA();
			} else {
				throw new A();
			}
		} catch (FilhaDeA | A e) {
			System.out.println(&quot;Erro: &quot; + e.getMessage());
		}
</pre>
<p style="text-align: justify;">Como FilhaDeA é filha da classe A (extends A), todas as exceções do tipo A (inclusive FilhaDeA) já são capturadas com a declaração de A no catch. Por esse motivo o código não é compilável.</p>
<p style="text-align: justify;">Dessa maneira o tratamento de erros se torna mais simplificado e melhora a legibilidade de código.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/10/multi-catch-java-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fechar recursos automaticamente (Java 7)</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/09/fechar-recursos-automaticamente-java-7/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/09/fechar-recursos-automaticamente-java-7/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 22:49:49 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java7]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2296</guid>
		<description><![CDATA[O Java 7 possui uma funcionalidade interessante para diminuir um pouco o código e evitar problemas em locais onde recursos precisam ser fechados (conexão com banco, manipulação de arquivos, sockets, streams em geral, &#8230;). Essa funcionalidade é conhecida como try-with-resources. Antes do Java 7, para ler um arquivo tínhamos que fazer o seguinte: Com o uso [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O Java 7 possui uma funcionalidade interessante para diminuir um pouco o código e evitar problemas em locais onde recursos precisam ser fechados (conexão com banco, manipulação de arquivos, sockets, streams em geral, &#8230;). Essa funcionalidade é conhecida como try-with-resources.</p>
<p style="text-align: justify;">Antes do Java 7, para ler um arquivo tínhamos que fazer o seguinte:</p>
<p><span id="more-2296"></span></p>
<pre class="brush: java; title: ; notranslate">
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(&quot;teste.txt&quot;));
			String txt = null;
			while ((txt = br.readLine()) != null) {
				System.out.println(txt);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br!=null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
</pre>
<p style="text-align: justify;">Com o uso do try-with-resources, podemos eliminar o &#8220;fechamento&#8221; do arquivo:</p>
<pre class="brush: java; title: ; notranslate">
		try (BufferedReader br = new BufferedReader(new FileReader(&quot;teste.txt&quot;))) {
			String txt = null;
			while ((txt = br.readLine()) != null) {
				System.out.println(txt);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
</pre>
<p style="text-align: justify;">Dentro dos parênteses do try devemos colocar a declaração de uma ou mais variáveis de classes que implementam a interface <a title="AutoCloseable" href="http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html" target="_blank">AutoCloseable</a>. Para garantir que isso funciona, vamos criar uma classe que implementa a interface AutoCloseable:</p>
<pre class="brush: java; title: ; notranslate">
public class AutoFechavel implements AutoCloseable {
	@Override
	public void close() throws Exception {
		System.out.println(&quot;Fechou!!!&quot;);
	}
}
</pre>
<p style="text-align: justify;">Agora vamos colocá-la dentro do novo try:</p>
<div>
<pre class="brush: java; title: ; notranslate">
package br.com.thiagovespa.sample.java7;
public class TryWithResources {
	public static void main(String[] args) {
		try (AutoFechavel af = new AutoFechavel()) {
			System.out.print(&quot;Ahh eu aqui. &quot;);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
</pre>
</div>
<div></div>
<p style="text-align: justify;">A saída desse código será: &#8220;Ahh eu aqui. Fechou!!!&#8221;. Demonstrando que após finalizar o bloco try, o método close() é chamado automaticamente.</p>
<p style="text-align: justify;">Podemos também ter duas ou mais variáveis dentro do try. Juntando os dois exemplos, temos:</p>
<div>
<pre class="brush: java; title: ; notranslate">
		try (AutoFechavel af = new AutoFechavel();
				BufferedReader br = new BufferedReader(new FileReader(
						&quot;teste.txt&quot;))) {
			System.out.print(&quot;Ahh eu aqui. &quot;);
			String txt = null;
			while ((txt = br.readLine()) != null) {
				System.out.println(txt);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
</pre>
</div>
<p style="text-align: justify;">Como as classes antigas também foram modificadas para implementar a interface AutoCloseable, podemos também utilizar essa funcionalidade em classes que realizam conexão com o banco (ResultSet, PreparedStatement, Connection, &#8230;) e com isso nossa vida fica bem mais fácil!</p>
<p style="text-align: justify;">Pontos importantes:</p>
<ol>
<li style="text-align: justify;">As variáveis declaradas dentro do try-with-resources são marcadas como final.</li>
<li style="text-align: justify;">A classe da variável declarada deve implementar a interface AutoCloseable</li>
<li style="text-align: justify;">O escopo da variável é somente dentro do bloco try (completo)</li>
<li style="text-align: justify;">As variáveis tem que ter nomes diferentes se estiverem dentro de um mesmo bloco try</li>
<li style="text-align: justify;">Os recursos são iniciados da esquerda pra direita (de acordo com a declaração) e são fechados da direita pra esquerda.</li>
<li style="text-align: justify;">Se o recurso for nulo ele não é fechado</li>
<li style="text-align: justify;">Se um recurso lançar exceção ao fechar, os outros recursos continuarão a serem fechados (exceção suprimida).</li>
<li style="text-align: justify;">Quando as exceções forem suprimidas, você pode recuperá-las utilizando o método: Throwable.getSuppressed()(normalmente dentro do catch)</li>
</ol>
<p style="text-align: justify;">Um dos problemas comum é atribuir um novo valor para a variável utilizada dentro do try-with-resources:</p>
<pre class="brush: java; highlight: [6,10]; title: ; notranslate">
		try (BufferedReader br = new BufferedReader(new FileReader(&quot;teste.txt&quot;))) {
			String txt = null;
			while ((txt = br.readLine()) != null) {
				System.out.println(txt);
			}
			br = new BufferedReader(new FileReader(&quot;novoArquivo.txt&quot;));
		} catch (Exception e) {
			e.printStackTrace();
			if (e.getSuppressed() != null) {
				for (Throwable t : e.getSuppressed()) {
					t.printStackTrace();
				}
			}
		}
</pre>
<p style="text-align: justify;">Na linha 6 estamos atribuindo para uma variável final. Isso vai ocasionar erro de compilação. Na linha 10 temos um exemplo de como recuperar as exceções suprimidas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/09/fechar-recursos-automaticamente-java-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Números Binários e com underscore (Java 7)</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/09/numeros-binarios-e-com-underscore-java-7/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/09/numeros-binarios-e-com-underscore-java-7/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 20:04:01 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java7]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2289</guid>
		<description><![CDATA[Na versão 7 do Java, além de representar número decimais, hexadecimais e octais, podemos representar números binários e separar os dígitos com underscore (_). Pontos importantes: O underscore não pode aparecer imediatamente após 0x, 0X , 0b ou 0B O underscore não pode aparecer antes do primeiro dígito e nem após o último dígito Um número [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Na versão 7 do Java, além de representar número decimais, hexadecimais e octais, podemos representar números binários e separar os dígitos com underscore (_).</p>
<p style="text-align: justify;">Pontos importantes:</p>
<ol>
<li style="text-align: justify;">O underscore não pode aparecer imediatamente após 0x, 0X , 0b ou 0B</li>
<li style="text-align: justify;">O underscore não pode aparecer antes do primeiro dígito e nem após o último dígito</li>
<li style="text-align: justify;">Um número binário começa sempre com 0B ou 0b e só aceita valores 0 e 1 (binário, duh! <img src='http://www.thiagovespa.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' title="Números Binários e com underscore (Java 7)" /> )</li>
<li style="text-align: justify;">A utilizar o P, p , E ou e para representação com expoente (binário e decimal), pode-se utilizar underscore, mas seguindo a regra 2 para o expoente.</li>
</ol>
<p><span id="more-2289"></span></p>
<p style="text-align: justify;">Exemplo de números válidos:</p>
<pre class="brush: java; title: ; notranslate">
		int n1 = 1234_5678;
		long n2 = 1_2_3_4__5_6_7_8L;
		int n3 = 0b0001_0010_0100_1000;
		double n4 = 3.141_592_653_589_793d; // PI
		double n5 = 0x1.ffff_ffff_ffff_fP1_023; // Double.MAX_VALUE
</pre>
<p style="text-align: justify;">Exemplo de números inválidos</p>
<pre class="brush: java; title: ; notranslate">
		int n6 = _1234;
		int n7 = 0x_1234;
		int n8 = 1234_;
		int n9 = 0x1.0_p_-1022;
		int n10 = 0b12;
</pre>
<p style="text-align: justify;">A linha 1 quebra a regra 2, pois está iniciando com underscore. A linha 2 quebra a regra 1, pois o inderscore está logo após o 0x. A linha 3 quebra a regra 2 pois o underscore está após o último dígito. A linha 4 quebra a regra 2 e a regra 4, pois o underscore está após o último dígito e antes do primeiro do expoente. A linha 5 quebra a regra 3, pois aparece o número 2 que não faz parte dos números binários.</p>
<p style="text-align: justify;">Essa alteração no Java 7 ajuda na legibilidade do código, principalmente para trabalhar com valores grandes (p. ex: 1_000_000_000 &#8211; um bilhão) ou com números binários.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/09/numeros-binarios-e-com-underscore-java-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String no Switch (Java 7)</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/09/string-no-switch-java-7/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/09/string-no-switch-java-7/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 17:21:48 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java7]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2280</guid>
		<description><![CDATA[No Java 7, temos um recurso bastante interessante que é o uso de String no bloco switch. Na minha opinião, é um recurso útil que demorou bastante para ser incorporado na linguagem. Pontos importantes: É proibido o uso de null nas cláusulas case O uso de null na verificação do switch irá gerar um NullPointerException [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No Java 7, temos um recurso bastante interessante que é o uso de String no bloco switch. Na minha opinião, é um recurso útil que demorou bastante para ser incorporado na linguagem.</p>
<p style="text-align: justify;">Pontos importantes:</p>
<ol>
<li style="text-align: justify;">É proibido o uso de null nas cláusulas case</li>
<li style="text-align: justify;">O uso de null na verificação do switch irá gerar um NullPointerException</li>
<li style="text-align: justify;">Os elementros utilizados nas cláusulas case tem que ter o modificador final</li>
<li style="text-align: justify;">Não é permitido valores duplicados no case</li>
</ol>
<p><span id="more-2280"></span></p>
<p style="text-align: justify;">Exemplo de código correto:</p>
<pre class="brush: java; title: ; notranslate">
		String nome = &quot;Thiago&quot;;
		final String SOBRENOME = &quot;Vespa&quot;;
		switch (nome) {
		case &quot;Thiago&quot;:
			System.out.println(&quot;Esse é o meu primeiro nome!&quot;);
			break;
		case &quot;Galbiatti&quot;:
			System.out.println(&quot;Esse é o meu nome do meio!&quot;);
			break;
		case SOBRENOME:
			System.out.println(&quot;Esse é o meu sobrenome!&quot;);
			break;
		default:
			System.out.println(&quot;Não sei o que é isso!&quot;);
		}
</pre>
<p>Exemplo de código não compilável ao utilizar null no case:</p>
<pre class="brush: java; highlight: [13]; title: ; notranslate">
		String nome = &quot;Thiago&quot;;
		final String SOBRENOME = &quot;Vespa&quot;;
		switch (nome) {
		case &quot;Thiago&quot;:
			System.out.println(&quot;Esse é o meu primeiro nome!&quot;);
			break;
		case &quot;Galbiatti&quot;:
			System.out.println(&quot;Esse é o meu nome do meio!&quot;);
			break;
		case SOBRENOME:
			System.out.println(&quot;Esse é o meu sobrenome!&quot;);
			break;
		case null:
			System.out.println(&quot;Null não pode!&quot;);
			break;
		default:
			System.out.println(&quot;Não sei o que é isso!&quot;);
		}
</pre>
<p>Exemplo de código que gera um NullPointerException:</p>
<pre class="brush: java; highlight: [1,3]; title: ; notranslate">
		String nome = null;
		final String SOBRENOME = &quot;Vespa&quot;;
		switch (nome) {
		case &quot;Thiago&quot;:
			System.out.println(&quot;Esse é o meu primeiro nome!&quot;);
			break;
		case &quot;Galbiatti&quot;:
			System.out.println(&quot;Esse é o meu nome do meio!&quot;);
			break;
		case SOBRENOME:
			System.out.println(&quot;Esse é o meu sobrenome!&quot;);
		default:
			System.out.println(&quot;Não sei o que é isso!&quot;);
		}
</pre>
<p>Exemplo de código não compilável por não possuir o modificador final e ser utilizado no case:</p>
<pre class="brush: java; highlight: [2,10]; title: ; notranslate">
		String nome = &quot;Thiago&quot;;
		String SOBRENOME = &quot;Vespa&quot;;
		switch (nome) {
		case &quot;Thiago&quot;:
			System.out.println(&quot;Esse é o meu primeiro nome!&quot;);
			break;
		case &quot;Galbiatti&quot;:
			System.out.println(&quot;Esse é o meu nome do meio!&quot;);
			break;
		case SOBRENOME:
			System.out.println(&quot;Esse é o meu sobrenome!&quot;);
			break;
		default:
			System.out.println(&quot;Não sei o que é isso!&quot;);
		}
</pre>
<p>E por último, exemplo de um código não compilável por ter elementos duplicados no case:</p>
<pre class="brush: java; highlight: [4,7]; title: ; notranslate">
		String nome = &quot;Thiago&quot;;
		final String SOBRENOME = &quot;Vespa&quot;;
		switch (nome) {
		case &quot;Thiago&quot;:
			System.out.println(&quot;Esse é o meu primeiro nome!&quot;);
			break;
		case &quot;Thiago&quot;:
			System.out.println(&quot;Esse é o meu primeiro nome novamente!&quot;);
			break;
		case SOBRENOME:
			System.out.println(&quot;Esse é o meu sobrenome!&quot;);
			break;
		default:
			System.out.println(&quot;Não sei o que é isso!&quot;);
		}
</pre>
<p>É isso. Agora só usar String no switch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/09/string-no-switch-java-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Telnet via WebService</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/09/telnet-via-webservice/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/09/telnet-via-webservice/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 15:43:53 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[telnet]]></category>
		<category><![CDATA[webservices]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2257</guid>
		<description><![CDATA[Em vários projetos, é necessário integração com legado (sistema antigo que o cliente não quer migrar). E em alguns casos específicos essa integração pode ser um pouco mais complicada do que leitura de arquivos textos, troca de informações em base e afins. Nesse post eu irei explicar como criar um Web Service que faz a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Em vários projetos, é necessário integração com legado (sistema antigo que o cliente não quer migrar). E em alguns casos específicos essa integração pode ser um pouco mais complicada do que leitura de arquivos textos, troca de informações em base e afins. Nesse post eu irei explicar como criar um Web Service que faz a autenticação em um servidor Telnet e executa comandos nesse servidor. Essa é mais uma maneira (não tão convencional) de se realizar integração com legado.</p>
<p style="text-align: justify;">Como client de Telnet, iremos utilizar a biblioteca Commons Net da Apache. Faça o download <a title="Commons Net Download" href="http://commons.apache.org/net/download_net.cgi" target="_blank">nesse site</a>, descompacte-a e localize o jar da biblioteca. Crie um projeto e adicione as duas libs (jars) no classpath (build path no Eclipse e libraries no JDeveloper e Netbeans). Crie um WebService (JAX-WS) conforme o exemplo abaixo:</p>
<p><span id="more-2257"></span></p>
<pre class="brush: java; highlight: [17,22,24,48,61]; title: ; notranslate">
package br.com.thiagovespa.ws.telnet;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.SocketException;
import javax.jws.*;
import org.apache.commons.net.telnet.TelnetClient;
@WebService
public class TelnetService {
	private final static String HOST = &quot;192.168.1.100&quot;;
	private final static String VALID_CHARS = &quot; :-.,!?+=_'\&quot;|\\/;@#$%&amp;*()[]{}&quot;;
	private final static int TIMEOUT = 150000;
	@WebMethod
	public String executeCommand(String user, String password,
			String delimiter, String command, boolean showLogin)
			throws SocketException, IOException {
		if (hasSpecialChar(delimiter)) {
			return &quot;Não utilize caracteres especiais como delimitador. Caracteres válidos: letras, espaço e números e &quot;
					+ VALID_CHARS;
		}
		StringBuilder retorno = new StringBuilder();
		TelnetClient telnet = new TelnetClient();
		telnet.setDefaultTimeout(TIMEOUT);
		telnet.connect(HOST);
		if (!telnet.isConnected()) {
			return &quot;ERRO: Não foi possível conectar na telnet&quot;;
		}
		telnet.setSoTimeout(TIMEOUT);
		InputStream in = telnet.getInputStream();
		PrintStream out = new PrintStream(telnet.getOutputStream());
		doLogin(user, password, (showLogin ? retorno : null), in, out);
		write(command, out);
		readValues(delimiter, in, retorno);
		return retorno.toString();
	}
	private void doLogin(String user, String password, StringBuilder retorno,
			InputStream in, PrintStream out) {
		readValues(&quot;login: &quot;, in, retorno);
		if (retorno != null) {
			retorno.append(&quot;\n&quot;);
		}
		write(user, out);
		readValues(&quot;Password:&quot;, in, retorno);
		if (retorno != null) {
			retorno.append(&quot;\n&quot;);
		}
		write(password, out);
		readValues(&quot;&gt;&quot;, in, retorno);
	}
	private void readValues(String endString, InputStream in,
			StringBuilder retorno) {
		try {
			char lastChar = endString.charAt(endString.length() - 1);
			StringBuilder sb = new StringBuilder();
			char ch = (char) in.read();
			while (true) {
				sb.append(ch);
				if (ch == lastChar) {
					if (sb.toString().endsWith(endString)) {
						if (retorno != null) {
							retorno.append(removeSpecialChars(sb.toString()));
						}
						return;
					}
				}
				ch = (char) in.read();
			}
		} catch (Exception e) {
			e.printStackTrace();
			if (retorno != null) {
				retorno.append(&quot;\nERRO: &quot;).append(e.getMessage()).toString();
			}
		}
	}
	private void write(String value, PrintStream out) {
		try {
			out.println(value + &quot;\n&quot;);
			out.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	private boolean isSpecialChar(char ch) {
		if (Character.isLetterOrDigit(ch) || ch == '\n'
				|| VALID_CHARS.indexOf(ch) &gt;= 0)
			return false;
		return true;
	}
	private boolean hasSpecialChar(String str) {
		for (char ch : str.toCharArray()) {
			if (isSpecialChar(ch))
				return true;
		}
		return false;
	}
	private String removeSpecialChars(String str) {
		StringBuilder sb = new StringBuilder();
		for (char ch : str.toCharArray()) {
			if (!isSpecialChar(ch)) {
				sb.append(ch);
			}
		}
		return sb.toString();
	}
}
</pre>
<p style="text-align: justify;">O serviço recebe como parâmetro cinco informações: o usuário, senha, um delimitador de comando, o comando a ser executado e um booleano para informar se é pra retornar todos os dados ou somente as informações após fazer o login. A conexão com Telnet é feita na linha 22 e 24. Após à conexão efetuada, informamos o usuário e a senha utilizando o método doLogin(). Na linha 48 utilizamos o caracter &#8220;&gt;&#8221; como delimitador de fim do comando de login. Você pode substituí-lo pelo correspondente no seu server de Telnet.</p>
<p style="text-align: justify;">Na linha 61 e 17 evitamos o uso de caracteres especiais para não termos problemas com o nosso cliente de WebService. Você pode utilizar outro tratamento, por exemplo: utilizar o CDATA ou realizar escape dos caracteres.</p>
<p style="text-align: justify;">Agora é só executar o serviço passando os parâmetros adequados. O importante é passar corretamente o delimitador. Esse campo indica quando terminou a execução de um comando e quando o serviço pode retornar a resposta. Você pode inclusive executar os comandos com parâmetros e utilizar o operador &amp;&amp; para executar mais de um comando. Abaixo temos o exemplo de uma requisição:</p>
<pre class="brush: xml; title: ; notranslate">
         usuario
         senha
         FIM
         &lt;![CDATA[ ps &amp;&amp; comandoQueImprimiFim ]]&gt;
         false
</pre>
<p style="text-align: justify;">Com essa execução, a resposta seria:</p>
<pre class="brush: xml; title: ; notranslate">
         ps &amp;&amp; comandoQueImprimiFim
   PID  CLS PRI TTY      TIME COMD
  6626   TS  59 pts134   0:00 ps
  5867   TS  70 pts134   0:00 bash
FIM
</pre>
<p style="text-align: justify;">Aí é só utilizar essa resposta em qualquer outro sistema que posso se comunicar via WebService SOAP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/09/telnet-via-webservice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualizando a árvore JNDI no WebLogic Server</title>
		<link>http://www.thiagovespa.com.br/blog/2012/04/01/visualizando-a-arvore-jndi-no-weblogic-server/</link>
		<comments>http://www.thiagovespa.com.br/blog/2012/04/01/visualizando-a-arvore-jndi-no-weblogic-server/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 20:36:32 +0000</pubDate>
		<dc:creator>Thiago Galbiatti Vespa</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[WebLogic]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[weblogic]]></category>
		<guid isPermaLink="false">http://www.thiagovespa.com.br/blog/?p=2261</guid>
		<description><![CDATA[Em alguns casos você precisa ver se o objeto que você está recuperando foi publicado no JNDI ou é necessário procurar por objetos na árvore JNDI. Por exemplo, verificar se o JNDI de um Data Source criado está disponível no servidor (pode não estar por um target errado) ou verificar o caminho para recuperar um [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Em alguns casos você precisa ver se o objeto que você está recuperando foi publicado no JNDI ou é necessário procurar por objetos na árvore JNDI. Por exemplo, verificar se o JNDI de um Data Source criado está disponível no servidor (pode não estar por um target errado) ou verificar o caminho para recuperar um destination de um módulo JMS, entre outros.</p>
<p style="text-align: justify;">Para visualizar a estrutura JNDI do WebLogic. Acesse o console (http://IP:PORTA/console) vá em Environment, Servers, selecione o servidor desejado e clique em View JNDI Tree. Está meio escondido, mas pela imagem abaixo fica mais fácil achar:</p>
<div id="attachment_2262" class="wp-caption aligncenter" style="width: 216px"><a href="http://www.thiagovespa.com.br/blog/wp-content/uploads/2012/04/ViewJNDITree.png"><img class="size-full wp-image-2262" title="View JNDI Tree" src="http://www.thiagovespa.com.br/blog/wp-content/uploads/2012/04/ViewJNDITree.png" alt="View JNDI Tree" width="206" height="237" /></a><p class="wp-caption-text">View JNDI Tree</p></div>
<p>Irá abrir uma nova janela onde você visualizar toda estrutura JNDI do server selecionado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thiagovespa.com.br/blog/2012/04/01/visualizando-a-arvore-jndi-no-weblogic-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.171 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-19 06:01:57 -->
<!-- Compression = gzip -->
