/*
Copyright 2012-2017 Jose Robson Mariano Alves
This file is part of bgfinancas.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package badernageral.bgfinancas.modulo.utilitario;
import badernageral.bgfinancas.biblioteca.banco.Conexao;
import badernageral.bgfinancas.biblioteca.banco.Database;
import badernageral.bgfinancas.biblioteca.sistema.Janela;
import badernageral.bgfinancas.biblioteca.sistema.Kernel;
import badernageral.bgfinancas.biblioteca.tipo.Status;
import badernageral.bgfinancas.idioma.Linguagem;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import javafx.stage.FileChooser;
public class Backup {
Conexao banco = Conexao.getInstance();
Linguagem idioma = Linguagem.getInstance();
public void exportarBackup(){
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(idioma.getMensagem("exportar_backup"));
fileChooser.setInitialFileName("BGFinancasBackup.bgf");
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("BGFinanças Backup", ".bgf")
);
File arquivoSelecionado = fileChooser.showSaveDialog(Kernel.palco);
if (arquivoSelecionado != null) {
try {
banco.executeUpdate("CHECKPOINT");
banco.executeUpdate("SHUTDOWN COMPACT");
String url = banco.getUrl(false);
File backup = arquivoSelecionado.getAbsoluteFile();
File[] arquivos = new File[2];
arquivos[0] = new File(url+".properties");
arquivos[1] = new File(url+".script");
compactar(arquivos, backup);
Janela.showMensagem(Status.SUCESSO, idioma.getMensagem("backup_exportado_sucesso"));
banco.conectar();
} catch (IOException ex) {
Janela.showException(ex);
}
}
}
public void importarBackup(){
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(idioma.getMensagem("importar_backup"));
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("BGFinanças Backup", "*.bgf"),
new FileChooser.ExtensionFilter(idioma.getMensagem("todos_arquivos"), "*.*")
);
File arquivoSelecionado = fileChooser.showOpenDialog(Kernel.palco);
if (arquivoSelecionado != null) {
try {
banco.executeUpdate("CHECKPOINT");
banco.executeUpdate("SHUTDOWN COMPACT");
String url = banco.getUrl(true);
File diretorio = new File(url);
File importar = arquivoSelecionado.getAbsoluteFile();
descompactar(importar, diretorio);
Janela.showMensagem(Status.SUCESSO, idioma.getMensagem("backup_importado_sucesso"));
banco.conectar();
Database.verificarBanco();
Kernel.master.reiniciar();
} catch (IOException ex) {
Janela.showException(ex);
}
}
}
private void compactar(File[] arquivos_entrada, File arquivo_saida) throws IOException {
if (arquivos_entrada != null && arquivos_entrada.length > 0) {
FileOutputStream saida = new FileOutputStream(arquivo_saida);
ZipOutputStream saida_zip = new ZipOutputStream(saida);
compactarArquivos(arquivos_entrada, saida_zip);
saida_zip.close();
}
}
private void compactarArquivos(File[] arquivos_entrada, ZipOutputStream saida_zip) throws IOException {
byte[] buffer = new byte[1024];
for (int i = 0; i < arquivos_entrada.length; i++) {
FileInputStream entrada = new FileInputStream(arquivos_entrada[i]);
saida_zip.putNextEntry(new ZipEntry(arquivos_entrada[i].getName()));
int tamanho;
while ((tamanho = entrada.read(buffer)) > 0) {
saida_zip.write(buffer,0,tamanho);
}
saida_zip.closeEntry();
entrada.close();
}
}
private void descompactar(File arquivo_zip, File diretorio_saida) throws IOException {
ZipFile zip = null;
File arquivo = null;
InputStream entrada = null;
OutputStream saida = null;
byte[] buffer = new byte[1024];
try {
if (!diretorio_saida.exists()) {
diretorio_saida.mkdirs();
}
if (!diretorio_saida.exists() || !diretorio_saida.isDirectory()) {
throw new IOException("Directory "+diretorio_saida.getName()+" invalid.");
}
zip = new ZipFile(arquivo_zip);
Enumeration conteudo_zip = zip.entries();
while (conteudo_zip.hasMoreElements()) {
ZipEntry arquivo_zipado = (ZipEntry) conteudo_zip.nextElement();
arquivo = new File(diretorio_saida, arquivo_zipado.getName());
if (!arquivo.getParentFile().exists()) {
arquivo.getParentFile().mkdirs();
}
try {
entrada = zip.getInputStream(arquivo_zipado);
saida = new FileOutputStream(arquivo);
int bytesLidos = 0;
if (arquivo_zipado == null) {
throw new ZipException("Erro ao ler a entrada do zip: "+arquivo_zipado.getName());
}
while ((bytesLidos = entrada.read(buffer)) > 0) {
saida.write(buffer, 0, bytesLidos);
}
} finally {
if (entrada != null) {
try {
entrada.close();
} catch (IOException ex) { }
}
if (saida != null) {
try {
saida.close();
} catch (IOException ex) { }
}
}
}
} finally {
if (zip != null) {
try {
zip.close();
} catch (IOException e) { }
}
}
}
}