<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1273956776603549315</id><updated>2011-11-27T16:16:02.173-08:00</updated><category term='squid'/><category term='linux'/><category term='xml'/><category term='hibernate'/><category term='virtualbox'/><category term='extgwt'/><category term='mygwt'/><category term='MySQL'/><category term='boot'/><category term='pcmcia'/><category term='java'/><category term='wireless'/><category term='spring'/><category term='jboss'/><category term='gwt'/><category term='Ubuntu'/><category term='iptables'/><category term='openldap'/><category term='thread'/><category term='splash'/><title type='text'>»» Anderson Clayton »» Linux &amp; Java</title><subtitle type='html'>Conteúdo voltado para Java e Linux.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-1132746367252012291</id><published>2008-07-17T05:12:00.000-07:00</published><updated>2008-07-17T05:53:50.331-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Usando o Spring para trabalhar com LDAP</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Estou construindo uma aplicação com GWT e Spring, para me ajudar na hora de administrar usuários do Squid, pelo LDAP. O LDAP é muito bom para centralizar contas de usuários e em breve minha aplicação funcionará também para PDC no Samba, contas de e-mails e tudo que usa o LDAP. Eu vou disponibilizar para a comunidade assim que terminado.&lt;br /&gt;&lt;br /&gt;Bom, vamos lá. Não vou entrar em muitos detalhes para a configuração do LDAP, mas deixe a base principal como dc=teste,dc=com,dc=br e o usuário administrador como cn=admin,dc=teste,dc=com,dc=br e a senha como teste.&lt;br /&gt;&lt;br /&gt;Crie um projeto no Eclipse, se você está usando Maven, melhor ainda, adicione as dependências do spring-ldap lá, senão, acesse o site www.springframework.org/ldap e faça o download da biblioteca e suas dependências, e adicione no projeto.&lt;br /&gt;&lt;br /&gt;Crie um arquivo applicationContext.xml e adicione o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;bean id="contextSource" &lt;br /&gt;  class="org.springframework.ldap.core.support.LdapContextSource"&amp;gt;&lt;br /&gt;  &amp;lt;property name="url" value="ldap://localhost:389" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="base" value="dc=teste,dc=com,dc=br" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="userDn" value="cn=admin,dc=teste,dc=com,dc=br" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="password" value="teste" /&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate"&amp;gt;&lt;br /&gt;  &amp;lt;constructor-arg ref="contextSource" /&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;bean id="userDao" class="br.org.teste.server.UserLdapDao"&amp;gt;&lt;br /&gt;  &amp;lt;property name="ldapTemplate" ref="ldapTemplate" /&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Beleza, a parte do Spring já está configurada, agora só fazermos um DAO e um POJO para trabalharmos.&lt;br /&gt;&lt;br /&gt;Bom, se você for trabalhar com o objeto do LDAP inetOrgPerson, você pode fazer a seguinte estrutura na classe POJO:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class UserLdap {&lt;br /&gt;&lt;br /&gt; private String fullName;&lt;br /&gt; private String lastName;&lt;br /&gt; private String uid;&lt;br /&gt; private String givenName;&lt;br /&gt; private String userPassword;&lt;br /&gt; private String description;&lt;br /&gt; private String mail;&lt;br /&gt; &lt;br /&gt; public String getFullName() {&lt;br /&gt;  return fullName;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setFullName(String fullName) {&lt;br /&gt;  this.fullName = fullName;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public String getLastName() {&lt;br /&gt;  return lastName;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setLastName(String lastName) {&lt;br /&gt;  this.lastName = lastName;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public String getUserId() {&lt;br /&gt;  return uid;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setUserId(String userId) {&lt;br /&gt;  this.uid = userId;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setGivenName(String givenName) {&lt;br /&gt;  this.givenName = givenName;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public String getGivenName() {&lt;br /&gt;  return givenName;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setUserPassword(String userPassword) {&lt;br /&gt;  this.userPassword = userPassword;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public Object getUserPassword() {&lt;br /&gt;  return userPassword;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setDescription(String description) {&lt;br /&gt;  this.description = description;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getDescription() {&lt;br /&gt;  return description;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setMail(String mail) {&lt;br /&gt;  this.mail = mail;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getMail() {&lt;br /&gt;  return mail;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos fazer a classe DAO. Vou mostrar a classe que eu fiz para as minhas necessidades, se você quiser se aprofundar mais, acesse o site http://static.springframework.org/spring-ldap/docs/1.2.1/reference/&lt;br /&gt;&lt;br /&gt;O difícil é entender o Spring, depois que você entende como funciona, a documentação no site se torna muito mais fácil.&lt;br /&gt;&lt;br /&gt;Então vamos lá, crie a classe DAO com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class UserLdapDao {&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; private LdapTemplate ldapTemplate;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Define um LdapTemplate do Spring&lt;br /&gt;  * @param ldapTemplate Define um objeto LdapTemplate&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; public void setLdapTemplate(LdapTemplate ldapTemplate) {&lt;br /&gt;  this.ldapTemplate = ldapTemplate;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Metodo que compila um DN&lt;br /&gt;  * @param user Define um objeto UserLdap&lt;br /&gt;  * @return Retorna um objeto Name&lt;br /&gt;  */&lt;br /&gt; public Name buildDn(UserLdap user) {&lt;br /&gt;  DistinguishedName dn = new DistinguishedName();&lt;br /&gt;  dn.add("cn", user.getFullName());&lt;br /&gt;  &lt;br /&gt;  return dn;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Metodo que insere uma nova entrada no Ldap&lt;br /&gt;  * @param user Define um objeto UserLdap&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; public void create(UserLdap user) {&lt;br /&gt;  Name dn = buildDn(user);&lt;br /&gt;  ldapTemplate.bind(dn, null, buildAttributes(user));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Metodo que remove uma entrada no Ldap&lt;br /&gt;  * @param user Define um objeto UserLdap&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; public void delete(UserLdap user) {&lt;br /&gt;  Name dn = buildDn(user);&lt;br /&gt;  ldapTemplate.unbind(dn);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Metodo que atualiza um registro no Ldap&lt;br /&gt;  * @param user Define um objeto UserLdap&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; public void update(UserLdap user) {&lt;br /&gt;  Name dn = buildDn(user);&lt;br /&gt;  ldapTemplate.rebind(dn, null, buildAttributes(user));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Metodo que compila os atributos para ser inserido, removido ou atualizado&lt;br /&gt;  * @param user Define um objeto UserLdap&lt;br /&gt;  * @return Retorna um objeto Attributes&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; private Attributes buildAttributes(UserLdap user) {&lt;br /&gt;  Attributes attrs = new BasicAttributes();&lt;br /&gt;  BasicAttribute ocattr = new BasicAttribute("objectclass");&lt;br /&gt;  &lt;br /&gt;  ocattr.add("top");&lt;br /&gt;  ocattr.add("inetOrgPerson");&lt;br /&gt;  &lt;br /&gt;  attrs.put(ocattr);&lt;br /&gt;  attrs.put("sn", user.getLastName());&lt;br /&gt;  attrs.put("givenName", user.getGivenName());&lt;br /&gt;  attrs.put("uid", user.getUserId());&lt;br /&gt;  attrs.put("userPassword", user.getUserPassword());&lt;br /&gt;  attrs.put("description", user.getDescription());&lt;br /&gt;  attrs.put("mail", user.getMail());&lt;br /&gt;  &lt;br /&gt;  return attrs;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Pega todo os registros do Ldap da classe inetOrgPerson&lt;br /&gt;  * @return Retorna uma lista de resultados&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; public List getAll() {&lt;br /&gt;  AndFilter filter = new AndFilter();&lt;br /&gt;  filter.and(new EqualsFilter("objectclass","inetOrgPerson"));&lt;br /&gt;  filter.and(new EqualsFilter("objectclass","person"));&lt;br /&gt;  &lt;br /&gt;  return ldapTemplate.search("", &lt;br /&gt;    filter.encode(), new PersonAttributesMapper());&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Pesquisa injetando os resultados no objeto UserLdao&lt;br /&gt;  * @param uid Define um uid para a consulta (Ex.: uid=teste)&lt;br /&gt;  * @return Retorna um objeto UserLdap&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; public List&lt;UserLdap&gt; find(String uid) {&lt;br /&gt;  AndFilter filter = new AndFilter();&lt;br /&gt;  filter.and(new EqualsFilter("objectclass","inetOrgPerson"));&lt;br /&gt;  filter.and(new WhitespaceWildcardsFilter("uid",uid));&lt;br /&gt;  &lt;br /&gt;  return ldapTemplate.search("", &lt;br /&gt;    filter.encode(), new PersonAttributesMapper());&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Classe interna para atribuir os valores para um pojo UserLdap&lt;br /&gt;  * @author anderson&lt;br /&gt;  * @version 1.0&lt;br /&gt;  */&lt;br /&gt; private class PersonAttributesMapper implements AttributesMapper {&lt;br /&gt;&lt;br /&gt;  public Object mapFromAttributes(Attributes attributes)&lt;br /&gt;    throws NamingException {&lt;br /&gt;   &lt;br /&gt;   byte[] senha = (byte[])attributes.get("userPassword").get();&lt;br /&gt;   &lt;br /&gt;   UserLdap user = new UserLdap();&lt;br /&gt;   user.setFullName((String)attributes.get("cn").get());&lt;br /&gt;   user.setLastName((String)attributes.get("sn").get());&lt;br /&gt;   user.setUserId((String)attributes.get("uid").get());&lt;br /&gt;   user.setGivenName((String)attributes.get("givenName").get());&lt;br /&gt;   user.setMail((String)attributes.get("mail").get());&lt;br /&gt;   user.setUserPassword(new String(senha));&lt;br /&gt;   user.setDescription((String)attributes.get("description").get());&lt;br /&gt;   &lt;br /&gt;   return user;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O método buildAttributes e a classe interna PersonAttributesMapper são os mais importantes e que fazem o negócio funcionar. O método buildAttributes compila os atributos do objeto inetOrgPerson para a base LDAP, você pode definir o objectclass e seus atributos, quais você quiser. A classe interna PersonAttributesMapper retorna no seu POJO, os valores da pesquisa que você solicitou. &lt;br /&gt;&lt;br /&gt;E para chamar o DAO, é simples. Na classe que você precisar, basta fazer o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(&lt;br /&gt;   new String[] { "applicationContext.xml" });&lt;br /&gt;UserLdapDao userDao = (UserLdapDao) ctx.getBean("userDao");&lt;br /&gt;List&lt;UserLdap&gt; resultado = userDao.find("uid=teste");&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O Spring é mil e uma utilidades, dá para trabalhar só com ele tranquilamente em seu projeto. Estou gostando de usar ele e a cada dia aprendo alguma coisa nova. &lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-1132746367252012291?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/1132746367252012291/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=1132746367252012291' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/1132746367252012291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/1132746367252012291'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/07/usando-o-spring-para-trabalhar-com-ldap.html' title='Usando o Spring para trabalhar com LDAP'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-6255368640038732852</id><published>2008-07-12T08:26:00.001-07:00</published><updated>2008-07-17T05:53:29.389-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>Problema ao usar o DialogBox no GWT 1.5-RC1</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Eu migrei a versão do GWT no meu sistema para 1.5-RC1, porque estava impossível trabalhar com o Hibernate corretamente, sem gambiarras, sem os recursos do Java 5, como Generics, Annotations, etc. &lt;br /&gt;&lt;br /&gt;Na migração, percebi que as funções das janelas feitas pelo DialogBox não mais funcionava. Fiquei louco e fiz vários testes e descobri o problema. Agora eu não sei se isso é um bug ou de agora em diante vai ser assim. Eu criava o dialog box assim:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class Teste extends DialogBox {&lt;br /&gt;&lt;br /&gt;      public Teste() {&lt;br /&gt;          setText("Teste");&lt;br /&gt;          setSize("200","200");&lt;br /&gt;          center();&lt;br /&gt;&lt;br /&gt;          final Button btFechar = new Button("Fechar", new ClickListener() {&lt;br /&gt;                 public void onClick(Widget sender) {&lt;br /&gt;                       hide();&lt;br /&gt;                 }&lt;br /&gt;&lt;br /&gt;          });&lt;br /&gt;      }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Depois ao instanciar a classe, basta chamar o método show(). Isso funciona no GWT 1.4, inclusive no Swing e AWT também. Agora para funcionar tem que ser feito assim:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class Teste {&lt;br /&gt;&lt;br /&gt;      public Teste() {&lt;br /&gt;           DialogBox d = createDialog();&lt;br /&gt;           d.setSize("200","200");&lt;br /&gt;           d.center();&lt;br /&gt;           d.show();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      public DialogBox createDialog() {&lt;br /&gt;          final DialogBox dialogBox = new DialogBox();&lt;br /&gt;   dialogBox.ensureDebugId("cwDialogBox");&lt;br /&gt;   dialogBox.setText("Teste");&lt;br /&gt;&lt;br /&gt;          Button btFechar = new Button("Fechar", new ClickListener() {&lt;br /&gt;                 public void onClick(Widget sender) {&lt;br /&gt;                       hide();&lt;br /&gt;                 }&lt;br /&gt;&lt;br /&gt;          });&lt;br /&gt;&lt;br /&gt;          dialogBox.setWidget(btFechar);&lt;br /&gt;&lt;br /&gt;          return dialogBox;&lt;br /&gt;      }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Vamos torcer para ser apenas um bug da versão release candidate.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-6255368640038732852?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/6255368640038732852/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=6255368640038732852' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6255368640038732852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6255368640038732852'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/07/problema-ao-usar-o-dialogbox-no-gwt-15.html' title='Problema ao usar o DialogBox no GWT 1.5-RC1'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-70342817888415111</id><published>2008-07-10T06:09:00.000-07:00</published><updated>2008-07-17T05:53:04.815-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>VistaFei - Ferramenta RAD para GWT</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Hoje estava dando umas voltas pelo Orkut e achei uma comunidade relacionada ao GWT. E um cara falou do tal VistaFei. Entrei no site e já vi de cara que era free e tinha uma versão enterprise. Fiz o download dele e logo me surpriendi com a facilidade do programa. Eles usaram uma versão do Eclipse e trabalharam o plugin deles em cima do Eclipse, então se você só quer uma ferramenta para desenhar telas, está mais que bom. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wirelexsoft.com/VistaFei.html"&gt;http://www.wirelexsoft.com/VistaFei.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-70342817888415111?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/70342817888415111/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=70342817888415111' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/70342817888415111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/70342817888415111'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/07/vistafei-ferramenta-rad-para-gwt.html' title='VistaFei - Ferramenta RAD para GWT'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-7533239210236484526</id><published>2008-07-08T11:58:00.000-07:00</published><updated>2008-07-08T12:42:35.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Usando o Spring para enviar e-mails</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Em uma de minhas pesquisas, percebi que não tem um material bem explicativo sobre o Spring quando se trata de usar outras bibliotecas ou frameworks para executar tal serviço. Um amigo me explicou a filosofia do Spring, que por sinal é bem simples. A partir daí, eu entendi como funciona e agora da pra por pra funcionar qualquer coisa. &lt;br /&gt;&lt;br /&gt;O Spring é interessante quando você quer criar uma instancia única para a aplicação inteira. O Hibernate por exemplo, o objeto SessionFactory é gigantesco e ficar instanciando isso o tempo todo, ou mais de uma vez, vai causar uma lentidão no sistema. Eu migrei o meu sistema Open Source, usando Spring junto com o Hibernate, o tempo de resposta de uma transação, mudou surpreendentemente. Também estou usando o Spring com o JavaMail. Não notei muita diferença de velocidade, mas pode ser muito útil mais pra frente quando o sistema ter que enviar e-mails em massa automaticamente para os administradores. Quem quiser conferir meu sistema Open Source, acesse http://articulus.sourceforge.net&lt;br /&gt;&lt;br /&gt;Bom, vamos ao que interessa. Já expliquei a filosofia do Spring, ele cria uma instancia única para trabalhar no sistema inteiro. Mas é claro que ele não faz só isso, mas é sua principal caracteristica. Crie um projeto qualquer e adicione as bibliotecas do Spring e do JavaMail. Primeiro de tudo, edite seu web.xml da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt; &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt; &amp;lt;param-value&amp;gt;classpath*:WEB-INF/classes/*.*&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt; &amp;lt;listener-class&amp;gt;&lt;br /&gt;  org.springframework.web.context.ContextLoaderListener&lt;br /&gt; &amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Fazendo isso, o Spring vai procurar no contexto dele, os beans que serão instanciados. Próximo passo é criar um arquivo chamado applicationContext.xml. Se você criou um projeto pelo Maven, salve no diretório resources, senão salve em WEB-INF, junto com o web.xml.&lt;br /&gt;&lt;br /&gt;Vamos criar os beans que serão instanciados da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt; http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean id="mailSender" autowire="byName"&lt;br /&gt;  class="org.springframework.mail.javamail.JavaMailSenderImpl"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;property name="host" value="mail.seuhost.com.br" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean id="mailMessage" autowire="byName"&lt;br /&gt;  class="org.springframework.mail.SimpleMailMessage"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;property name="from" &lt;br /&gt;   value="teste@teste.com.br" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="to"&lt;br /&gt;   value="outroteste@teste.com.br" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="subject"&lt;br /&gt;   value="Teste" /&amp;gt;&lt;br /&gt;  &amp;lt;property name="text"&lt;br /&gt;   value="Teste do Spring com o JavaMail" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean id="sendMail" autowire="byName"&lt;br /&gt;  class="br.org.teste.SendMail"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;property name="mailSender" ref="mailSender" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora o mais importante, você vai ter que criar as classes e seus atributos, exatamente como criou nos beans, assim o Spring vai fazer a injeção nos objetos conforme você declarou.&lt;br /&gt;&lt;br /&gt;Crie uma classe chamada SendMail e um pacote chamado br.org.teste e salve a classe lá dentro. Crie a seguinte estrutura:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class SendMail {&lt;br /&gt;&lt;br /&gt; private JavaMailSender mailSender;&lt;br /&gt; private SimpleMailMessage mailMessage;&lt;br /&gt; &lt;br /&gt; public void setMailSender(JavaMailSender mailSender) {&lt;br /&gt;  this.mailSender = mailSender;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setMailMessage(SimpleMailMessage mailMessage) {&lt;br /&gt;  this.mailMessage = mailMessage;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void send() {&lt;br /&gt;  mailSender.send(mailMessage);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Reparam nas propriedades da classe? Possui os mesmos nomes dos beans, assim quando você for chamar o bean, ele vai fazer a injeção dos objetos pelo nome.&lt;br /&gt;&lt;br /&gt;Agora crie uma classe que vai chamar o SendMail, pode ser um Servlet mesmo. Para chamar faça o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;ClassPathXmlApplicationContext ctx = &lt;br /&gt; new ClassPathXmlApplicationContext(&lt;br /&gt; new String[] {"applicationContext.xml"});&lt;br /&gt;&lt;br /&gt;SendMail send = (SendMail)ctx.getBean("sendMail");&lt;br /&gt;send.send();&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Simples né? Muita gente se embaralha totalmente no Spring, mas ele é mais simples do que parece. Eu também penei muito pra entender. Dizem por ae que não precisa invocar o contexto usando a classe ClassPathXmlApplicationContext, que o Spring faz a injeção automaticamente, mas nos meus testes ele só dava NullPointer dae eu desisti. Vou pesquisar mais. Amanhã ou depois eu posto como se faz para trabalhar com o Hibernate e Spring.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-7533239210236484526?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/7533239210236484526/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=7533239210236484526' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/7533239210236484526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/7533239210236484526'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/07/usando-o-spring-para-enviar-e-mails.html' title='Usando o Spring para enviar e-mails'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-4992616846436955752</id><published>2008-07-02T11:48:00.000-07:00</published><updated>2008-07-02T12:21:56.092-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>Internacionalização com o GWT</title><content type='html'>Olá amiguinhos.&lt;br /&gt;&lt;br /&gt;Poucos sabem mas estou desenvolvendo um projeto Open Source, junto com a minha amiga Laydy. E estou utilizando o GWT e ao longo do projeto, descubro muitas coisas e vou postando aqui. O projeto está no começo e pensei na internacionalização. Se eu fosse fazer isso no fim do projeto, seria quase o mesmo que redesenvolver tudo, então resolvi acelerar isso agora. Pesquisei e fui direto ao site do GWT e lá explica detalhadamente (A documentação do GWT é a melhor que eu já vi). Então vou resumir aqui o básico, se precisarem de mais recursos, acessem o esse &lt;b&gt;&lt;a href="http://code.google.com/intl/pt-BR/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.Internationalization.html"&gt;link &lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Primeiro, adicione o seguinte no seu arquivo *.gwt.xml:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;inherits name="com.google.gwt.i18n.I18N"/&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Depois, crie uma interface em algum pacote de sua escolha, vamos nomea-la de Teste:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public interface Teste extends Constants {&lt;br /&gt;  String helloWorld();&lt;br /&gt;  String goodByeWorld();&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Depois crie um arquivo com o mesmo nome da interface, chamado Teste.properties, com a seguinte estrutura:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;helloWorld = Olá mundo!&lt;br /&gt;goodByeWorld = Tchau mundo!&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Simples assim. O nome da interface é a mesma do arquivo properties, assim o GWT sabe qual arquivo pegar. E os métodos da interface, são os mesmos nomes das propriedades. Agora na sua classe principal, faça o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;Teste teste = (Teste)GWT.create(Teste.class);&lt;br /&gt;Window.alert(teste.helloWorld());&lt;br /&gt;Window.alert(teste.goodByeWorld());&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Simples não? O problema é se o sistema for gigante, vai dar trabalho ficar criando isso hehehe. Mas vai da sua criatividade, você pode criar uma classe para tratar isso e um ComboBox para o usuário escolher.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-4992616846436955752?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/4992616846436955752/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=4992616846436955752' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4992616846436955752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4992616846436955752'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/07/internacionalizao-com-o-gwt.html' title='Internacionalização com o GWT'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-6333282867781657553</id><published>2008-07-01T07:10:00.000-07:00</published><updated>2008-07-08T12:41:59.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>Recarregando a página com GWT</title><content type='html'>Olá amiguinhos.&lt;br /&gt;&lt;br /&gt;Primeiro dia do mês e primeiro post do mês. Descobri uma forma de executar métodos nativos pelo GWT. E para recarregar a sua página, não é diferente. Precisa executar um método (função) do JavaScript para dar um reload na página. Eu não testei com outras coisas do tipo, alterar barra de status, título, usar o document.write, entre outros. Até porque o GWT já fornece isso para você. Se alguém encontrar um meio de recarregar a página que seja nativo do GWT, por favor me avise.&lt;br /&gt;&lt;br /&gt;Em alguma classe qualquer, crie o seguinte método:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;private native void reload() /*-{&lt;br /&gt; $wnd.location.reload();&lt;br /&gt;}-*/;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O encapsulamento fica a seu critério, o importante é a palavra-chave native. Eu não pesquisei muito sobre o significado do $wnd mas funcionando já está perfeito hehe.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-6333282867781657553?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/6333282867781657553/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=6333282867781657553' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6333282867781657553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6333282867781657553'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/07/recarregando-pgina-com-gwt.html' title='Recarregando a página com GWT'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-1941992603926190821</id><published>2008-06-22T15:57:00.000-07:00</published><updated>2008-06-22T16:09:03.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><title type='text'>Eliminando o XML de configuração do Hibernate</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Você ainda usa o arquivo hibernate.cfg.xml? Pois é, eu também usava, até uns dias atrás. Vou explicar como é fácil usar a classe Configuration do Hibernate.&lt;br /&gt;&lt;br /&gt;Suponho que você esteja usando um construtor para iniciar as configurações do Hibernate. Veja só como ficaria o construtor.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt; public HibernateInitialize() {&lt;br /&gt;  Configuration cfg = new AnnotationConfiguration()&lt;br /&gt;   .addAnnotatedClass(SuaClasseAnotada.class)&lt;br /&gt;   .setProperty(Environment.HBM2DDL_AUTO, "update")&lt;br /&gt;   .setProperty(Environment.SHOW_SQL, "false")&lt;br /&gt;   .setProperty(Environment.DIALECT, &lt;br /&gt;     "org.hibernate.dialect.MySQLInnoDBDialect")&lt;br /&gt;   .setProperty("hibernate.connection.driver_class", &lt;br /&gt;     "com.mysql.jdbc.Driver")&lt;br /&gt;   .setProperty("hibernate.connection.url", &lt;br /&gt;     "jdbc:mysql://localhost:3306/test")&lt;br /&gt;   .setProperty("hibernate.connection.username", "test")&lt;br /&gt;   .setProperty("hibernate.connection.password", "test")&lt;br /&gt;   .setProperty("hibernate.connection.pool_size", "10");&lt;br /&gt;  &lt;br /&gt;  SessionFactory sf = cfg.buildSessionFactory();&lt;br /&gt;  session = sf.openSession();&lt;br /&gt;  tx = session.beginTransaction();&lt;br /&gt; }&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Dispensa comentários né? Você acaba de montar a mesma estrutura do XML mas dentro da classe que faz a inicialização do Hibernate.&lt;br /&gt;&lt;br /&gt;Nesse &lt;b&gt;&lt;a href="http://www.hibernate.org/hib_docs/reference/en/html/session-configuration.html"&gt;link&lt;/a&gt;&lt;/b&gt; você encontra todas as propriedades para JDBC do Hibernate.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-1941992603926190821?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/1941992603926190821/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=1941992603926190821' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/1941992603926190821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/1941992603926190821'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/eliminando-o-xml-de-configurao-do.html' title='Eliminando o XML de configuração do Hibernate'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-7085827788155863932</id><published>2008-06-20T09:57:00.001-07:00</published><updated>2008-06-20T10:39:13.707-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>Configurando cluster com JBoss</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Tive que fazer uma tarefa aqui no trabalho e não encontrava a solução. Precisava fazer um cluster com o Tomcat, sendo que, se eu desse deploy em um servidor Tomcat, o outro também deveria receber esse deploy. E não estava acontecendo isso e eu estava ficando desesperado já. Resolvi perguntar para meu professor de Protocolos, Cléber, se ele já havia feito cluster com o Tomcat. Ele me deu a dica de usar o JBoss.&lt;br /&gt;&lt;br /&gt;O JBoss é um servidor de aplicações J2EE, assim como o Tomcat, mas com recursos bem melhores. Se quiser saber mais sobre o JBoss, clique &lt;a href="http://www.jboss.org/"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O JBoss já vem pronto para ser cluster. Você não precisa fazer nenhuma configuração se você não quiser, se for algo bem simples é claro. Vou ensinar como fazer um cluster conforme o meu cenário.&lt;br /&gt;&lt;br /&gt;Supondo que você instalou o JBoss em /opt/jboss-4.2.2.GA. Eu criei um link simbólico chamado jboss para facilitar. Acesse o diretório /opt/jboss/bin e execute o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# ./run.sh -c all -b 172.16.5.30&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Onde -c é para informar qual configuração você quer, que é all, e -b é o seu IP. Agora acesse o diretório /opt/jboss/server e execute um ls para você ver. Ali fica os diretórios all, default e minimal. Como indicamos que seria o all, vamos trabalhar dentro do diretório all. É um pouco diferente o esquema do JBoss mas logo você acostuma.&lt;br /&gt;&lt;br /&gt;Por padrão, o JBoss trabalha a comunicação entre os clusters, usando o protocolo UDP. Fica a seu critério. Se sua rede for um pouco instável, é recomendado você usar o protocolo TCP, pois é orientado a conexão.&lt;br /&gt;&lt;br /&gt;Se você quiser usar o TCP, você precisa ter que fazer um trabalho muito árduo. Foi uma das configurações mais complicadas que eu já fiz e sinceramente, espero não precisar fazer mais. Hehehehehe.&lt;br /&gt;&lt;br /&gt;Abra o seguinte arquivo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# vim /opt/jboss/server/all/deploy/cluster-service.xml&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Procure a tag &amp;lt;Config&amp;gt; e comente ela da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;!--&amp;lt;Config&amp;gt;&lt;br /&gt; ....&lt;br /&gt; ....&lt;br /&gt;&amp;lt;/Config&amp;gt;--&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Um pouco mais para baixo, tem outra tag &amp;lt;Config&amp;gt; mas ela já está comentada. É a configuração para TCP. Descomente-a. E dentro da tag &amp;lt;Config&amp;gt; procure a tag &amp;lt;TCPPING&amp;gt; e altere o atributo initial_hosts da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;TCPPING &lt;br /&gt;initial_hosts="${jboss.bind.address}[7800],172.16.5.163[7800]" &lt;br /&gt;port_range="3"&lt;br /&gt;                  timeout="3000"&lt;br /&gt;                  down_thread="false" up_thread="false"&lt;br /&gt;                  num_initial_members="3"/&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Onde ${jboss.bind.address}[7800] pega seu IP local e o outro IP seria o outro nó do seu cluster. Você pode indicar quantos você quiser. O TCPPING amarra os principais nós ao seu cluster. Assim ele não fica procurando e já vai direto ao nó.&lt;br /&gt;&lt;br /&gt;Dificil, não? É eu sei, dá vontade de formatar o PC e começar tudo de novo de tão complicado hehehehehe.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;big&gt;&lt;center&gt;Farm War Deployment&lt;/center&gt;&lt;/big&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Bom, se você já deu uma brincada no JBoss para ver como ele funciona, já percebeu que para fazer deploy nele, basta apenas copiar o .war para o diretório /opt/jboss/server/all/deploy. Mas no nosso caso, precisamos replicar a aplicação para todos os nós, assim, você faz 1 deploy e ele se encarrega de mandar para os outros nós automaticamente. Meus olhos enxeram de lágrimas quando eu vi a facilidade de fazer isso. Basta copiar o .war para o diretório /opt/jboss/server/all/farm.&lt;br /&gt;&lt;br /&gt;Fique olhando no console, onde você executou o comando run.sh, o que ele fez.&lt;br /&gt;&lt;br /&gt;Simples, não? Ah, um detalhe muito importante. Se você configurou 1 nó como TCP, todos os outros precisam ser TCP também. Configure os outros nós conforme a configuração acima e execute o comando run.sh da mesma forma, apenas alterando o IP.&lt;br /&gt;&lt;br /&gt;Espero ter ajudado alguém com esse post.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-7085827788155863932?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/7085827788155863932/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=7085827788155863932' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/7085827788155863932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/7085827788155863932'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/configurando-cluster-com-jboss.html' title='Configurando cluster com JBoss'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-4048794491179450821</id><published>2008-06-17T09:48:00.000-07:00</published><updated>2008-12-09T19:00:03.102-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='thread'/><title type='text'>Trabalhando com Threads e evitando congelamento</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Vou ensinar um esquema que me ajudou por bastante tempo. Controle por iterações no sistema. Um objeto do tipo observador, irá acompanhar as mudanças do sistema.&lt;br /&gt;&lt;br /&gt;Vamos lá, crie a seguinte classe, que será nossa interface gráfica principal:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package br.org.testethread;&lt;br /&gt;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import java.awt.Toolkit;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JLabel;&lt;br /&gt;import javax.swing.JPanel;&lt;br /&gt;&lt;br /&gt;public class Principal extends JFrame {&lt;br /&gt;&lt;br /&gt; private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt; public Principal() {&lt;br /&gt;  super("Teste Thread");&lt;br /&gt;  setSize(150, 150);&lt;br /&gt;  &lt;br /&gt;  Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();&lt;br /&gt;  int w = getSize().width;&lt;br /&gt;  int h = getSize().height;&lt;br /&gt;  int x = (dim.width-w) / 2;&lt;br /&gt;  int y = (dim.height-h) / 2;&lt;br /&gt;  setLocation(x, y);&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;  JPanel p = new JPanel();&lt;br /&gt;  &lt;br /&gt;  final JLabel lb = new JLabel("0");&lt;br /&gt;  final JButton bt = new JButton("Clique aqui!");&lt;br /&gt;  &lt;br /&gt;  bt.addActionListener(new ActionListener() {&lt;br /&gt;&lt;br /&gt;   public void actionPerformed(ActionEvent e) {&lt;br /&gt;    for (int i=0; i &lt; 5000000; i++) {&lt;br /&gt;     lb.setText(String.valueOf(i));&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;  });&lt;br /&gt;  &lt;br /&gt;  p.add(lb);&lt;br /&gt;  p.add(bt);&lt;br /&gt;  &lt;br /&gt;  getContentPane().add(p);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  new Principal().setVisible(true);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VMMGvNwO6To/SFgNOqvB1lI/AAAAAAAAABY/UpvfYPcnDCo/s1600-h/Captura_da_tela-Teste+Thread.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_VMMGvNwO6To/SFgNOqvB1lI/AAAAAAAAABY/UpvfYPcnDCo/s320/Captura_da_tela-Teste+Thread.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5212931114322220626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rode o programa e clique no botão para você ver o que acontece. A interface vai congelar, dependendo do seu processador é claro. Se sua máquina for muito potente, aumente a quantidade de laços. Aqui no meu, tive que deixar em 5 milhões para ficar congelada a tela.&lt;br /&gt;&lt;br /&gt;Para resolver esse problema, crie uma classe chamada Observador com a seguinte estrutura:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package br.org.testethread;&lt;br /&gt;&lt;br /&gt;import java.util.Observable;&lt;br /&gt;import java.util.Observer;&lt;br /&gt;&lt;br /&gt;public class Observador extends Observable implements Runnable {&lt;br /&gt;&lt;br /&gt; public Observador(Observer observador) {&lt;br /&gt;  // Adiciona o objeto observador a lista de observadores&lt;br /&gt;  addObserver(observador);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;  int i;&lt;br /&gt;  for (i = 0; i &lt;= 10; i++) {&lt;br /&gt;   // Notifica o processamento a cada 10 iterações&lt;br /&gt;   if ((i % 10 == 0)) {&lt;br /&gt;    notifyObservers(new Integer(i));&lt;br /&gt;    setChanged();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Notifica fim do processo&lt;br /&gt;  notifyObservers(new Boolean(true));&lt;br /&gt;  setChanged();&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Já temos a nossa classe do tipo Observer, ela vai observar as alterações dos objetos a cada 10 iterações e vai notificar os observadores. Agora precisamos fazer algumas alterações na nossa classe Principal, ela deverá ficar da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package br.org.testethread;&lt;br /&gt;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import java.awt.Toolkit;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import java.util.Observable;&lt;br /&gt;import java.util.Observer;&lt;br /&gt;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JLabel;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;import javax.swing.JPanel;&lt;br /&gt;&lt;br /&gt;// Adiciona a interface Observer&lt;br /&gt;public class Principal extends JFrame implements Observer {&lt;br /&gt;&lt;br /&gt; private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt; // Cria um objeto do tipo Thread&lt;br /&gt; private Thread processo;&lt;br /&gt;&lt;br /&gt; // Declara o label para uso global&lt;br /&gt; private JLabel lb;&lt;br /&gt;&lt;br /&gt; public Principal() {&lt;br /&gt;  super("Teste Thread");&lt;br /&gt;  setSize(150, 150);&lt;br /&gt;&lt;br /&gt;  Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();&lt;br /&gt;  int w = getSize().width;&lt;br /&gt;  int h = getSize().height;&lt;br /&gt;  int x = (dim.width - w) / 2;&lt;br /&gt;  int y = (dim.height - h) / 2;&lt;br /&gt;  setLocation(x, y);&lt;br /&gt;&lt;br /&gt;  JPanel p = new JPanel();&lt;br /&gt;&lt;br /&gt;  lb = new JLabel("0");&lt;br /&gt;  final JButton bt = new JButton("Clique aqui!");&lt;br /&gt;&lt;br /&gt;  bt.addActionListener(new ActionListener() {&lt;br /&gt;&lt;br /&gt;   public void actionPerformed(ActionEvent e) {&lt;br /&gt;                                // metodo que vai criar uma nova thread&lt;br /&gt;    executaProcesso();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;  p.add(lb);&lt;br /&gt;  p.add(bt);&lt;br /&gt;&lt;br /&gt;  getContentPane().add(p);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  new Principal().setVisible(true);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; private void executaProcesso() {&lt;br /&gt;  if (processo == null) {&lt;br /&gt;   processo = new Thread(new Observador(this));&lt;br /&gt;   processo.start();&lt;br /&gt;  } else {&lt;br /&gt;   JOptionPane.showMessageDialog(this,&lt;br /&gt;     "O processo ainda está em execução!");&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void update(Observable o, Object arg) {&lt;br /&gt;  if (arg instanceof Integer) {&lt;br /&gt;                        // O laco foi transportado para essa parte&lt;br /&gt;   for (int i = 0; i &lt; 5000000; i++) {&lt;br /&gt;    lb.setText(String.valueOf(i));&lt;br /&gt;   }&lt;br /&gt;  } else if (arg instanceof Boolean) {&lt;br /&gt;   if (((Boolean) arg).booleanValue()) {&lt;br /&gt;    JOptionPane.showMessageDialog(this, &lt;br /&gt;                                     "Processo terminado!");&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora clique no botão para você ver. Você vai acompanhar a incrementação sem que a tela congele. Enquanto ele continua incrementando, experimente clicar no botão novamente para ver o que acontece. Ele te alerta que o processo ainda não terminou. A interface Observer vai "observar" o processo de acordo com a classe Observador. Não é muito difícil de entender, mas você precisa ter uma noção básica de Thread para entender.&lt;br /&gt;&lt;br /&gt;Não testei esse esquema para Web, quem quiser testar e comentar aqui, seria legal. Mas acredito que para Web o esquema é meio diferente.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-4048794491179450821?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/4048794491179450821/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=4048794491179450821' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4048794491179450821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4048794491179450821'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/trabalhando-com-threads-e-evitando.html' title='Trabalhando com Threads e evitando congelamento'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_VMMGvNwO6To/SFgNOqvB1lI/AAAAAAAAABY/UpvfYPcnDCo/s72-c/Captura_da_tela-Teste+Thread.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-6103792647505991498</id><published>2008-06-16T10:30:00.000-07:00</published><updated>2008-12-09T19:00:03.451-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Fazendo uma conexão bridge no VirtualBox</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Muita gente gosta de usar o VirtualBox por ser leve e prático e ser opensource. Mas um problema é que ele não faz conexão por bridge, sendo assim, impossível o seu sistema operacional se comunicar com o sistema operacional virtualizado. Mas, sempre existe um esqueminha né? Fiz esses testes no Ubuntu e no Debian e funcionou perfeitamente. Vamos lá.&lt;br /&gt;&lt;br /&gt;Instale os seguintes pacotes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# aptitude install bridge-utils uml-utilities&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos criar as interfaces que farão a conexão bridge. Vamos utilizar a interface eth0 para fazer o bridge. Se você possui uma conexão pppoe utilize ela, ou qualquer outra interface que esteja recebendo a conexão. Execute o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# tunctl -t tap1 -u anderson&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Com esse comando, criamos a interface tap1 para ser usada pelo usuário anderson. Essa interface que será usada no VirtualBox. Agora vamos criar uma interface de bridge com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# brctl addbr br0&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Vamos colocar a eth0 (ou sua interface de conexão escolhida) em modo promiscuo, para aceitar conexãoes de outros MACs. Execute o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# ifconfig eth0 0.0.0.0 promisc&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos adicionar a interface eth0 a interface de bridge. Execute:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# brctl addif br0 eth0&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Preciamos definir um IP para nossa interface de bridge. Seja por DHCP ou estático:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# dhclient3 br0&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;ou&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# ifconfig br0 192.168.0.10&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Adicionamos a interface virtual a interface bridge:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# brctl addif br0 tap1&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Terminamos a configuração da nossa conexão bridge, vamos levantar a interface tap1:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# ifconfig tap1 up&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos configurar o VirtualBox para receber essa conexão. Abra seu VirtualBox. Nas preferências de sua máquina virtual, clique em Rede:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VMMGvNwO6To/SFapSYv4GEI/AAAAAAAAABI/nruQJB7pA5E/s1600-h/Captura_da_tela.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_VMMGvNwO6To/SFapSYv4GEI/AAAAAAAAABI/nruQJB7pA5E/s320/Captura_da_tela.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5212539752073926722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Na opção Ligado a, escolha Interface do Hospedeiro. Vai abrir uma caixa de texto abaixo denominado Nome da Placa de Rede, digite tap1:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_VMMGvNwO6To/SFaqGiHodOI/AAAAAAAAABQ/ut_6JQ6imCs/s1600-h/Captura_da_tela-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_VMMGvNwO6To/SFaqGiHodOI/AAAAAAAAABQ/ut_6JQ6imCs/s320/Captura_da_tela-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5212540647942681826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Clique em OK. Agora antes de inicializar a máquina virtual, é preciso dar permissão de escrita em dois arquivos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# chmod 666 /dev/net/tun&lt;br /&gt;# chown root:vboxusers /dev/net/tun&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora inicie a sua máquina virtual. Se estiver com o DHCP configurado, provavelmente ele vai pegar o IP da rede e as máquinas conseguirão pingar na sua máquina virtual. &lt;br /&gt;&lt;br /&gt;Espero ter ajudado.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-6103792647505991498?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/6103792647505991498/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=6103792647505991498' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6103792647505991498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6103792647505991498'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/fazendo-uma-conexo-bridge-no-virtualbox.html' title='Fazendo uma conexão bridge no VirtualBox'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_VMMGvNwO6To/SFapSYv4GEI/AAAAAAAAABI/nruQJB7pA5E/s72-c/Captura_da_tela.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-4361870521814703132</id><published>2008-06-12T05:23:00.000-07:00</published><updated>2008-06-13T05:09:07.176-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><title type='text'>Salvando fotos no banco de dados com Hibernate</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Vi nos fóruns por ae que muita gente tem dúvida quanto a isso. Eu particularmente, prefiro salvar no banco de dados, se forem fotos simples de um cadastro. Acho que evita muitos problemas futuramente.&lt;br /&gt;&lt;br /&gt;O arquivo com todos os arquivos do projeto pode ser baixado nesse link: &lt;a href="http://anderson.insula.com.br/HibernateObject.zip"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nesse exemplo que vou ensinar é bem simples, nem me dei ao luxo de fazer uma mega interface com o Swing, usei o FlowLayout como padrão mesmo e taquei os componentes lá. A beleza do negócio está no Hibernate hehe. Bom, vamos lá, vou ensinar passo a passo. Estou usando o Maven como gerenciador de projetos, que na minha opinião, é perfeito. Mas se você não quiser usar o Maven, basta adicionar no Classpath as bibliotecas do Hibernate e MySQL. Antes de começar, verifique se você possui o MySQL instalado na sua máquina, e então crie um database com o nome de hibernate_object:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;CREATE DATABASE 'hibernate_object';&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Crie um usuário para esse database agora com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;GRANT ALL ON hibernate_object.* TO &lt;br /&gt;'hibernate'@localhost IDENTIFIED BY 'hibernate123';&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Perfeito!!! Agora pode fechar o MySQL que agora vamos só trabalhar com Java. Se você não for usar o Maven, crie um projeto com o nome de HibernateObject. Se estiver usando Maven, crie um archtype padrão e adicione as dependências do Hibernate e MySQL:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 &lt;br /&gt;http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;&lt;br /&gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;br.org.hibernateobject&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;HibernateObject&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;HibernateObject&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&lt;br /&gt; &amp;lt;dependencies&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;hibernate-annotations&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;3.3.1.GA&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;5.1.6&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Para criar a estrutura de diretórios padrão do Maven, basta usar esse comando (Se você estiver usando Linux é claro ;) ):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;$ mkdir -p src/{main,test}/{java,resources}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora basta dar o comando do Maven para atualiza o projeto para o Eclipse:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;$ mvn eclipse:eclipse&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Vamos botar a mão na massa agora. Vamos precisar da seguinte estrutura de classes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;Cadastro&lt;br /&gt;CadastroDao&lt;br /&gt;Hibernateinitialize&lt;br /&gt;Principal&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;E o arquivo XML do Hibernate:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;hibernate.cfg.xml&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, vamos criar a classe Cadastro, que terá a seguinte estrutura:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package br.org.hibernateobject;&lt;br /&gt;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.GenerationType;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.Lob;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "cadastro")&lt;br /&gt;public class Cadastro {&lt;br /&gt;&lt;br /&gt; @Id&lt;br /&gt; @GeneratedValue(strategy = GenerationType.AUTO)&lt;br /&gt; @Column(name = "id_cadastro")&lt;br /&gt; private int id;&lt;br /&gt; &lt;br /&gt; @Column(length = 100)&lt;br /&gt; private String nome;&lt;br /&gt; &lt;br /&gt; @Lob&lt;br /&gt; private byte[] foto;&lt;br /&gt;&lt;br /&gt; public int getId() {&lt;br /&gt;  return id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setId(int id) {&lt;br /&gt;  this.id = id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public byte[] getFoto() {&lt;br /&gt;  return foto;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setFoto(byte[] foto) {&lt;br /&gt;  this.foto = foto;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getNome() {&lt;br /&gt;  return nome;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setNome(String nome) {&lt;br /&gt;  this.nome = nome;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O segredo pra funcionar esse esquema é o annotation @Lob, que cria um campo no banco de dados do tipo Blob ou Clob. Eu não testei em outros bancos, somente no MySQL, mas creio que essa mesma annotation dá pra ser usada em outros tipos.&lt;br /&gt;&lt;br /&gt;Agora vamos criar a classe CadastroDao, onde fará toda a mágica do negócio:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package br.org.hibernateobject;&lt;br /&gt;&lt;br /&gt;import java.io.DataInputStream;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;&lt;br /&gt;import org.hibernate.HibernateException;&lt;br /&gt;&lt;br /&gt;public class CadastroDao {&lt;br /&gt;&lt;br /&gt; public void save(String txt) {&lt;br /&gt;  if (txt.equals("") || txt == null) {&lt;br /&gt;   JOptionPane.showMessageDialog(null, "Campo obrigatório!");&lt;br /&gt;  } else {&lt;br /&gt;   try {&lt;br /&gt;    String nome = null;&lt;br /&gt;    File f = new File(txt);&lt;br /&gt;    &lt;br /&gt;    // Converte o arquivo em um array de bytes&lt;br /&gt;    byte[] buffer = new byte[(int) f.length()];&lt;br /&gt;    DataInputStream ds = new DataInputStream(new FileInputStream(f));&lt;br /&gt;    ds.readFully(buffer);&lt;br /&gt;    ds.close();&lt;br /&gt;    &lt;br /&gt;    // Pega o nome do arquivo&lt;br /&gt;    nome = f.getName();&lt;br /&gt;&lt;br /&gt;    Cadastro c = new Cadastro();&lt;br /&gt;    c.setNome(nome);&lt;br /&gt;    c.setFoto(buffer);&lt;br /&gt;    &lt;br /&gt;    // Finaliza a transacao com o hibernate&lt;br /&gt;    Principal.getHi().getSession().save(c);&lt;br /&gt;    Principal.getHi().getTx().commit();&lt;br /&gt;    &lt;br /&gt;    JOptionPane.showMessageDialog(null, &lt;br /&gt;            "Arquivo cadastrado com sucesso!");&lt;br /&gt;   } catch (HibernateException e) {&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;   } catch (FileNotFoundException e) {&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;   } catch (IOException e) {&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; public void get(int id) {&lt;br /&gt;  try {&lt;br /&gt;   Cadastro c;&lt;br /&gt;   c = (Cadastro)Principal.getHi().getSession()&lt;br /&gt;         .get(Cadastro.class, id);&lt;br /&gt;   &lt;br /&gt;   String arquivo = "/tmp/" + c.getNome();&lt;br /&gt;   &lt;br /&gt;   FileOutputStream fos = new FileOutputStream(arquivo);&lt;br /&gt;   byte[] buffer = c.getFoto();&lt;br /&gt;   &lt;br /&gt;   fos.write(buffer);&lt;br /&gt;   fos.flush();&lt;br /&gt;   fos.close();&lt;br /&gt;   &lt;br /&gt;   JOptionPane.showMessageDialog(null, &lt;br /&gt;     "Arquivo resgatado com sucesso em: " + arquivo);&lt;br /&gt;  } catch (HibernateException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (FileNotFoundException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O método save(String txt) pega o caminho absoluto de onde está o arquivo da foto, depois passa para um DataInputStream que passa para um array de bytes. Feito isso, basta apenas passar para nosso método lá da classe Cadastro setFoto(byte[] foto). O método get(int id) faz o processo contrário, salvando a foto do banco para o diretório /tmp conforme foi setado na variável arquivo.&lt;br /&gt;&lt;br /&gt;Vamos criar a classe HibernateInitialize, que vai ser responsável em criar a fábrica de sessão do Hibernate e iniciar as transações:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package br.org.hibernateobject;&lt;br /&gt;&lt;br /&gt;import org.hibernate.Session;&lt;br /&gt;import org.hibernate.SessionFactory;&lt;br /&gt;import org.hibernate.Transaction;&lt;br /&gt;import org.hibernate.cfg.AnnotationConfiguration;&lt;br /&gt;import org.hibernate.cfg.Configuration;&lt;br /&gt;import org.hibernate.cfg.Environment;&lt;br /&gt;&lt;br /&gt;public class HibernateInitialize {&lt;br /&gt; &lt;br /&gt; private Session session;&lt;br /&gt; private Transaction tx;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; public HibernateInitialize() {&lt;br /&gt;  Configuration cfg = new AnnotationConfiguration()&lt;br /&gt;   .addAnnotatedClass(Cadastro.class)&lt;br /&gt;   .setProperty(Environment.HBM2DDL_AUTO, "update");&lt;br /&gt;  &lt;br /&gt;  cfg.configure("/br/org/hibernateobject/hibernate.cfg.xml");&lt;br /&gt;  &lt;br /&gt;  SessionFactory sf = cfg.buildSessionFactory();&lt;br /&gt;  session = sf.openSession();&lt;br /&gt;  tx = session.beginTransaction();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; public Session getSession() {&lt;br /&gt;  return session;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setSession(Session session) {&lt;br /&gt;  this.session = session;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Transaction getTx() {&lt;br /&gt;  return tx;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setTx(Transaction tx) {&lt;br /&gt;  this.tx = tx;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Dispensa comentários. Eu ainda uso XML para configurações, se você usa annotations, pode fazer essa classe do jeito que preferir. O arquivo hibernate.cfg.xml tem a seguinte estrutura:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE hibernate-configuration PUBLIC&lt;br /&gt;       "-//Hibernate/Hibernate Configuration DTD 3.0//EN"&lt;br /&gt;       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;hibernate-configuration&amp;gt;&lt;br /&gt; &amp;lt;session-factory&amp;gt;&lt;br /&gt;  &amp;lt;!-- properties --&amp;gt;&lt;br /&gt;  &amp;lt;property name="connection.driver_class"&amp;gt;&lt;br /&gt;   com.mysql.jdbc.Driver&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="connection.url"&amp;gt;&lt;br /&gt;   jdbc:mysql://localhost:3306/hibernate_object&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="dialect"&amp;gt;&lt;br /&gt;   org.hibernate.dialect.MySQLDialect&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="show_sql"&amp;gt;false&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="connection.username"&amp;gt;hibernate&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="connection.password"&amp;gt;hibernate123&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="connection.pool_size"&amp;gt;10&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;!-- mapping classes --&amp;gt;&lt;br /&gt;  &amp;lt;mapping class="br.org.hibernateobject.Cadastro" /&amp;gt;&lt;br /&gt; &amp;lt;/session-factory&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-configuration&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos fazer a classe Principal, que vai ser a interface gráfica e dispensa comentário também. Com uma interface simples usando Swing e chamando os métodos do CadastroDao:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package br.org.hibernateobject;&lt;br /&gt;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import java.awt.Toolkit;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;import javax.swing.JPanel;&lt;br /&gt;import javax.swing.JTextField;&lt;br /&gt;&lt;br /&gt;public class Principal extends JFrame {&lt;br /&gt;&lt;br /&gt; private static final long serialVersionUID = 1L;&lt;br /&gt; private static HibernateInitialize hibernate;&lt;br /&gt;&lt;br /&gt; public Principal() {&lt;br /&gt;  super("Hibernate Salvando Objetos");&lt;br /&gt;  &lt;br /&gt;  setSize(400,100);&lt;br /&gt;  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;  setResizable(false);&lt;br /&gt;  &lt;br /&gt;  // Centraliza a janela&lt;br /&gt;  Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();&lt;br /&gt;        int w = getSize().width;&lt;br /&gt;        int h = getSize().height;&lt;br /&gt;        int x = (dim.width-w) / 2;&lt;br /&gt;        int y = (dim.height-h) / 2;&lt;br /&gt;        setLocation(x, y);&lt;br /&gt;  &lt;br /&gt;  final JTextField txtFoto = new JTextField(30);&lt;br /&gt;  final JButton btOK = new JButton("Salvar");&lt;br /&gt;  final JButton btGet = new JButton("Resgatar");&lt;br /&gt;  &lt;br /&gt;  // Acao do click do botao&lt;br /&gt;  btOK.addActionListener(new ActionListener() {&lt;br /&gt;&lt;br /&gt;   public void actionPerformed(ActionEvent e) {&lt;br /&gt;    String txt = txtFoto.getText();&lt;br /&gt;    CadastroDao cdao = new CadastroDao();&lt;br /&gt;    cdao.save(txt);&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;  });&lt;br /&gt;  &lt;br /&gt;  btGet.addActionListener(new ActionListener(){&lt;br /&gt;&lt;br /&gt;   public void actionPerformed(ActionEvent e) {&lt;br /&gt;    int id = Integer.parseInt(JOptionPane&lt;br /&gt;      .showInputDialog("Informe o ID do cadastro:"));&lt;br /&gt;    &lt;br /&gt;    CadastroDao cdao = new CadastroDao();&lt;br /&gt;    cdao.get(id);&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;  });&lt;br /&gt;  &lt;br /&gt;  JPanel p = new JPanel();&lt;br /&gt;  p.add(txtFoto);&lt;br /&gt;  p.add(btOK);&lt;br /&gt;  p.add(btGet);&lt;br /&gt;  &lt;br /&gt;  getContentPane().add(p);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  new Principal().setVisible(true);&lt;br /&gt;  hibernate = new HibernateInitialize();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; public static HibernateInitialize getHi() {&lt;br /&gt;  return hibernate;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; public static void setHi(HibernateInitialize hi) {&lt;br /&gt;  Principal.hibernate = hi;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Execute o seu programa e digite o caminho completo de algum arquivo de foto e clique no botão Salvar, se aparecer a mensagem 'Arquivo cadastrado com sucesso!', parabéns, senão, verifique seu código.&lt;br /&gt;&lt;br /&gt;É isso, espero ter ajudado com esse pequeno conhecimento. O Hibernate é muito poderoso, dá pra fazer muita coisa com ele sem ao menos mexer no banco.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-4361870521814703132?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/4361870521814703132/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=4361870521814703132' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4361870521814703132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4361870521814703132'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/salvando-fotos-no-banco-de-dados-com.html' title='Salvando fotos no banco de dados com Hibernate'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-4027412864651903993</id><published>2008-06-11T05:13:00.000-07:00</published><updated>2008-12-09T19:00:03.473-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iptables'/><title type='text'>Controle de banda com TC e IPTABLES</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Atendendo a pedidos ontem no laboratório, vou fazer um tutorial explicando como controlar a banda usando o tc e o iptables. Vou tentar ser o mais didático possível. Bom, vamos lá, considerando que sua distribuição seja Debian, verifique se o iproute e o tcng estão instalados, caso não estejam, instale com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# aptitude install tcng&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora vá até um diretório qualquer, e crie um script:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# vim fw&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora monte a seguinte estrutura:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;# Linha 1&lt;br /&gt;tc qd del dev eth0 root&lt;br /&gt;&lt;br /&gt;# Linha 2&lt;br /&gt;tc qd add dev eth0 root handle 1: htb&lt;br /&gt;&lt;br /&gt;# Linha 3&lt;br /&gt;tc cl add dev eth0 parent 1: classid 1:1 htb rate 4Mbit ceil 4Mbit&lt;br /&gt;&lt;br /&gt;# Linha 4&lt;br /&gt;tc cl add dev eth0 parent 1:1 classid 1:10 htb \&lt;br /&gt;rate 64Kbit ceil 128Kbit prio 1&lt;br /&gt;&lt;br /&gt;# Linha 5&lt;br /&gt;tc filter add dev eth0 parent 1:0 protocol ip prio 1 \ &lt;br /&gt;handle 0x1 fw classid 1:10&lt;br /&gt;&lt;br /&gt;# Linha 6&lt;br /&gt;iptables -t mangle -F&lt;br /&gt;&lt;br /&gt;# Linha 7&lt;br /&gt;iptables -t mangle -A POSTROUTING -p tcp --sport 80 \ &lt;br /&gt;-j MARK --set-mark 0x1&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Bom, vamos lá vou explicar linha por linha:&lt;br /&gt;&lt;br /&gt;# Linha 1: Esse comando apaga a classe raiz do dispositivo eth0. Ou seja, ele apaga tudo mesmo, todas as classes que estão incorporadas na classe raiz. É interessante usar esse comando quando se faz um script que você precisa reiniciar os serviços.&lt;br /&gt;&lt;br /&gt;# Linha 2: Adiciona uma nova fila raiz, no dispositivo eth0, com o tipo de fila htb. Esse comando cria o topo da hierarquia, onde tudo vai ser incluído nele.&lt;br /&gt;&lt;br /&gt;# Linha 3: Adiciona uma classe mãe, no dispositivo eth0, e ela é parente da classe raiz (1:), o tipo da fila dela é htb e a banda definida para essa classe é de 4Mbit. O comando ceil, é uma variação de banda, significa que se você definir, por exemplo, 1Mbit ceil 4Mbit, o minimo é 1Mbit e o máximo que pode chegar é 4Mbit. Pra simplificar é isso que significa. Agora que criamos a classe mãe, faremos os filhos dela e trabalharemos de acordo com o limite de banda definidos por ela.&lt;br /&gt;&lt;br /&gt;# Linha 4: Cria uma classe para o dispositivo eth0, sendo que é parente da classe 1:1 (classe mãe), a identificação dela é 1:10, o tipo da fila dela é htb, e a banda definida para essa classe é de 64Kbit no minimo e 128Kbit no máximo. O parametro prio, é a prioridade, segue o mesmo conceito do TOS. Você pode criar várias classes filho, e você pode brincar com isso, por exemplo, pra http eu defino uma velocidade, pra ssh eu defino outra e assim vai. Eu posso distribuir a banda pra cada tipo de serviço.&lt;br /&gt;&lt;br /&gt;# Linha 5: O segredo da coisa funcionar. Essa linha cria um filtro de acordo com a marcação que foi feito no pacote com o iptables. Se você marcar o pacote com o número 0x1, o htb vai pegar esse pacote e tratar conforme a classe pede. Então, cria um filtro para o dispositivo eth0, da classe raiz, sobre o protocolo ip, com prioridade número 1, com todos os pacotes que estejam marcados com o número 0x1, e redireciona para a classe com identificação 1:10 tratar a banda. Simples não?&lt;br /&gt;&lt;br /&gt;# Linha 6: Simplesmente limpa a tabela mangle do iptables.&lt;br /&gt;&lt;br /&gt;# Linha 7: Marca todos os pacotes que estão saindo pela porta 80 com o número 0x1, de qualquer origem pra qualquer destino, sobre o protocolo tcp.&lt;br /&gt;&lt;br /&gt;Essas regras foram adicionadas somente no dispositivo eth0. Se seu servidor usa um modem do tipo router, vai funcionar perfeitamente. Se for um modem que conecta sobre o pppOE, então é só mudar a interface para ppp0.&lt;br /&gt;&lt;br /&gt;Trabalhar com o TC não é dificil, basta entender o conceito de hierarquia, veja o desenho abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_VMMGvNwO6To/SE_W4p8hKNI/AAAAAAAAAA4/qD-d7qzUc4Q/s1600-h/hierarquia.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_VMMGvNwO6To/SE_W4p8hKNI/AAAAAAAAAA4/qD-d7qzUc4Q/s320/hierarquia.png" alt="" id="BLOGGER_PHOTO_ID_5210619562711656658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bom, espero que eu consegui ajudar. Qualquer dúvida é só perguntar.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-4027412864651903993?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/4027412864651903993/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=4027412864651903993' title='13 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4027412864651903993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4027412864651903993'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/controle-de-banda-com-tc-e-iptables.html' title='Controle de banda com TC e IPTABLES'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_VMMGvNwO6To/SE_W4p8hKNI/AAAAAAAAAA4/qD-d7qzUc4Q/s72-c/hierarquia.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-6533842276627714978</id><published>2008-06-10T12:34:00.000-07:00</published><updated>2008-06-11T07:04:48.172-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pcmcia'/><category scheme='http://www.blogger.com/atom/ns#' term='wireless'/><title type='text'>Instalando a placa PCMCIA Netgear WG511 no Debian</title><content type='html'>Olá amiguinhos.&lt;br /&gt;&lt;br /&gt;Eu penei pra conseguir instalar essa placa e consegui depois de dois dias. O maior problema de instalar essa placa, é que a versão do ndiswrapper 1.9 não é compatível, então eu experimentei instalar a versão 1.1 e funcionou perfeitamente. Bom, vamos ao que interessa.&lt;br /&gt;&lt;br /&gt;Instale os pacotes do ndiswrapper, com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# aptitude install ndiswrapper-utils-1.1 ndiswrapper-source&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Depois faça o download do driver da placa neste link:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://anderson.insula.com.br/SMC2802W.tar.gz"&gt;Download Netgear WG511&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bom, não vou abordar o assunto do driver, mas o processo é o mesmo para instalar os drivers, basta localizar o seu driver no site do ndiswrapper, qualquer dúvida, basta me enviar um e-mail.&lt;br /&gt;&lt;br /&gt;Descompacte o pacote em um diretório qualquer e entre nele. Execute os seguintes comandos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# ndiswrapper -i 2802W.inf&lt;br /&gt;# ndiswrapper -l&lt;br /&gt;installed drivers:&lt;br /&gt;2802w           driver installed, hardware (1260:3890) present (alternate driver: prism54)&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Se tudo correu bem, vai aparecer que o driver está instalado e caso a placa esteja plugada, ela estara presente também.&lt;br /&gt;&lt;br /&gt;Agora é preciso que o módulo prism54 seja removido, pois vai dar conflito na hora de carregar o módulo do ndiswrapper. Faça com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# rmmod prism54&lt;br /&gt;# echo blacklist prism54 &gt;&gt; /etc/modprobe.d/blacklist&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Carregue o módulo do ndiswrapper:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# modprobe ndiswrapper&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Eu tive problemas nesta parte também, ele não encontrava o módulo do ndiswrapper. Então a solução foi instalar o pacote chamado module-assistant. Nele, selecionei o módulo do ndiswrapper e mandei compilar os fonte e instalar. É bem simples que eu nem vou abordar no tutorial.&lt;br /&gt;&lt;br /&gt;Depois crie o alias do dispositivo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# ndiswrapper -m&lt;br /&gt;adding "alias wlan0 ndiswrapper" to /etc/modprobe.d/ndiswrapper... &lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Adicione o módulo do ndiswrapper no boot:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# echo ndiswrapper &gt;&gt; /etc/modules&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pronto, agora é só dar um dmesg e ver se o kernel identificou a sua placa. No meu apareceu o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;ndiswrapper: using IRQ 11&lt;br /&gt;wlan0: vendor: 'SMC2802W 2.4GHz 54 Mbps Wireless PCI Adapter'&lt;br /&gt;wlan0: ethernet device 00:0f:b5:5a:77:b1 using NDIS driver 2802w, 1260:3890.5.conf&lt;br /&gt;wlan0: encryption modes supported: WEP; TKIP with WPA; AES/CCMP with WPA&lt;br /&gt;usbcore: registered new driver ndiswrapper&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Se aparecer isso, parabéns, sua placa está configurada. Agora basta configurar sua rede wireless.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-6533842276627714978?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/6533842276627714978/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=6533842276627714978' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6533842276627714978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/6533842276627714978'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/instalando-placa-pcmcia-netgear-wg511.html' title='Instalando a placa PCMCIA Netgear WG511 no Debian'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-2740044036737873326</id><published>2008-06-09T12:46:00.000-07:00</published><updated>2008-06-09T13:32:49.663-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openldap'/><category scheme='http://www.blogger.com/atom/ns#' term='squid'/><title type='text'>Configurando o Squid com o OpenLdap</title><content type='html'>Olá amiguinhos,&lt;br /&gt;&lt;br /&gt;Este tutorial foi feito por mim mesmo e com auxilio ao fórum GDH para tirar dúvidas. Antes de tudo, vou mostrar como se faz no Debian, no CentOS tive muitos problemas, acho que os pacotes do Squid não foram compilados com suporte ao Ldap, e eu fiquei uma semana quebrando a cabeça pra descobrir isso. A solução foi compilar o Squid na mão e assim, funcionou no CentOS. Mas no Debian não tem esse problema, então vamos lá. Primeiro vamos configurar o OpenLdap, instale ele:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# aptitude install ldap-server ldap-client&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Após a instalação é preciso ser feito uma configuração básica do openldap:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# cd /etc/ldap&lt;br /&gt;# vim slapd.conf&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;E altere o arquivo conforme abaixo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;include         /etc/ldap/schema/core.schema&lt;br /&gt;include         /etc/ldap/schema/cosine.schema&lt;br /&gt;include         /etc/ldap/schema/nis.schema&lt;br /&gt;include         /etc/ldap/schema/inetorgperson.schema&lt;br /&gt;pidfile         /var/run/slapd/slapd.pid&lt;br /&gt;argsfile        /var/run/slapd/slapd.args&lt;br /&gt;loglevel        0&lt;br /&gt;modulepath      /usr/lib/ldap&lt;br /&gt;moduleload      back_bdb&lt;br /&gt;sizelimit 500&lt;br /&gt;tool-threads 1&lt;br /&gt;backend         bdb&lt;br /&gt;checkpoint 512 30&lt;br /&gt;database        bdb&lt;br /&gt;suffix          "dc=teste,dc=com,dc=br"&lt;br /&gt;directory       "/var/lib/ldap"&lt;br /&gt;dbconfig set_cachesize 0 2097152 0&lt;br /&gt;dbconfig set_lk_max_objects 1500&lt;br /&gt;dbconfig set_lk_max_locks 1500&lt;br /&gt;dbconfig set_lk_max_lockers 1500&lt;br /&gt;index           objectClass eq&lt;br /&gt;lastmod         on&lt;br /&gt;access to attrs=userPassword,shadowLastChange&lt;br /&gt;    by dn="cn=admin,dc=teste,dc=com,dc=br" write&lt;br /&gt;    by anonymous auth&lt;br /&gt;    by self write&lt;br /&gt;    by * none&lt;br /&gt;access to dn.base="" by * read&lt;br /&gt;access to *&lt;br /&gt;    by dn="cn=admin,dc=teste,dc=com,dc=br" write&lt;br /&gt;    by * read&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Depois configuramos o ldap.conf conforme abaixo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;BASE dc=teste,dc=com,dc=br&lt;br /&gt;rootbinddn cn=admin,dc=teste,dc=com,dc=br&lt;br /&gt;bindpw {SSHA}7z7N6plyPwijNr2tyhOPpZWc3NMRiKQg&lt;br /&gt;host 127.0.0.1&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A senha você pode gerar usando o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# slappasswd -s teste&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Então basta copiar o resultado da senha criptografada e colocar na frente do bindpw.&lt;br /&gt;&lt;br /&gt;Feito isso, basta iniciar o serviço do Ldap para começarmos a popular nossa base:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# /etc/init.d/slapd start&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos criar os arquivos .ldif, que contém os dados para o funcionamento do Squid. É necessário que se siga essa mesma linha lógica da base de dados para não haver erros futuramente. Primeiro, vamos criar o base.ldif, que contém as informações da base principal do ldap. Este é opicional, já que quando você instala pelo aptitude, ele já te pede pra criar a base principal, mas se você quiser excluir ela e começar do zero, fique a vontade. Crie o arquivo base.ldif conforme abaixo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;dn: dc=teste,dc=com,dc=br&lt;br /&gt;objectClass: top&lt;br /&gt;objectClass: dcObject&lt;br /&gt;objectClass: organization&lt;br /&gt;dc: teste&lt;br /&gt;o: Teste Ltda&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Feito isso, salve o arquivo para ser adicionado depois. Agora criaremos o arquivo dos grupos, no arquivo grupos.ldif:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;dn: ou=usuarios,dc=teste,dc=com,dc=br&lt;br /&gt;ou: usuarios&lt;br /&gt;objectClass: top&lt;br /&gt;objectClass: organizationalUnit&lt;br /&gt;objectClass: dcObject&lt;br /&gt;dc: teste&lt;br /&gt;&lt;br /&gt;dn: ou=grupos,dc=teste,dc=com,dc=br&lt;br /&gt;ou: grupos&lt;br /&gt;objectClass: top&lt;br /&gt;objectClass: organizationalUnit&lt;br /&gt;objectClass: dcObject&lt;br /&gt;dc: teste&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora o arquivo usuarios.ldif:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;dn: cn=anderson,ou=usuarios,dc=teste,dc=com,dc=br&lt;br /&gt;objectClass: top&lt;br /&gt;objectClass: person&lt;br /&gt;objectClass: posixAccount&lt;br /&gt;objectClass: inetOrgPerson&lt;br /&gt;cn: anderson&lt;br /&gt;sn: Anderson&lt;br /&gt;mail: teste@teste.com.br&lt;br /&gt;telephonenumber: 1234-5678&lt;br /&gt;uid: anderson&lt;br /&gt;userPassword: 123456&lt;br /&gt;homeDirectory: /home/anderson&lt;br /&gt;displayName: anderson&lt;br /&gt;loginShell: /dev/null&lt;br /&gt;uidNumber:1001&lt;br /&gt;gidNumber:2001&lt;br /&gt;&lt;br /&gt;dn: cn=clayton,ou=usuarios,dc=teste,dc=com,dc=br&lt;br /&gt;objectClass: top&lt;br /&gt;objectClass: person&lt;br /&gt;objectClass: posixAccount&lt;br /&gt;objectClass: inetOrgPerson&lt;br /&gt;cn: clayton&lt;br /&gt;sn: Clayton&lt;br /&gt;mail: teste2@teste.com.br&lt;br /&gt;telephonenumber: 9876-5432&lt;br /&gt;uid: clayton&lt;br /&gt;userPassword: teste&lt;br /&gt;homeDirectory: /home/clayton&lt;br /&gt;displayName: clayton&lt;br /&gt;loginShell: /dev/null&lt;br /&gt;uidNumber:1002&lt;br /&gt;gidNumber:2002&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Vamos criar o segredo da coisa, que faz o squid saber qual grupo o usuário pertence. Crie um arquivo chamado usuarios_por_grupo.ldif (Obs. O nome dos arquivos não interfere em nada, crie com o nome que quiser):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;dn: cn=AuthLiberado,ou=grupos,dc=teste,dc=com,dc=br&lt;br /&gt;objectClass: posixGroup&lt;br /&gt;objectClass: top&lt;br /&gt;memberUid: anderson&lt;br /&gt;cn: AuthLiberado&lt;br /&gt;gidNumber: 3001&lt;br /&gt;&lt;br /&gt;dn: cn=AuthBloqueado,ou=grupos,dc=teste,dc=com,dc=br&lt;br /&gt;objectClass: posixGroup&lt;br /&gt;objectClass: top&lt;br /&gt;memberUid: clayton&lt;br /&gt;cn: AuthBloqueado&lt;br /&gt;gidNumber: 3002&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Se tiver mais de um usuário, pode adicionar mais memberUid. Feito isso, vamos popular a base do ldap, com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;ldapadd -f base.ldif -x -D "cn=admin,dc=teste,dc=com,dc=br" -W&lt;br /&gt;ldapadd -f grupos.ldif -x -D "cn=admin,dc=teste,dc=com,dc=br" -W&lt;br /&gt;ldapadd -f usuarios.ldif -x -D "cn=admin,dc=teste,dc=com,dc=br" -W&lt;br /&gt;ldapadd -f usuarios_por_grupo.ldif -x \&lt;br /&gt;-D "cn=admin,dc=teste,dc=com,dc=br" -W&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pronto!!! Se não deu nenhum erro, o OpenLdap está pronto para ser usado com o Squid. Agora vamos para a parte da configuração do Squid.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Configurando o Squid&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Vamos instalar o Squid pelo aptitude. Lembrando que se você estiver usando CentOS ou outra distribuição derivada do RedHat e esse tutorial não funcionar, compile o código-fonte do Squid que vai funcionar. Instale o Squid:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# aptitude install squid&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Limpe o arquivo de configuração do Squid para facilitar a sua vida:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# egrep -v "^$|^#" squid.conf &gt; squid.conf.limpo&lt;br /&gt;# mv squid.conf.limpo squid.conf&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Se o squid ainda não está startado, start ele:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# /etc/init.d/squid start&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Beleza, agora deixe o arquivo do squid.conf conforme abaixo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;http_port 3128&lt;br /&gt;hierarchy_stoplist cgi-bin ?&lt;br /&gt;acl QUERY urlpath_regex cgi-bin \?&lt;br /&gt;cache deny QUERY&lt;br /&gt;acl apache rep_header Server ^Apache&lt;br /&gt;broken_vary_encoding allow apache&lt;br /&gt;access_log /var/log/squid/access.log squid&lt;br /&gt;hosts_file /etc/hosts&lt;br /&gt;refresh_pattern ^ftp:           1440    20%     10080&lt;br /&gt;refresh_pattern ^gopher:        1440    0%      1440&lt;br /&gt;refresh_pattern .               0       20%     4320&lt;br /&gt;acl all src 0.0.0.0/0.0.0.0&lt;br /&gt;acl manager proto cache_object&lt;br /&gt;acl localhost src 127.0.0.1/255.255.255.255&lt;br /&gt;acl to_localhost dst 127.0.0.0/8&lt;br /&gt;acl SSL_ports port 443          # https&lt;br /&gt;acl SSL_ports port 563          # snews&lt;br /&gt;acl SSL_ports port 873          # rsync&lt;br /&gt;acl Safe_ports port 80          # http&lt;br /&gt;acl Safe_ports port 21          # ftp&lt;br /&gt;acl Safe_ports port 443         # https&lt;br /&gt;acl Safe_ports port 70          # gopher&lt;br /&gt;acl Safe_ports port 210         # wais&lt;br /&gt;acl Safe_ports port 1025-65535  # unregistered ports&lt;br /&gt;acl Safe_ports port 280         # http-mgmt&lt;br /&gt;acl Safe_ports port 488         # gss-http&lt;br /&gt;acl Safe_ports port 591         # filemaker&lt;br /&gt;acl Safe_ports port 777         # multiling http&lt;br /&gt;acl Safe_ports port 631         # cups&lt;br /&gt;acl Safe_ports port 873         # rsync&lt;br /&gt;acl Safe_ports port 901         # SWAT&lt;br /&gt;acl purge method PURGE&lt;br /&gt;acl CONNECT method CONNECT&lt;br /&gt;http_access allow manager localhost&lt;br /&gt;http_access deny manager&lt;br /&gt;http_access allow purge localhost&lt;br /&gt;http_access deny purge&lt;br /&gt;http_access deny !Safe_ports&lt;br /&gt;http_access deny CONNECT !SSL_ports&lt;br /&gt;&lt;br /&gt;# Autenticacao&lt;br /&gt;auth_param basic program /usr/lib/squid/ldap_auth -D "cn=admin,dc=teste,dc=com,dc=br" -w SENHA -b "dc=teste,dc=com,dc=br" -f "uid=%s" -h 127.0.0.1 -p 389 -v 3&lt;br /&gt;auth_param basic realm Autorização de Acesso&lt;br /&gt;auth_param basic children 5&lt;br /&gt;auth_param basic credentialsttl 2 hours&lt;br /&gt;&lt;br /&gt;# Autenticacao por Grupos&lt;br /&gt;external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -b "ou=grupos,dc=teste,dc=com,dc=br" -B "ou=usuarios,dc=teste,dc=com,dc=br" -f "(&amp;amp;(memberUid=%u)(cn=%g))" -h 127.0.0.1 -p 389 -v 3&lt;br /&gt;&lt;br /&gt;# Cria a acl para os grupos do ldap&lt;br /&gt;acl Liberado external ldap_group AuthLiberado&lt;br /&gt;acl Bloqueado external ldap_group AuthBloqueado&lt;br /&gt;&lt;br /&gt;# Aqui vamos bloquear o acesso para os usuarios que estao no grupo Bloqueados e liberar somente os do Liberado&lt;br /&gt;http_access allow Liberado&lt;br /&gt;&lt;br /&gt;http_access deny all&lt;br /&gt;&lt;br /&gt;http_reply_access allow all&lt;br /&gt;icp_access allow all&lt;br /&gt;cache_effective_group proxy&lt;br /&gt;coredump_dir /var/spool/squid&lt;br /&gt;visible_hostname teste.com.br&lt;br /&gt;error_directory /usr/share/squid/errors/Portuguese&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Lembrando que essas regras, apenas vão liberar o acesso total para a acl Liberado e bloqueando o resto, então brinque a vontade com as regras. Agora reinicie as configurações do Squid, se não der nenhum erro, parabéns:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# squid -k reconfigure&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora faça o teste. Abra seu navegador favorito, configure o proxy como localhost, e tente acessar algum site. Primeiro teste com o usuário anderson e depois com o usuário clayton e veja o que acontece.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-2740044036737873326?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/2740044036737873326/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=2740044036737873326' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/2740044036737873326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/2740044036737873326'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/configurando-o-squid-com-o-openldap.html' title='Configurando o Squid com o OpenLdap'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-3192677650113034296</id><published>2008-06-07T04:17:00.000-07:00</published><updated>2008-06-09T13:33:51.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extgwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='mygwt'/><title type='text'>Configurando o MyGWT/ExtGWT no Eclipse</title><content type='html'>Olá amiguinhos.&lt;br /&gt;&lt;br /&gt;Esse esquema funciona tanto no GWT quanto no MyGWT/ExtGWT. Agradecimentos ao Lucas que me ensinou passo a passo ;-)&lt;br /&gt;&lt;br /&gt;Faça o download das bibliotecas em http://mygwt.net e http://code.google.com/webtoolkit/&lt;br /&gt;&lt;br /&gt;Descompacte o pacote do GWT e do MyGWT/ExtGWT em algum diretório de sua preferência. E acesse o diretório onde ficou o GWT:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;$ cd /exemplo/gwt-linux-1.4.62&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Agora é preciso gerar os arquivos de projeto para que funcione corretamente no Eclipse. Basta executar os seguintes comandos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;$ ./applicationCreator -eclipse \&lt;br /&gt;NOME_DO_PROJETO org.algumacoisa.client.HelloWorld \&lt;br /&gt;-out ~/Projetos/NOME_DO_PROJETO&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ele vai gerar os arquivos necessários para o funcionamento do GWT diretamente no diretório do projeto do Eclipse.&lt;br /&gt;&lt;br /&gt;Após isto, vamos criar os arquivos de configuração de projeto do Eclipse, com o seguinte comando (Lembrando que ainda estamos no diretório do GWT)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;$ ./projectCreator -eclipse NOME_DO_PROJETO -out \&lt;br /&gt;/home/anderson/Projetos/NOME_DO_PROJETO -overwrite&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A opção overwrite é opcional, ele sobrescreve arquivos existentes caso existam.&lt;br /&gt;&lt;br /&gt;Feito isto, importe o projeto para o Eclipse. E pronto, o GWT está funcionando, de um Run para testar.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-size:180%;" &gt;Configurando com o MyGWT/ExtGWT&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para fazer o MyGWT/ExtGWT funcionar, após ter feito toda a configuração do GWT, basta adicionar o arquivo .jar do MyGWT (mygwt.jar) no classpath do projeto e adicionar a seguinte linha no arquivo xml que foi gerado pelo gwt, nome semelhante a NOME_DO_PROJETO.gwt.xml. Adicione a seguinte linha:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;inherits name="net.mygwt.ui.MyGWT" /&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Essa linha deve ficar antes da tag &lt;entry-point&gt;. Feito isto, basta criar as classes de acordo com a documentação e viva o Java.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;/entry-point&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-3192677650113034296?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/3192677650113034296/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=3192677650113034296' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/3192677650113034296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/3192677650113034296'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/configurando-o-mygwtextgwt-no-eclipse.html' title='Configurando o MyGWT/ExtGWT no Eclipse'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-1869566315749874782</id><published>2008-06-07T04:05:00.000-07:00</published><updated>2008-06-07T04:14:45.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='splash'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='boot'/><title type='text'>Resolvendo o problema da tela preta no boot do Ubuntu 7.10</title><content type='html'>Olá amiguinhos.&lt;br /&gt;&lt;br /&gt;Quem tem monitor turbo não precisa dessa dica, mas pra um simples mortal como eu, é útil. Achei essa dica em um fórum e vou compartilhar.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Instalei o Ubuntu 7.10, codenome Gutsy Gibbon, no meu notebook e tive uma ingrata surpresa: não aparecia o splash de carregamento do sistema.&lt;br /&gt;Tudo o que eu via era uma tela preta. Tinha pensado que a instalação tinha dado pau, e reinstalei o Ubuntu umas 4 vezes: 2 a versão para 64 bits e mais 2 para a versão X86.&lt;br /&gt;Com todas as reinstalações o problema continuava... Resolvi deixar sistema, recem instalado pela quarta vez, rodar com aquela tela preta. Para minha surpresa o sistema carregou e apareceu a tela de login 'linda de bonita' para mim.&lt;br /&gt;Depois de muito pesquisar, e não achar nada acabei indo no canal de IRC do Ubuntu-br. Lá o pessoal me passou a seguinte dica:&lt;br /&gt;&lt;br /&gt;Edite o arquivo upsplash.conf. No terminal digite:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;sudo gedit /etc/usplash.conf&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Coloque os valores relativos a resolução do seu monitor:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;xres=*1024*&lt;br /&gt;yres=*768*&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Atenção: Esses valores são relativos á minha tela, não se esqueça de mudá-los!&lt;br /&gt;Salve o arquivo.&lt;br /&gt;Depois, ainda no terminal digite:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;sudo update-usplash-theme usplash-theme-ubuntu&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Esse comando irá atualizar as configurações que acabamos de mudar. Depois disso reinicie o sistema, e você verá um lindo splash screen do ubuntu carregando o seu sistema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-1869566315749874782?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/1869566315749874782/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=1869566315749874782' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/1869566315749874782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/1869566315749874782'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/resolvendo-o-problema-da-tela-pretano.html' title='Resolvendo o problema da tela preta no boot do Ubuntu 7.10'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-8621573429088202453</id><published>2008-06-06T06:55:00.000-07:00</published><updated>2008-06-06T07:10:54.078-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Como ler um arquivo XML com GWT</title><content type='html'>Olá amiguinhos.&lt;br /&gt;&lt;br /&gt;Considerando o seguinte arquivo XML:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;nome id="1"&amp;gt;Anderson Clayton&amp;lt;/nome&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O XML precisa estar no diretório public da estrutura de diretórios do GWT. Agora para ler esses dados do XML, é simples como falar a palavra "paralelepípedo".&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;public void onModuleLoad() {&lt;br /&gt;   HTTPRequest.asyncGet("nome.xml", new ResponseTextHandler() {&lt;br /&gt;&lt;br /&gt;       public void onCompletion(String responseText) {&lt;br /&gt;           Document customerDom = XMLParser.parse(responseText);&lt;br /&gt;           Element customerElement = customerDom.getDocumentElement();&lt;br /&gt;           XMLParser.removeWhitespace(customerElement);&lt;br /&gt;&lt;br /&gt;           // Pega o ID da tag nome&lt;br /&gt;           String id = customerElement.getElementsByTagName("nome")&lt;br /&gt;               .item(0).getAttributes().getNamedItem("id")&lt;br /&gt;               .getNodeValue();&lt;br /&gt;           // Pega o valor da tag nome&lt;br /&gt;           String nome = customerElement.getElementsByTagName("nome")&lt;br /&gt;               .item(0).getNodeValue();&lt;br /&gt;&lt;br /&gt;           // Exibe os valores&lt;br /&gt;           Window.alert(id);&lt;br /&gt;           Window.alert(nome);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;     });&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Fácil né? Você pode fazer um laço para percorrer o XML, é possível pegar o length de cada nó, usando o método getLength().&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-8621573429088202453?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/8621573429088202453/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=8621573429088202453' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/8621573429088202453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/8621573429088202453'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/como-ler-um-arquivo-xml-com-gwt.html' title='Como ler um arquivo XML com GWT'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1273956776603549315.post-4131809394021559326</id><published>2008-06-05T17:19:00.000-07:00</published><updated>2008-06-06T06:50:04.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>Utilizando o Hibernate no GWT</title><content type='html'>Olá amiguinhos.&lt;br /&gt;&lt;br /&gt;Vou mostrar um simples exemplo de como fazer um cadastro no GWT utilizando Hibernate. Eu achei muito trabalhoso pelo fato de não poder utilizar os recursos do Java 5. Mas em breve teremos a possibilidade de utilizar o Java 5 no GWT.&lt;br /&gt;&lt;br /&gt;Primeiro, vamos fazer uma interface bem tosca, só com os campos necessários para nosso teste. Detalhe, esse esquema também funciona com o MyGWT, basta mudar os componentes. Vou evitar falar sobre a configuração do Hibernate, eu utilizo xml ainda, então não vou entrar em tantos detalhes.&lt;br /&gt;&lt;br /&gt;Crie o projeto do GWT e crie uma classe chamada Principal, como segue abaixo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.client;&lt;br /&gt;&lt;br /&gt;public class Principal implements EntryPoint {&lt;br /&gt;&lt;br /&gt;public void onModuleLoad() {&lt;br /&gt;    // Cria o formulario para cadastro            &lt;br /&gt;    final FormPanel form = new FormPanel();             &lt;br /&gt;    final VerticalPanel p = new VerticalPanel();            &lt;br /&gt;    form.setWidget(p);             &lt;br /&gt;    final Label lbNome = new Label("Nome");            &lt;br /&gt;    p.add(lbNome);             &lt;br /&gt;    final TextBox txtNome = new TextBox();            &lt;br /&gt;    txtNome.setName("txtNome");            &lt;br /&gt;    p.add(txtNome);             &lt;br /&gt;    final Label lbCidade = new Label("Cidade");            &lt;br /&gt;    p.add(lbCidade);             &lt;br /&gt;    final TextBox txtCidade = new TextBox();            &lt;br /&gt;    txtCidade.setName("txtCidade");            &lt;br /&gt;    p.add(txtCidade);             &lt;br /&gt;&lt;br /&gt;    // Cria um botao e define um evento para ele            &lt;br /&gt;    Button btCadastrar = new Button("Cadastrar");            &lt;br /&gt;    p.add(btCadastrar);             &lt;br /&gt;&lt;br /&gt;    RootPanel.get().add(form);    &lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lembrando que eu não estou me preocupando muito com a aparência, e essa vai ficar muito feia hehe. Após isso, temos que criar as interfaces que vão controlar os dados e trabalhar RPC e a classe de "entidade". Devido ao problema do código do GWT ser compatível com o Java 1.4, vamos ter que duplicar essa classe de entidade no lado do server, com suas devidas annotations. Criamos então a classe Cadastro:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.client;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.user.client.rpc.IsSerializable;&lt;br /&gt;&lt;br /&gt;public class Cadastro implements IsSerializable {&lt;br /&gt;&lt;br /&gt;private String nome;&lt;br /&gt;private String cidade;&lt;br /&gt;private String estado;&lt;br /&gt;&lt;br /&gt;public String getNome() {    &lt;br /&gt;     return nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setNome(String nome) {&lt;br /&gt;     this.nome = nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getCidade() {&lt;br /&gt;    return cidade;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setCidade(String cidade) {&lt;br /&gt;     this.cidade = cidade;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getEstado() {&lt;br /&gt;     return estado;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setEstado(String estado) {&lt;br /&gt;     this.estado = estado;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Depois criamos duas interfaces, uma para o método que retornará alguma coisa do servidor e outra que enviará alguma coisa para o servidor. Simples não? Criamos a interface CadastroService:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.client;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.user.client.rpc.RemoteService;&lt;br /&gt;&lt;br /&gt;public interface CadastroService extends RemoteService {&lt;br /&gt;    public String cadastrar(Cadastro c);&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;E a interface CadastroServiceAsync:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.client;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.user.client.rpc.AsyncCallback;&lt;br /&gt;&lt;br /&gt;public interface CadastroServiceAsync {&lt;br /&gt;public void cadastrar(Cadastro c, AsyncCallback callback);&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Um detalhe muito importante e que é regra no GWT, apanhei muito no começo pra descobrir isso hehe. Essas duas interfaces, precisam obrigatóriamente conter Service e ServiceAsync nos nomes delas. Então crie um padrão, por exemplo, eu quero trabalhar com a classe Cidadao com o RPC, então eu vou criar as interfaces CidadaoService e CidadaoServiceAsync.&lt;br /&gt;&lt;br /&gt;Bom, está quase pronto, agora precisamos criar um pacote no mesmo nível dos pacotes org.cadastrogwt.client e org.cadastrogwt.public. Crie um pacote chamado org.cadastrogwt.server. Tudo que ficar neste pacote é livre pra usar qualquer recurso do Java, Hibernate, Struts, tudo mesmo, pois ele será executado no servidor e não no cliente. Então criamos uma classe chamada CadastroServiceImpl (Mesma regra das interfaces também):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.server;&lt;br /&gt;&lt;br /&gt;import org.cadastrogwt.client.Cadastro;&lt;br /&gt;import org.cadastrogwt.client.CadastroService;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.user.server.rpc.RemoteServiceServlet;&lt;br /&gt;&lt;br /&gt;public class CadastroServiceImpl extends RemoteServiceServlet&lt;br /&gt; implements CadastroService {&lt;br /&gt;&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;   public String cadastrar(Cadastro c) {&lt;br /&gt;               // Valores definidos pelo cliente&lt;br /&gt;               String nome = c.getNome();&lt;br /&gt;               String cidade = c.getCidade();&lt;br /&gt;               String estado = c.getEstado();&lt;br /&gt;               String retorno = null;&lt;br /&gt;&lt;br /&gt;        // Hibernate&lt;br /&gt;               CadastroServerDao cdao = new CadastroServerDao();&lt;br /&gt;               cdao.insert(nome, cidade, estado);&lt;br /&gt;&lt;br /&gt;               retorno = "Cadastro efetuado com sucesso!!!";&lt;br /&gt;&lt;br /&gt;               return retorno;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta classe pega tudo que foi setado na classe Cadastro e passa para o Dao. Se pudesse usar annotations, eu poderia pegar o objeto c e já mandar para o Dao, mas vamos aguardar a versão 1.5 :)&lt;br /&gt;&lt;br /&gt;Bom, agora para dar certo, vamos criar uma classe igual a classe Cadastro, mas mapeando-a. Criamos a classe CadastroServer:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.server;&lt;br /&gt;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "cadastro")&lt;br /&gt;public class CadastroServer {&lt;br /&gt;&lt;br /&gt;@Id&lt;br /&gt;@Column(name = "id_cadastro")&lt;br /&gt;private int id;&lt;br /&gt;&lt;br /&gt;@Column(length = 100)&lt;br /&gt;private String nome;&lt;br /&gt;&lt;br /&gt;@Column(length = 50)&lt;br /&gt;private String cidade;&lt;br /&gt;&lt;br /&gt;public int getId() {&lt;br /&gt;     return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setId(int id) {&lt;br /&gt;     this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getNome() {&lt;br /&gt;     return nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setNome(String nome) {&lt;br /&gt;     this.nome = nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getCidade() {&lt;br /&gt;     return cidade;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setCidade(String cidade) {&lt;br /&gt;     this.cidade = cidade;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Beleza, agora é só criar o Dao. Criamos a classe CadastroServerDao:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.server;&lt;br /&gt;&lt;br /&gt;import org.hibernate.Query;&lt;br /&gt;import org.hibernate.Session;&lt;br /&gt;import org.hibernate.SessionFactory;&lt;br /&gt;import org.hibernate.Transaction;&lt;br /&gt;import org.hibernate.cfg.AnnotationConfiguration;&lt;br /&gt;import org.hibernate.cfg.Configuration;&lt;br /&gt;&lt;br /&gt;public class CadastroServerDao {&lt;br /&gt;&lt;br /&gt;private Session session;&lt;br /&gt;private Transaction tx;&lt;br /&gt;&lt;br /&gt;public CadastroServerDao() {&lt;br /&gt;     Configuration cfg = new AnnotationConfiguration();&lt;br /&gt;     cfg.configure("/org/cadastrogwt/server/hibernate.cfg.xml");&lt;br /&gt;&lt;br /&gt;     SessionFactory sf = cfg.buildSessionFactory();&lt;br /&gt;&lt;br /&gt;     session = sf.openSession();&lt;br /&gt;    tx = session.beginTransaction();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void insert(String nome, String cidade, String estado) {&lt;br /&gt;     CadastroServer cad = new CadastroServer();&lt;br /&gt;     cad.setCidade(cidade);&lt;br /&gt;     cad.setEstado(estado);&lt;br /&gt;     cad.setNome(nome);&lt;br /&gt;&lt;br /&gt;    session.save(cad);&lt;br /&gt;    tx.commit();&lt;br /&gt;    session.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fica a critério de cada um como usar o Configuration. Pronto, a parte do server está pronta. Agora vamos voltar para a parte do client novamente, para preparar a classe Principal para trabalhar com o AsyncCallback que faz a mesma coisa que o Ajax. Modifique a classe Principal para que fique com a mesma aparência que esta:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package org.cadastrogwt.client;&lt;br /&gt;&lt;br /&gt;import *****;&lt;br /&gt;&lt;br /&gt;public class Principal implements EntryPoint, AsyncCallback {&lt;br /&gt;&lt;br /&gt;private CadastroServiceAsync service;&lt;br /&gt;&lt;br /&gt;private void asyncCadastro(Cadastro c) {&lt;br /&gt;     this.service.cadastrar(c, this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void onModuleLoad() {&lt;br /&gt;     // Inicia a sincronizacao com o servlet&lt;br /&gt;    service = (CadastroServiceAsync)&lt;br /&gt;  GWT.create(CadastroService.class);&lt;br /&gt;    ServiceDefTarget target = (ServiceDefTarget) service;&lt;br /&gt;    target.setServiceEntryPoint(GWT.getModuleBaseURL() +&lt;br /&gt;  "cadastro");&lt;br /&gt;&lt;br /&gt;    // Cria o formulario para cadastro            &lt;br /&gt;     final FormPanel form = new FormPanel();             &lt;br /&gt;    final VerticalPanel p = new VerticalPanel();            &lt;br /&gt;    form.setWidget(p);             &lt;br /&gt;    final Label lbNome = new Label("Nome");            &lt;br /&gt;    p.add(lbNome);             &lt;br /&gt;    final TextBox txtNome = new TextBox();            &lt;br /&gt;    txtNome.setName("txtNome");            &lt;br /&gt;    p.add(txtNome);             &lt;br /&gt;    final Label lbCidade = new Label("Cidade");            &lt;br /&gt;    p.add(lbCidade);             &lt;br /&gt;    final TextBox txtCidade = new TextBox();&lt;br /&gt;    txtCidade.setName("txtCidade");            &lt;br /&gt;    p.add(txtCidade);             &lt;br /&gt;&lt;br /&gt;    // Cria um botao e define um evento para ele            &lt;br /&gt;    Button btCadastrar = new Button("Cadastrar",&lt;br /&gt;            new ClickListener() {&lt;br /&gt;                public void onClick(Widget sender) {&lt;br /&gt;                    Cadastro cad = new Cadastro();&lt;br /&gt;                    cad.setCidade(txtCidade.getText());&lt;br /&gt;                    cad.setNome(txtNome.getText());&lt;br /&gt;&lt;br /&gt;                    asyncCadastro(cad);&lt;br /&gt;            }&lt;br /&gt;      });            &lt;br /&gt;    p.add(btCadastrar);             &lt;br /&gt;&lt;br /&gt;    RootPanel.get().add(form);    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void onFailure(Throwable caught) {&lt;br /&gt;    // Joga uma mensagem de erro caso ocorra&lt;br /&gt;    Window.alert(caught.getMessage());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void onSuccess(Object result) {&lt;br /&gt;     // Retorna a resposta do servidor&lt;br /&gt;     Window.alert(result.toString());&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pronto, agora antes de testar, é necessário criar uma linha no xml do projeto GWT, que seria Principal.gwt.xml. Adicione depois da tag entry-point:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;servlet path="/cadastro"&lt;br /&gt; class="org.cadastrogwt.server.CadastroServiceImpl" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pronto, rode o projeto e tente fazer um cadastro e depois olhe no banco de dados se foi corretamente. Eu não vou explicar como faz a listagem, porque seria legal se desse pra retornar do servidor um ArrayList&lt;e&gt; mas não consegui, vou fazer mais testes. Mas fica ae pra diversão de vocês. Usei como base os exemplos que vem no pacote do GWT, lá tem o pacote DynamTable que usa recursos do RPC.&lt;br /&gt;&lt;br /&gt;Enjoy...&lt;/e&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1273956776603549315-4131809394021559326?l=andersonajx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andersonajx.blogspot.com/feeds/4131809394021559326/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1273956776603549315&amp;postID=4131809394021559326' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4131809394021559326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1273956776603549315/posts/default/4131809394021559326'/><link rel='alternate' type='text/html' href='http://andersonajx.blogspot.com/2008/06/utilizando-o-hibernate-no-gwt.html' title='Utilizando o Hibernate no GWT'/><author><name>Anderson Clayton</name><uri>http://www.blogger.com/profile/06447160297830578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_VMMGvNwO6To/SElFweiOLeI/AAAAAAAAAAw/-m6yPR89Lek/S220/eu1.jpg'/></author><thr:total>2</thr:total></entry></feed>
