package co.forsaken.projectindigo.utils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.nio.channels.FileChannel;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import co.forsaken.projectindigo.data.log.Logger;
import co.forsaken.projectindigo.utils.mojangtokens.ExtractRule;
public class FileUtils {
public static void writeStringToFile(String str, File file) {
BufferedWriter writer = null;
try {
file.delete();
file.createNewFile();
writer = new BufferedWriter(new FileWriter(file));
writer.write(str);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String formatPath(String inputPath) {
return new File(inputPath).getAbsolutePath();
}
public static void writeStreamToFile(InputStream stream, File file) {
try {
OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int read;
while ((read = stream.read(buffer)) > 0) {
out.write(buffer, 0, read);
}
out.close();
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static boolean deleteDirectory(File directory) {
if (directory.exists()) {
File[] files = directory.listFiles();
if (null != files) {
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
deleteDirectory(files[i]);
} else {
files[i].delete();
}
}
}
}
return directory.delete();
}
public static Document getXML(InputStream stream) throws SAXException, IOException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
try {
return docFactory.newDocumentBuilder().parse(stream);
} catch (ParserConfigurationException ignored) {
Logger.logError(ignored.getMessage(), ignored);
} catch (UnknownHostException e) {
Logger.logError(e.getMessage(), e);
}
return null;
}
public static void unzip(File in, File out) {
unzip(in, out, null);
}
public static void unzip(File in, File out, ExtractRule extractRule) {
try {
ZipFile zipFile = null;
if (!out.exists()) {
out.mkdirs();
}
zipFile = new ZipFile(in);
Enumeration<?> e = zipFile.entries();
while (e.hasMoreElements()) {
ZipEntry entry = (ZipEntry) e.nextElement();
String entryName = entry.getName();
if (entry.getName().endsWith("aux.class")) {
entryName = "aux_class";
}
if (extractRule != null && extractRule.shouldExclude(entryName)) {
continue;
}
if (entry.isDirectory()) {
File folder = new File(out, entryName);
folder.mkdirs();
}
File destinationFilePath = new File(out, entryName);
destinationFilePath.getParentFile().mkdirs();
if (!entry.isDirectory() && !entry.getName().equals(".minecraft")) {
BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
int b;
byte buffer[] = new byte[1024];
FileOutputStream fos = new FileOutputStream(destinationFilePath);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
while ((b = bis.read(buffer, 0, 1024)) != -1) {
bos.write(buffer, 0, b);
}
bos.flush();
bos.close();
bis.close();
}
}
zipFile.close();
} catch (IOException e) {}
}
public static boolean copyFile(File from, File to) {
return copyFile(from, to, false);
}
public static boolean copyFile(File from, File to, boolean withFilename) {
if (!from.isFile()) { return false; }
if (!from.exists()) { return false; }
if (!withFilename) {
to = new File(to, from.getName());
}
if (to.exists()) {
to.delete();
}
try {
to.createNewFile();
} catch (IOException e) {
return false;
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(from).getChannel();
destination = new FileOutputStream(to).getChannel();
destination.transferFrom(source, 0, source.size());
} catch (IOException e) {
return false;
} finally {
try {
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}
} catch (IOException e) {
return false;
}
}
return true;
}
}