/* -------------------------------------------------------------------------*
* PKUAS: Peking University Application Server
* Copyright (C) 2006 Peking University
*
* This software is free; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* either version 2.1 or any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
* ------------------------------------------------------------------------*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* This is the Helper Class to manipulate Java Archive File
* @author Lin Liang
*/
public class JarMaker {
public JarMaker() {
}
public static boolean pack(String jarPath, String jarFileName) {
try {
String t_jarPathName = jarPath.replace('\\', File.separatorChar);
String t_jarFileName = jarFileName.replace('\\', File.separatorChar);
RealPackUtilityJar(t_jarPathName, t_jarFileName);
return true;
} catch (Exception ex) {
return false;
}
}
public static boolean utilityPack(String p_utilityFileName, String jarName) {
try {
// begin to pack the utility jar file.
String t_utilityfilename = p_utilityFileName.replace('\\', File.separatorChar);
String t_jarfilename = jarName.replace('\\', File.separatorChar) + ".jar";
// File utilityFile = new File(p_utilityFileName);
RealPackUtilityJar(t_utilityfilename, t_jarfilename);
// delete the utility directory!
} catch (Exception ex) {
return false;
}
return true;
}
public static void RealPackUtilityJar(String s_src, String s_dest) throws IOException {
URL _src, _dest;
File f_src = new File(s_src);
if (!f_src.isDirectory())
throw new IOException(s_src + " is not a directory");
_src = f_src.toURL();
_dest = new File(s_dest).toURL();
int path_l = s_dest.lastIndexOf("/");
if (path_l > 0) {
File dir = new File(s_dest.substring(0, path_l));
if (!dir.exists())
dir.mkdirs();
}
JarOutputStream jout = new JarOutputStream(new FileOutputStream(_dest.getFile()));
// put all into the jar...
add(jout, new File(_src.getFile()), "");
jout.close();
}
/**
* used by downloadAndPack
* @param _jout
* @param _dir
* @param _prefix
* @throws IOException
*/
public static void add(JarOutputStream _jout, File _dir, String _prefix) throws IOException {
File[] content = _dir.listFiles();
if (_dir.isDirectory()) {
for (int i = 0, l = content.length; i < l; ++i) {
if (content[i].isDirectory()) {
_jout.putNextEntry(new ZipEntry(_prefix + (_prefix.equals("") ? "" : "/") + content[i].getName() + "/"));
add(_jout, content[i], _prefix + (_prefix.equals("") ? "" : "/") + content[i].getName());
} else {
_jout.putNextEntry(new ZipEntry(_prefix + (_prefix.equals("") ? "" : "/") + content[i].getName()));
FileInputStream in = new FileInputStream(content[i]);
write(in, _jout);
in.close();
}
}
} else {
_jout.putNextEntry(new ZipEntry(_prefix + (_prefix.equals("") ? "" : "/") + _dir.getName()));
FileInputStream in = new FileInputStream(_dir);
write(in, _jout);
in.close();
}
}
/**
* writes the content of the InputStream into the OutputStream
* @param _in
* @param _out
* @throws IOException
*/
private static synchronized void write(InputStream _in, OutputStream _out) throws IOException {
byte[] buffer = new byte[1024 * 512];
int read;
while (true) {
read = _in.read(buffer);
if (read == -1)
break;
_out.write(buffer, 0, read);
}
_out.flush();
}
/**
* Deletes all files and subdirectories under dir.
* @param dir
* @return true if all deletions were successful.If a deletion fails, the
* method stops attempting to delete and returns false.
*/
public static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// The directory is now empty so delete it
return dir.delete();
}
/**
* @param f_name : source zip file
* @param dir_name : target dir file
*/
public static void unpackJar(File f_name, File dir_name) throws IOException {
unpackJar(f_name.getCanonicalPath(), dir_name.getCanonicalPath());
}
/**
* @param f_name : source zip file path name
* @param dir_name : target dir file path
*/
public static void unpackJar(String f_name, String dir_name) throws IOException {
BufferedInputStream bism = new BufferedInputStream(new FileInputStream(f_name));
ZipInputStream zism = new ZipInputStream(bism);
for (ZipEntry z = zism.getNextEntry(); z != null; z = zism.getNextEntry()) {
File f = new File(dir_name, z.getName());
if (z.isDirectory()) {
f.mkdirs();
} else {
f.getParentFile().mkdirs();
BufferedOutputStream bosm = new BufferedOutputStream(new FileOutputStream(f));
int i;
byte[] buffer = new byte[1024 * 512];
try {
while ((i = zism.read(buffer, 0, buffer.length)) != -1)
bosm.write(buffer, 0, i);
} catch (IOException ie) {
throw ie;
}
bosm.close();
}
}
zism.close();
bism.close();
}
/**
* Unpack the jar file to a directory, till teaf files
* @param file
* @param file1
* @throws IOException
*/
public static void unpackAppJar(File file, File file1) throws IOException {
unpackAppJar(file.getCanonicalPath(), file1.getCanonicalPath());
}
/**
* Unpack the jar file to a directory, till teaf files
* @param file The source file name
* @param file1 The target directory
* @author wangxp
* @version 2003/11/07
*/
public static void unpackAppJar(String file, String file1) throws IOException {
// m_log.debug("unpackAppJar begin. file="+file+"|||file1="+file1);
BufferedInputStream bufferedinputstream = new BufferedInputStream(new FileInputStream(file));
ZipInputStream zipinputstream = new ZipInputStream(bufferedinputstream);
byte abyte0[] = new byte[1024];
for (ZipEntry zipentry = zipinputstream.getNextEntry(); zipentry != null; zipentry = zipinputstream.getNextEntry()) {
File file2 = new File(file1, zipentry.getName());
if (zipentry.isDirectory()) {
if (!file2.exists() && !file2.mkdirs())
throw new IOException("Could not make directory " + file2.getPath());
} else {
File file3 = file2.getParentFile();
if (file3 != null && !file3.exists() && !file3.mkdirs())
throw new IOException("Could not make directory " + file3.getPath());
BufferedOutputStream bufferedoutputstream = new BufferedOutputStream(new FileOutputStream(file2));
int i;
try {
while ((i = zipinputstream.read(abyte0, 0, abyte0.length)) != -1)
bufferedoutputstream.write(abyte0, 0, i);
} catch (IOException ie) {
ie.printStackTrace();
// m_logger.error(ie);
throw ie;
}
bufferedoutputstream.close();
}
}
zipinputstream.close();
bufferedinputstream.close();
// m_log.debug("unpackAppJar end.");
}
/**
* Combine several jar files and some given files into one jar file.
* @param outJar The output jar file's filename.
* @param inJarsList The jar files to be combined
* @param filter A filter that exclude some entries of input jars. User
* should implement the EntryFilter interface.
* @param inFileList The files to be added into the jar file.
* @param prefixs The prefixs of files to be added into the jar file.
* inFileList and prefixs should be paired.
* @throws FileNotFoundException
* @throws IOException
*/
@SuppressWarnings("unchecked")
public static void combineJars(String outJar, String[] inJarsList, EntryFilter filter, String[] inFileList, String[] prefixs)
throws FileNotFoundException, IOException {
JarOutputStream jout = new JarOutputStream(new FileOutputStream(outJar));
ArrayList entryList = new ArrayList();
for (int i = 0; i < inJarsList.length; i++) {
BufferedInputStream bufferedinputstream = new BufferedInputStream(new FileInputStream(inJarsList[i]));
ZipInputStream zipinputstream = new ZipInputStream(bufferedinputstream);
byte abyte0[] = new byte[1024 * 4];
for (ZipEntry zipentry = zipinputstream.getNextEntry(); zipentry != null; zipentry = zipinputstream.getNextEntry()) {
if (filter.accept(zipentry)) {
if (!entryList.contains(zipentry.getName())) {
jout.putNextEntry(zipentry);
if (!zipentry.isDirectory()) {
int j;
try {
while ((j = zipinputstream.read(abyte0, 0, abyte0.length)) != -1)
jout.write(abyte0, 0, j);
} catch (IOException ie) {
throw ie;
}
}
entryList.add(zipentry.getName());
}
}
}
zipinputstream.close();
bufferedinputstream.close();
}
for (int i = 0; i < inFileList.length; i++) {
add(jout, new File(inFileList[i]), prefixs[i]);
}
jout.close();
}
/**
* Test
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception {
String[] in = new String[2];
in[1] = "E:\\pkuas03\\pkuas_51\\repository\\deployed\\ecperf.ear\\corp.jar";
in[0] = "E:\\pkuas03\\pkuas_51\\repository\\deployed\\ecperf.ear\\orders.jar";
String[] fs = new String[1];
fs[0] = "E:\\pkuas03\\pkuas_51\\repository\\deployed\\ecperf.ear\\META-INF\\application.xml";
String[] pres = new String[1];
pres[0] = "META-INF";
combineJars("e:\\111.jar", in, new EntryFilter() {
public boolean accept(ZipEntry entry) {
if (entry.getName().endsWith("ejb-jar.xml"))
return false;
return true;
}
}, fs, pres);
}
interface EntryFilter {
public boolean accept(ZipEntry entry);
}
}