CONSULTA DE CEP COM WEBSERVICE
18/03/2016
0
Galera, Boa noite, tudo bem?
Seguinte, tenho uma classe de consulta CEP via HIbernate, no qual possui uma base de dados local no postgres, quando não encontrado o endereço faço uma consulta via WebService, porém com as necessidades do cliente foi solicitado um tipo de CACHE para manter os dados sempre atualizados.
A solução que tive foi a seguinte abaixo:
OBS: Peço ajuda sobre performance e até mesmo dicas se o código está bem feito, visando que sou Estágiario com pouco meses de programação. heheh.
Abraços a todos.
Seguinte, tenho uma classe de consulta CEP via HIbernate, no qual possui uma base de dados local no postgres, quando não encontrado o endereço faço uma consulta via WebService, porém com as necessidades do cliente foi solicitado um tipo de CACHE para manter os dados sempre atualizados.
A solução que tive foi a seguinte abaixo:
OBS: Peço ajuda sobre performance e até mesmo dicas se o código está bem feito, visando que sou Estágiario com pouco meses de programação. heheh.
package br.com.cliente.services; import java.net.MalformedURLException; import java.net.URL; import java.util.Calendar; import java.util.Date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.persistence.Query; import javax.persistence.TypedQuery; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.hibernate.SQLQuery; import org.hibernate.Session; import br.com.allergisa.common.EntityManagerUtil; import br.com.allergisa.entites.Endereco; //Consulta de CEP public class CEPService { private String data = "18/03/2016"; // Verifica a Validade do CEP public Endereco validaCEP(String cep) throws Exception { if (cep.equals("00000-000")) { throw new Exception("O CEP É INVÁLIDO!!!"); } else { String regex = "^[0-9]-[0-9]$"; Pattern pattern = Pattern.compile(regex); Matcher match = pattern.matcher(cep); if (match.find()) { return consultaCEP(cep); } else { throw new Exception("O FORMATO DO CEP É INVÁLIDO!!!"); } } } // Busca o Cep public Endereco consultaCEP(String cep) throws Exception { Date data = cacheCEP(); boolean valida = compareDate(data); Endereco endereco = new Endereco(); if (valida) { String cepUf = cep.substring(0, 5); String uf = null; String sql = "SELECT uf FROM UF WHERE ? BETWEEN cep1 and cep2 "; Query query = null; // Verifica a tabela que vai buscar o CEP try { query = EntityManagerUtil.creatEM().createNativeQuery(sql); query.setParameter(1, cepUf); uf = (String) query.getSingleResult(); } catch (Exception e) { e.printStackTrace(); } Endereco end = new Endereco(); end.setUF(uf); end.setCEP(cep); endereco = getEnderecoViaCep(end); if (endereco.getCEP() == null) { try { endereco = serviceCEP(end); } catch (Exception e) { e.printStackTrace(); } } } else { Endereco end = new Endereco(); end.setCEP(cep); endereco = serviceCEP(end); } return endereco; } // Chama o Método para buscar CEP e Persistir public Endereco serviceCEP(Endereco end) throws Exception { Endereco endereco = new Endereco(); endereco = consultaWebService(end.getCEP()); if (!end.getCidade().trim().equals("")) { persisteCEP(endereco); } return endereco; } // Busca o Endereco no Banco public Endereco getEnderecoViaCep(Endereco end) { Endereco endereco = new Endereco(); String sql = "SELECT * FROM " + end.getUF(); sql += " WHERE CEP = ?"; try { Query query = EntityManagerUtil.creatEM().createNativeQuery(sql); query.setParameter(1, end.getCEP()); List<Object[]> list = query.getResultList(); if (!list.isEmpty()) { for (Object[] o : list) { endereco.setCidade((String) o[1]); endereco.setLogradouro((String) o[2]); endereco.setBairro((String) o[3]); endereco.setCEP((String) o[4]); endereco.setTp_logradouro((String) o[5]); endereco.setUF(end.getUF()); } } } catch (Exception e) { e.printStackTrace(); } return endereco; } // Persiste um novo CEP public void persisteCEP(Endereco endereco) { String uf = endereco.getUF(); Endereco end = getEnderecoViaCep(endereco); if(end.getCEP != null){ try{ String sql = "UPDATE FROM " + end.getUF(); sql += "set values(?,?,?,?,?) WHERE cep = ?"; Query query = EntityManagerUtil.creatEM().createNativeQuery(sql); query.setParameter(1, endereco.getCidade()); query.setParameter(2, endereco.getLogradouro()); query.setParameter(3, endereco.getBairro()); query.setParameter(4, endereco.getTp_logradouro()); query.setParameter(5, endereco.getCEP()); EntityManagerUtil.begin(); EntityManagerUtil.creatEM().getTransaction(); query.executeUpdate(); EntityManagerUtil.commit(); }catch(Exception e ){ e.printStackTracer(); } }else{ String sql = "SELECT MAX(id) from " + uf; try { Query query = EntityManagerUtil.creatEM().createNativeQuery(sql); // Obtem o ultimo id do Banco e add próximo Integer id = Integer.parseInt(query.getSingleResult().toString()); id++; sql = "INSERT INTO " + uf; sql += " VALUES(?,?,?,?,?,?)"; query = EntityManagerUtil.creatEM().createNativeQuery(sql); query.setParameter(1, id); query.setParameter(2, endereco.getCidade()); query.setParameter(3, endereco.getLogradouro()); query.setParameter(4, endereco.getBairro()); query.setParameter(5, endereco.getCEP()); query.setParameter(6, endereco.getTp_logradouro()); EntityManagerUtil.begin(); EntityManagerUtil.creatEM().getTransaction(); query.executeUpdate(); EntityManagerUtil.commit(); } catch (Exception e) { e.printStackTrace(); } finally { EntityManagerUtil.close(); } } } // Consulta via WebService public Endereco consultaWebService(String cep) { Endereco endereco = new Endereco(); try { URL webService = new URL("http://cep.republicavirtual.com.br/web_cep.php?cep=" + cep + "&formato=xml"); SAXReader reader = new SAXReader(); Document retornoWebService = reader.read(webService); Element element = retornoWebService.getRootElement(); for (Iterator i = element.elementIterator(); i.hasNext();) { Element e = (Element) i.next(); if (e.getQualifiedName().equals("cidade")) { endereco.setCidade(e.getText()); } if (e.getQualifiedName().equals("uf")) { endereco.setUF(e.getText()); } if (e.getQualifiedName().equals("bairro")) { endereco.setBairro(e.getText()); } if (e.getQualifiedName().equals("tipo_logradouro")) { endereco.setTp_logradouro(e.getText()); } if (e.getQualifiedName().equals("logradouro")) { endereco.setLogradouro(e.getText()); } } endereco.setCEP(cep); } catch (MalformedURLException | DocumentException e) { e.printStackTrace(); } return endereco; } // Válidade da data de consulta ao CEP public Date cacheCEP() throws ParseException { Date data = new SimpleDateFormat("dd/MM/yyyy").parse(this.data); Calendar c = Calendar.getInstance(); c.setTime(data); c.add(Calendar.DATE, 30); return data = c.getTime(); } // Compara as Datas public boolean compareDate(Date data) { Date date = new Date(System.currentTimeMillis()); if (!date.before(data)) { this.data = new SimpleDateFormat("dd/MM/yyyy").format(date); return false; } return true; } }
Abraços a todos.
Christian Fuin
Curtir tópico
+ 0
Responder
Posts
Clique aqui para fazer login e interagir na Comunidade :)