package com.smartandroid.sa.zip;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.nio.charset.Charset;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* Mainly methods to lookup Zip* class constructors. This is needed because Java
* 6 doesn't have constructors with Charsets that were introduced in Java 7.
*/
class ZipFileUtil {
private static final String MISSING_METHOD_PLEASE_UPGRADE = "Your JRE doesn't support the ZipFile Charset constructor. Please upgrade JRE to 1.7 use this feature. Tried constructor ZipFile(File, Charset).";
private static final String CONSTRUCTOR_MESSAGE_FOR_ZIPFILE = "Using constructor ZipFile(File, Charset) has failed: ";
private static final String CONSTRUCTOR_MESSAGE_FOR_OUTPUT = "Using constructor ZipOutputStream(OutputStream, Charset) has failed: ";
private static final String CONSTRUCTOR_MESSAGE_FOR_INPUT = "Using constructor ZipInputStream(InputStream, Charset) has failed: ";
// Private constructor for the utility class
private ZipFileUtil() {
}
/**
* Returns a ZipInputStream opened with a given charset.
*/
static ZipInputStream createZipInputStream(InputStream inStream,
Charset charset) {
if (charset == null)
return new ZipInputStream(inStream);
try {
Constructor<ZipInputStream> constructor = ZipInputStream.class
.getConstructor(new Class[] { InputStream.class,
Charset.class });
return (ZipInputStream) constructor.newInstance(new Object[] {
inStream, charset });
} catch (NoSuchMethodException e) {
throw new IllegalStateException(MISSING_METHOD_PLEASE_UPGRADE, e);
} catch (InstantiationException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_INPUT
+ e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_INPUT
+ e.getMessage(), e);
} catch (IllegalArgumentException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_INPUT
+ e.getMessage(), e);
} catch (InvocationTargetException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_INPUT
+ e.getMessage(), e);
}
}
/**
* Returns a ZipOutputStream opened with a given charset.
*/
static ZipOutputStream createZipOutputStream(
BufferedOutputStream outStream, Charset charset) {
if (charset == null)
return new ZipOutputStream(outStream);
try {
Constructor<ZipOutputStream> constructor = ZipOutputStream.class
.getConstructor(new Class[] { OutputStream.class,
Charset.class });
return (ZipOutputStream) constructor.newInstance(new Object[] {
outStream, charset });
} catch (NoSuchMethodException e) {
throw new IllegalStateException(MISSING_METHOD_PLEASE_UPGRADE, e);
} catch (InstantiationException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_OUTPUT
+ e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_OUTPUT
+ e.getMessage(), e);
} catch (IllegalArgumentException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_OUTPUT
+ e.getMessage(), e);
} catch (InvocationTargetException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_OUTPUT
+ e.getMessage(), e);
}
}
/**
* Returns a zipFile opened with a given charset
*/
static ZipFile getZipFile(File src, Charset charset) throws IOException {
if (charset == null) {
return new ZipFile(src);
}
try {
Constructor<ZipFile> constructor = ZipFile.class
.getConstructor(new Class[] { File.class, Charset.class });
return (ZipFile) constructor.newInstance(new Object[] { src,
charset });
} catch (NoSuchMethodException e) {
throw new IllegalStateException(MISSING_METHOD_PLEASE_UPGRADE, e);
} catch (InstantiationException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_ZIPFILE
+ e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_ZIPFILE
+ e.getMessage(), e);
} catch (IllegalArgumentException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_ZIPFILE
+ e.getMessage(), e);
} catch (InvocationTargetException e) {
throw new IllegalStateException(CONSTRUCTOR_MESSAGE_FOR_ZIPFILE
+ e.getMessage(), e);
}
}
/**
* Returns <code>true</code> if charsets are supported in this JRE.
*/
static boolean isCharsetSupported() throws IOException {
try {
ZipFile.class.getConstructor(new Class[] { File.class,
Charset.class });
return true;
} catch (NoSuchMethodException e) {
return false;
}
}
}