13d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambypackage com.mot.dm.tool;
23d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
33d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport java.io.*;
43d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport java.util.zip.*;
53d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport java.util.Enumeration;
63d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
73d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambypublic class Zip {
83d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  private final int BUFFER = 1024;
93d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  private String topPath;
103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  public void zip(String inputDir, String outputFile) throws Exception {
123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    File input = new File(inputDir);
133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!input.exists()) {
153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      throw new Exception("Input directory doesn't exist: " + inputDir);
163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    else if (!input.isDirectory()) {
183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      throw new Exception("Input file doesn't directory: " + inputDir);
193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    File output = new File(outputFile);
223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!output.getName().toUpperCase().endsWith(".ZIP")) {
233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      throw new Exception("Output file is not zip: " + outputFile);
243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!output.exists()) {
263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      File parentDir = output.getParentFile();
273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      if (parentDir != null && !parentDir.exists()) {
283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        parentDir.mkdirs();
293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      }
303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    FileOutputStream dest = new FileOutputStream(output);
323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    topPath = input.getParentFile().getAbsolutePath() + File.separator;
353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    addFileToZip(input, out);
363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    parseDirectory(input, out);
373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    /*
393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        File files[] = input.listFiles();
403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        for (int i = 0; i < files.length; i++) {
413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          if (files[i].isDirectory()) {
423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            addFileToZip(files[i], out);
433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            parseDirectory(files[i], out);
443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          }
453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          else {
463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            addFileToZip(files[i], out);
473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          }
483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          }
503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     */
513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    out.close();
523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  }
533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  public void unzip(String zipFilePath, String outputDir) throws Exception {
553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    BufferedOutputStream dest = null;
563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    BufferedInputStream is = null;
573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    ZipEntry entry;
583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    ZipFile zipfile = new ZipFile(zipFilePath);
603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    Enumeration e = zipfile.entries();
613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    while (e.hasMoreElements()) {
633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      try {
643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        entry = (ZipEntry) e.nextElement();
653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        Util.verbose("Extracting: " + entry);
673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        is = new BufferedInputStream(zipfile.getInputStream(entry));
693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        int count;
703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        byte data[] = new byte[BUFFER];
713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        outputDir +=
723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            (outputDir.length() > 0 && !outputDir.endsWith(File.separator)) ?
733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            "/" : "";
743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        File newFile = new File(outputDir + entry);
763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (entry.isDirectory()) {
773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          if (!newFile.exists()) {
783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            newFile.mkdirs();
793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          }
803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        else {
823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          File parent = newFile.getParentFile();
833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          if (parent != null && !parent.exists()) {
843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            parent.mkdirs();
853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          }
863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        FileOutputStream fos = new FileOutputStream(newFile.getAbsolutePath());
893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        dest = new BufferedOutputStream(fos, BUFFER);
903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        while ( (count = is.read(data, 0, BUFFER)) != -1) {
913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby          dest.write(data, 0, count);
923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        dest.flush();
943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        dest.close();
953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        is.close();
963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      }
973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      catch (Exception ee) {
983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby//ee.printStackTrace();
993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      }
1003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  }
1023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  private void parseDirectory(File dir, ZipOutputStream out) throws Exception {
1043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    File files[] = dir.listFiles();
1053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    for (int i = 0; i < files.length; i++) {
1063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      if (files[i].isDirectory()) {
1073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        addFileToZip(files[i], out);
1083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        parseDirectory(files[i], out);
1093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      }
1103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      else {
1113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        addFileToZip(files[i], out);
1123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      }
1133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  }
1153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  private void addFileToZip(File file, ZipOutputStream out) throws Exception {
1173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    BufferedInputStream origin = null;
1193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    byte data[] = new byte[BUFFER];
1203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    Util.verbose("Adding: " + file);
1223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    String zipEntryName = file.getAbsolutePath();
1243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    zipEntryName = Util.replaceStr(zipEntryName, topPath, "");
1253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    zipEntryName = Util.replaceStr(zipEntryName, "\\", "/");
1263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (file.isDirectory() && !zipEntryName.endsWith("/")) {
1273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      zipEntryName += "/";
1283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    ZipEntry entry = new ZipEntry(zipEntryName);
1303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    out.putNextEntry(entry);
1313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (file.isFile()) {
1323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      FileInputStream fi = new FileInputStream(file);
1333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      origin = new BufferedInputStream(fi, BUFFER);
1343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      int count;
1353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      while ( (count = origin.read(data, 0, BUFFER)) != -1) {
1363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        out.write(data, 0, count);
1373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      }
1383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby      origin.close();
1393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  }
1413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  public static void main(String[] args) {
1433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    try {
1443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     if (args.length != 3) {
1453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby       System.out.println("Wrong arguments");
1463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby       DMTSTool.usage(true);
1473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby       System.exit( -1);
1483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     }
1493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     Util.VERBOSE = true;
1513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     Zip zip  = new Zip();
1523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     if(args[0].equals("-zip")){
1533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby       zip.zip(args[1], args[2]);
1543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     }
1553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     else if(args[0].equals("-unzip")){
1563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        zip.unzip(args[1], args[2]);
1573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     }
1583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     else{
1593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby       System.out.println("Wrong arguments");
1603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby       DMTSTool.usage(true);
1613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby       System.exit(-1);
1623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     }
1633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby   }
1643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby   catch (Exception e) {
1653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     e.printStackTrace();
1663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby   }
1673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    //z.zip("I:\\tmp\\Dmt", "R_NewZIP.zip");
1693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    // z.unzip("NewZIP.zip", "");
1703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    // z.unzip("D:/Profiles/E32569/jbproject/Dmt.zip", "");
1713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    // z.unzip("I:/tmp/Dmt.zip", "");
1723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    // z.unzip("D:/Profiles/E32569/jbproject/Dmt.zip", "D:\\Profiles\\E32569\\jbproject\\XML2WBXMLPrj\\tmp_1129935212004\\2");
1733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  }
1743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
175