<?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>WEBCODELOG &#187; Programação</title>
	<atom:link href="http://www.lucianosilva.com/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lucianosilva.com</link>
	<description>free codes, enjoy</description>
	<lastBuildDate>Mon, 14 Jun 2010 00:34:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Maven2 com Oracle JDBC</title>
		<link>http://www.lucianosilva.com/2010/06/09/maven2-com-oracle-jdbc/</link>
		<comments>http://www.lucianosilva.com/2010/06/09/maven2-com-oracle-jdbc/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 00:01:59 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[ojdbc]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=396</guid>
		<description><![CDATA[Se você é um dos milhares que sofre com o erro abaixo, fique calmo, o seu problema está resolvido! [INFO] Unable to find resource 'com.oracle:ojdbc14:jar:10.2.0.3.0' in repository central (http://repo1.maven.org/maven2) [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to resolve artifact. Missing: ---------- 1) com.oracle:ojdbc14:jar:10.2.0.3.0 Try downloading the file manually from the project website. Then, [...]]]></description>
			<content:encoded><![CDATA[<p>Se você é um dos milhares que sofre com o erro abaixo, fique calmo, o seu problema está resolvido!</p>
<pre class="brush: bash;">
[INFO] Unable to find resource 'com.oracle:ojdbc14:jar:10.2.0.3.0' in repository central
(http://repo1.maven.org/maven2)

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) com.oracle:ojdbc14:jar:10.2.0.3.0

 Try downloading the file manually from the project website.

 Then, install it using the command:
 mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14
-Dversion=10.2.0.3.0 -Dpackaging=jar -Dfile=/path/to/file

 Alternatively, if you host your own repository you can deploy the file there:
 mvn deploy:deploy-file -DgroupId=com.oracle -DartifactId=ojdbc14
-Dversion=10.2.0.3.0 -Dpackaging=jar -Dfile=/path/to/file -
Durl=[url] -DrepositoryId=[id]

 Path to dependency:
 1) br.com.ninecon.core:isupport:war:0.0.1-SNAPSHOT
 2) com.oracle:ojdbc14:jar:10.2.0.3.0
</pre>
<p>É possível configurar o repositório do Maven, utilizando a biblioteca localmente, ou seja, se você já tem o arquivo .jar em seu computador, pode corrigir o problema adicionando este arquivo ao repositório.</p>
<p>No meu caso foi simples, pois eu já tinha o banco de dados Oracle instalado localmente, mas caso você não tenha, faça o <a href="http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html" target="_blank">download </a>library OJDBC.</p>
<p>Acesse o diretório onde esta o arquivo jar.</p>
<pre class="brush: bash;">
C:\Users\luciano&gt;cd %ORACLE_HOME%/jdbc/lib
</pre>
<p>Execute o comando de instalação da library conforme abaixo passando os parametros necessários. No exemplo o banco utilizado é o 10.2.0.3.0.</p>
<pre class="brush: bash;">
c:\oracle\product\10.2.0\db_1\jdbc\lib&gt;mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=oracle -Dversion=10.2.0.3.0 -Dpackaging=jar -DgeneratePom=true
</pre>
<pre class="brush: bash;">
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'install'.
[INFO] org.apache.maven.plugins: checking for updates from central
[INFO] org.codehaus.mojo: checking for updates from central
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [install:install-file] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [install:install-file {execution: default-cli}]
[INFO] Installing c:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar to C:\Users\luciano\.m2\repository\com\oracle\oracle\10.2.0.3
.0\oracle-10.2.0.3.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Wed Jun 09 20:32:02 BRT 2010
[INFO] Final Memory: 3M/15M
[INFO] ------------------------------------------------------------------------
'cmd' is not recognized as an internal or external command,
operable program or batch file.
c:\oracle\product\10.2.0\db_1\jdbc\lib&gt;
</pre>
<p>Perceba que o <strong>artifactId</strong> esta como <strong>oracle</strong>, portanto o seu pom.xml deve ser modificado também.</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2010/06/maven-oracle.png"><img class="aligncenter size-full wp-image-402" title="maven-oracle" src="http://www.lucianosilva.com/wp-content/uploads/2010/06/maven-oracle.png" alt="" width="483" height="196" /></a></p>
<p>Com este simples comando você resolverá um problemão chato! ;)</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "he-man, anos 80, anos 90";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2010/06/09/maven2-com-oracle-jdbc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autenticação e Autorização com a API do Twitter</title>
		<link>http://www.lucianosilva.com/2010/02/13/autenticacao-e-autorizacao-com-a-api-do-twitter/</link>
		<comments>http://www.lucianosilva.com/2010/02/13/autenticacao-e-autorizacao-com-a-api-do-twitter/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 00:27:01 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Redes Sociais]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=366</guid>
		<description><![CDATA[O Twitter veio para ficar e isto eu não discuto e, este blog quando empolgado com o micro-blog público um exemplo simples de como utilizar o Twitter4j. Agora estou tentando mostrar uma forma mais avançada de comunicação com o Twitter, utilizando o modo de autenticação/autorização. No exemplo anterior além de obter o Customer Key e [...]]]></description>
			<content:encoded><![CDATA[<p>O Twitter veio para ficar e isto eu não discuto e, este blog quando empolgado com o micro-blog<a href="http://www.lucianosilva.com/2009/01/21/conhecendo-a-api-do-twitter/"> público um exemplo</a> simples de como utilizar o Twitter4j. Agora estou tentando mostrar uma forma mais avançada de comunicação com o Twitter, utilizando o modo de autenticação/autorização.</p>
<p>No exemplo anterior além de obter o Customer Key e Secret, você irá precisar do Usuário e Senha do Twitter, para assim obter a comunicação devida. Bem, nem todo mundo sente-se disposto a oferecer seus dados confidênciais para um software ou site qualquer. Portanto, este novo exemplo mostrará como você deve comunicar com o Twitter deixando a autenticação por parte do micro-blog e autorização por parte do próprio usuário.</p>
<p>Dando sequência ao assunto, inicialmente você precisará <a href="https://twitter.com/apps/new">registrar uma aplicação</a> no  Twitter caso ainda não a tenha, guarde os dados Consumer Key e Secret. Existem dois tipos de aplicações a Client (Desktop) e Browser (Web), sendo que a segunda precisará de uma url que receberá o Token de autenticação.</p>
<p><span style="text-decoration: line-through;"><span style="color: #ff0000;">Infelizmente, este post foi prejudicado pela falta de um web hosting que suporte Java, a Locaweb (atual host deste blog) cobra valores mensais absurdos, que inviabiliza blogs com intuito simplesmente acadêmico, como este, de realizar testes utilizando a linguagem Java.</span></span></p>
<p>Consegui descobrir lendo <a href="http://code.google.com/p/twitter-api/issues/detail?id=534" target="_blank">aqui</a>, <a href="http://www.tonyamoyal.com/2009/08/17/how-to-quickly-set-up-a-test-for-twitter-oauth-authentication-from-your-local-machine/" target="_blank">aqui</a> e<a href="http://www.martinadamek.com/2010/01/28/twitter-oauth-on-java-appengine/" target="_blank"> aqui</a> que é possível configurar o seu localhost como Callback URL no Twitter, assim não será necessário ter um site publicado na internet para seus testes.</p>
<p><strong>Web Autenticação</strong></p>
<p>Durante o registro você irá informar o tipo de aplicação Browser e uma Callback URL, é para onde o navegador será redirecionado após a autorização do usuário. Já o campo Application Website, é a origem da sua aplicação web, ou seja, serão aceitas as chamadas feitas apenas a partir deste site.</p>
<p>O código abaixo irá fazer iniciar o processo de autenticação, o navegador vai ser redirecionado para a página de login do Twitter.</p>
<pre class="brush: java;">
 final String CALLBACK_URL     = &quot;http://127.0.0.1:8080/BlogTwitt4u/&quot;; // a mesma configurada na aplicação
 final String CUSTOMER_KEY     = &quot;6MWotGxvuNVGfK4lDqAqhg&quot;;
 final String CUSTOMER_SEC     = &quot;oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUpqSY&quot;;

 OAuthConsumer consumer         = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);
 OAuthProvider provider         = new DefaultOAuthProvider( &quot;https://twitter.com/oauth/request_token&quot;,
 &quot;https://twitter.com/oauth/access_token&quot;,
 &quot;https://twitter.com/oauth/authorize&quot; );

 //
 // Solicita a autorização
 //
 String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
 session.setAttribute(&quot;token&quot;,         consumer.getToken());
 session.setAttribute(&quot;tokenSecret&quot;, consumer.getTokenSecret());

 //
 //
 // Redireciona para  o Twitter solicitar o Usuário e Senha, e Autorização para a aplicação
 // Em seguida será redirecionado para a callback url
 response.sendRedirect(authUrl);
</pre>
<p>Após fazer o login e autorizar a sua aplicação, o navegador será redirecionado novamente para o seu site, com dois parâmetros preenchidos, como esta abaixo:</p>
<pre class="brush: java;">

http://127.0.0.1:8080/BlogTwitt4u/?oauth_token=RQVPENBxDbQuI1bJ1rjELuVSyZhMYqr8Fcs5eqyZw&amp;oauth_verifier=a8FuEeitfdCR2IfgisfsHopMAUevs4cDyRWkbZz4
</pre>
<p>Pronto, ai você já pode colher as informações que desejar, veja:</p>
<pre class="brush: java;">
 if( oauthVerifier!=null &amp;&amp; !oauthVerifier.trim().equals(&quot;&quot;) ){

 String token            = (String) session.getAttribute(&quot;token&quot;);
 String tokenSecret        = (String) session.getAttribute(&quot;tokenSecret&quot;);

 //
 consumer.setTokenWithSecret(token, tokenSecret);

 //
 //
 provider.setOAuth10a(true);
 provider.retrieveAccessToken(consumer, oauthVerifier);

 out.println(&quot;&lt;h1&gt;AUTORIZADO!&lt;/h1&gt;&quot;);
 out.println(&quot;&lt;pre&gt;&quot;);
 out.println(&quot;token:\t\t&quot; + consumer.getToken());
 out.println(&quot;tokenSecret:\t\t&quot; + consumer.getTokenSecret());
 out.println(&quot;oauthVerifier:\t\t&quot; + oauthVerifier);
 out.println(&quot;oauthToken:\t\t&quot; + oauthToken);

 //
 //
 URL url                         = new URL(&quot;http://twitter.com/statuses/mentions.json&quot;);
 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
 consumer.sign( urlConnection );
 urlConnection.connect();

 BufferedReader in    = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()) );
 String inputLine     = &quot;&quot;;
 String content       = &quot;&quot;;
 while ((inputLine = in.readLine()) != null){
     content += inputLine;
 }// while end
 in.close();

 int statusCode = urlConnection.getResponseCode();
 out.println(&quot;statusCode: &quot; + statusCode);
 out.println(&quot;&lt;/pre&gt;&quot;);

 JSONArray json = JSONArray.fromObject( content );

 out.println(&quot;&lt;hr&gt;&quot;);
 out.println(&quot;&lt;h3&gt;Mentions&lt;/h3&gt;&quot;);
 out.println(&quot;&lt;pre&gt;&quot;);
 for(int i=0; i&lt;json.size(); i++){

 JSONObject obj = (JSONObject) json.get(i);
 if( obj!=null ){
   // JSONString str = (JSONString) obj.get(&quot;text&quot;);
   out.println(obj.getString(&quot;text&quot;));
 }

 }// for end
 out.println(&quot;&lt;/pre&gt;&quot;);

 }
</pre>
<p><strong>Desktop Autenticação</strong></p>
<p>Este é um exemplo comum, muito conhecido em qualquer pesquisa no Google, para utiliza-lo você deve ter uma aplicação do tipo Client.</p>
<p>O código pede para que o usuário abra o navegador, acesse uma determinada URL e depois informe o código númerico no programa, nada eficaz né? Muitos programadores utilizam uma maneira nada elegante que é a de &#8220;hackear&#8221; esta página e pegar o código automáticamente, facilitando a vida de todo mundo. Faça isto por sua conta e risco. Perceba que quando comparado ao código de autenticação Web a única mudança é a utilização do código PIN, que não necessário informar na web.</p>
<pre class="brush: java;">
&lt;pre&gt;
&lt;pre&gt;&lt;pre&gt;// Lembre-se de modificar estes valores para os seus
//
final String CUSTOMER_KEY = &quot;6MWotGxvuNVGfK4lDq&quot;;
final String CUSTOMER_SEC = &quot;oRH0YviLum2Rrii25ePj0DEk6VnmNjoTG0ESUp&quot;;

try {
HttpURLConnection request = null;
URL url = null;
OAuthConsumer consumer = new DefaultOAuthConsumer(CUSTOMER_KEY, CUSTOMER_SEC);

OAuthProvider provider = new DefaultOAuthProvider( &lt;a href=&quot;https://twitter.com/oauth/request_token&quot;&gt;https://twitter.com/oauth/request_token&lt;/a&gt;,
&quot;https://twitter.com/oauth/access_token&quot;,
&quot;https://twitter.com/oauth/authorize&quot;);

String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
//
// URL Que irá retornar o PIN, necessário para formar o Token
System.out.println(authUrl);

String pinCode = JOptionPane.showInputDialog(&quot;Acesse o endereço:\n&quot; + authUrl + &quot;\nE Informe o PIN:&quot;);
System.out.println(&quot;PIN Code: &quot; + pinCode);

//
provider.retrieveAccessToken(consumer, pinCode);

String tokenKey = consumer.getToken();
String tokenSec = consumer.getTokenSecret();

System.out.println(&quot;Token Key : &quot; + tokenKey);
System.out.println(&quot;Token Sec : &quot; + tokenSec);

consumer.setTokenWithSecret(tokenKey, tokenSec);

url  = new URL(&lt;a href=&quot;http://twitter.com/statuses/mentions.xml&quot;&gt;http://twitter.com/statuses/mentions.xml&lt;/a&gt;);
 request = (HttpURLConnection) url.openConnection();
// sign the request
consumer.sign(request);

// send the request
request.connect();

// response status should be 200 OK
int statusCode = request.getResponseCode();
System.out.println(&quot;Status Code : &quot; + statusCode);

} catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
</pre>
<p>Foram utilizadas as seguintes bibliotecas:<br />
<a href="http://commons.apache.org/beanutils/"> Apache Commons BeansUtil 1.8</a><br />
<a href="http://commons.apache.org/codec/"> Apache Commons Codec 1.4</a><br />
<a href="http://hc.apache.org/httpclient-3.x/"> Apache Http Client 3.1</a><br />
<a href="http://commons.apache.org/lang/"> Apache Commons Lang 2.4</a><br />
<a href="http://ezmorph.sourceforge.net/">ezmorph 1.0.6</a><br />
<a href="http://json-lib.sourceforge.net/"> json-lib 2.3</a></p>
<p>Faça <a href="http://www.lucianosilva.com/download/BlogTwitt4u.zip">download do projeto</a>, que contêm ambos exemplos de autenticação.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "batman, ben10, anime, simpsons";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2010/02/13/autenticacao-e-autorizacao-com-a-api-do-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando a API LastFm em Java</title>
		<link>http://www.lucianosilva.com/2010/02/01/usando-a-api-lastfm-em-java/</link>
		<comments>http://www.lucianosilva.com/2010/02/01/usando-a-api-lastfm-em-java/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 00:41:37 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Redes Sociais]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[lastfm]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=339</guid>
		<description><![CDATA[A LastFm é a queridinha das rádios online, mesmo com diversos concorrentes de alto nível como iLike, Pandora, Imeem, e outros tantos, aqui no Brasil a LastFm é um grande sucesso, seus milhões de usuários brasileiros ignoraram o bloqueio de alguns recursos e continuam fazendo scrobbling de seus áudios diáriamente. Além de um database music, [...]]]></description>
			<content:encoded><![CDATA[<p>A LastFm é a queridinha das rádios online, mesmo com diversos concorrentes de alto nível como iLike, Pandora, Imeem, e outros tantos, aqui no Brasil a LastFm é um grande sucesso, seus milhões de usuários brasileiros ignoraram o bloqueio de alguns recursos <em>e continuam fazendo scrobbling </em>de seus áudios diáriamente.</p>
<p>Além de um database music, o LastFm é uma rede social e grande parte de suas informações são públicas e podem ser acessadas facilmente através de sua API.<br />
Vamos dar inicio a um exemplo de como consumir os dados utilizando a library para Java <a href="http://code.google.com/p/lastfm-java/">lastfm-java</a>. Antes de tudo, se você não tiver uma conta no LastFm, crie-a agora e depois obtenha a <a href="http://www.last.fm/api">API Key</a>. Neste mesmo link você encontrará a documentação da API, que detalha claramente a funcionalidade de cada método disponível e como é o seu acesso e se necessita ou não de autenticação.</p>
<p>Em nosso primeiro exemplo vamos fazer uma página web que irá listar as <strong>últimas faixas ouvidas </strong>e a <strong>lista de amigos</strong> de um usuário específico, com isto, você perceberá que nenhuma autenticação é necessária pois os dados são públicos.</p>
<p>Criei a classe LastFmClient, para facilitar os casts necessários e centralizar as chamadas da API.</p>
<pre class="brush: java;">
public class LastFmClient {
// altere para a sua api key
 private static final String APIKEY = &quot;XyZaBc001&quot;;
 private String uName = null;

/**
 *
 * @param uName
 */
 public LastFmClient(String uName){
 this.uName = uName;
 }

/**
 *
 * @return User/Friends List
 */
 public ArrayList&lt;User&gt; getFriends(){
 return (ArrayList&lt;User&gt;) User.getFriends(uName, APIKEY);
 }

 /**
 *
 * @return Tracks List
 */
 public ArrayList&lt;Track&gt; getTracks(){
 return (ArrayList&lt;Track&gt;) User.getRecentTracks(uName, APIKEY);
 }
}
</pre>
<p>Isto é o suficiente para você montar a lista como descrito acima, veja:</p>
<pre class="brush: java;">
 String userName = request.getParameter(&quot;username&quot;);
 if( userName!=null &amp;&amp; !userName.trim().equals(&quot;&quot;) ){
 // instancia a classe de backend
 LastFmClient client = new LastFmClient(userName);

 // seu código aqui
 }
</pre>
<p>Ouvidas recentemente.</p>
<pre class="brush: java;">
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;1&quot;&gt;
&lt;% for(Track t : tracks){ %&gt;
&lt;tr&gt;
 &lt;td valign=&quot;top&quot; align=&quot;left&quot;&gt;
 &lt;br/&gt;&lt;strong&gt;&lt;%=t.getAlbum() %&gt;&lt;/strong&gt;
 &lt;br/&gt;&lt;em&gt;&lt;%=t.getArtist() %&gt;&lt;/em&gt;
 &lt;/td&gt;
&lt;/tr&gt;
&lt;% }// for end tracks %&gt;
&lt;/table&gt;
</pre>
<p>Lista de amigos.</p>
<pre class="brush: java;">
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;%
 ArrayList&lt;User&gt; friends = client.getFriends();
 int count = 1;
 for(User f : friends){
%&gt;
 &lt;td valign=&quot;top&quot; align=&quot;center&quot;&gt;
 &lt;% if( f.getImageURL()!=null ){ %&gt;&lt;img src=&quot;&lt;%= f.getImageURL() %&gt;&quot;&gt;&lt;% } %&gt;
 &lt;br&gt;&lt;strong&gt;&lt;%=f.getName() %&gt;&lt;/strong&gt;
 &lt;br&gt;&lt;a href=&quot;&lt;%= f.getUrl() %&gt;&quot;&gt;&lt;%= f.getUrl() %&gt;&lt;/a&gt;
 &lt;br/&gt;
 &lt;/td&gt;
&lt;%
 if( count%5==0 ) out.print(&quot;&lt;/tr&gt;&lt;tr&gt;&quot;);
 count++;

 }// for end friends

}//
%&gt;
</pre>
<p><a href="http://www.lucianosilva.com/download/BlogLastFmWeb.zip">Faça download do código completo</a>.</p>
<p>Pronto, você conseguiu acessar dados do LastFm, usando o caminho correto e fácil, sem autenticação. Mas alguns dados são restritos e necessitam da autorização do usuário, informações básicas como a quantidade de músicas ouvidas, data de cadastro, nome, etc. são de acesso restrito.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "música, cd, dvd, bluray";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2010/02/01/usando-a-api-lastfm-em-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulando BLOB &#8211; MySQL vs. Oracle</title>
		<link>http://www.lucianosilva.com/2009/11/16/manipulando-blob-mysql-vs-oracle/</link>
		<comments>http://www.lucianosilva.com/2009/11/16/manipulando-blob-mysql-vs-oracle/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 01:55:03 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=323</guid>
		<description><![CDATA[A missão de um programador em manipular arquivos e armazená-los no banco de dados já não é uma tarefa desafiadora a tempos, visto que é extremamente fácil encontrar exemplos internet a fora, aqui vou fazer mais um, em que o foco é demonstrar a diferença de se realizar o mesmo procedimento utilizando o MySQL e [...]]]></description>
			<content:encoded><![CDATA[<p>A missão de um programador em manipular arquivos e armazená-los no banco de dados já não é uma tarefa desafiadora a tempos, visto que é extremamente fácil encontrar exemplos internet a fora, aqui vou fazer mais um, em que o foco é demonstrar a diferença de se realizar o mesmo procedimento utilizando o MySQL e Oracle.</p>
<p><strong>1. Oracle</strong></p>
<p>Primeiramente vamos fazer o processo para gravar um arquivo qualquer no banco de dados.<br />
Criação da tabela que será utilizada para armazenar os arquivos.</p>
<pre class="brush: sql;">

CREATE TABLE ARQUIVOS(
ID     NUMBER(4)      NOT NULL,
TIPO   VARCHAR2(20)   NULL,
ARQ    BLOB           DEFAULT EMPTY_BLOB() NOT NULL,
CONSTRAINT PKARQ PRIMARY KEY(ID)
)
</pre>
<p>Perceba que o campo ARQ que irá guardar o binário, tem como valor default a propriedade EMPTY_BLOB() &#8211; Retorna um LOB vazio, para ser usado como um indicador para INSERT ou UPDATE.</p>
<p>No geral, o processo para inserir um campo LOB (BLOB ou CLOB) no Oracle é um pouco burocrático, feito em duas etapas. Primeiro deve-se inserir o registro setando o campo BLOB como EMPTY_BLOB, no em seguida finalizamos com um SELECT FOR UPDATE no campo &#8220;LOB&#8221; especifico para que o byte[] seja gravado.</p>
<pre class="brush: java;">

// Inserindo o empty_blob
//
String sql  = &quot;INSERT INTO arquivos(id, tipo, arq) VALUES(1, ?, EMPTY_BLOB())&quot;;
conn   = ConnOracle.getInstance().getConn();
pstmt1   = conn.prepareStatement(sql);
pstmt1.setString(1, &quot;TEXT&quot;);
pstmt1.execute();
</pre>
<p>Este passo irá fazer com que um arquivo seja armazenado no banco.</p>
<pre class="brush: java;">

// Faz o select como for update
// Inserir o binário
//
String ins  = &quot;SELECT arq FROM arquivos WHERE id = 1 FOR UPDATE&quot;;
pstmt2  = conn.prepareStatement(ins);
rset  = pstmt2.executeQuery(ins);
while( rset.next() ){
Blob blob   = rset.getBlob(1);
// filePath eh a String com o caminho do arquivo a ser gravado

File file    = new File( filePath );
byte[] bbuf   = new byte[1024];
InputStream bin  = new FileInputStream( file );
// Realiza o cast especifico para o driver Oracle
OutputStream bout  = ((BLOB) blob).getBinaryOutputStream();

int bytesRead   = 0;
while( (bytesRead = bin.read(bbuf))!=-1 ){
bout.write(bbuf, 0, bytesRead);
}//

if( bout!=null ) bout.close();

}// end while
conn.commit();
</pre>
<p><strong></strong><strong>2. MySQL</strong></p>
<p><strong></strong>A estrutura da tabela muda pouco, o mais importante é que o campo para armazenar o arquivo é do tipo LONGBLOB, veja:</p>
<pre class="brush: sql;">
CREATE TABLE ARQUIVOS(
ID     INT(4)        NOT NULL,
TIPO   VARCHAR(20)   NULL,
ARQ    LONGBLOB      NOT NULL,
PRIMARY KEY(ID)
);
</pre>
<p>Gravar um campo LONGBLOB no MySQL, é tão fácil quando gravar um int ou uma String, e eu não estou falando no sentido figurado.</p>
<pre class="brush: java;">   File file    = new File( filePath );
byte[] bytes  = getBytesFromFile( file );&lt;/pre&gt;
// Inserindo o longblob
//
String sql  = &quot;INSERT INTO arquivos(id, tipo, arq) VALUES(1, ?, ?)&quot;;
conn   = ConnMysql.getInstance().getConn();
pstmt   = conn.prepareStatement(sql);
pstmt.setString(1, &quot;TEXT&quot;);
pstmt.setBytes(2, bytes);
pstmt.execute();
</pre>
<p>O método <em>getBytesFromFile()</em> é uma função genérica para converter o File em byte[], e somente este último é necessário para gravar, fácil assim.</p>
<p>Não posso deixar de indicar <a href="http://javafree.uol.com.br/artigo/851262/Manipulando-campos-BLOB-e-CLOB-com-JDBC.html" target="_blank">este artigo</a> completo e bem detalhado, escrito por <em>Giovane Kuhn</em> do JavaFree.</p>
<p>Espero que estes simples códigos sejam proveitosos, abaixo estão as duas classes utilizadas para este post.</p>
<p><a href="http://www.lucianosilva.com/download/ManipulandoBlob_OracleMysql.zip">Faça download das classes</a>.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "apocalipse, futebol, história, brasil";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/11/16/manipulando-blob-mysql-vs-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enviando e-mail com PL/SQL para múltiplos endereços</title>
		<link>http://www.lucianosilva.com/2009/11/16/enviando-e-mail-com-plsql-para-multiplos-enderecos/</link>
		<comments>http://www.lucianosilva.com/2009/11/16/enviando-e-mail-com-plsql-para-multiplos-enderecos/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 18:54:03 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[utl_mail]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=312</guid>
		<description><![CDATA[A situação mais comum é o envio de e-mail para diversos destinatários, portanto, complementando o código já postado aqui sobre o envio de e-mails utilizando PLSQL. Uma lista de destinatários formatada normalmente assim:  Luciano &#60;luciano@lucianosilva.com&#62;, Grupos &#60;grupos@lucianosilva.com&#62;, Futebol &#60;futebol@cfb.com.br&#62;  Este é o nosso problema, o Oracle não irá conseguir trabalhar com a String formatada dessa [...]]]></description>
			<content:encoded><![CDATA[<p>A situação mais comum é o envio de e-mail para diversos destinatários, portanto, complementando o código já postado <a href="http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/">aqui</a> sobre o envio de e-mails utilizando PLSQL.</p>
<p>Uma lista de destinatários formatada normalmente assim:</p>
<blockquote><p> Luciano &lt;<a href="mailto:luciano@lucianosilva.com">luciano@lucianosilva.com</a>&gt;, Grupos &lt;<a href="mailto:grupos@lucianosilva.com">grupos@lucianosilva.com</a>&gt;, Futebol &lt;<a href="mailto:futebol@cfb.com.br">futebol@cfb.com.br</a>&gt; </p></blockquote>
<p>Este é o nosso problema, o Oracle não irá conseguir trabalhar com a String formatada dessa maneira, e irá lançar o erro:</p>
<blockquote><p><strong>ORA-29279: SMTP permanent error: 501 Bad address syntax</strong></p></blockquote>
<p>Enfim, para conseguir solucionar o problema do envio de e-mail para multiplos destinatários, utilize a função abaixo, ela irá devolver apenas o endereço de e-mail.</p>
<pre class="brush: sql;">

FUNCTION FORMAT_ADDRESS(ADDR_LIST IN OUT VARCHAR2) RETURN VARCHAR2 IS
    ---
    ADDR VARCHAR2(256);
    I    PLS_INTEGER;
    ---
    FUNCTION LOOKUP_UNQUOTED_CHAR(STR IN VARCHAR2, CHRS IN VARCHAR2)
      RETURN PLS_INTEGER AS
      C            VARCHAR2(5);
      I            PLS_INTEGER;
      LEN          PLS_INTEGER;
      INSIDE_QUOTE BOOLEAN;
      ---
    BEGIN
      INSIDE_QUOTE := FALSE;
      I            := 1;
      LEN          := LENGTH(STR);
      WHILE (I &lt;= LEN) LOOP
        C := SUBSTR(STR, I, 1);
        IF (INSIDE_QUOTE) THEN
          IF (C = '&quot;') THEN
            INSIDE_QUOTE := FALSE;
          ELSIF (C = '\') THEN
            I := I + 1; -- Skip the quote character
          END IF;
          GOTO NEXT_CHAR;
        END IF;
        IF (C = '&quot;') THEN
          INSIDE_QUOTE := TRUE;
          GOTO NEXT_CHAR;
        END IF;
        IF (INSTR(CHRS, C) &gt;= 1) THEN
          RETURN I;
        END IF;
        &lt;&lt;NEXT_CHAR&gt;&gt;
        I := I + 1;
      END LOOP;
      RETURN 0;
    END;
  BEGIN
    ADDR_LIST := LTRIM(ADDR_LIST);
    I         := LOOKUP_UNQUOTED_CHAR(ADDR_LIST, ',;');
    IF (I &gt;= 1) THEN
      ADDR      := SUBSTR(ADDR_LIST, 1, I - 1);
      ADDR_LIST := SUBSTR(ADDR_LIST, I + 1);
    ELSE
      ADDR      := ADDR_LIST;
      ADDR_LIST := '';
    END IF;
    I := LOOKUP_UNQUOTED_CHAR(ADDR, '&lt;');
    IF (I &gt;= 1) THEN
      ADDR := SUBSTR(ADDR, I + 1);
      I    := INSTR(ADDR, '&gt;');
      IF (I &gt;= 1) THEN
        ADDR := SUBSTR(ADDR, 1, I - 1);
      END IF;
    END IF;
    RETURN ADDR;
  END FORMAT_ADDRESS;
</pre>
<p>A mudança do código anterior não é tão drástica, já que o parâmetro é entrada/saída, você pode fazer um looping na lista de endereços para adicionar um-a-um.</p>
<pre class="brush: sql;">
UTL_SMTP.MAIL(MAIL_CONN, V_FROM );
    WHILE( V_LIST_ADDRESS IS NOT NULL )LOOP
           UTL_SMTP.RCPT(MAIL_CONN, FORMAT_ADDRESS(V_LIST_ADDRESS) );   
    END LOOP;
</pre>
<p>Veja que é uma modificação simples, porém, ganha-se muito quando é necessário deixar o programa o mais abrangente possível<br />
Enjoy!</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "hobbit, Isaac Asimov, Alice";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/11/16/enviando-e-mail-com-plsql-para-multiplos-enderecos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enviando e-mail com PL/SQL</title>
		<link>http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/</link>
		<comments>http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 16:01:34 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[utl_mail]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=283</guid>
		<description><![CDATA[Em continuidade a nossa série &#8220;as mil-e-uma utilidades do seu banco de dados Oracle&#8221;, agora você poderá descobrir como é fácil enviar e-mails a partir do PL/SQL e saber o quanto isto é produtivo. Vamos lá, para o envio de e-mails é necessário que o pacote UTL_MAIL esteja instalado. Conectando como sysdba na instância ORCL. [...]]]></description>
			<content:encoded><![CDATA[<p>Em continuidade a nossa série &#8220;as mil-e-uma utilidades do seu banco de dados Oracle&#8221;, agora você poderá descobrir como é fácil enviar e-mails a partir do PL/SQL e saber o quanto isto é produtivo.</p>
<p>Vamos lá, para o envio de e-mails é necessário que o pacote UTL_MAIL esteja instalado.</p>
<p>Conectando como sysdba na instância ORCL.</p>
<pre class="brush: sql;">
C:\&gt;set oracle_sid=orcl
C:\&gt;sqlplus sys/oracle as sysdba
</pre>
<p>Instalando o pacote UTL_MAIL. Isto não é nenhuma novidade, mas a variável de ambiente %ORACLE_HOME% indica o caminho a qual o banco de dados foi instalado, neste caso, foi utilizada a versão 10.2.0 &#8211; C:\oracle\product\10.2.0\db_1. Os sub-diretórios, contém os pacotes necessários para o UTL_MAIL funcionar.</p>
<pre class="brush: sql;">
SQL&gt; set serveroutput on
SQL&gt; @%ORACLE_HOME%/rdbms/admin/utlmail.sql
SQL&gt; @%ORACLE_HOME%/rdbms/admin/prvtmail.plb
SQL&gt; show errors;
</pre>
<p>Pronto, isto é o suficiente para o nosso próximo passo, a criação da procedure de envio de e-mails.</p>
<p>Crie uma package para agrupar todas as funcionalidades que podem ser comuns a diversos projetos, e reutilize o código quando necessário.</p>
<pre class="brush: sql;">
create or replace package PKG_BLOG_UTIL is

-- Author  : LUCIANO
-- Created : 05/07/2009

PROCEDURE enviar_email_auth(p_USUARIO   IN VARCHAR2,
p_SENHA     IN VARCHAR2,
p_TO        IN VARCHAR2,
p_COPIA     IN VARCHAR2,
p_SUBJECT   IN VARCHAR2,
p_MESSAGE   IN VARCHAR2);
end PKG_BLOG_UTIL;
</pre>
<p>Veja agora a versão 1.0 desta implementação:</p>
<pre class="brush: sql;">
CREATE OR REPLACE PACKAGE BODY PKG_BLOG_UTIL IS

PROCEDURE ENVIAR_EMAIL_AUTH(P_HOST    IN VARCHAR2,
P_USUARIO IN VARCHAR2,
P_SENHA   IN VARCHAR2,
P_TO      IN VARCHAR2,
P_COPIA   IN VARCHAR2,
P_SUBJECT IN VARCHAR2,
P_MESSAGE IN VARCHAR2)
IS

MAIL_CONN   UTL_SMTP.CONNECTION;
V_HEADER    VARCHAR2(4000);
CRLF        VARCHAR2(2) := CHR(13) || CHR(10); -- quebra de linha

BEGIN

-- Abre a conexão
MAIL_CONN   := UTL_SMTP.OPEN_CONNECTION(P_HOST, 25);
UTL_SMTP.HELO(MAIL_CONN, P_HOST);

-- Faz a autenticação para envio de mensagem
UTL_SMTP.COMMAND(MAIL_CONN, 'AUTH LOGIN');
UTL_SMTP.COMMAND(MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_USUARIO))));
UTL_SMTP.COMMAND(MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_SENHA))));

-- Prepara o cabeçalho de
V_HEADER := 'Date:'    || TO_CHAR(SYSDATE, 'dd Mon yy hh24:mi:ss') || CRLF ||
'From:'    || p_USUARIO || CRLF ||
'Subject:' || p_SUBJECT || CRLF ||
'To:'      || p_TO      || CRLF ||
'Cc:'      || p_COPIA   || CRLF ||
CRLF || CRLF ||
p_MESSAGE;

--
UTL_SMTP.MAIL(MAIL_CONN, '&lt;' || P_USUARIO || '&gt;');
UTL_SMTP.RCPT(MAIL_CONN, '&lt;' || P_TO || '&gt;');
UTL_SMTP.DATA(MAIL_CONN, V_HEADER);

-- Fecha a conexão
UTL_SMTP.QUIT(MAIL_CONN);

END ENVIAR_EMAIL_AUTH;
END PKG_BLOG_UTIL;
</pre>
<p>Algumas coisas podem ser melhoradas como, separar o corpo da mensagem do cabeçalho e utilizar o UTL_TCP.CRLF como separador de linhas no lugar da variável CRLF, veja como o código fica mais organizado:</p>
<pre class="brush: sql;">
/* APENAS UM TRECHO DO CÓDIGO */
UTL_SMTP.MAIL(MAIL_CONN, '&lt;' || P_USUARIO || '&gt;');
UTL_SMTP.RCPT(MAIL_CONN, '&lt;' || P_TO || '&gt;');

UTL_SMTP.open_data(MAIL_CONN);

-- Prepara o cabeçalho
UTL_SMTP.write_data(MAIL_CONN, 'From'    || ': ' || p_USUARIO || UTL_TCP.CRLF);
UTL_SMTP.write_data(MAIL_CONN, 'To'      || ': ' || p_TO      || UTL_TCP.CRLF);
UTL_SMTP.write_data(MAIL_CONN, 'Cc'      || ': ' || p_COPIA   || UTL_TCP.CRLF);
UTL_SMTP.write_data(MAIL_CONN, 'Subject' || ': ' || P_SUBJECT || UTL_TCP.CRLF);

-- Escreve a mensagem
UTL_SMTP.write_data(MAIL_CONN, UTL_TCP.CRLF || p_message);
UTL_SMTP.close_data(MAIL_CONN);
</pre>
<p>Eu preferi adotar este segundo código como o mais recomendável, mesmo assim, alguns detalhes podem ser adaptados a sua realidade, por exemplo, criar uma constante para o Mail Host, e indicando que o envio de e-mails sempre será a partir daquele servidor ou fazer a sobrecarga da procedure &#8211; a reutilização é uma benção.</p>
<p>Veja que a assinatura da procedure abaixo é um overload do que foi mostrado acima, isto é um conceito de Orientação-a-Objetos suportado pelo PLSQL, permite que um método seja escrito com diversas assinaturas diferentes, e reaproveitando o código de maneira eficaz.</p>
<pre class="brush: sql;">
PROCEDURE ENVIAR_EMAIL_AUTH(P_USUARIO IN VARCHAR2,
P_SENHA   IN VARCHAR2,
P_TO      IN VARCHAR2,
P_COPIA   IN VARCHAR2,
P_SUBJECT IN VARCHAR2,
P_MESSAGE IN VARCHAR2)
IS
V_MAILHOST CONSTANT VARCHAR2(100) := 'pop.xxxx.com.br';
BEGIN

enviar_email_auth(P_HOST    =&gt; v_mailhost,
P_USUARIO =&gt; P_USUARIO,
P_SENHA   =&gt; P_SENHA,
P_TO      =&gt; P_TO,
P_COPIA   =&gt; P_COPIA,
P_SUBJECT =&gt; P_SUBJECT,
P_MESSAGE =&gt; P_MESSAGE);
END ENVIAR_EMAIL_AUTH;
</pre>
<p>A package completa, está disponível <a href="http://www.lucianosilva.com/download/pkg_blog_util.rar">aqui </a>para download.</p>
<p>Não envie spam!</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "utl_mail";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/07/05/enviando-e-mail-com-plsql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ToStringUtil() com Annotations versão 1.0.2</title>
		<link>http://www.lucianosilva.com/2009/03/08/tostringutil-com-annotations-versao-102/</link>
		<comments>http://www.lucianosilva.com/2009/03/08/tostringutil-com-annotations-versao-102/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 03:28:32 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[util]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=268</guid>
		<description><![CDATA[Dando continuidade a customização do toString(), certamente existirá aquele atributo que você não irá querer exibir no toString(), então seguindo a dica do @pauloprestes, resolvido com annotations: Aqui está a interface para a anotação, o melhor seria utilizar o Target como FIELD, porém, como falei vamos exibir os atributos com base nos métodos públicos Getters. [...]]]></description>
			<content:encoded><![CDATA[<p>Dando continuidade a customização do toString(), certamente existirá aquele atributo que você não irá querer exibir no toString(), então seguindo a dica do <a href="http://twitter.com/pauloprestes" target="_blank">@pauloprestes</a>, resolvido com annotations:</p>
<p>Aqui está a interface para a anotação, o melhor seria utilizar o Target como FIELD, porém, como falei vamos exibir os atributos com base nos métodos públicos <em>Getters</em>.</p>
<pre class="brush: java;">
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NoToString{}
</pre>
<p>Na classe ToStringUtil foi apenas acrescentado uma regra para não exibir os métodos marcados com a anotação @NoToString, sendo:</p>
<pre class="brush: java;">
// Nao exibir os métodos que estejam com a Annotação NoToString
boolean isNotAnnotation = m.isAnnotationPresent(NoToString.class);
</pre>
<p>Realizei alguns testes com tipos complexos e funcionou, talvez você tenha alguma sugestão para melhorar este tipo de tratamento.</p>
<p>Baixe <a href="http://www.lucianosilva.com/download/ToStringUtil_v1.0.2.zip">aqui</a> a versão 1.0.2.</p>
<p>Namastê!</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "util";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/03/08/tostringutil-com-annotations-versao-102/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Automatizando o toString() versão 1.0.1</title>
		<link>http://www.lucianosilva.com/2009/03/06/automatizando-o-tostring-v1/</link>
		<comments>http://www.lucianosilva.com/2009/03/06/automatizando-o-tostring-v1/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 18:45:32 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[util]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=253</guid>
		<description><![CDATA[É comum sobrescrever o método toString() da classe Object, facilita em situações como quando é necessário saber o conteúdo de um Bean, por exemplo. Sobretudo, reescrever este método poderá ser trabalhoso se você tem muitos atributos e cansativo, se você o fizer para todos os seu beans. Pensando nisso resolvi criar uma classe útil que [...]]]></description>
			<content:encoded><![CDATA[<p>É comum sobrescrever o método <strong>toString()</strong> da classe Object, facilita em situações como quando é necessário saber o conteúdo de um Bean, por exemplo. Sobretudo, reescrever este método poderá ser trabalhoso se você tem muitos atributos e cansativo, se você o fizer para todos os seu beans.</p>
<p>Pensando nisso resolvi criar uma classe útil que mostre todos os atributos Privates da sua classe juntamente com seus respectivos valores. Veja o código abaixo, em um bean eu reescrevi o método toString() fazendo um looping em todos os atributos:</p>
<pre class="brush: java;">
public class Equipamento implements Serializable {
private String modelo;
private String marca;
private String descricao;
private Date fabricacao;

/*** getters/setters ocultados **/

public String toString(){
StringBuffer b = new StringBuffer();
// Obtem todos os atributos da classe
Field[] fields = this.getClass().getDeclaredFields();
b.append( this.getClass().getName() );
b.append( &quot; { \n&quot; );
for (int i = 0; i &lt; fields.length; i++) {
try {

Field field = fields[i];
b.append( field.getName() );
b.append( &quot; = &quot; );
b.append( field.get(this) );
b.append(&quot;\n&quot;);

} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
b.append( &quot; } &quot; );
return b.toString();
}
}
</pre>
<p>A reescrita do método acima resolve parcialmente o nosso problema, além de não atender aos tipos de dados complexos, você terá que fazer o famoso copy-paste para todas as classes que forem implementa-lo.</p>
<p>Voltamos então para nossa idéia inicial, então criaremos uma classe útil para que a automatização do toString(), sendo assim, qualquer classe poderá utiliza-la. Saiba que não iremos ter acesso aos atributos assinados com o modificador Private da classe que deseja utilizar o toString customizado, para resolver tal problema utilizaremos os Métodos públicos, ignorando os métodos da classe Object e aproveitando apenas os <a href="http://en.wikipedia.org/wiki/Accessor" target="_blank">métodos acessores</a>.</p>
<pre class="brush: java;">

public final class ToStringUtil{
/*** ocultado ***/

public static String getText(Object object){
StringBuffer buffer = new StringBuffer(&quot;&quot;);
Method[] methods = object.getClass().getMethods();

for( Method method : methods ){
//
// verifica se o método é um Getter de attributo da classe
//
if( isGetterFieldMethod(method, object.getClass()) ){
buffer.append( getResumeNameMethod( method.getName() ) );
buffer.append(&quot;   = &quot;);
buffer.append( getMethodReturnValue(object, method) );
buffer.append( NEW_LINE );
}

}// for each end

return buffer.toString();
}

/*** ocultado ***/
}
</pre>
<p>Esta versão ainda continua com o problema de tipos complexos, assim que eu for melhorando vou disponibilizar por aqui.</p>
<p><strong>Download<br />
</strong><a href="http://www.lucianosilva.com/download/ToStringUtil_v1.0.1.zip">Versão completa ToStringUtil 1.0.1</a>.</p>
<p><strong>Referência<br />
</strong><a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/reflect/package-summary.html">Reflection</a></p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "util";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/03/06/automatizando-o-tostring-v1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lendo seus e-mails com Java</title>
		<link>http://www.lucianosilva.com/2009/02/23/lendo-seus-e-mails-com-java/</link>
		<comments>http://www.lucianosilva.com/2009/02/23/lendo-seus-e-mails-com-java/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 03:38:48 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javamail]]></category>
		<category><![CDATA[pop3]]></category>
		<category><![CDATA[util]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=233</guid>
		<description><![CDATA[Criando com poucas linhas um leitor de e-mails com Java.]]></description>
			<content:encoded><![CDATA[<p>Lembro de um camarada me dizendo: &#8220;Fiz um browser em Java com menos de 20 linhas de código&#8221; &#8211; Acredite, era verdade! Okay! Okay! Sem recurso nenhum básicamente, apenas a barra de endereços, mas e daí? Assim como esse meu amigo, provavelmente você já tem aquela classe para envio de e-mails guardada na manga, muito útil naqueles dias em que seu chefe pressiona: &#8220;É pra ontem!&#8221;</p>
<p>Mas&#8230; você já tentou montar seu cliente de email? &#8220;Pra quê, cara? Eu uso o Gmail&#8221; &#8211; você irônicamente me responderia, e na tréplica eu diria: Ué! Pra quê o Gmail, se você pode fazer melhor meu rapaz! (sarcástico, não?) Mãos a obra!</p>
<p>O pacote <strong>javax.mail.*</strong> fornece uma série de recursos para protocolos de internet, utilizando-o como uma receita de bolo o sucesso é garantido. Basicamente vamos criar um programa que monitore a caixa de entrada de um determinado endereço POP3.</p>
<p>Coloque os dados de acesso ao mail em um arquivo config.properties, assim:</p>
<pre class="brush: java;">

pop.hst=pop.lucianosilva.com.br
pop.usr=boss@lucianosilva.com.br
pop.pwd=ABC123#XYZ
</pre>
<p>A classe abaixo se encarregará de obter estes dados de conexão:</p>
<pre class="brush: java;">
public class PropertiesMail extends Properties{
private static final String ARQUIVO_CONFIGURACAO = &quot;C:\\config.properties&quot;;

public PropertiesMail(){
try{
FileInputStream file = new FileInputStream( ARQUIVO_CONFIGURACAO);
this.load( file );

}catch(IOException e){
e.printStackTrace();
}
}

public String getHost(){
return this.getProperty(&quot;pop.hst&quot;);
}

public String getAccountUser(){
return this.getProperty(&quot;pop.usr&quot;);
}

public String getAccountPassword(){
return this.getProperty(&quot;pop.pwd&quot;);
}

}
</pre>
<p>Agora, a caixa de correios. Veja que o processo abaixo básicamente segue um roteiro, mas é óbvio que isto é feito apenas para a leitura.</p>
<pre class="brush: java;">
public class Inbox{

public Inbox(){
try {
init();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

private void init() throws MessagingException, IOException{
// Instância das Propriedades de Conexão
PropertiesMail ppm = new PropertiesMail();
// Seta o endereço do host
Properties pp        = System.getProperties();
pp.put(&quot;mail.pop3.host&quot;, ppm.getHost());

// Se o servidor exigir autenticação segura
Authenticator auth = new PopAuthentication();
Session session    = Session.getDefaultInstance(pp, auth);

Store store           = session.getStore(&quot;pop3&quot;);
// Dados básicos de conexão
store.connect(ppm.getHost(), ppm.getAccountUser(), ppm.getAccountPassword());

// Obtem o diretório (INBOX)
Folder folder       = store.getFolder(&quot;INBOX&quot;);
folder.open(Folder.READ_ONLY);

// ler as mensagens do diretório
Message message[] = folder.getMessages();

processMessage(message);

// Close connection
folder.close(false);
store.close();
}

private void processMessage( Message[] message ) throws MessagingException, IOException{
if( message == null || message.length==0 ){
System.out.println(&quot;Nenhuma mensagem encontrada&quot;);
}else{
for (int i=0, n=message.length; i
System.out.println(i + &quot;: &quot; + message[i].getFrom()[0] + &quot;\t&quot; + message[i].getSubject());
String content = message[i].getContent().toString();
System.out.print(content);
}// for end
}
}

public static void main(String[] args){
Inbox inbox = new Inbox();
}
}
</pre>
<p>Muito fácil não? Mas este é um exemplo simples mesmo, saiba que é possível fazer todo o controle de um cliente de e-mail não só Ler, como Escrever, Apagar, Mover, etc.</p>
<p><a href="http://www.lucianosilva.com/download/JavaMail.zip"></a></p>
<p><strong>Downloads</strong></p>
<p><a href="http://www.lucianosilva.com/download/JavaMail.zip">Projeto utilizado para este post</a>.<br />
<a href="http://java.sun.com/products/javamail/downloads/index.html">JavaMail API</a></p>
<p><strong>Veja mais sobre JavaMail</strong></p>
<p><a href="http://java.sun.com/products/javamail/FAQ.html">JavaMail API</a><br />
<a href="http://java.sun.com/developer/onlineTraining/JavaMail/index.html">jGuru: Fundamentals of the JavaMail API</a><br />
<a href="http://www.developer.com/java/other/article.php/618481">WebMail in Java: Reading E-mail</a><br />
Have a fun!</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "util";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/02/23/lendo-seus-e-mails-com-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apresentando o BPEL com o Adapter File</title>
		<link>http://www.lucianosilva.com/2009/02/13/apresentando-o-bpel-com-o-adapter-file/</link>
		<comments>http://www.lucianosilva.com/2009/02/13/apresentando-o-bpel-com-o-adapter-file/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 23:14:00 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[AdapterFile]]></category>
		<category><![CDATA[BPEL]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=163</guid>
		<description><![CDATA[O BPEL é uma linguagem que descrita em XML, que básicamente é utilizada para desenhar processo de negócio seguindo como base o BPM, destaca-se pela simplicidade da criação de um processo e pela amigável interface, proporcionando uma sensação agradável no momento do design. O utilizador de BPEL não necessita de conhecimentos em linguagem de programação, porém, o programador poderá obter mais recursos da ferramenta.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">A solução da Oracle para o conceito de arquitetura de serviços SOA, conhecida como Oracle SOA Suite, disponibiliza um pacote com diversos recursos para organização, orquestração, segurança e integração. Para este último posso destacar o Business Process Execution Language, BPEL, que integrado ao JDeveloper é uma excelente ferramenta de trabalho, fácil, simples e com alguns recursos (adapters) pré-compilados que auxiliam.</p>
<p style="text-align: left;">O BPEL é uma linguagem que descrita em XML, que básicamente é utilizada para desenhar processo de negócio seguindo como base o BPM, destaca-se pela simplicidade da criação de um processo e pela amigável interface, proporcionando uma sensação agradável no momento do design. O utilizador de BPEL não necessita de conhecimentos em linguagem de programação, porém, o programador poderá obter mais recursos da ferramenta.</p>
<p style="text-align: left;">Para apresentar o BPEL escolhi algo um pouco mais além do famoso &#8220;Hello Word&#8221;, vamos trabalhar em um cenário de integração de softwares, aonde o legado irá disponibilizar um arquivo TXT no padrão CVS posicional diáriamente, o processo deverá interpretar o conteúdo deste arquivo e gravar no banco.</p>
<p style="text-align: left;"><strong>Pré-Requisitos</strong></p>
<p style="text-align: left;"><a href="http://www.oracle.com/technology/software/products/jdev/htdocs/soft10134.html" target="_blank">JDeveloper 10.1.3.4</a> (com suporte a SOA).</p>
<p style="text-align: left;"><a href="http://www.oracle.com/technology/software/products/ias/htdocs/101310.html" target="_blank">SOA Suite 10.1.3.1.0</a> (Com Windows Vista, talvez vc tenha problemas, baixe o patch).</p>
<p style="text-align: left;">MySQL.</p>
<p style="text-align: left;"><strong>Parte 1 &#8211; Criando o Projeto</strong></p>
<p style="text-align: left;">Crie um projeto do tipo BPEL Project em File -&gt; New -&gt; Projects -&gt; BPEL Process Project (certifique-se de que está filtrando por todas as tecnologias). Em seguida, dê um nome ao projeto e na opção template opte por Empty BPEL Process.</p>
<p style="text-align: center;"><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/proj02.jpg"><img class="size-medium wp-image-170 aligncenter" title="proj02 - New Project 2" src="http://www.lucianosilva.com/wp-content/uploads/2009/02/proj02-300x225.jpg" alt="proj02 - New Project 2" width="300" height="225" /></a></p>
<p style="text-align: left;"><strong>Parte 2 &#8211; Usando o Adapter File</strong></p>
<p style="text-align: left;">O Adapter File é um recurso do BPEL para manipulação de arquivos, oferece três opções Leitura, Escrita e Sincronização (Read, Writer e Synchronous Read), além dele existe o Adapter FTP (autoexplicativo), porém iremos falar sobre ele depois. Continuando com nosso projeto, vamos utiliza a opção Read para o <a href="http://www.lucianosilva.com/download/EXPORT_PAIS_20090212.txt" target="_blank">arquivo texto</a> que estará disponível no diretório c:\interface_dir, haverá um pooling a cada 1 minuto, obviamente que isto é apenas para testes você deve adequar o intervalo de tempo de acordo com sua necessidade, veja a seguir o passo-a-passo do Adapter File.</p>
<p style="text-align: center;"><a class="wpGallery" href="http://www.lucianosilva.com/windowTutorialAdapterFile.php" target="_blank">Veja aqui os screenshot do passo-a-passo para configurar o File Adapter</a>.</p>
<p style="text-align: left;">Até este passo fizemos apenas configurações básicas da funcionalidade do Adapter, porém, agora é necessário definir um o mapeamento das colunas posicional (fixo), utililzando um Schema XSD, veja a seguir como é simples:</p>
<p style="text-align: center;"><a class="wpGallery" href="http://www.lucianosilva.com/windowTutorialXSD.php" target="_blank"> Screenshots para criar o Schema XSD</a>.</p>
<p style="text-align: left;"><strong>Parte 3 &#8211; Criando o Adapter Database</strong></p>
<p style="text-align: left;">Crie um banco de dados no MySQL ou em qualquer outro SGDB, em seguida <a href="http://www.lucianosilva.com/download/script_pais.sql" target="_blank">crie a tabela pais</a> que irá receber os dados contidos no arquivo texto. Antes de utilizar o Adapter Database certifique-se que sua conexão com o banco está feita pelo JDeveloper, ela será necessária para os passos a seguir, portando vá até a aba Connection, se não existir crie-a.</p>
<p style="text-align: center;"><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/connection.jpg"><img class="aligncenter size-medium wp-image-205" style="border: 1px solid black;" title="Connection" src="http://www.lucianosilva.com/wp-content/uploads/2009/02/connection-300x204.jpg" alt="Connection" width="300" height="204" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">Com a tabela criada e a conexão feita, agora vamos utilizar o componente Database Adapter que será o responsável por executar instruções SQL. Os passos aqui são tão simples quanto a criação da conexão, porém, é importante destacar que no <strong>Passo 4</strong> escolha a opção <strong>Execute Custom SQL</strong>, e no quinto e último passo coloque a instrução de inserção da tabela pais, não se preocupe com o XSD ele será criado automáticamente, veja como fica:</p>
<p style="TEXT-ALIGN: center"><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/custom_sql.jpg"><img class="size-medium wp-image-220 aligncenter" title="Custom SQL" src="http://www.lucianosilva.com/wp-content/uploads/2009/02/custom_sql-300x222.jpg" alt="Custom SQL" width="300" height="222" /></a><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/custom_sql.jpg"></a></p>
<p style="text-align: left;"><strong>Passo 4 &#8211; While e Variáveis</strong></p>
<p style="text-align: left;">Para cada campo do arquivo TXT, mapeado pelo Schema XSD, devemos criar uma variável que irá armazenar o valor dos campos, então vá até a aba Structure e crie as variáveis.</p>
<p style="TEXT-ALIGN: center"><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/variaveis_01.jpg"><img class="size-medium wp-image-221 aligncenter" title="Variaveis - 01" src="http://www.lucianosilva.com/wp-content/uploads/2009/02/variaveis_01-300x186.jpg" alt="Variaveis - 01" width="300" height="186" /></a></p>
<p style="TEXT-ALIGN: center"><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/variaveis_02.jpg"><img class="aligncenter size-medium wp-image-222" title="Variaveis - 02" src="http://www.lucianosilva.com/wp-content/uploads/2009/02/variaveis_02-300x278.jpg" alt="Variaveis - 02" width="300" height="278" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">Depois de todas as variáveis criadas precisamos associa-las aos campos do XSD e inicializa-las, mas para isto devo esclarecer uma coisa, sabemos que o arquivo texto poderá ter uma ou mais linhas de registro, portanto é necessária uma instrução de repetição. Utilizaremos o componente <strong>WHILE</strong>, a partir de uma variável contadora (índice).</p>
<p style="text-align: left;"><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/diagram_01.jpg"><img class="aligncenter size-medium wp-image-226" title="diagram_01" src="http://www.lucianosilva.com/wp-content/uploads/2009/02/diagram_01-114x300.jpg" alt="diagram_01" width="114" height="300" /></a></p>
<p style="text-align: left;">O While cria um novo escopo aonde devemos arrastar os componentes de assinatura das variáveis e chamada da procedure, ou seja, para cada registro iremos fazer a inicialização da variáveis e a chamada da procedure para gravar no banco de dados, finalizando o nosso processo BPEL.</p>
<p style="text-align: left;"><a href="http://www.lucianosilva.com/wp-content/uploads/2009/02/diagram_02.jpg"><img class="aligncenter size-medium wp-image-228" title="diagram_02" src="http://www.lucianosilva.com/wp-content/uploads/2009/02/diagram_02-281x300.jpg" alt="diagram_02" width="281" height="300" /></a></p>
<p style="text-align: left;">O processo é simples mas o dominio do ambiente BPEL é excencial, saber criar as variáveis, inicializá-las, passagem de valores, etc. Abaixo está disponível o fonte do projeto criado no JDeveloper.</p>
<p style="text-align: left;">Clique <a href="http://www.lucianosilva.com/download/BlogApReadFileToDB.zip">aqui</a> para baixar o fonte.</p>
<p style="text-align: left;">
<p style="text-align: left;">
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "oracle";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/02/13/apresentando-o-bpel-com-o-adapter-file/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Conhecendo a API do Twitter</title>
		<link>http://www.lucianosilva.com/2009/01/21/conhecendo-a-api-do-twitter/</link>
		<comments>http://www.lucianosilva.com/2009/01/21/conhecendo-a-api-do-twitter/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 12:32:38 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Redes Sociais]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[twitter4j]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=122</guid>
		<description><![CDATA[Incentivado por este post do Blog do Élcio que demonstrou a utilização da API do Twitter no ubuntu de uma maneira muito fácil e simples, então procurei saber um pouco mais sobre ela. Existem algumas bibliotecas prontas para diversas linguagens, escolhi pela Twitter4j antes de mexer na API do Twitter mesmo, e não me arrependi [...]]]></description>
			<content:encoded><![CDATA[<p>Incentivado por este <a href="http://blog.elcio.com.br/brincando-com-a-api-do-twitter/" target="_blank">post</a> do <a href="http://blog.elcio.com.br/" target="_blank">Blog do Élcio</a> que demonstrou a utilização da <a href="http://apiwiki.twitter.com" target="_blank">API do Twitter</a> no ubuntu de uma maneira muito fácil e simples, então procurei saber um pouco mais sobre ela.</p>
<p>Existem algumas <a href="http://apiwiki.twitter.com/Libraries#TableofContents">bibliotecas</a> prontas para diversas linguagens, escolhi pela <a href="http://yusuke.homeip.net/twitter4j/en/index.html"><strong>Twitter4j</strong></a> antes de mexer na API do Twitter mesmo, e não me arrependi com algumas poucas linhas de código é possível atualizar seu status e até receber as últimas atualizações, veja como é simples.</p>
<pre class="brush: java;">

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;

public class Twittando {

public static void main(String[] args) {
// usuário e senha do twitter
String usr = &quot;lucianosilva&quot;;
String pwd = &quot;ABCDEFGHIJKL&quot;;

try {

Twitter twitter = new Twitter(usr, pwd);
// atualizando o status do twitter
Status status   = twitter.update(&quot;Twitter4J, muuito fácil de usar, recomendo!&quot;);
System.out.println(&quot;Result: &quot; + status.getText() );

} catch (TwitterException e) {
e.printStackTrace();
}
}
}
</pre>
<p>Não esqueça de fazer o download da biblioteca Twitter4j <a href="http://yusuke.homeip.net/twitter4j/en/index.html" target="_blank">aqui</a>. E se você for uma pessoa &#8220;caprichosa&#8221; assim como o Elcio, criaria um UPBox, mas&#8230; no meu caso fiz um exemplo mais simples para demonstrar a lista de updates, veja o scriptlet:</p>
<pre class="brush: java;">

&lt;style type=&quot;text/css&quot;&gt;
#box{
font-family:tahoma,arial;
font-size:10px;
border:1px #000000 solid;
background-color:#ffffff;
width: 300px;
height: 400px;
overflow: auto;
}
&lt;/style&gt;
...
&lt;div id=&quot;box&quot;&gt;
&lt;%
Twitter twitter = new Twitter();
twitter.setUserId(&quot;lucianosilva&quot;);
twitter.setPassword(&quot;ABCDEFGHIJKL&quot;);

ArrayList&lt;status&gt; listUpdates = (ArrayList&lt;status&gt;) twitter.getFriendsTimeline();
for(Status status : listUpdates){
User user = status.getUser();
%&gt;
&lt;p&gt;&lt;img src=&quot;&lt;%= user.getProfileImageURL() %&gt;&quot; border=2/&gt;
&amp;amp;amp;amp;amp;nbsp;:&amp;amp;amp;amp;amp;nbsp;&lt;%= status.getText() %&gt;&lt;/p&gt;
&lt;%
}// for each end
%&gt;
&lt;/div&gt;
</pre>
<p>Bacana né? Divirta-se.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "twitter4j";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/01/21/conhecendo-a-api-do-twitter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Combinando APIs GeoLite City com Google Maps</title>
		<link>http://www.lucianosilva.com/2009/01/18/combinando-apis-geolite-city-com-google-maps/</link>
		<comments>http://www.lucianosilva.com/2009/01/18/combinando-apis-geolite-city-com-google-maps/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 23:35:14 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[geoip]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[maps]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=113</guid>
		<description><![CDATA[Hello there! Maravilha, eu só tinha o IP e então conseguiu saber o País daquele endereço de IP, não satisfeito consegui mais dados sobre ele, então surgiu o Estado, Cidade, Latitude e Longitude, e talvez o CEP, o Código de Área internacional, quem sabe? É mais uma vez eu não estou satisfeito e agora vou [...]]]></description>
			<content:encoded><![CDATA[<p>Hello there!</p>
<p>Maravilha, eu só tinha o IP e então conseguiu saber o País daquele endereço de IP, não satisfeito consegui mais dados sobre ele, então surgiu o Estado, Cidade, Latitude e Longitude, e talvez o CEP, o Código de Área internacional, quem sabe?</p>
<p>É mais uma vez eu não estou satisfeito e agora vou fazer com que estes dados sejam exibidos no mapa, usando o Google Maps API. =) E provarei que é tão fácil quanto foram os outros exemplos.</p>
<p>Nós já sabemos o que ter em &#8220;mãos&#8221; para API GeoLite.</p>
<p><img class="aligncenter size-full wp-image-100" title="arquivos-geolitecity" src="http://www.lucianosilva.com/wp-content/uploads/2009/01/arquivos-geolitecity.jpg" alt="arquivos-geolitecity" width="509" height="146" /></p>
<p>Já para utilizar o Google Maps API você deve obter uma chave que permitirá fazer as consultas, veja mais aqui. O código descrito abaixo exibira uma mapa simples com alguns markets-point, mas é possível demonstrar o mapa de diversas maneiras, <a href="http://code.google.com/intl/pt-BR/apis/maps/documentation/examples/">sabia mais</a>.</p>
<pre class="brush: php;">

&lt;?php
require(&quot;geoipregionvars.php&quot;);
require(&quot;geoipcity.inc&quot;);

// Obtem o IP
$vIP     = $_SERVER['REMOTE_ADDR'];

// Abre o arquivo dat com o banco de dados
$giCity  = geoip_open(&quot;GeoLiteCity.dat&quot;,GEOIP_STANDARD);

echo $vIP;

// obtem o registro do
$record  = geoip_record_by_addr($giCity, $vIP);
?&gt;
</pre>
<p>Perceba que no JavaScript abaixo a url do maps solicita através do parâmetro key o código gerado para sua conta, eu substitui o valor por &lt;COLOQUE-SUA-KEY-AQUI&gt;.</p>
<pre class="brush: php;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot;/&gt;
&lt;title&gt;Google Maps JavaScript API Example&lt;/title&gt;
&lt;!---// Mude o Key //--&gt;
&lt;script src=&quot;http://maps.google.com/maps?file=api&amp;amp;amp;amp;amp;amp;amp;v=2&amp;amp;amp;amp;amp;amp;amp;key=&lt;coloque-SUA-KEY-AQUI&gt;&quot;
type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;

function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById(&quot;mapaGeoIP&quot;));

// ---
// Aqui informamos a Latitude e Longitude do IP
//
map.setCenter(new GLatLng(&lt;?= $record-&gt;latitude ?&gt;, &lt;?= $record-&gt;longitude ?&gt;), 13);

// Adicionado 10 lugares (markets) randômicos próximo a localidade
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() - southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var i = 0; i &lt; 15; i++) {
var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
southWest.lng() + lngSpan * Math.random());
map.addOverlay(new GMarker(point));
}
}
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body onload=&quot;initialize()&quot; onunload=&quot;GUnload()&quot;&gt;
&lt;div id=&quot;mapaGeoIP&quot; style=&quot;width: 600px; height: 400px&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><img class="aligncenter size-full wp-image-136" title="google_maps1" src="http://www.lucianosilva.com/wp-content/uploads/2009/01/google_maps1.jpg" alt="google_maps1" width="459" height="590" /></p>
<p>Este é um exercício muito interessante, veja que legal alterando o endereço de IP, para isto vá ao prompt de comando no Windows e digite, por exemplo:</p>
<blockquote><p><strong>ping bb.com<br />
ping google.com<br />
ping cnn.com</strong></p></blockquote>
<p>Namastê.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "maps";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/01/18/combinando-apis-geolite-city-com-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GeoLite City informações completas do seu IP &#8211; Parte II</title>
		<link>http://www.lucianosilva.com/2009/01/18/geolite-city-ip-parte-ii/</link>
		<comments>http://www.lucianosilva.com/2009/01/18/geolite-city-ip-parte-ii/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 21:38:23 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[city]]></category>
		<category><![CDATA[geoip]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=93</guid>
		<description><![CDATA[Você já viu que utilizando as bibliotecas do GeoLite é possivel localizar o pais de um IP, mas é uma informação limitada, já com o GeoLite City exibe informações mais detalhadas além do Pais como Estado, Cidade, Latitude e Longitude, Código Postal (CEP) e muito mais. Como esta é uma ferramenta gratuita, algumas informações não [...]]]></description>
			<content:encoded><![CDATA[<p>Você já viu que utilizando as bibliotecas do GeoLite é possivel localizar o pais de um IP, mas é uma informação limitada, já com o <a href="http://www.maxmind.com/app/geolitecity">GeoLite City</a> exibe informações mais detalhadas além do Pais como Estado, Cidade, Latitude e Longitude, Código Postal (CEP) e muito mais.<br />
Como esta é uma ferramenta gratuita, algumas informações não estão totalmente completas como por exemplo o CEP e  Código de Área (telefônia). Em meus testes consegui identificar que para os EUA, Canadá e Itália estes dados estão disponíveis, mas para o Brasil (pelo menos para o estado de São Paulo) ainda não.</p>
<p>Este código complementa o mesmo utilizado em <a href="http://www.lucianosilva.com/obtendo-localizacao-ip-parte-i/">GeoLite Country</a>, porém, utiliza um objeto com as caracteristicas de localização.</p>
<p>Faça o download do arquivo <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">dat</a>, copie o <a href="http://geolite.maxmind.com/download/geoip/api/php/geoipcity.inc">geoipcity.inc</a> também, crie o arquivo &#8211; <em>geoipregionvars.php</em> &#8211; com as variáveis e constantes necessárias como <a href="http://geolite.maxmind.com/download/geoip/api/php/geoipregionvars.php">este</a>, certifique-se que o arquivo <a href="http://geolite.maxmind.com/download/geoip/api/php/geoip.inc">geoip.inc</a> esteja na sua estrutura de arquivos, que deverá ficar assim:</p>
<p><img class="aligncenter size-full wp-image-100" title="arquivos-geolitecity" src="http://www.lucianosilva.com/wp-content/uploads/2009/01/arquivos-geolitecity.jpg" alt="arquivos-geolitecity" width="509" height="146" /></p>
<p>Vamos ao código! O seu arquivo index.php deverá centralizar a obtenção do IP e chamar as funções para decodificar e exibir os dados sobre ele, veja:</p>
<pre class="brush: php;">

&lt;?php

// Includes da API
require(&quot;geoipregionvars.php&quot;);
require(&quot;geoipcity.inc&quot;);

// Obtem o IP
$vIP     = $_SERVER['REMOTE_ADDR'];

// Abre o arquivo dat com o banco de dados
$giCity  = geoip_open(&quot;GeoLiteCity.dat&quot;,GEOIP_STANDARD);

// obtem o registro do
$record  = geoip_record_by_addr($giCity, $vIP);
?&gt;
</pre>
<p>Até aqui conseguimos identificar o IP e obter as informações sobre de localização que está na variável <em>$record</em>, a seguir esta a camada de visualização dos dados.</p>
<pre class="brush: php;">

&lt;?
// obtem o registro do
$record  = geoip_record_by_addr($giCity, $vIP);
if( !empty($record) ){?&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;th colspan=&quot;2&quot;&gt;Informações sobre o IP
&lt;em&gt;&quot;&lt;?= $vIP ?&gt;&quot;&lt;/em&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;35%&quot;&gt;País&lt;/td&gt;
&lt;td width=&quot;65%&quot;&gt;&lt;?= $record-&gt;country_name ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estado&lt;/td&gt;
&lt;td&gt;
&lt;?=$GEOIP_REGION_NAME[$record-&gt;country_code][$record-&gt;region] ?&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cidade&lt;/td&gt;
&lt;td&gt;&lt;?= $record-&gt;city ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;?    if(!empty($record-&gt;postal_code)){ ?&gt;
&lt;tr&gt;
&lt;td&gt;CEP&lt;/td&gt;
&lt;td&gt;&lt;?= $record-&gt;postal_code ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;? } ?&gt;
&lt;tr&gt;
&lt;td&gt;Latitude&lt;/td&gt;
&lt;td&gt;&lt;?= $record-&gt;latitude ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Longitude&lt;/td&gt;
&lt;td&gt;&lt;?= $record-&gt;longitude ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;?
}
?&gt;
</pre>
<p>Have a fun.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "php";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/01/18/geolite-city-ip-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GeoLite Country Obtendo a localização por IP &#8211; Parte I</title>
		<link>http://www.lucianosilva.com/2009/01/18/obtendo-localizacao-ip-parte-i/</link>
		<comments>http://www.lucianosilva.com/2009/01/18/obtendo-localizacao-ip-parte-i/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 18:36:51 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[country]]></category>
		<category><![CDATA[geoip]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=86</guid>
		<description><![CDATA[Certa vez fiz um curso de um determinado produto cujo sua função basicamente era medir a audiência dos sites da empresa em que trabalhava, na mesma época onde pagava-se absurdos por este tipo de informação, irônia ou não, hoje o Google Analytics faz gratuitamente. O que me mais me fascinou foi quando a instrutora explicou [...]]]></description>
			<content:encoded><![CDATA[<p>Certa vez fiz um curso de um determinado produto cujo sua função basicamente era medir a audiência dos sites da empresa em que trabalhava, na mesma época onde pagava-se absurdos por este tipo de informação, irônia ou não, hoje o Google Analytics faz gratuitamente. O que me mais me fascinou foi quando a instrutora explicou a importância do IP, como é distribuído, o que é possível fazer através de seu rastreamento, assuntos de deixar qualquer geek boquiaberto.</p>
<p>Portanto, resolvi fazer este post para demonstrar uma facilidade muito interessante e pouco utilizado em sites nacionais, como os de operadora de telefônia, que preferem perguntar qual a sua cidade ao invés de identificar seu IP e redirecioná-lo aos serviços prestados em sua região e, fornecer uma opção para mudar de região quando quiser.</p>
<p>Talvez você encontre diversos outros bancos de dados de IPs na internet, porém, o mais popular é da <a href="http://www.maxmind.com/app/country">Maxmind</a>, que disponibiliza um bom serviço e gratuíto e também um serviço mais amplo por alguns dólares. A versão free é chamada de GeoLite e fornece além dos dados em CSV e DAT, incluí uma série de APIs para as linguagens de programação mais populares e alguns tutoriais de como utilizá-las, aqui utilizaremos PHP.</p>
<p>Vamos lá, faça o download do <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz">arquivo dat do GeoLite Country</a>, e depois <a href="http://geolite.maxmind.com/download/geoip/api/php/geoip.inc">baixe</a> as funções para manipulação do arquivo dat. Não será necessária nenhuma configuração no servidor tão menos no PHP, veja como é simples a identificação de pais utilizando os recursos do GeoLite Country.</p>
<pre class="brush: php;">

&lt;?php

// Inclui as funções do GeoIP Country
require(&quot;geoip.inc&quot;);

// Abre o arquivo .dat (banco de dados)
// especificando o caminho fisico do mesmo.
$gi = geoip_open(&quot;GeoIP.dat&quot;, GEOIP_STANDARD);
// recebendo o IP
$vIP = $_SERVER['REMOTE_ADDR'];
echo &quot;Endereço de IP identificado: &quot; . $vIP . &quot;&lt;br/&gt;&quot;;
// Exibe a sigla e o nome do País
echo geoip_country_code_by_addr($gi, $vIP);
echo geoip_country_name_by_addr($gi, $vIP);

// fecha a conexão com o banco de dados
geoip_close($gi);
?&gt;
</pre>
<p>Uma informação básica como esta, permite aos sites de serviços fornecerem funcionalidades, customizações, atrações no geral para que seu visitante sinta-se mais confortável se isto é possível.</p>
<p>Vou dar sequência a esta sessão de post, aprofundando as funcionalidades do GeoLite.</p>
<p><strong>Namastê.</strong></p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "php";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2009/01/18/obtendo-localizacao-ip-parte-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sun Certified Java Programmer &#8211; Requisitos</title>
		<link>http://www.lucianosilva.com/2008/12/08/sun-certified-java-programmer-requisitos/</link>
		<comments>http://www.lucianosilva.com/2008/12/08/sun-certified-java-programmer-requisitos/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 16:35:47 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[scjp]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=57</guid>
		<description><![CDATA[O exame CX-310-055 da Sun é para a Certificação Java versão 1.5 da linguagem, uma das metas mais cobiçadas entre os programadores da plataforma e também uma das mais temidas. Básicamente são testados conhecimentos primordiais da linguagem como declarações, controle de escopo, condições,  APIs específicas até conceitos de orientação a objetos. Atualmente a versão da [...]]]></description>
			<content:encoded><![CDATA[<p>O exame CX-310-055 da Sun é para a Certificação Java versão 1.5 da linguagem, uma das metas mais cobiçadas entre os programadores da plataforma e também uma das mais temidas.<br />
Básicamente são testados conhecimentos primordiais da linguagem como declarações, controle de escopo, condições,  APIs específicas até conceitos de orientação a objetos.</p>
<p>Atualmente a versão da SCJP é a 6, porém ainda é possível fazer a 5, existem cursos específico preparatórios para a certificação, mas eu ainda prefiro seguir o bom e velho livro da Kathy Sierra, e os mocks que são diversas opções pela internet.</p>
<p>Abaixo vou listar alguns links úteis para auxiliar nos estudos.</p>
<p><strong>Mocks</strong><br />
<a href="http://www.javabeat.net/javabeat/scjp5/index.php" target="_blank"> http://www.javabeat.net/javabeat/scjp5/index.php</a><br />
<a href="http://www.wickedlysmart.com/SCJPStudyGuide/Java_5_SCJPquestions.html" target="_blank"> http://www.wickedlysmart.com/SCJPStudyGuide/Java_5_SCJPquestions.html</a><br />
<a href="http://www.javabeat.net/javabeat/scjp5/mocks/index.php" target="_blank"> http://www.javabeat.net/javabeat/scjp5/mocks/index.php</a></p>
<p><strong>Perguntas Frequêntes no JavaRanch</strong><br />
<a href="http://faq.javaranch.com/java/ScjpFaq" target="_blank"> http://faq.javaranch.com/java/ScjpFaq</a></p>
<p><strong>Guia de Estudos e Dicas</strong><br />
<a href="http://java.boot.by/scjp-tiger/" target="_blank"> http://java.boot.by/scjp-tiger/</a><br />
<a href="http://camilolopes.wordpress.com/2008/03/31/falando-um-pouco-sobre-o-exame-310-055-scjp/" target="_blank"> http://camilolopes.wordpress.com/2008/03/31/falando-um-pouco-sobre-o-exame-310-055-scjp/</a></p>
<p><strong>Livro da Kathy Sierra</strong><br />
<a href="http://www.submarino.com.br/produto/1/1808932/scjp:+certificacao+sun+para+programador+java+5+-+guia+de+estudo" target="_blank"> Submarino</a><br />
<a href="http://astore.amazon.com/javabeat-20/detail/0072253606/002-4766180-9401631" target="_blank">Amazon</a></p>
<p><strong>Twitter da Kathy </strong><br />
<a href="http://twitter.com/KathySierra" target="_blank"> http://twitter.com/KathySierra</a></p>
<p><strong>Detalhes da Certificação</strong><br />
<a href="http://www.sun.com/training/catalog/courses/CX-310-055.xml" target="_blank"> http://www.sun.com/training/catalog/courses/CX-310-055.xml</a></p>
<p>Boa Sorte!</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "scjp";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/12/08/sun-certified-java-programmer-requisitos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Annotations e XFire um jeito simples de criar Web Services</title>
		<link>http://www.lucianosilva.com/2008/08/16/annotations-e-xfire-um-jeito-simples-de-criar-web-services/</link>
		<comments>http://www.lucianosilva.com/2008/08/16/annotations-e-xfire-um-jeito-simples-de-criar-web-services/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 23:11:37 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[annotations]]></category>
		<category><![CDATA[jsr-181]]></category>
		<category><![CDATA[jsr-224]]></category>
		<category><![CDATA[webservices]]></category>
		<category><![CDATA[xfire]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=55</guid>
		<description><![CDATA[Eu já falei um pouco de Web Services por aqui, mas ainda tem muita coisa a ser discutida e experimentada sobre este assunto. Existem diversas formas de distribuir serviços na internet e a o número de ferramentas para tornar isto cada vez mais fácil aumentam constantemente. Pesquisando sobre conceitos e maneiras práticas para desenvolvimento encontrei [...]]]></description>
			<content:encoded><![CDATA[<p>Eu já falei um pouco de Web Services por <a href="http://www.lucianosilva.com/tag/webservices/" target="_blank">aqui</a>, mas ainda tem muita coisa a ser discutida e experimentada sobre este assunto.</p>
<p>Existem diversas formas de distribuir serviços na internet e a o número de ferramentas para tornar isto cada vez mais fácil aumentam constantemente. Pesquisando sobre conceitos e maneiras práticas para desenvolvimento encontrei no <a href="http://blog.caelum.com.br/2006/08/17/criando-um-webservice-com-a-jsr-181/" target="_blank">Blog dos Desenvolvedores da Caelum</a> um jeito simples para criação de Web Services utilizando a especificação JSR-181 e JSR-224, achei interessantíssimo e não perdi tempo em fazer os testes.</p>
<p>A especificação permite que você crie serviços utilizando apenas Annotations.</p>
<pre class="brush: java;">
import javax.jws.WebMethod;
import javax.jws.WebService;
import tucano.bean.Pessoa;

@WebService
public class PessoaWS {
private Pessoa[] list = new Pessoa[5];

public PessoaWS() {
list[0] = new Pessoa(&quot;M&quot;, &quot;Luciano&quot;, &quot;Silva&quot;);
list[1] = new Pessoa(&quot;F&quot;, &quot;Priscila&quot;, &quot;Carmo&quot;);
list[2] = new Pessoa(&quot;F&quot;, &quot;Maria&quot;, &quot;Conceição&quot;);
list[3] = new Pessoa(&quot;F&quot;, &quot;Lucia&quot;, &quot;Felix&quot;);
list[4] = new Pessoa(&quot;M&quot;, &quot;Cristino&quot;, &quot;José&quot;);
}

@WebMethod
public Pessoa[] listAll(){
return list;
}
}
</pre>
<p>Perceba que este Web Service foi criado de maneira extremamente simples apenas para demonstração, porém, o método retorna um tipo de dado complexo, isto para sair da monotonia.</p>
<p>Ainda o que os caras da Caelum, vamos fazer a publicação/ativação do serviço utilizando o XFire projeto relacionado ao <a href="http://cxf.apache.org/" target="_blank">Apache CXF</a></p>
<pre class="brush: xml;">
&lt;!-- // X-Fire //---&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
&lt;display-name&gt;XFire Servlet&lt;/display-name&gt;
&lt;servlet-class&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet&lt;/servlet-class&gt;
&lt;init-param&gt;
&lt;param-name&gt;config&lt;/param-name&gt;
&lt;param-value&gt;services.xml&lt;/param-value&gt;
&lt;/init-param&gt;
&lt;/servlet&gt;

&lt;servlet-mapping&gt;
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;servlet-mapping&gt;
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;!-- // //---&gt;
</pre>
<p>Se você for seguir o site do projeto X-Fire, irá perceber que é sugerido a criação do arquivo no caminho META-INF/xfire/services.xml, isto não deu muito certo comigo, tentei diversas configurações e até percebi que é um bug em aberto para o projeto.</p>
<p>Para resolver o problema opite por colocar o arquivo de configuração services.xml na raíz do source [src/services.xml].</p>
<pre class="brush: xml;">
&lt;beans xmlns=&quot;http://xfire.codehaus.org/config/1.0&quot;&gt;
&lt;service&gt;
&lt;name&gt;PessoaService&lt;/name&gt;
&lt;namespace&gt;http://xfire.codehaus.org/PessoaService&lt;/namespace&gt;
&lt;serviceClass&gt;tucano.ws.PessoaWS&lt;/serviceClass&gt;
&lt;/service&gt;
&lt;/beans&gt;
</pre>
<p>Básicamente a configuração se resume em um nome para o Serviço e a Classe que implementa-o. Após fazer deploy do projeto no seu container JEE você poderá acessar o serviço da seguinte maneira http://localhost/&lt;CONTEXTO&gt;/services/&lt;SERVICE_NAME&gt;?wsdl, então, http://localhost/Tucano/services/PessoaService?wsdl.</p>
<p>Você pode fazer o download dos fontes <a href="http://www.lucianosilva.com/download/Tucano.zip">aqui</a>.</p>
<p>É prático, fácil e rápido, vale ser estudado e em alguns casos sugerido como solução, mesmo assim eu estou cansado de ver configurações em arquivo XMLs fora do contexto, não sou muito adepto a esta solução, de qualquer maneira tá dado o recado. =)</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "xfire";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/08/16/annotations-e-xfire-um-jeito-simples-de-criar-web-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF, RichFaces, AJAX e combobox alinhados</title>
		<link>http://www.lucianosilva.com/2008/08/11/jsf-richfaces-ajax-e-combobox-alinhados/</link>
		<comments>http://www.lucianosilva.com/2008/08/11/jsf-richfaces-ajax-e-combobox-alinhados/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 22:23:31 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[richfaces]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=52</guid>
		<description><![CDATA[Em meus estudos sobre JSF e AJAX, gostei muito do pacote disponibilizado pela JBoss, o RichFaces. A intensão é usar o mais puro do JSF porém, aproveitando o que cada componente oferece de melhor. O RichFaces é interessante e muito completo, oferece diversos recursos para web que até então o HTML estava limitado, como o [...]]]></description>
			<content:encoded><![CDATA[<p>Em meus estudos sobre JSF e AJAX, gostei muito do pacote disponibilizado pela JBoss, o RichFaces. A intensão é usar o mais puro do JSF porém, aproveitando o que cada componente oferece de melhor.</p>
<p>O RichFaces é interessante e muito completo, oferece diversos recursos para web que até então o HTML estava limitado, como o combobox (leia-se também dropdown) com área aberta para localização de textos &#8211; &lt;rich:comboBox/&gt;. Ao contrário deste alguns outros componentes apresentam problemas sérios de incompatibilidade com o Apache MyFaces (Tomahawk), por exemplo, o &lt;rich:fileUpload/&gt;.</p>
<p>Estudando esses componentes observei suas vantagens e falhas, decidi então criar este exemplo de um recurso tão comum em formulários e simples com JSF, que são os combobox dependentes ou alinhados.<br />
Vamos continuar com o esquema de Países e Estados, um combobox para cada, sendo que ao modificar o Pais através do AJAX os estados relacionados serão carregados.</p>
<p>A configuração básica do Faces e RichFaces no web.xml será ocultada, porém você poderá fazer o download do projeto no fim deste post.<br />
O projeto está estruturado da seguinte maneira:</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/estrutura.jpg"><img class="alignnone size-medium wp-image-53" title="estrutura" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/estrutura-197x300.jpg" alt="" width="197" height="300" /></a></p>
<p>No Manager Bean destacam-se os métodos getPaises() e actionCarregarEstados(), o primeiro retorna um array de itens &#8211; SelectItem[] &#8211; tipo de dado complexo que será tratado pelo componente JSF, já o actionCarregarEstados() é responsável por carregar os estados relacionados ao pais.</p>
<pre class="brush: java;">
public class UirapuruManagerBean {
private Pessoa pessoa = new Pessoa();
private SelectItem[] estados;

/* getters e setters ocultados */

/* carrega os paises */
public SelectItem[] getPaises(){
List&lt;pais&gt; lp = regiaoDao.getAllPais();
List&lt;selectItem&gt; itens = new ArrayList&lt;selectItem&gt;(lp.size());

for( Pais p : lp ){
itens.add( new SelectItem(p.getId_pais(), p.getNm_pais()) );
}// for end
return itens.toArray( new SelectItem[itens.size()] );
}

/* carrega os estados */
public SelectItem[] getEstadosByPais(int id_pais){
List&lt;estado&gt; estados   = regiaoDao.getEstadosDoPais(id_pais);
List&lt;selectItem&gt; itens = new ArrayList&lt;selectItem&gt;(estados.size());

for( Estado e : estados ){
itens.add( new SelectItem(e.getId_estado(), e.getNm_estado()) );
}// for end
return itens.toArray( new SelectItem[itens.size()] );
}

/*  */
public String actionCarregarEstados(){
this.estados = getEstadosByPais(getPessoa().getPais().getId_pais());
return &quot;SUCCESS&quot;;
}

}
</pre>
<p>Uma observação importante antes de seguirmos: os beans Pessoa, Pais e Estado são simples e foram criados apenas para uma interpretação melhor, é importante e somente assim este exemplo irá funcionar perfeitamente se no bean Pessoa, os atributos pais e estado sejam inicializados. Já que não estamos trabalhando com Spring o Faces não irá fazer este entendimento e uma exceção NullPointerException será lançada, para evitar tal faça isto:</p>
<pre class="brush: java;">
public class Pessoa implements Serializable {
private int id;
private String nome;

// criando os objetos
private Pais pais = new Pais();
private Estado estado = new Estado();

/* getters e setters ocultados */
}
</pre>
<p>Okay. Feita a observação vamos para a parte final, a montagem do JSP.</p>
<pre class="brush: java;">
&lt;%@ taglib prefix=&quot;f&quot;  uri=&quot;http://java.sun.com/jsf/core&quot;%&gt;
&lt;%@ taglib prefix=&quot;h&quot;  uri=&quot;http://java.sun.com/jsf/html&quot;%&gt;
&lt;%@ taglib prefix=&quot;a4j&quot; uri=&quot;http://richfaces.org/a4j&quot;%&gt;
</pre>
<p>Não esqueça que qualquer página JSF deve ser elaborada dentro da tag &lt;f:view/&gt; e, que sem a definição do formulário &lt;h:form/&gt; o AJAX não irá funcionar.</p>
<pre class="brush: java;">
&lt;f:view&gt;
&lt;h:form&gt;
&lt;h:panelGrid border=&quot;0&quot; columns=&quot;2&quot; width=&quot;500&quot; cellpadding=&quot;1&quot; cellspacing=&quot;2&quot;&gt;

&lt;h:outputLabel value=&quot;Pais&quot; for=&quot;pais&quot;/&gt;
&lt;h:selectOneMenu id=&quot;pais&quot;
value=&quot;#{umb.pessoa.pais.id_pais}&quot;
rendered=&quot;true&quot;&gt;
&lt;f:selectItems value=&quot;#{umb.paises}&quot;/&gt;
&lt;a4j:support event=&quot;onchange&quot;
ajaxSingle=&quot;true&quot;
action=&quot;#{umb.actionCarregarEstados}&quot;
reRender=&quot;pais,estado&quot;/&gt;
&lt;/h:selectOneMenu&gt;

&lt;h:outputLabel value=&quot;Estado&quot; for=&quot;estado&quot;/&gt;
&lt;h:selectOneMenu id=&quot;estado&quot;
value=&quot;#{umb.pessoa.estado.id_estado}&quot;
rendered=&quot;true&quot;&gt;
&lt;f:selectItems value=&quot;#{umb.estados}&quot;/&gt;
&lt;/h:selectOneMenu&gt;

&lt;/h:panelGrid&gt;
&lt;/h:form&gt;
&lt;/f:view&gt;
</pre>
<p>Na tag &lt;h:selectOneMenu/&gt; deve-se colocar na propriedade VALUE o atributo que irá receber o valor selecionado no combobox, outras propriedades excenciais são o ID que identifica o componente e RENDERED que indica a renderização. A tag &lt;f:selectItems/&gt; invoca o método &#8211; umb.getPaises() &#8211; que contém os itens do combobox.</p>
<p>Até o momento utilizamos apenas JSF puro, o RichFaces é representado na tag &lt;a4j:support/&gt; responsável por identificar quando um evento do tipo OnChange é feito e fazer a ação definida no método umb.actionCarregarEstados, e por fim na propriedade reRender estão separados por vírgulas os componentes que serão renderizados.</p>
<p>Seguindo esta linha de raciocínio você conseguirá fazer vários níveis de dependência facilmente, o componente &lt;rich:combobox/&gt; também permite este tipo de interação, com alguns recursos a mais.</p>
<p>Faça <a href="http://www.lucianosilva.com/download/Uirapuru.zip">aqui </a>o download do projeto.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "richfaces";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/08/11/jsf-richfaces-ajax-e-combobox-alinhados/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Web Services com Apache Axis e Tipos Complexos &#8211; Part III</title>
		<link>http://www.lucianosilva.com/2008/08/05/webservices-part-iii-com-apache-axis-e-tipos-complexos/</link>
		<comments>http://www.lucianosilva.com/2008/08/05/webservices-part-iii-com-apache-axis-e-tipos-complexos/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 23:12:52 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[axis]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=41</guid>
		<description><![CDATA[Criar WebServices já foi um trabalho árduo, mas há alguns anos isto deixou de ser um problema com a ajuda das IDEs. Então vou mostrar como utilizar os recursos do Eclipse que facilitam o desenvolvimento de serviços. Você já sabe o que é um WebServices e também como é simples publicá-lo utilizando Axis, mas nem [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Criar WebServices já foi um trabalho árduo, mas há alguns anos isto deixou de ser um problema com a ajuda das IDEs. Então vou mostrar como utilizar os recursos do Eclipse que facilitam o desenvolvimento de serviços.</p>
<p>Você já sabe o que é um WebServices e também como é simples publicá-lo utilizando Axis, mas nem todos seus serviços irão trabalhar apenas com tipos de dados primitivos, provavelmente será necessário retornar uma lista de Pessoas, Enderecos, ou qualquer outro tipo de dado complexo.</p>
<p>Nosso cenário é um projeto cujo o objetivo é fornecer consultas de Países e seus respectivos Estados, acessados através de serviços, a definição de Beans, DAOs e qualquer outras classes serão ocultadas, porém, no final deste post você poderá baixar a versão completa do projeto.</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem1.jpg"></a></p>
<p style="TEXT-ALIGN: center"><img class="alignnone size-medium wp-image-42 aligncenter" title="imagem1" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem1.jpg" alt="" width="240" height="122" /></p>
<p>Bem como já foi demonstrado aqui precisamos de uma classe para que seja a base do serviço, neste caso será a harpia.region.services.Region, veja:</p>
<pre class="brush: java;">
package harpia.region.services;

/* imports ocultados */

public class Region {
private RegionDAO rdao = new RegionDAO();

/**
*
* @param Nome do Pais
* @return Todos os países encontrados
*/
public Pais[] find(String nmPais){
ArrayList&lt;pais&gt; list = rdao.getAllPais( nmPais );
Pais[] paises    = new Pais[list.size()];
list.toArray(paises);

return paises;
}
}
</pre>
<p><strong>Criando o WSDL<br />
</strong>Crie um novo objeto chamado Web Service (File &gt; New &gt; Others &gt; Web Service). Após selecionar Web Service clique em Next.</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem2.jpg"><img class="alignnone size-medium wp-image-43" title="imagem2" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem2-300x298.jpg" alt="" width="300" height="298" /></a></p>
<p>Clique em Browse e selecione a classe responsável por implementar o serviço, ou seja, harpia.region.services.Region. Veja que o tipo deve ser <strong>Bottom up Java Web Service</strong>.</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem3.jpg"><img class="alignnone size-medium wp-image-44" title="imagem3" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem3-254x300.jpg" alt="" width="254" height="300" /></a></p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem4.jpg"><img class="alignnone size-medium wp-image-45" title="imagem4" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem4-300x250.jpg" alt="" width="300" height="250" /></a></p>
<p>Na sequência serão exibidos os métodos disponibilizados pelo serviço, caso você não queira publicar basta desmarcar.</p>
<p><img class="alignnone size-medium wp-image-46" title="imagem5" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem5-254x300.jpg" alt="" width="254" height="300" /></p>
<p>E por fim a caixa de dialogo informa que o servidor Apache está down é que será necessário fazer o startup para concluir a criação e publicação do WSDL, utilize esta mesma tela para iniciar o servidor e concluir o passo-a-passo.</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem6.jpg"><img class="alignnone size-medium wp-image-47" title="imagem6" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/imagem6-255x300.jpg" alt="" width="255" height="300" /></a></p>
<p>Veja que um novo arquivo foi criado em projeto, agora existe o wsdl/Region.wsdl.</p>
<p>O WSDL (Web Service Description Language) nada mais é do que um Schema XML cujo está descrito o serviço de internet. Você poderá acessar este serviço em <a href="http://localhost/Harpia/wsdl/Region.wsdl">http://localhost/Harpia/wsdl/Region.wsdl</a> ou também <a href="http://localhost/Harpia/services/Region?wsdl">http://localhost/Harpia/services/Region?wsdl</a>.</p>
<p><strong>Criando o Client</strong></p>
<p>Nosso serviço foi criado em Java 1.5, porem, neste momento poderiamos fazer uma solicitação a partir de qualquer linguagem que saiba interpretar o WSDL. Vamos continuar no Java por enquanto e fazer a chamada do nosso Web Service.<br />
Já que a intensão é mostrar como a IDE facilita a criação de Web Services, aqui vai mais um wizard de como fazer o Web Service Client no eclipse.</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/client1.jpg"><img class="alignnone size-medium wp-image-49" title="client1" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/client1-300x298.jpg" alt="" width="300" height="298" /></a></p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/client2.jpg"><img class="alignnone size-medium wp-image-50" title="client2" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/client2-298x300.jpg" alt="" width="298" height="300" /></a></p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/client3.jpg"><img class="alignnone size-medium wp-image-51" title="client3" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/client3-298x300.jpg" alt="" width="298" height="300" /></a></p>
<p>Hey Client! Chamaí o serviço pow!</p>
<pre class="brush: java;">
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import harpia.region.bean.Pais;
import harpia.region.services.RegionServiceLocator;

public class HarpiaClient {

public static void main(String[] args) throws RemoteException, ServiceException {
// obter o nome do pais para pesquisa
String nome = JOptionPane.showInputDialog(null, &quot;Qual é o pais?&quot;, &quot;Unido&quot;);

RegionServiceLocator locator = new RegionServiceLocator(); // localizando ...
Pais[] paises = locator.getRegion().find(nome); // procurando ...
for (int i = 0; i &lt; paises.length; i++) { // exibindo
Pais pais = paises[i];

System.out.println(&quot;[&quot;+i+&quot;] &quot; + pais.getNome() + &quot; | ID: &quot; + pais.getId_pais());
}
// Simples assim
}

}
</pre>
<p>E para aqueles que ainda dizem por aí que tudo isso aqui é conversa fiada, se é que existe algum maluco pra dizer isto, tomaí! PHP consumindo o Web Service feito em Java.</p>
<pre class="brush: php;">
&lt;?
$client = new SoapClient(null, array('location' =&gt; 'http://localhost/Harpia/services/Region?wsdl',
'uri' =&gt; 'http://localhost/Harpia/services/Region?wsdl',
'trace' =&gt; '1'));

$result = $client-&gt;find('ale');

if(  is_soap_fault($result) ){
echo &quot;Ocorreu algum erro.&lt;br/&gt;&quot;;
}else{

print_r($result);
}

unset($client);
?&gt;
</pre>
<p>Faça download dos fontes <a href="http://www.lucianosilva.com/download/harpia1.0.zip">aqui</a>.</p>
<p>That&#8217;s all.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "webservices";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/08/05/webservices-part-iii-com-apache-axis-e-tipos-complexos/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Web Services com Apache Axis &#8211; Part II</title>
		<link>http://www.lucianosilva.com/2008/08/05/webservices-com-apache-axis-part-ii/</link>
		<comments>http://www.lucianosilva.com/2008/08/05/webservices-com-apache-axis-part-ii/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 22:11:54 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[axis]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=37</guid>
		<description><![CDATA[Dando sequência a WebServices agora vou demonstrar um exemplo prático de como criar um serviço utilizando os recursos do framework Apache Axis. A instalação do Axis funciona como qualquer outra API na plataforma JEE, portanto não será detalhado este procedimento. A criação de webservices com Apache Axis é muito simples, veja a classe abaixo: public [...]]]></description>
			<content:encoded><![CDATA[<p>Dando sequência a WebServices agora vou demonstrar um exemplo prático de como criar um serviço utilizando os recursos do framework Apache Axis.<br />
A instalação do Axis funciona como qualquer outra API na plataforma JEE, portanto não será detalhado este procedimento.</p>
<p>A criação de webservices com Apache Axis é muito simples, veja a classe abaixo:</p>
<pre class="brush: java;">
public class Calculo {
/**
*
* @param n1
* @param n2
* @return Resultado da Soma
*/
public double soma(double n1, double n2){
return (n1 + n2);
}
}
</pre>
<p>Após criar essa simples classe composta pelo método soma, cujo retorna um tipo primitivo, para que esta classe seja publicada como um serviço basta copiá-la para a aplicação do Axis ($TOMCAT_HOME\webapps\axis) em seguida renomeá-la para Calculo.jws. Acesse o serviço como <a href="http://localhost:8080/axis/Calculo.jws?wsdl">http://localhost:8080/axis/Calculo.jws?wsdl</a>, isto é tudo.</p>
<p style="text-align: center;"><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/tomcat_axis.jpg"><img class="alignnone size-medium wp-image-40 aligncenter" title="tomcat_axis" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/tomcat_axis-300x189.jpg" alt="" width="300" height="189" /></a></p>
<p>Simples assim, criar o Client que irá utilizar o serviço é tão simples quanto.</p>
<pre class="brush: java;">
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class CalculoClient {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
String url = &quot;&lt;a href=&quot;http://localhost/axis/Calculo.jws?wsdl&quot;&gt;http://localhost/axis/Calculo.jws?wsdl&lt;/a&gt;&quot;;
Service service = new Service();
Call call       = (Call) service.createCall();
call.setTargetEndpointAddress( url );
call.setOperationName(&quot;soma&quot;); // método do webservices

Double[] param  = {15.0, 15.0}; // parâmetros
Double result   = (Double) call.invoke( param ); // chamada
System.out.println(&quot;Resultado : &quot; + result );
}
}
</pre>
<p>Exemplos iguais a este devem existir centenas de milhares na internet, simples utilizando tipos primitivos, básico mesmo. Mas cansado de saber disto vou demonstrar um exemplo mais completo utilizando tipo de dados complexos!</p>
<p>Veja mais esses artigos excelentes:<br />
<a href="http://www.javafree.org/content/view.jf?idContent=4">http://www.javafree.org/content/view.jf?idContent=4</a><br />
<a href="http://www.guj.com.br/java.tutorial.artigo.180.1.guj">http://www.guj.com.br/java.tutorial.artigo.180.1.guj</a><br />
<a href="http://www.guj.com.br/java.tutorial.artigo.132.1.guj">http://www.guj.com.br/java.tutorial.artigo.132.1.guj</a></p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "webservices";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/08/05/webservices-com-apache-axis-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Services &#8211; Part I</title>
		<link>http://www.lucianosilva.com/2008/08/03/webservices-part-i/</link>
		<comments>http://www.lucianosilva.com/2008/08/03/webservices-part-i/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 01:30:24 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[axis]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=36</guid>
		<description><![CDATA[Provavelmente você já ouviu falar sobre serviços na web, mas cê sabe mesmo o que é isto? Web Services nada mais é do que um serviço remoto descrito utilizando a WSDL &#8211; Web Service Description Language &#8211; e acessado utilizando um protocolo (SOAP) totalmente abstrato. As grandes do mercado Microsoft, Oracle, IBM, Sun, HP entre [...]]]></description>
			<content:encoded><![CDATA[<p>Provavelmente você já ouviu falar sobre serviços na web, mas cê sabe mesmo o que é isto?</p>
<p>Web Services nada mais é do que um serviço remoto descrito utilizando a WSDL &#8211; Web Service Description Language &#8211; e acessado utilizando um protocolo (SOAP) totalmente abstrato.</p>
<p>As grandes do mercado Microsoft, Oracle, IBM, Sun, HP entre outos, estão a frente do WS-I, orgão responsável por manter e garantir o funcionamento dos webservices em qualquer plataforma.</p>
<p style="text-align: center;"><a href="http://www.lucianosilva.com/wp-content/uploads/2008/08/web_services.jpg"><img class="alignnone size-medium wp-image-38 aligncenter" title="Web Services" src="http://www.lucianosilva.com/wp-content/uploads/2008/08/web_services.jpg" alt="" width="240" height="218" /></a></p>
<p>Simples assim&#8230;</p>
<p>O popular SOAP nada mais é do que um schema descrito em XML, definindo o serviço e sua localização, para que o cliente faça a conexão.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "webservices";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/08/03/webservices-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Função InitCap para MySql</title>
		<link>http://www.lucianosilva.com/2008/07/25/funcao-initcap-para-mysql/</link>
		<comments>http://www.lucianosilva.com/2008/07/25/funcao-initcap-para-mysql/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 00:52:56 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[initcap]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[util]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=33</guid>
		<description><![CDATA[Conhecida em várias linguagens e ambientes o InitCap tem a função de transformar o primeiro caracter de cada palavra em maíusculo e o restante em minúsculo. Infelizmente o MySql não disponibiliza essa funcionalidade nativa, portanto, você terá que criá-la. Essa é a minha versão do InitCap em Java. private static final String SEPARADOR[] = {&#34;do&#34;,&#34;da&#34;,&#34;de&#34;,&#34;e&#34;,&#34;dos&#34;,&#34;das&#34;}; [...]]]></description>
			<content:encoded><![CDATA[<p>Conhecida em várias linguagens e ambientes o InitCap tem a função de transformar o primeiro caracter de cada palavra em maíusculo e o restante em minúsculo. Infelizmente o MySql não disponibiliza essa funcionalidade nativa, portanto, você terá que criá-la.</p>
<p>Essa é a minha versão do InitCap em Java.</p>
<pre class="brush: java;">
private static final String SEPARADOR[] = {&quot;do&quot;,&quot;da&quot;,&quot;de&quot;,&quot;e&quot;,&quot;dos&quot;,&quot;das&quot;};

/**
* @author lsilva
* @param in
* @return
*/
public static String initCap( String in ){
String out    = null;
String[] part = in.split(&quot; &quot;);
StringBuffer temp = new StringBuffer();

for (int i = 0; i&lt;part.length; i++){

if( i&gt;0 ) temp.append(&quot; &quot;);
if( ehSeparador( part[i] ) ){
temp.append( part[i].toLowerCase() );
}else{
temp.append( part[i].substring(0, 1).toUpperCase() );
temp.append( part[i].toLowerCase().substring(1, part[i].length()) );
}
}// for end

out = temp.toString();
return out;
}

/**
* @author lsilva
* @param sep
* @return
*/
private static boolean ehSeparador(String sep){
boolean r = false;
for (int i = 0; i &lt; SEPARADOR.length; i++){

if( sep.equalsIgnoreCase( SEPARADOR[i] ) ){
r = true;
break;
}else{
r = false;
}
}
return r;
}
</pre>
<p>Depois de algumas discussões e muita zuação, meu amigo Orlando disse: &#8220;Muita firula pra pouca coisa, faz assim cara:</p>
<pre class="brush: java;">
/**
* @author oneto
* @param n
* @return
*/
public static String initCap( String n ){
String[] x                      = n.split(&quot; &quot;);
StringBuffer r  = new StringBuffer();
String e                        = &quot; de , da , des , da &quot;;

for (int i = 0;i&lt;x.length;i++){
if(e.indexOf(x[i].trim().toLowerCase())&lt; 0){
r.append(x[i].substring(0,1).toUpperCase() + x[i].substring(1,x[i].length()).toLowerCase() + &quot; &quot; );
}else{
r.append(x[i].toLowerCase() + &quot; &quot;);
}
}
return r.toString().trim();
}
</pre>
<p>Essa função pode ser feita de diversas outras maneiras, aqui foram apenas sugeridas algumas. Muitas vezes você não precisará criar basta pesquisar sobre a linguagem utilizada, por exemplo, em PHP a função nativa para isto é o <strong>ucwords</strong>.</p>
<p>That&#8217;s all.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "util";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/07/25/funcao-initcap-para-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX II: Java Server Faces com Jboss RichFaces</title>
		<link>http://www.lucianosilva.com/2008/07/06/ajax-java-server-faces-com-jboss-richfaces/</link>
		<comments>http://www.lucianosilva.com/2008/07/06/ajax-java-server-faces-com-jboss-richfaces/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 23:19:52 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[richfaces]]></category>

		<guid isPermaLink="false">http://www.lucianosilva.com/?p=29</guid>
		<description><![CDATA[Continuando com a série de posts sobre AJAX, agora vou mostrar como é mais simples desenvolver aplicativos utilizando um framework e o escolhido foi JavaServer Faces. A utilização de frameworks é uma mão-na-roda, tanto no sentido de diminuir muito a reconstrução de funcionalidades básicas, tão quanto para padronizar componentes. O JavaServer Faces há tempos é [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando com a série de posts sobre AJAX, agora vou mostrar como é mais simples desenvolver aplicativos utilizando um framework e o escolhido foi JavaServer Faces.</p>
<p>A utilização de <em>frameworks</em> é uma mão-na-roda, tanto no sentido de diminuir muito a reconstrução de funcionalidades básicas, tão quanto para padronizar componentes. O JavaServer Faces há tempos é uma base de desenvolvimento segura, padronizada e rica em componentes web 2.0, seguindo este padrão o pessoal do <a href="http://jboss.org" target="_blank">JBoss</a> criou o <em>RichFaces</em>, que futuramente foi chamado de <em>Ajax4Jsf</em>, nada mais é que um pacote de componentes pré-definidos para construção de aplicativos utilizando AJAX. No <a href="http://pt.wikipedia.org" target="_blank">wikipedia </a>você encontra uma descrição mais detalhada sobre <a href="http://en.wikipedia.org/wiki/JavaServer_Faces" target="_blank">JSF</a> e <a href="http://en.wikipedia.org/wiki/Richfaces" target="_blank">RichFaces</a>.</p>
<p>Em seguida vou demonstrar um desafio feito por mim mesmo, veja <a href="http://www.lucianosilva.com/ajax-nada-novo-mas-que-muda-tudo/">aqui</a>, construindo um auto-completar utilizando JSF com Richfaces.</p>
<p>Os conceitos de JSF e RichFaces não serão discutidos, ou seja, apenas vou demonstrar como criar a aplicação sem detalhar a configuração feita no <strong>web.xml</strong> e no <strong>faces-config.xml</strong>, futuramente dedicarei um post sobre essas configurações.</p>
<p>Em seguida será demonstrado como construit um auto-completar cujo conteúdo será o nome de países, portanto, a estrutura básica das classes é esta:</p>
<p><a href="http://www.lucianosilva.com/wp-content/uploads/2008/07/rich-faces.jpg"><img class="aligncenter size-full wp-image-30" title="Estrutura de Classes" src="http://www.lucianosilva.com/wp-content/uploads/2008/07/rich-faces.jpg" alt="" width="278" height="324" /></a></p>
<p>O arquivo web.xml está configurado básicamente para trabalhar com os framewroks JSF e RichFaces.</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
xmlns:web=&quot;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;
xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;
id=&quot;WebApp_ID&quot; version=&quot;2.5&quot;&gt;
&lt;display-name&gt;ClubesRich&lt;/display-name&gt;
&lt;!-- RichFaces Config --&gt;
&lt;context-param&gt;
&lt;param-name&gt;org.richfaces.SKIN&lt;/param-name&gt;
&lt;param-value&gt;blueSky&lt;/param-value&gt;
&lt;/context-param&gt;
&lt;context-param&gt;
&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
&lt;param-value&gt;server&lt;/param-value&gt;
&lt;/context-param&gt;
&lt;filter&gt;
&lt;display-name&gt;RichFaces Filter&lt;/display-name&gt;
&lt;filter-name&gt;richfaces&lt;/filter-name&gt;
&lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;richfaces&lt;/filter-name&gt;
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
&lt;/filter-mapping&gt;

&lt;!-- Faces Config --&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;

&lt;!-- Faces Mapping --&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;!-- Database Config --&gt;
&lt;resource-ref&gt;
&lt;description&gt;DB Connection&lt;/description&gt;
&lt;res-ref-name&gt;jdbc/Clubes&lt;/res-ref-name&gt;
&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
&lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;
&lt;!--  --&gt;
&lt;welcome-file-list&gt;
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;
&lt;welcome-file&gt;index.jsf&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;
&lt;/web-app&gt;
</pre>
<p>Já o ManagerBean está assim configurado no faces-config.xml:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;faces-config version=&quot;1.2&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
xmlns:xi=&quot;http://www.w3.org/2001/XInclude&quot;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd&quot;&gt;
&lt;managed-bean&gt;
&lt;managed-bean-name&gt;regiaoControl&lt;/managed-bean-name&gt;
&lt;managed-bean-class&gt;com.clubs.control.RegiaoControl&lt;/managed-bean-class&gt;
&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
&lt;/managed-bean&gt;
&lt;navigation-rule&gt;
&lt;display-name&gt;autocomplete&lt;/display-name&gt;
&lt;from-view-id&gt;/autocomplete.jsp&lt;/from-view-id&gt;

&lt;/navigation-rule&gt;&lt;/faces-config&gt;
</pre>
<p>Veja abaixo o manager bean terá um método chamado autoCompletePais que receberá um parametro do tipo Object e retorna um ArrayList do tipo Pais.</p>
<pre class="brush: java;">
public ArrayList&lt;pais&gt; autoCompletePais(Object o){
return rdao.getAllPais( o.toString() );
}
</pre>
<p>E por fim, o arquivo <strong>autocomplete.jsp</strong>, que foi mapeado no faces-config, mostrará como é simples utilizar o recurso <strong>SuggestionBox </strong>do pacote RichFaces e fazer um auto-completar com diversos recursos, acima de tudo bonito e eficaz no dia-a-dia, veja:</p>
<pre class="brush: java;">
&lt;%@ taglib uri=&quot;http://java.sun.com/jsf/html&quot; prefix=&quot;h&quot;%&gt;
&lt;%@ taglib uri=&quot;http://java.sun.com/jsf/core&quot; prefix=&quot;f&quot;%&gt;
&lt;%@ taglib uri=&quot;http://richfaces.org/a4j&quot; prefix=&quot;a4j&quot;%&gt;
&lt;%@ taglib uri=&quot;http://richfaces.org/rich&quot; prefix=&quot;rich&quot;%&gt;

&lt;f:view&gt;
&lt;h:form&gt;
&lt;rich:panel&gt;
&lt;f:facet name=&quot;header&quot;&gt;&lt;h:outputText value=&quot;Digite o Pais:&quot;/&gt;&lt;/f:facet&gt;
&lt;h:inputText value=&quot;#{regiaoControl.pais.nome}&quot; id=&quot;campo&quot; /&gt;
&lt;rich:suggestionbox height=&quot;150&quot;
width=&quot;150&quot;
for=&quot;campo&quot;
fetchValue=&quot;#{campo.nome}&quot;
suggestionAction=&quot;#{regiaoControl.autoCompletePais}&quot;
var=&quot;campo&quot;&gt;
&lt;h:column&gt;
&lt;h:outputText value=&quot;#{campo.id_pais}&quot;/&gt;
&lt;/h:column&gt;
&lt;h:column&gt;
&lt;h:outputText value=&quot;#{campo.nome}&quot;/&gt;
&lt;/h:column&gt;
&lt;/rich:suggestionbox&gt;
&lt;/rich:panel&gt;
&lt;/h:form&gt;
&lt;/f:view&gt;
</pre>
<p><a href="http://www.youtube.com/v/pDkcJJgL29s" target="_self">Veja o resultado final</a>, tornando a utilização do software mais agradável.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "richfaces";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/07/06/ajax-java-server-faces-com-jboss-richfaces/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AJAX: Nada novo, mas que muda tudo!</title>
		<link>http://www.lucianosilva.com/2008/06/13/ajax-nada-novo-mas-que-muda-tudo/</link>
		<comments>http://www.lucianosilva.com/2008/06/13/ajax-nada-novo-mas-que-muda-tudo/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 01:51:22 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://lucianosilva.wordpress.com/?p=17</guid>
		<description><![CDATA[Resolvi escrever sobre AJAX porque vejo muita confusão ainda sobre o assunto, tem uma galera que não sabe exatamente o que é e, como se aplica e o que se ganha utilizando a técnica. Vou apenas demonstrar o mecanismo básico para funcionamento, não é um segredo, esse mesmo tutorial pode ser encontrado em milhares de [...]]]></description>
			<content:encoded><![CDATA[<p>Resolvi escrever sobre AJAX porque vejo muita confusão ainda sobre o assunto, tem uma galera que não sabe exatamente o que é e, como se aplica e o que se ganha utilizando a técnica. Vou apenas demonstrar o mecanismo básico para funcionamento, não é um segredo, esse mesmo tutorial pode ser encontrado em milhares de sites na internet.</p>
<p>AJAX (Asynchronous JavaScript and XML) é uma técnica simples aplicada em ambiente de internet que utiliza apenas JavaScript e XML, possibilitando ao desenvolvedor criar funcionalidades mais ricas, daí o famoso RIA (Rich Internet Application). É possível usar AJAX em qualquer linguagem dinâmica de internet que suporte XML, como PHP, ASP, J2EE, .NET, etc.  A diferença realmente está nos navegadores de internet, que utilizam o componente chave XMLHttpRequest cada um a sua maneira.</p>
<p>O processo é feito de maneira simples, o XMLHttpRequest  faz uma chamada assíncrona por XML a uma outra página oculta aos olhos do usuário. Esta página oculta por sua vez devolve as informações processadas ao XMLHttpRequest, também via XML, e utilizando JavaScript é feito o parse do XML e exibido o resultado na página principal, que originou a chamada.</p>
<p>Para obter o XMLHttpRequest, eh comum a utilização deste bloco JavaScript</p>
<blockquote><p><span style="color: #0000ff;">if( window.XMLHttpRequest ){ // Firefox, Safári, etc.<br />
xmlReq= new XMLHttpRequest();<br />
}else  if( window.ActiveXObject ){ // Se for IE &#8211; ActiveX version<br />
xmlReq = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;);<br />
}</span></p></blockquote>
<p>Existem outras maneiras para obter o componente, cada programador decide pelo mais conveniente, veja este outro exemplo:</p>
<blockquote><p><span style="color: #0000ff;">try{<br />
xmlReq = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;); // IE<br />
}catch(e){   // Falhou, para os normais<br />
xmlReq = new XMLHttpRequest();<br />
}</span></p></blockquote>
<p>Após obter o XMLHttpRequest, vamos fazer a comunicação com um XML e exibir seu conteúdo, e tudo isso usando apenas JavaScript.</p>
<blockquote><p><span style="color: #808080;"><br />
</span><span style="color: #0000ff;"><span style="color: #808080;">// faz a chamada no servidor da página dinâmica, responsavel por devolver o XML response<br />
// o primeiro parametro indica se a chamada será via GET ou POST<br />
// o segundo informa qual é a página, e por último se será uma chamada assíncrona</span><br />
xmlReq.open(&#8220;GET&#8221;, &#8220;http://localhost/ajax/response.php&#8221;, true);</span></p>
<p><span style="color: #0000ff;"><br />
xmlReq.onreadystatechange=function(){<br />
if( xmlReq.readyState &lt; 4 ){<br />
<span style="color: #808080;">// Enquanto é aguardado o retorno, pode-se exibir uma mensagem</span><br />
}else{<br />
if( xmlReq.readyState == 4 ){<br />
<span style="color: #808080;">// Aqui é colocado o processo de parser do XMLResponse.</span><br />
}<br />
}<br />
}// end OnReadyStateChange<br />
xmlReq.send(null); <span style="color: #808080;">// transporte</span></span></p></blockquote>
<p>Vejam que a primeira ação é chamar a página &#8220;oculta&#8221;, responsável por retornar o XML com os dados necessário.</p>
<p>O <strong>readyState </strong>indica qual o nível do processamento, esses são os estados: 1 &#8211; Sendo enviado; 2 &#8211; Processando; 3 &#8211; Armazenando e 4 &#8211; Pronto. É possível utilizar a propriedade <strong>status </strong>do XMLHttpResponse, esta por sua vez indica o status da página que foi chamada, ou seja, se ocorreu algum erro ou não.</p>
<p>That`s all! Simples não? É assim que funciona o famoso AJAX, nada mais além disso, os recursos de JavaScript são utilizados ao extremo. Atualmente existem recursos extremamente avançados e mais seguros que este exemplo, mesmo assim é válido o entendimento do mecanismo utilizado nesses frameworks e esclarecer o funcionamento do AJAX.</p>
<p>Você pode fazer <a title="Ajax Arquivos" href="http://www.lucianosilva.com/download/ajax.rar" target="_blank">aqui</a> o download de um exemplo simples, porém muito útil em formulários de cadastro, onde três dropdowns (País, Estado e Cidade) interdependentes, que ao fazer o reload da página para carregá-los é muito cansativo. Vale ressaltar que utilizei PHP para a construção deste pequeno tutorial, acabando como mito de que AJAX está vinculado a Java/.Net.</p>
<p><strong>Ambiente</strong></p>
<p><strong></strong>PHP 5 e MySQL 5, rodando em Windows XP, IE 6 e 7 e Firefox 2.</p>
<p><strong>Desafio</strong></p>
<p>Talvez você tenha idéia melhores para aplicar o AJAX depois de entendê-lo e, eu não me surpreenderia com isto, então faço aqui um desafio para estimular o aprendizado: crie um Auto-Completar! Você é capaz?!</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "web2.0";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/06/13/ajax-nada-novo-mas-que-muda-tudo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java, Os iniciantes e a Sopa de Letrinhas</title>
		<link>http://www.lucianosilva.com/2008/04/15/java-os-iniciantes-e-a-sopa-de-letrinhas/</link>
		<comments>http://www.lucianosilva.com/2008/04/15/java-os-iniciantes-e-a-sopa-de-letrinhas/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 02:36:31 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://lucianosilva.wordpress.com/?p=13</guid>
		<description><![CDATA[Uma breve histórinha: &#8220;recentemente um amigo iniciou seu estágio em uma grande companhia em Soluções de TI, ele fez treinamentos específicos durante algum tempo, porém, para sua surpresa o tal treinamento foi ignorado e disseram agora você irá estagiar em Java (JEE) e PlSql (Oracle), hã? O que é isso? Meu amigo não gostou da [...]]]></description>
			<content:encoded><![CDATA[<p>Uma breve histórinha: &#8220;recentemente um amigo iniciou seu estágio em uma grande companhia em Soluções de TI, ele fez treinamentos específicos durante algum tempo, porém, para sua surpresa o tal treinamento foi ignorado e disseram agora você irá estagiar em Java (JEE) e PlSql (Oracle), hã? O que é isso? Meu amigo não gostou da idéia inicialmente mas depois de algumas conversas ele mudou de idéia, hoje está feliz tentando entender e programar em Java&#8221;.</p>
<p>Eu aprendi um pouco com esta história, aprendi que as empresas muitas vezes não estão preocupadas quão bom será o seu código, ou ainda qual o seu nível de conhecimento sobre a plataforma de desenvolvimento utilizada. Conhecer o ambiente, quais as possibilidades de evolução dele, a aceitação de mercado, e vou mais afundo a portabildiade, segurança e velocidade consideradas por especialistas são de extrema importância para um desenvolvedor, e não apenas &#8220;Leia e Faça&#8221;.</p>
<p>Calma lá, ou muita calma nessa hora! :)<br />
Não quero ser polêmico e chato neste primeiro post, portanto deixaremos minhas opiniões a parte e vamos ao que interessa.</p>
<p>Muitas pessoas quando iniciam seus estudos no mundo Java ficam espantados com a quantidade de siglas, e realmente é uma sopa de letrinhas quase que inesgotável, mas como estamos aqui para esclarecer e não complicar ainda mais, vamos lá. Abaixo listei algumas siglas junto a um breve resumo.</p>
<p><strong>JVM &#8211; Java Virtual Machine</strong><br />
Máquina Virtual Java, responsável por carregar os programas e fazer a conversão do bytecodes em Linguagem de Máquina, definida para cada estrutura de Sistema Operacional. Aqui está um dos grandes diferenciais do Java comparado a outros linguagens, o programa não se limita ao SO já que a JVM faz a conversão.</p>
<p><strong>JRE &#8211; Java Runtime Environment</strong><br />
Composto pela JVM e Bibliotecas Java para execução de programas em tempo real.</p>
<p><strong>JSE &#8211; Java Standard Edition</strong><br />
Ambiente com a estrutura básica necessária para criação de programas Java, contém a JVM, o compilador e as bibliotecas Java necessárias.</p>
<p><strong>JEE &#8211; Java Enterprise Edition</strong><br />
Assim como JSE, o JEE é uma edição do ambiente Java para desenvolvimento de programas, porém, com número de recursos superior, permitindo o desenvolvimento em multicamadas, componentes distribuídos, ambientes de internet, etc.</p>
<p><strong>JME &#8211; Java Micro Edition</strong><br />
Edição do Java voltado para dispositivos capacidade de memória compacta, tais como: Celulares, PDAs, e muitos outros dispositivos.</p>
<p><strong>JSDK &#8211; Java Standard Development Kit</strong><br />
Contém o JRE, JSE, os fontes das classes Java e o JavaDoc, com isto, fornecendo o ambiente para desenvolvimento e execução de programas Java.</p>
<p><strong>JAVA_HOME</strong><br />
É o nome da variável de sistema operacional que contém o caminho de instalação do JSDK. Uma boa prática que deve ser seguidas por todos bons programadores.</p>
<p><strong>CLASSPATH</strong><br />
É o nome da variável de sistema operacional que contém o caminho das bibliotecas nativas do Java ou de terceiros para a compilação e execução de programas Java.</p>
<p><strong>EJB</strong><br />
Enterprise JavaBeans, componente JEE que fica no container do Servidor de Aplicação, auxilia no desenvolvimento de aplicações distribuídas, transacionais de forma segura e ágil.</p>
<p>Obviamente que foram listados pouquissimos termos aqui talvez você tenha ouvido falar em Design Pattern, JSF, JFX, Tomcat, JBoss, e nem saiba que raios isto significa!Fique tranquilo ao longo do tempo iremos discutir mais sobre eles.</p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "Java";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2008/04/15/java-os-iniciantes-e-a-sopa-de-letrinhas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Data Access Object (DAO)</title>
		<link>http://www.lucianosilva.com/2007/09/28/hello-world/</link>
		<comments>http://www.lucianosilva.com/2007/09/28/hello-world/#comments</comments>
		<pubDate>Fri, 28 Sep 2007 11:49:27 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[DAO]]></category>
		<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://blog.lucianosilva.com/?p=11</guid>
		<description><![CDATA[Recentemente revivi a experiência de lidar com a construção de DAOs, especificamente com Factory, fiz algumas pesquisas na internet e não encontrei nenhum material bacana em português, então pensei em criar um exemplo simples porém eficaz. Data Access Object é um padrão da camada de integração para recuperação de dados, independente da fonte, ou seja, [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente revivi a experiência de lidar com a construção de DAOs, especificamente com Factory, fiz algumas pesquisas na internet e não encontrei nenhum material bacana em português, então pensei em criar um exemplo simples porém eficaz.</p>
<p>Data Access Object é um padrão da camada de integração para recuperação de dados, independente da fonte, ou seja, podem ser utilizadas vários data sources da mesma forma deixando totalmente transparente para a aplicação.</p>
<p>Abstração é ponto importante do pattern, algumas pessoas acabam complicando, fazendo com que sejam criadas muitas classes sem necessidade, o próprio site da <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html" target="_blank">Sun</a> não é muito didático.</p>
<p>Enfim, o embasamento deste post refere-se ao Blog do <a href="http://beyondclick.wordpress.com/2007/06/07/dao-factory-dinamica/" target="_blank">Beyond </a>e no artigo do <a href="http://www.javafree.org/content/view.jf?idContent=183" target="_blank">Davi Lucas</a> no JavaFree.</p>
<p><a title="Diagram Class DAO" href="http://blog.lucianosilva.com/wp-content/uploads/2007/11/dao_v21.jpg"></a><a title="Diagram Class DAO" href="http://blog.lucianosilva.com/wp-content/uploads/2007/11/dao_v21.jpg"></a><a title="Diagram Class DAO" href="http://blog.lucianosilva.com/wp-content/uploads/2007/11/dao_v21.jpg"></a></p>
<p style="text-align:center;"><a title="Diagram Class DAO" href="http://blog.lucianosilva.com/wp-content/uploads/2007/11/dao_v21.jpg"><img style="width:375px;height:403px;" src="http://blog.lucianosilva.com/wp-content/uploads/2007/11/dao_v21.jpg" alt="Diagram Class DAO" width="540" height="552" /></a></p>
<p><a title="Diagram Class DAO" rel="attachment wp-att-4" href="http://lucianosilva.wordpress.com/2007/09/28/hello-world/diagram-class-dao/"></a></p>
<!-- boo-widget start -->
          <script type="text/javascript">
            bb_keywords = "design pattern";
            bb_bid  = "41213";
            bb_lang = "pt-BR";
            bb_name = "custom";bb_limit = "4";bb_format = "bbm";
          </script>
          <script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
          <!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.lucianosilva.com/2007/09/28/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
