Mega Code Archive

 
Categories / Java / File Input Output
 

Helper Class to manipulate Java Archive File

/* -------------------------------------------------------------------------*  * 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);     } }