package br.com.cafebinario.file.implementation;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.sql.ResultSetMetaData;
import java.util.Enumeration;
import org.apache.log4j.Logger;
import br.com.cafebinario.exception.IntegrationArchiveException;
import br.com.cafebinario.file.interfaces.IIntegrationArchive;
import br.com.cafebinario.integration.IIntegracao;
import br.com.cafebinario.properties.AppProperties;
import br.com.cafebinario.transport.GenericTO;
import br.com.cafebinario.transport.GenericVO;
public class CsvIntegrationArchive implements IIntegrationArchive {
private static Logger LOG = Logger.getLogger(CsvIntegrationArchive.class);
private FileWriter arquivo = null;
private String delimitador = null;
private IIntegracao integracao = null;
protected AppProperties properties = AppProperties.instanceOf();
private String quebraLinha = null;
private int writeCount = 0;
private StringBuilder buffer = new StringBuilder();
public void discharge() throws IntegrationArchiveException {
try {
arquivo.flush();
} catch (IOException e) {
throw new IntegrationArchiveException(
"Erro ao descarregar buffer do arquivo.", e);
}
}
public void finalize() throws IntegrationArchiveException {
try {
arquivo.flush();
arquivo.close();
} catch (IOException e) {
LOG.error("Erro ao encerrar conex�o com arquivo " + integracao.getFileName(), e);
throw new IntegrationArchiveException(
"Erro ao encerrar conex�o com arquivo.", e);
}
}
public String getFileName() {
return integracao.getFileName();
}
public String initialize(IIntegracao integracao) throws IOException {
this.integracao = integracao;
delimitador = properties.getProperty("DELIMITADOR");
quebraLinha = properties.getProperty("QUEBRA_DE_LINHA");
writeCount = Integer.parseInt(properties.getProperty("IO_QuantidadeLinhas", "-1"));
File arq = new File(integracao.getFileName());
if (Boolean.parseBoolean(AppProperties.instanceOf().getProperty(
"DELETE_IF_EXIST_FILE"))) {
if (arq.exists()) {
arq.delete();
}
}
try {
arquivo = new FileWriter(arq, Boolean.parseBoolean(AppProperties
.instanceOf().getProperty("APPEND_FILE")));
} catch (IOException e) {
throw e;
}
return integracao.getFileName();
}
public String initializeOrder(IIntegracao integracao) throws IOException {
this.integracao = integracao;
delimitador = properties.getProperty("DELIMITADOR");
quebraLinha = properties.getProperty("QUEBRA_DE_LINHA");
File arq = new File(integracao.getFileName());
if (Boolean.parseBoolean(AppProperties.instanceOf().getProperty(
"DELETE_IF_EXIST_FILE"))) {
if (arq.exists()) {
arq.delete();
}
}
try {
arquivo = new FileWriter(arq, Boolean.parseBoolean(AppProperties
.instanceOf().getProperty("APPEND_FILE")));
} catch (IOException e) {
throw e;
}
return integracao.getFileName();
}
public String write() throws IntegrationArchiveException {
try {
LOG.debug("OUTPUT_FILE=" + integracao.getFileName());
GenericTO data = integracao.getData();
int i = 0;
for (GenericVO vo : data) {
write(vo, data.getCollNumber());
if(i == writeCount){
arquivo.append(buffer.toString());
buffer = new StringBuilder();
i = 0;
}
i++;
}
arquivo.append(buffer.toString());
arquivo.flush();
return integracao.getFileName();
} catch (Exception e) {
LOG.error("Erro ao gerar arquivo " + integracao.getFileName(), e);
throw new IntegrationArchiveException("erro ao escrever arquivo.",
e);
}
}
public void write(GenericVO vo, int collNumber) throws IOException {
Enumeration<Integer> itKey = vo.keys();
int i = 1;
while (itKey.hasMoreElements()) {
Integer key = itKey.nextElement();
String value = vo.get(key);
buffer.append(value + (i++ < collNumber ? delimitador : quebraLinha));
}
}
public String writeRecord(GenericVO vo, int collNumber, ResultSetMetaData mt)
throws IntegrationArchiveException {
FileChannel rwChannel = null;
try {
LOG.debug("OUTPUT_FILE=" + integracao.getFileName());
/*
* Calcula o buffer da saida
*/
int tamanho = 0;
int columnCount = mt.getColumnCount();
int i = 1;
while (i < columnCount) {
if (i == 1) {
tamanho += mt.getColumnDisplaySize(i)
+ quebraLinha.length();
} else {
tamanho += mt.getColumnDisplaySize(i)
+ delimitador.length();
}
i++;
}
/*
* Grava no arquivo o conte�do do ResultSet
*/
rwChannel = new RandomAccessFile(integracao.getFileName(), "rw").getChannel();
ByteBuffer wrBuf = null;
wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, tamanho);
byte[] buffer = null;
StringBuilder registro = new StringBuilder(tamanho);
Enumeration<Integer> itKey = vo.keys();
while (itKey.hasMoreElements()) {
Integer key = itKey.nextElement();
registro.append(vo.get(key)
+ (key.intValue() < collNumber ? delimitador
: quebraLinha));
}
buffer = registro.toString().getBytes();
wrBuf.put(buffer);
} catch (FileNotFoundException e) {
LOG.error("Erro ao gerar arquivo " + integracao.getFileName(), e);
throw new IntegrationArchiveException(
"Erro ao escrever arquivo. FileNotFoundException: ", e);
} catch (IOException e) {
LOG.error("Erro ao gerar arquivo " + integracao.getFileName(), e);
throw new IntegrationArchiveException(
"Erro ao escrever arquivo. IOException: ", e);
} catch (Exception e) {
LOG.error("Erro ao gerar arquivo " + integracao.getFileName(), e);
throw new IntegrationArchiveException(
"Erro ao escrever arquivo. Exception: ", e);
} finally {
try {
if (rwChannel != null) {
rwChannel.close();
}
} catch (IOException e) {
LOG.error("Erro ao encerrar conex�o com arquivo. " + integracao.getFileName(),
e);
throw new IntegrationArchiveException(
"Erro ao encerrar conex�o com arquivo.", e);
}
}
return integracao.getFileName();
}
}