mcMMO/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java

129 lines
4.2 KiB
Java
Raw Normal View History

2012-05-01 00:48:59 +02:00
package net.shatteredlands.shatt.backup;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
2012-05-01 07:40:47 +02:00
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
2012-05-01 07:40:47 +02:00
2012-05-01 00:48:59 +02:00
public class ZipLibrary {
private final static mcMMO plugin = mcMMO.p;
private static String BackupDirectory = plugin.mainDirectory + "backup" + File.separator;
2012-05-01 01:32:50 +02:00
private static File BackupDir = new File(BackupDirectory);
private static File FlatFileDirectory = new File(plugin.flatFileDirectory);
private static File ModFileDirectory = new File(plugin.modDirectory);
private static File UsersFile = new File(plugin.usersFile);
private static File ConfigFile = new File(plugin.mainDirectory + "config.yml");
private static File TreasuresFile = new File(plugin.mainDirectory + "treasures.yml");
private static File Leaderboards = new File(plugin.leaderboardDirectory);
2012-05-01 07:43:00 +02:00
2012-05-01 01:32:50 +02:00
public static void mcMMObackup() throws IOException {
if (Config.getInstance().getUseMySQL()) {
System.out.println("No Backup performed, in SQL Mode.");
return;
}
try {
if (BackupDir.mkdir()) {
2012-05-01 01:32:50 +02:00
mcMMO.p.getLogger().info("Created Backup Directory.");
}
} catch (Exception e) {
mcMMO.p.getLogger().severe(e.toString());
}
2012-05-01 01:32:50 +02:00
//Generate the proper date for the backup filename
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
File fileZip = new File(BackupDirectory + File.separator + dateFormat.format(date) + ".zip");
//Create the Source List, and add directories/etc to the file.
List<File> sources = new ArrayList<File>();
sources.add(FlatFileDirectory);
sources.add(ModFileDirectory);
2012-05-01 01:32:50 +02:00
sources.add(UsersFile);
sources.add(ConfigFile);
sources.add(TreasuresFile);
2012-05-01 01:32:50 +02:00
sources.add(Leaderboards);
//Actually do something
System.out.println("Backing up your mcMMO Configuration... ");
packZip(fileZip, sources);
}
private static void packZip(File output, List<File> sources) throws IOException {
2012-05-01 00:48:59 +02:00
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(output));
zipOut.setLevel(Deflater.DEFAULT_COMPRESSION);
for (File source : sources) {
if (source.isDirectory()) {
zipDir(zipOut, "", source);
2012-05-01 01:32:50 +02:00
}
else {
2012-05-01 00:48:59 +02:00
zipFile(zipOut, "", source);
}
}
2012-05-01 01:32:50 +02:00
2012-05-01 00:48:59 +02:00
zipOut.flush();
zipOut.close();
System.out.println("Backup Completed.");
}
private static String buildPath(String path, String file) {
if (path == null || path.isEmpty()) {
return file;
2012-05-01 01:32:50 +02:00
}
else {
2012-05-01 07:43:00 +02:00
return path + File.separator + file;
2012-05-01 00:48:59 +02:00
}
}
private static void zipDir(ZipOutputStream zos, String path, File dir) throws IOException {
if (!dir.canRead()) {
System.out.println("Cannot read " + dir.getCanonicalPath() + " (Maybe because of permissions?)");
2012-05-01 00:48:59 +02:00
return;
}
File[] files = dir.listFiles();
path = buildPath(path, dir.getName());
for (File source : files) {
if (source.isDirectory()) {
zipDir(zos, path, source);
2012-05-01 01:32:50 +02:00
}
else {
2012-05-01 00:48:59 +02:00
zipFile(zos, path, source);
}
}
}
private static void zipFile(ZipOutputStream zos, String path, File file) throws IOException {
if (!file.canRead()) {
System.out.println("Cannot read " + file.getCanonicalPath() + "(File Permissions?)");
return;
}
2012-05-01 01:32:50 +02:00
2012-05-01 00:48:59 +02:00
zos.putNextEntry(new ZipEntry(buildPath(path, file.getName())));
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[4092];
int byteCount = 0;
2012-05-01 01:32:50 +02:00
2012-05-01 00:48:59 +02:00
while ((byteCount = fis.read(buffer)) != -1) {
zos.write(buffer, 0, byteCount);
}
fis.close();
zos.closeEntry();
}
}