KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > util > ZipCompare


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tc.util;
5
6 import org.apache.commons.io.IOUtils;
7
8 import java.io.File JavaDoc;
9 import java.io.IOException JavaDoc;
10 import java.util.Arrays JavaDoc;
11 import java.util.Collections JavaDoc;
12 import java.util.Enumeration JavaDoc;
13 import java.util.Iterator JavaDoc;
14 import java.util.Set JavaDoc;
15 import java.util.TreeSet JavaDoc;
16 import java.util.zip.ZipEntry JavaDoc;
17 import java.util.zip.ZipFile JavaDoc;
18
19 public class ZipCompare {
20   private static final String JavaDoc TAB = " ";
21
22   public static void main(String JavaDoc args[]) throws IOException JavaDoc {
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 JavaDoc zipfile1 = new File JavaDoc(args[0]);
31     File JavaDoc zipfile2 = new File JavaDoc(args[1]);
32
33     check(zipfile1);
34     check(zipfile2);
35
36     ZipFile JavaDoc zip1 = new ZipFile JavaDoc(zipfile1);
37     ZipFile JavaDoc zip2 = new ZipFile JavaDoc(zipfile2);
38
39     Set JavaDoc files1 = getFiles(zip1);
40     Set JavaDoc files2 = getFiles(zip2);
41
42     Set JavaDoc zip1Only = difference(files1, files2);
43     Set JavaDoc 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 JavaDoc diffs = new TreeSet JavaDoc();
57     for (Iterator JavaDoc iter = intersect(files1, files2).iterator(); iter.hasNext();) {
58       String JavaDoc file = (String JavaDoc) 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 JavaDoc diffs) {
76     if (diffs.size() > 0) {
77       System.out.println("Files that differ:");
78       for (Iterator JavaDoc 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 JavaDoc zip1, ZipFile JavaDoc zip2, String JavaDoc file) throws IOException JavaDoc {
86     ZipEntry JavaDoc entry1 = zip1.getEntry(file);
87     ZipEntry JavaDoc entry2 = zip2.getEntry(file);
88
89     if (entry1 == null) { throw new AssertionError JavaDoc("Null entry for file " + file + " in zip " + zip1.getName()); }
90     if (entry2 == null) { throw new AssertionError JavaDoc("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 JavaDoc zipfile, Set JavaDoc files) {
102     if (files.size() > 0) {
103       System.out.println("Only in " + zipfile + ":");
104       for (Iterator JavaDoc 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 JavaDoc intersect(Set JavaDoc set1, Set JavaDoc set2) {
112     Set JavaDoc intersection = new TreeSet JavaDoc(set1);
113     intersection.retainAll(set2);
114     return Collections.unmodifiableSet(intersection);
115   }
116
117   private static Set JavaDoc difference(Set JavaDoc set1, Set JavaDoc set2) {
118     Set JavaDoc copy = new TreeSet JavaDoc(set1);
119     copy.removeAll(set2);
120     return Collections.unmodifiableSet(copy);
121   }
122
123   private static Set JavaDoc getFiles(ZipFile JavaDoc zip) {
124     Set JavaDoc files = new TreeSet JavaDoc();
125
126     Enumeration JavaDoc e = zip.entries();
127     while (e.hasMoreElements()) {
128       ZipEntry JavaDoc entry = (ZipEntry JavaDoc) e.nextElement();
129       files.add(entry.getName());
130     }
131
132     return Collections.unmodifiableSet(files);
133   }
134
135   private static void check(File JavaDoc 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 JavaDoc msg) {
154     System.err.println(msg);
155     System.exit(1);
156   }
157
158 }
159
Popular Tags