package demo14; import java.io.*; import java.util.zip.*; import java.util.ArrayList; import org.openswing.swing.miscellaneous.client.ProgressDialog; import org.openswing.swing.miscellaneous.client.ProgressEvent; import org.openswing.swing.wizard.client.WizardPanel; import javax.swing.JOptionPane; import org.openswing.swing.client.OptionPane; import org.openswing.swing.tree.client.*; import org.openswing.swing.util.client.ClientSettings; import javax.swing.tree.TreePath; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Class used to perform zip/unzip task.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * @version 1.0 */ public class ExecutionEngine { private boolean interrupted = false; private WizardFrame frame = null; /** * Check if all input controls are defined. */ public ExecutionEngine(WizardPanel wizardPanel,WizardFrame frame) { this.frame = frame; if (wizardPanel.getCurrentVisiblePanel().getPanelId().equals("SECOND")) { SecondPanel p = (SecondPanel)wizardPanel.getCurrentVisiblePanel(); // file to decompress... File zipFile = new File(p.controlFileName.getText()); if (!zipFile.isFile() || !zipFile.exists() || !zipFile.getName().endsWith(".zip")) { OptionPane.showMessageDialog(frame,"You must specify a zip file","Attention",JOptionPane.WARNING_MESSAGE); return; } File destDir = new File(p.controlDestPath.getText()); if (!destDir.isDirectory() || !destDir.exists()) { OptionPane.showMessageDialog(frame,"You must specify an existing folder","Attention",JOptionPane.WARNING_MESSAGE); return; } try { ZipInputStream zip = new ZipInputStream(new FileInputStream(zipFile)); ZipEntry entry = null; String name = null; byte[] bb = new byte[10000]; int len = 0; FileOutputStream out = null; while((entry=zip.getNextEntry())!=null) { name = entry.getName(); if (entry.isDirectory()) new File(destDir.getAbsolutePath()+"/"+name).mkdirs(); else { out = new FileOutputStream(destDir.getAbsolutePath()+"/"+name); while((len = zip.read(bb))>0) out.write(bb,0,len); out.close(); } zip.closeEntry(); } zip.close(); System.exit(0); } catch (Exception ex) { OptionPane.showMessageDialog(frame,ex.getMessage(),"Attention",JOptionPane.ERROR_MESSAGE); } } else { ThirdPanel p = (ThirdPanel)wizardPanel.getCurrentVisiblePanel(); // folder to compress... File folder = new File(p.controlFolder.getText()); if (!folder.isDirectory() || !folder.exists()) { OptionPane.showMessageDialog(frame,"You must specify an existing folder","Attention",JOptionPane.WARNING_MESSAGE); return; } File destFile = new File(p.controlZip.getText()); if (destFile.isDirectory() || !destFile.getName().endsWith(".zip")) { OptionPane.showMessageDialog(frame,"You must specify a zip file","Attention",JOptionPane.WARNING_MESSAGE); return; } // find out files and sub-folders... final ArrayList files = new ArrayList(); addFiles(files,folder); final ProgressDialog d = new ProgressDialog( frame, "Zip/Unzip Files Wizard", "Fetching files...", "Searching for files in file system to add to zip file", new String[] {"File name","File size"}, 0, 100, false, true ); d.setImageName("file.gif"); d.addCancelButtonListener(new ActionListener() { public void actionPerformed(ActionEvent e) { interrupted = true; } }); try { final ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(destFile)); d.setMaximumValue(files.size()); /* // uncomment this to add colored bands... for(int i=0;i<files.size();i++) d.addColoredBand(i,i+1,new Color(155+(int)(100d*(double)i/(double)files.size()),155+(int)(100d*(double)i/(double)files.size()),155+(int)(100d*(double)i/(double)files.size()))); */ /* // uncomment this to enable color changing according to colored bands, using only one color... d.setShowAllBands(false); */ d.setVisible(true); interrupted = false; new Thread() { public void run() { compressFiles(files,zip,d); } }.start(); } catch (Exception ex2) { try { d.setVisible(false); d.dispose(); } catch (Exception ex1) { } } } } private void compressFiles(ArrayList files,ZipOutputStream zip,ProgressDialog d) { try { ZipEntry entry = null; File name = null; byte[] bb = new byte[10000]; int len = 0; FileInputStream in = null; for(int i=0;i<files.size();i++) { if (interrupted) { // d.setVisible(false); // d.dispose(); return; } name = (File)files.get(i); entry = new ZipEntry(name.getPath()); zip.putNextEntry(entry); if (name.isFile()) { in = new FileInputStream(name); while((len = in.read(bb))>0) zip.write(bb,0,len); in.close(); } zip.closeEntry(); d.processProgressEvent(new ProgressEvent( i+1, "Adding files to zip destination file...", "Add all searched files to\n the specified destination zip file", new String[] {name.getAbsolutePath(),String.valueOf(name.length())+" bytes"} )); try { Thread.sleep(500); } catch (InterruptedException ex1) { } } zip.close(); System.exit(0); } catch (Exception ex) { OptionPane.showMessageDialog(frame,ex.getMessage(),"Attention",JOptionPane.ERROR_MESSAGE); } } /** * Add recursiverly a list of files for the specified directory. */ private void addFiles(ArrayList files,File dir) { File[] newfiles = dir.listFiles(); for(int i=0;i<newfiles.length;i++) if (newfiles[i].isDirectory()) addFiles(files,newfiles[i]); else files.add(newfiles[i]); } }