package com.rjconsultores.ventaboletos.layouts; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.jrimum.texgit.FlatFile; import org.jrimum.texgit.Record; import org.jrimum.texgit.Texgit; import org.jrimum.utilix.ClassLoaders; import org.jrimum.utilix.Collections; import org.jrimum.utilix.Objects; import org.jrimum.utilix.text.Strings; import com.rjconsultores.ventaboletos.ArquivoRemessa; import com.rjconsultores.ventaboletos.ArquivoRemessaItemInteface; import com.rjconsultores.ventaboletos.ArquivoRetorno; import com.rjconsultores.ventaboletos.ArquivoRetornoItem; import com.rjconsultores.ventaboletos.blocos.CabecalhoRemessa; import com.rjconsultores.ventaboletos.blocos.CabecalhoRetorno; import com.rjconsultores.ventaboletos.blocos.DadosBoleto; import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; import com.rjconsultores.ventaboletos.blocos.DetalheRetorno; import com.rjconsultores.ventaboletos.blocos.RateioDeCredito; import com.rjconsultores.ventaboletos.blocos.RodapeRemessa; import com.rjconsultores.ventaboletos.blocos.RodapeRetorno; import com.rjconsultores.ventaboletos.enuns.BancoLayout; /** *

* Implementação base para classes utilizadoras do JRimum-Texgit . *

* * @author Gilmar P.S.L. */ public abstract class AbstractFlatFile{ //protected static Logger log = LoggerFactory.getLogger(AbstractFlatFile.class); /** * Nome do arquivo xml de configuração. */ protected BancoLayout cfgFile; /** * FlatFile Texgit. */ private FlatFile flatFile; /** * Linhas do Arquivo */ private List lines = new ArrayList(); /** * Construtor para inicializção com layout xml. * * @param cfgFile * - nome do arquivo layout em xml. */ protected AbstractFlatFile(BancoLayout cfgFile) { init(cfgFile); } /** * Inicializador e validador do nome do e layout do arquivo. * * @param cfgFile */ protected final void init(BancoLayout cfgFile) { //Strings.checkNotBlank(cfgFile.getPath(), "Arquivo invalido!"); this.cfgFile = cfgFile; configure(); } /** * Retorna o Texgit flatfile da instância. * * @return the flatFile */ protected final FlatFile getFlatFile() { return flatFile; } /** * Configura o flat file a partir do nome do arquivo layout xml da instância * procurando no classpath. */ private void configure() { InputStream in = null; try { //in = ClassLoaders.getResourceAsStream(cfgFile.getPath(), this.getClass()); in = getClass().getResourceAsStream(cfgFile.getPath()); File config = File.createTempFile(cfgFile.getTemp(), null); copyInputStreamToFile(in, config); //FileUtils.copyInputStreamToFile(in, config); flatFile = Texgit.createFlatFile(config); } catch (Exception e) { throw new IllegalStateException(e); }finally { if (in != null) { try { in.close(); } catch (Exception e) { e.printStackTrace(); } } } Objects.checkNotNull(flatFile, "NAO FOI POSSIVEL INICIALIZAR A LIB TEXGIT!"); } public void copyInputStreamToFile(InputStream initialStream, File targetFile) throws IOException { OutputStream outStream = new FileOutputStream(targetFile); byte[] buffer = new byte[8 * 1024]; int bytesRead; while ((bytesRead = initialStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } IOUtils.closeQuietly(initialStream); IOUtils.closeQuietly(outStream); // Reader reader = new BufferedReader(new InputStreamReader(initialStream)); // Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile), "Cp1252")); // // char[] buffer = new char[8 * 1024]; // int bytesRead; // while ((bytesRead = reader.read(buffer)) != -1){ // writer.write(buffer, 0, bytesRead); // } // // IOUtils.closeQuietly(initialStream); // IOUtils.closeQuietly(reader); // IOUtils.closeQuietly(writer); } /** *

* Lê um arquivo do layout da instancia. *

* * @param lines * linhas do arquivo */ @SuppressWarnings("unchecked") public FF read(final List lines) { Collections.checkNotEmpty(lines, "Linhas ausentes!"); try { getFlatFile().read(lines); } catch (Exception e) { e.printStackTrace(); } return (FF) this; } /** *

* Lê um arquivo do layout da instancia com enconding UTF-8. *

* * @param file * arquivo texto */ @SuppressWarnings("unchecked") public FF read(final File file) { Objects.checkNotNull(file, "Arquivo TXT a ser importado nulo!"); try { getFlatFile().read(FileUtils.readLines(file)); } catch (Exception e) { e.printStackTrace(); } return (FF) this; } /** *

* Lê um arquivo do layout da instancia. *

* * @param file * - Arquivo texto * @param encoding * - Econding em que o arquivo será lido */ @SuppressWarnings("unchecked") public FF read(final File file, String encoding) { Objects.checkNotNull(file, "Arquivo TXT a ser importado nulo!"); Strings.checkNotBlank(encoding, "Encoding inválido!"); try { getFlatFile().read(FileUtils.readLines(file, encoding)); } catch (IOException e) { e.printStackTrace(); } return (FF) this; } /** *

* Escreve um arquivo do layout da instancia com enconding UTF-8. *

* * @return arquivo texto * @throws IOException */ public File write() throws IOException { Objects.checkNotNull(getFlatFile(), "Arquivo TXT a ser importado nulo!"); File f = File.createTempFile(this.getClass().getName() + "" + new Date().getTime(), "_jnfmtmp.txt"); FileUtils.writeLines(f, getFlatFile().write()); return f; } /** *

* Escreve um arquivo do layout da instancia. *

* @param encoding - Econding em que o arquivo será escrito * @return arquivo texto * @throws IOException */ public File write(String encoding) throws IOException { if (getFlatFile() != null) { File f = File.createTempFile(this.getClass().getName() + "" + new Date().getTime(), "_jnfmtmp.txt"); FileUtils.writeLines(f, getFlatFile().write(), encoding); return f; } else{ throw new IllegalArgumentException(new NullPointerException( "Arquivo TXT a ser importado nulo!")); } } /** *

* Escreve um arquivo do layout da instancia. *

* @param arquivoRemessaFisico * @throws IOException */ protected void write(File arquivoRemessaFisico) throws IOException{ if(arquivoRemessaFisico == null){ throw new IllegalArgumentException(new NullPointerException( "Arquivo TXT a ser importado nulo!")); } FileUtils.writeLines(arquivoRemessaFisico, getFlatFile().write(), "\r\n"); } protected void writeLines(File arquivoRemessaFisico) throws IOException{ if(arquivoRemessaFisico == null){ throw new IllegalArgumentException(new NullPointerException( "Arquivo TXT a ser importado nulo!")); } FileUtils.writeLines(arquivoRemessaFisico, "Cp1252", this.lines, "\r\n"); //FileUtils.writeLines(file, encoding, lines, lineEnding); } protected void writeLines() throws IOException{ this.lines.addAll(getFlatFile().write()); flatFile = null; configure(); } /** * * @param arquivoRemessaFisico * @param arquivoRemessa * @throws FileNotFoundException * @throws IOException */ public List gerarRemessa(File arquivoRemessaFisico, ArquivoRemessa arquivoRemessa) throws FileNotFoundException, IOException{ //log.info("Gerando Remessa: " + cfgFile.name()); //log.info("INICIO - Bloco de Header..."); for(ArquivoRemessaItemInteface arquivoRemessaItem : arquivoRemessa.getItens()){ createHeader(arquivoRemessaItem.getCabecalhoRemessa()); //log.info("FIM - Bloco de Header..."); //log.info("INICIO - Bloco de Titulos..."); for (DetalheObrigatorio titulo : arquivoRemessaItem.getTitulos()) { createTransacaoTitulos(titulo); } //log.info("FIM - Bloco de Titulos..."); //log.info("INICIO - Bloco de Trailler..."); createTrailler(arquivoRemessaItem.getRodapeRemessa()); //log.info("FIM - Bloco de Trailler..."); //log.info("INICIO - Gerando arquivo..."); writeLines(); //log.info("FIM - Gerando arquivo..."); } writeLines(arquivoRemessaFisico); return this.lines; } public ArquivoRetorno lerRetorno(File arquivoRetornoFisico) throws FileNotFoundException, IOException{ //log.info("Gerando Retorno: " + cfgFile.name()); //log.info("INICIO - Bloco de Header..."); read(arquivoRetornoFisico); return loadInfo(); } private ArquivoRetorno loadInfo() { ArquivoRetorno arquivoRetorno = new ArquivoRetorno(); Record header = getFlatFile().getRecord("Header"); ArquivoRetornoItem arquivoRetornoItem = new ArquivoRetornoItem(); arquivoRetornoItem.setCabecalhoRetorno(readHeader(header)); Collection registrosDeTransacoes = getFlatFile().getRecords( "TransacaoTitulo"); List titulos = readTransacaoTitulos(registrosDeTransacoes); for(DetalheRetorno titulo : titulos){ arquivoRetornoItem.addTitulo(titulo); } Record trailler = getFlatFile().getRecord("Trailler"); arquivoRetornoItem.setRodapeRetorno(readTrailler(trailler)); arquivoRetorno.addItem(arquivoRetornoItem); return arquivoRetorno; } protected abstract void createHeader(CabecalhoRemessa cabecalhoRemessaParam); protected abstract void createTransacaoTitulos(DetalheObrigatorio tituloParam); protected abstract Record createDadosBoletos(DadosBoleto boleto); protected abstract Record createRateioDeCredito(RateioDeCredito rateioDeCredito); protected abstract void createTrailler(RodapeRemessa trailler); protected abstract CabecalhoRetorno readHeader(Record header); protected abstract List readTransacaoTitulos(Collection registrosDeTransacoes); protected abstract RodapeRetorno readTrailler(Record trailler); }