/* * Copyright (C) 2004 The Concord Consortium, Inc., * 10 Concord Crossing, Concord, MA 01742 * * Web Site: http://www.concord.org * Email: info@concord.org * * This library is free software; 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 * version 2.1 of the License, or (at your option) any later version. * * This library 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 library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * END LICENSE */ package org.concord.swing; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Vector; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.swing.JOptionPane; public class Zipper { public static final int ZIP_MODE_SINGLE_FILE = 1; public static final int ZIP_MODE_MULTIPLE_FILES = 2; public static final int ZIP_MODE_FOLDER = 3; Vector inputs; File output; public Zipper() {} public static File zip(Vector files) { String msg = "Please specify the zipped file"; JOptionPane.showMessageDialog(null, msg, "", JOptionPane.INFORMATION_MESSAGE); File output = null; MostRecentFileDialog mrfd = new MostRecentFileDialog(); mrfd.setFilenameFilter("zip"); int retval = mrfd.showSaveDialog(null, "Save as"); if(retval == MostRecentFileDialog.APPROVE_OPTION) { output = mrfd.getSelectedFile(); zip(files, output); } return output; } public static void zip(Vector files, File output) { if(files == null || files.size() == 0) return; int size = files.size(); String[] fns = new String[size]; for(int i = 0; i < size; i++) { Object ele = files.elementAt(i); if(ele instanceof String) { fns[i] = ele.toString(); } else if(ele instanceof File) { try { fns[i] = ((File)ele).getCanonicalPath(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.err.println("Zip entry must be " + "either File or File name (String)"); } } zip(fns, output); } public static void zip(String[] files, String output) { zip(files, new File(output)); } public static void zip(String input, String output) { zip(new File(input), new File(output)); } public static void zip(String input, File output) { zip(new File(input), output); } public static void zip(File input, String output) { Vector v = new Vector(1); v.addElement(input); zip(v, new File(output)); } public static void zip(File input, File output) { Vector v = new Vector(1); v.addElement(input); zip(v, output); } public static void zip(File[] files, File output) { if(files == null || files.length == 0) return; FileOutputStream fos; try { fos = new FileOutputStream(output); ZipOutputStream zout = new ZipOutputStream(fos); byte b[] = new byte[512]; for(int i = 0; i < files.length; i++) { if(files[i] != null && files[i].exists()) { String fName = files[i].getCanonicalPath().replace(File.separatorChar, '/'); FileInputStream fis = new FileInputStream(files[i]); ZipEntry ze = new ZipEntry(fName); zout.putNextEntry(ze); int len=0; while((len=fis.read(b)) != -1) { zout.write(b,0,len); } zout.closeEntry(); print(ze); fis.close(); } } zout.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void zip(File[] files, String output) { zip(files, new File(output)); } public static void zip(String[] files, File output) { if(files == null || files.length == 0) return; int length = files.length; File[] fs = new File[length]; for(int i = 0; i < length; i++) { fs[i] = new File(files[i]); } zip(fs, output); } public static void zip(Vector files, String output) { zip(files, new File(output)); } public static void print(ZipEntry e){ System.err.print("added " + e.getName()); if (e.getMethod() == ZipEntry.DEFLATED) { long size = e.getSize(); if (size > 0) { long csize = e.getCompressedSize(); long ratio = ((size-csize)*100) / size; System.err.println(" (deflated " + ratio + "%)"); } else { System.err.println(" (deflated 0%)"); } } else { System.err.println(" (stored 0%)"); } } public static void main(String[] args) { File f1 = new File("src/org/concord/swing/Zipper.java"); File f2 = new File("lib/org/concord/swing/Zipper.class"); File fo = new File("out.zip"); File[] files = {f1, f2}; Vector vector = new Vector(); vector.addElement(f1); vector.addElement(f2); String[] strs = {f1.getAbsolutePath(), f2.getAbsolutePath()}; Zipper.zip(strs, "out.zip"); } }