package br.com.caelum.stella.gateway.bb; import java.io.ByteArrayInputStream; import java.io.File; import java.net.URISyntaxException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import net.vidageek.mirror.Mirror; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import br.com.caelum.stella.gateway.core.BigDecimalFormatter; import br.com.caelum.stella.gateway.core.CalendarFormatter; import br.com.caelum.stella.gateway.core.EnumComCodigoFinder; import br.com.caelum.stella.gateway.core.IntegrationFailedException; import br.com.caelum.stella.gateway.core.ReturnBuilder; public enum BBFormularioSondaReturnBuilder implements ReturnBuilder<BBFormularioSondaReturn, String> { HTML("01") { public BBFormularioSondaReturn buildReturn(String source) { // TODO Auto-generated method stub throw new IntegrationFailedException( "Essa forma ainda não esta implementada"); } }, XML("02") { /** * Aqui, substitui o caminho do dtd no xml e depois parsea. */ public BBFormularioSondaReturn buildReturn(String source) { // TODO Auto-generated method stub try { source = source.replace("lojavirtual.dtd",new File(BBFormularioSondaReturnBuilder.class.getResource("/lojavirtual.dtd").toURI()).getPath()); } catch (URISyntaxException e) { // TODO Auto-generated catch block throw new IntegrationFailedException("Não foi possivel substituir o caminho para a lojavirtual.dtd",e); } return createFormularioSondaReturn(parseaXMLEMontaFormularioInicialSondaAPartirDosAtributos(source)); } private RespostaInicialFormularioSonda parseaXMLEMontaFormularioInicialSondaAPartirDosAtributos( String source) { /* * implementado do jeito mais básico, não achei valido jogar o Jaxb só para isso. */ try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbf.newDocumentBuilder(); Document document = docBuilder.parse(new ByteArrayInputStream(source .getBytes())); NodeList entradas = document.getElementsByTagName("ENTRADA"); RespostaInicialFormularioSonda formularioSonda = new RespostaInicialFormularioSonda(); for(int i=0;i<entradas.getLength();i++){ Node node = entradas.item(i); Mirror.on(formularioSonda).set().field(node.getAttributes().item(0).getNodeValue()).withValue(node.getAttributes().item(1).getNodeValue()); } return formularioSonda; } catch (Exception e) { // como so vou lançar a exception, caso ela ocorra, não vale a pena tratar uma por uma. throw new IntegrationFailedException(e); } } }, STRING("03") { public BBFormularioSondaReturn buildReturn(String source) { // TODO Auto-generated method stub String refTran = source.substring(0, 17); String valor = source.substring(17, 32); String idConv = source.substring(32, 38); String tipoTransacao = source.substring(38, 39); String situacao = source.substring(39, 41); String dataPagamento = source.substring(41); return createFormularioSondaReturn(new RespostaInicialFormularioSonda( refTran, valor, idConv, tipoTransacao, situacao, dataPagamento)); } }; private String codigo; private BBFormularioSondaReturnBuilder(String codigo) { this.codigo = codigo; } public String getCodigo() { return codigo; } @Override public String toString() { // TODO Auto-generated method stub return codigo; } protected BBFormularioSondaReturn createFormularioSondaReturn( RespostaInicialFormularioSonda formularioSonda) { return new BBFormularioSondaReturn(new BBBasicDataReturn( Integer.valueOf(formularioSonda.getIdConv()), formularioSonda.getRefTran()), new BigDecimalFormatter().stringInCentsToBigDecimal(formularioSonda .getValor()), new EnumComCodigoFinder() .descobreAEnumPeloCodigo(BBTipoTransacao.class, formularioSonda.getTpPagamento()), new EnumComCodigoFinder().descobreAEnumPeloCodigo( BBSituacao.class, formularioSonda.getSituacao()), new CalendarFormatter().stringToCalendar(formularioSonda .getDataPagamento(), "ddMMyyyy")); } }