1 4 package com.tc.util; 5 6 import org.apache.commons.io.IOUtils; 7 8 import java.io.File ; 9 import java.io.IOException ; 10 import java.util.Arrays ; 11 import java.util.Collections ; 12 import java.util.Enumeration ; 13 import java.util.Iterator ; 14 import java.util.Set ; 15 import java.util.TreeSet ; 16 import java.util.zip.ZipEntry ; 17 import java.util.zip.ZipFile ; 18 19 public class ZipCompare { 20 private static final String TAB = " "; 21 22 public static void main(String args[]) throws IOException { 23 boolean hasDiffs = false; 24 25 if (args.length != 2) { 26 System.err.println("usage: " + ZipCompare.class.getName() + " <zip file 1> <zip file 2>"); 27 return; 28 } 29 30 File zipfile1 = new File (args[0]); 31 File zipfile2 = new File (args[1]); 32 33 check(zipfile1); 34 check(zipfile2); 35 36 ZipFile zip1 = new ZipFile (zipfile1); 37 ZipFile zip2 = new ZipFile (zipfile2); 38 39 Set files1 = getFiles(zip1); 40 Set files2 = getFiles(zip2); 41 42 Set zip1Only = difference(files1, files2); 43 Set zip2Only = difference(files2, files1); 44 45 if (zip1Only.size() != zip2Only.size()) { 46 hasDiffs = true; 47 System.out.println("Number of entries differ:"); 48 System.out.println(TAB + zip1Only.size() + " " + zipfile1); 49 System.out.println(TAB + zip2Only.size() + " " + zipfile2); 50 System.out.println(); 51 } 52 53 listOnlyFiles(zipfile1, zip1Only); 54 listOnlyFiles(zipfile2, zip2Only); 55 56 Set diffs = new TreeSet (); 57 for (Iterator iter = intersect(files1, files2).iterator(); iter.hasNext();) { 58 String file = (String ) iter.next(); 59 boolean same = diff(zip1, zip2, file); 60 61 if (!same) { 62 diffs.add(file); 63 } 64 65 hasDiffs |= !same; 66 } 67 68 listDiffs(diffs); 69 70 if (!hasDiffs) { 71 System.out.println("No differences"); 72 } 73 } 74 75 private static void listDiffs(Set diffs) { 76 if (diffs.size() > 0) { 77 System.out.println("Files that differ:"); 78 for (Iterator iter = diffs.iterator(); iter.hasNext();) { 79 System.out.println(TAB + iter.next()); 80 } 81 System.out.println(); 82 } 83 } 84 85 private static boolean diff(ZipFile zip1, ZipFile zip2, String file) throws IOException { 86 ZipEntry entry1 = zip1.getEntry(file); 87 ZipEntry entry2 = zip2.getEntry(file); 88 89 if (entry1 == null) { throw new AssertionError ("Null entry for file " + file + " in zip " + zip1.getName()); } 90 if (entry2 == null) { throw new AssertionError ("Null entry for file " + file + " in zip " + zip2.getName()); } 91 92 if (entry1.getSize() != entry2.getSize()) { return false; } 93 if (entry1.getCrc() != entry2.getCrc()) { return false; } 94 95 byte[] data1 = IOUtils.toByteArray(zip1.getInputStream(entry1)); 96 byte[] data2 = IOUtils.toByteArray(zip2.getInputStream(entry2)); 97 98 return Arrays.equals(data1, data2); 99 } 100 101 private static void listOnlyFiles(File zipfile, Set files) { 102 if (files.size() > 0) { 103 System.out.println("Only in " + zipfile + ":"); 104 for (Iterator iter = files.iterator(); iter.hasNext();) { 105 System.out.println(TAB + iter.next()); 106 } 107 System.out.println("\n"); 108 } 109 } 110 111 private static Set intersect(Set set1, Set set2) { 112 Set intersection = new TreeSet (set1); 113 intersection.retainAll(set2); 114 return Collections.unmodifiableSet(intersection); 115 } 116 117 private static Set difference(Set set1, Set set2) { 118 Set copy = new TreeSet (set1); 119 copy.removeAll(set2); 120 return Collections.unmodifiableSet(copy); 121 } 122 123 private static Set getFiles(ZipFile zip) { 124 Set files = new TreeSet (); 125 126 Enumeration e = zip.entries(); 127 while (e.hasMoreElements()) { 128 ZipEntry entry = (ZipEntry ) e.nextElement(); 129 files.add(entry.getName()); 130 } 131 132 return Collections.unmodifiableSet(files); 133 } 134 135 private static void check(File file) { 136 if (!file.exists()) { 137 exit(file + " does not exist"); 138 } 139 140 if (!file.isFile()) { 141 exit(file + " is not a file"); 142 } 143 144 if (!file.canRead()) { 145 exit(file + " is not readable"); 146 } 147 148 if (!file.getName().toLowerCase().endsWith(".zip")) { 149 System.err.println("WARN --> filename does not have a .zip extension: " + file); 150 } 151 } 152 153 private static void exit(String msg) { 154 System.err.println(msg); 155 System.exit(1); 156 } 157 158 } 159 | Popular Tags |