CONSULTA DE CEP COM WEBSERVICE
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
Curtidas 0
Respostas
Christian Fuin
18/03/2016
up!?
GOSTEI 0