CONSULTA DE CEP COM WEBSERVICE

PostgreSQL

Java

18/03/2016

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

Curtidas 0

Respostas

Christian Fuin

Christian Fuin

18/03/2016

up!?
GOSTEI 0
POSTAR