/*
Copyright 2009 Hauke Rehfeld
This file is part of QuakeInjector.
QuakeInjector 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.
QuakeInjector 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 QuakeInjector. If not, see <http://www.gnu.org/licenses/>.
*/
package de.haukerehfeld.quakeinjector;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.zip.CRC32;
public class Utils {
public static final int BUFFERSIZE = 4096;
public static <T> String join(final Iterable<T> objs, final String delimiter) {
Iterator<T> iter = objs.iterator();
if (!iter.hasNext())
return "";
StringBuffer buffer = new StringBuffer(String.valueOf(iter.next()));
while (iter.hasNext()) {
buffer.append(delimiter).append(String.valueOf(iter.next()));
}
return buffer.toString();
}
/**
* Like File.mkdirs() this creates all parent directories of f, but returns them in a list
*/
public static List<File> mkdirs(File f) {
ArrayList<File> files = new ArrayList<File>();
if (f.isDirectory()) {
files.add(f);
}
File parentDir = f.getParentFile();
while (parentDir != null && !parentDir.exists()) {
files.add(parentDir);
parentDir = parentDir.getParentFile();
}
java.util.Collections.reverse(files);
for (File dir: files) {
System.out.println("Creating dir " + dir);
dir.mkdir();
}
return files;
}
/**
* Write stream to file in chunks of 2048 bytes
*
* doesn't do any checks.
*/
public static long writeFile(InputStream in, File file, ProgressListener progress)
throws IOException {
return writeFile(in, file, 2048, progress);
}
/**
* Write stream to file
* @return crc32 checksum
*/
public static long writeFile(final InputStream in,
final File file,
final int BUFFERSIZE,
final ProgressListener progress) throws IOException {
final BufferedOutputStream dest = new BufferedOutputStream(new FileOutputStream(file),
BUFFERSIZE);
long crc = copy(in, dest, BUFFERSIZE, progress);
dest.close();
return crc;
}
public static long copy(final InputStream in,
final OutputStream out,
final int BUFFERSIZE,
final ProgressListener progress) throws IOException {
byte data[] = new byte[BUFFERSIZE];
CRC32 crc = new CRC32();
int readcount;
while ((readcount = in.read(data, 0, BUFFERSIZE)) != -1) {
if (progress != null) {
progress.publish(readcount);
}
out.write(data, 0, readcount);
crc.update(data, 0, readcount);
}
out.flush();
return crc.getValue();
}
public static long getCrc32(final InputStream in, final ProgressListener progress) throws IOException {
return copy(in, new NoOutputStream(), BUFFERSIZE, progress);
}
public static class NoOutputStream extends OutputStream {
public void write(int b) {}
public void write(byte[] b) {}
public void write(byte[] b, int off, int len) {}
}
/**
Check if files can indeed be written inside a certain directory
Tries to write a temp file in a dir.
@param directory The directory to test
*/
public static boolean canWriteToDirectory(File directory) {
try {
File tmp = File.createTempFile("writeTest", null, directory);
tmp.delete();
}
catch (IOException e) {
System.out.println(e);
return false;
}
return true;
}
public static javax.swing.ImageIcon createImageIcon(String path, String description) throws java.io.IOException {
java.net.URL imgURL = Utils.class.getResource(path);
if (imgURL != null) {
return new javax.swing.ImageIcon(imgURL, description);
} else {
throw new java.io.IOException("Couldn't find file: " + path);
}
}
}