package com.idega.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.Writer;
import java.util.Iterator;
import java.util.Set;
import java.util.jar.JarInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.servlet.http.HttpServletRequest;
import com.idega.idegaweb.IWMainApplication;
import com.idega.idegaweb.IWModuleLoader;
import com.idega.io.ZipInstaller;
public class IOUtil {
public static final void close(Closeable closeable) {
if (closeable == null) {
return;
}
try {
closeable.close();
} catch (IOException e) {}
}
public static final void closeInputStream(InputStream stream) {
close(stream);
}
public static final void closeOutputStream(OutputStream stream) {
close(stream);
}
public static final void closeReader(Reader reader) {
close(reader);
}
public static final void closeWriter(Writer writer) {
close(writer);
}
public static final InputStream getStreamFromCurrentZipEntry(ZipInputStream zipStream) throws IOException {
if (zipStream == null) {
throw new IOException("Unable to read from provided zip stream");
}
ZipInstaller zipInstaller = new ZipInstaller();
ByteArrayOutputStream memory = new ByteArrayOutputStream();
zipInstaller.writeFromStreamToStream(zipStream, memory);
return new ByteArrayInputStream(memory.toByteArray());
}
@SuppressWarnings("unchecked")
public static final InputStream getStreamFromJar(String bundleIdentifier, String filePathWithinJar) {
Set<String> paths = IWMainApplication.getDefaultIWMainApplication().getResourcePaths(IWModuleLoader.DEFAULT_LIB_PATH);
if (ListUtil.isEmpty(paths)) {
return null;
}
String expectedBundleJar = new StringBuilder(bundleIdentifier).append("-").toString();
String bundleJar = null;
for (Iterator<String> pathsIter = paths.iterator(); (pathsIter.hasNext() && bundleJar == null);) {
bundleJar = pathsIter.next();
if (bundleJar.indexOf(expectedBundleJar) == -1) {
bundleJar = null; // Not bundle's JAR file
}
}
if (StringUtil.isEmpty(bundleJar)) {
return null;
}
if (bundleJar.startsWith(File.separator)) {
bundleJar = bundleJar.replaceFirst(File.separator, CoreConstants.EMPTY);
}
String jarPath = IWMainApplication.getDefaultIWMainApplication().getApplicationRealPath() + bundleJar;
JarInputStream jarStream = null;
try {
jarStream = new JarInputStream(new FileInputStream(new File(jarPath)));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (jarStream == null) {
return null;
}
try {
for (ZipEntry entry = null; (entry = jarStream.getNextEntry()) != null;) {
if (entry.getName().equals(filePathWithinJar) && !entry.isDirectory()) {
return getStreamFromCurrentZipEntry(jarStream);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static final boolean isStreamValid(InputStream stream) {
try {
return stream != null && stream.available() >= 0;
} catch (Exception e) {}
return false;
}
public static byte[] getBytesFromInputStream(InputStream stream) {
if (!isStreamValid(stream)) {
return null;
}
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
FileUtil.streamToOutputStream(stream, output);
return output.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
close(stream);
close(output);
}
return null;
}
public static byte[] getBytesFromObject(Serializable object) {
if (object == null)
return null;
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
close(oos);
close(baos);
}
return null;
}
public static <T extends Serializable> T getObjectFromInputStream(InputStream stream) {
if (stream == null)
return null;
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(stream);
@SuppressWarnings("unchecked")
T object = (T) ois.readObject();
return object;
} catch (Exception e) {
e.printStackTrace();
} finally {
close(ois);
close(stream);
}
return null;
}
public static final long getRequestSize(HttpServletRequest request) {
if (request == null)
return 0;
Long requestSize = null;
try {
requestSize = Long.valueOf(request.getHeader("Content-Length"));
} catch (Exception e) {
e.printStackTrace();
}
return requestSize == null ? 0 : requestSize;
}
public static final boolean isUploadExceedingLimits(HttpServletRequest request, long maxUploadSize) {
Long requestSize = getRequestSize(request);
return requestSize == null ? false : requestSize > maxUploadSize;
}
}