package gcom.gui.cadastro; import gcom.cadastro.atualizacaocadastral.command.AtualizacaoCadastral; import gcom.cadastro.atualizacaocadastral.command.AtualizacaoCadastralImovel; import gcom.fachada.Fachada; import gcom.gui.ActionServletException; import gcom.gui.GcomAction; import gcom.util.exception.BaseRuntimeException; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.ejb.EJBException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.upload.FormFile; import org.jboss.logging.Logger; public class CarregarDadosAtualizacaoCadastralAction extends GcomAction { private static Logger logger = Logger .getLogger(CarregarDadosAtualizacaoCadastralAction.class); public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { ActionForward retorno = actionMapping.findForward("telaSucesso"); CarregarDadosAtualizacaoCadastralActionForm form = (CarregarDadosAtualizacaoCadastralActionForm) actionForm; FormFile arquivo = form.getArquivo(); String nomeArquivoTxt = ""; String nomeArquivoZip = arquivo.getFileName(); String caminhoJboss = System.getProperty("jboss.server.home.dir"); this.salvarArquivoZip(arquivo, nomeArquivoZip, caminhoJboss); if (nomeArquivoZip.toLowerCase().endsWith(".zip")) { try { ZipInputStream zipInputStream = new ZipInputStream(arquivo.getInputStream()); ZipEntry zipEntry = null; BufferedReader buffer = null; List<String> imagens = new ArrayList<String>(); while ((zipEntry = zipInputStream.getNextEntry()) != null) { String nomeItem = zipEntry.getName().toLowerCase(); if (nomeItem.startsWith("__")) { continue; } if (nomeItem.endsWith(".txt")) { nomeArquivoTxt = nomeItem.substring(0, 10); System.out.println("Descompactando " + nomeItem); buffer = this.lerArquivoTxt(buffer, zipInputStream, zipEntry); } else if (nomeItem.endsWith(".jpeg") || nomeItem.endsWith(".jpg") || nomeItem.endsWith(".png")) { imagens = this.lerImagem(zipInputStream, zipEntry, imagens, nomeArquivoZip, nomeArquivoTxt, caminhoJboss); } } AtualizacaoCadastral atualizacao = Fachada.getInstancia().carregarImovelAtualizacaoCadastral(buffer, imagens); if (atualizacao.existeErroNoArquivo()) { Map<String, List<String>> mapErros = new HashMap<String, List<String>>(); for (AtualizacaoCadastralImovel imovel : atualizacao.getImoveisComErro()) { List<String> erros = mapErros.get(String.valueOf(imovel.getMatricula())); if (erros == null) { erros = new ArrayList<String>(); mapErros.put(String.valueOf(imovel.getMatricula()), erros); } erros.addAll(imovel.getMensagensErro()); } httpServletRequest.setAttribute("mapErros", mapErros); form.setColecaoErrosCadastro(mapErros); form.setNomeArquivo(arquivo.getFileName()); form.setTotalImoveis(atualizacao.getTotalImoveis() + ""); form.setTotalImoveisComErro(atualizacao.getTotalImoveisComErro() + ""); retorno = actionMapping.findForward("CarregarDadosAtualizacaoCadastralAction"); } zipInputStream.close(); } catch (Exception e) { if (e instanceof EJBException) { Throwable t = ((EJBException) e).getCausedByException(); if (t instanceof BaseRuntimeException) { throw new ActionServletException(t.getMessage(), ((BaseRuntimeException) t).getParametros()); } } logger.error("Erro ao carregar arquivo de atualizacao."); throw new ActionServletException("atencao.erro_arquivo_carregado"); } } else { throw new ActionServletException("atencao.arquivo_zip_nao_encontrado"); } montarPaginaSucesso(httpServletRequest, "Arquivo carregado com sucesso.", "Carregar outro arquivo", "exibirCarregarDadosAtualizacaoCadastralAction.do?menu=sim"); return retorno; } private void salvarArquivoZip(FormFile arquivoCarregado, String nomeArquivoZip, String caminhoJboss) { try { File pasta = new File(caminhoJboss + "/retorno", nomeArquivoZip.substring(0, 10)); if (!pasta.exists()) { pasta.mkdir(); } else { File arquivos[] = pasta.listFiles(); for (File arquivo : arquivos) { if (nomeArquivoZip.equals(arquivo.getName())) { arquivo.delete(); } } } byte tamanho[] = arquivoCarregado.getFileData(); File arquivoZip = new File(pasta, nomeArquivoZip); OutputStream out = new FileOutputStream(arquivoZip); out.write(tamanho); out.close(); } catch (IOException e1) { e1.printStackTrace(); throw new ActionServletException("atencao.erro_salvar_arquivo_zip"); } } private List<String> lerImagem(ZipInputStream zipInputStream, ZipEntry zipEntry, List<String> imagens, String nomeArquivoZip, String nomeImagem, String caminhoJboss) throws FileNotFoundException, IOException { try { File pasta = new File(caminhoJboss + "/images/" + nomeArquivoZip.substring(0, 10) , nomeImagem); if (!pasta.exists()) { pasta.mkdir(); } else { File arquivos[] = pasta.listFiles(); for (File arquivo : arquivos) { if (zipEntry.getName().equals(arquivo.getName())) { arquivo.delete(); } } } imagens = this.extrairImagem(zipInputStream, zipEntry, imagens, pasta); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return imagens; } private List<String> extrairImagem(ZipInputStream zipInputStream, ZipEntry zipEntry, List<String> imagens, File caminho) throws FileNotFoundException, IOException { File imagem = new File(caminho, zipEntry.getName()); imagens.add(imagem.getName()); FileOutputStream fileOutputStream = new FileOutputStream(imagem); for (int c = zipInputStream.read(); c != -1; c = zipInputStream.read()) { fileOutputStream.write(c); } zipInputStream.closeEntry(); fileOutputStream.close(); return imagens; } private BufferedReader lerArquivoTxt(BufferedReader buffer, ZipInputStream zipInputStream, ZipEntry zipEntry) throws FileNotFoundException, IOException { File arquivoRetorno = new File(zipEntry.getName()); FileOutputStream fileOutputStream = new FileOutputStream(arquivoRetorno); for (int c = zipInputStream.read(); c != -1; c = zipInputStream.read()) { fileOutputStream.write(c); } zipInputStream.closeEntry(); fileOutputStream.close(); buffer = new BufferedReader(new FileReader(arquivoRetorno)); arquivoRetorno.delete(); return buffer; } }