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.

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

Christian Fuin

Responder

Posts

18/03/2016

Christian Fuin

up!?
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar