Fórum CONSULTA DE CEP COM WEBSERVICE #548934
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
18/03/2016
Christian Fuin
up!?
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)