1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 package com.generationjava.io.find;
38
39 import java.io.File;
40 import java.util.List;
41 import java.util.ArrayList;
42 import java.util.LinkedList;
43 import java.util.Iterator;
44 import java.util.Enumeration;
45 import java.util.Map;
46 import java.util.zip.ZipFile;
47 import java.util.zip.ZipEntry;
48 import java.util.zip.ZipException;
49 import java.io.IOException;
50
51 /***
52 * A Finder which finds files inside a Zip file.
53 * Will also work for jar files.
54 */
55 public class ZipFinder implements Finder {
56
57 private List findListeners;
58
59 public File[] find(File zip) {
60 return find(zip, new java.util.HashMap());
61 }
62
63 public File[] find(File zipfile, Map options) {
64 String extension = null;
65 if(options.containsKey(Finder.NAME)) {
66 extension = options.get(Finder.NAME).toString();
67 }
68 List retlist = new ArrayList();
69
70 try {
71 ZipFile zip = new ZipFile(zipfile);
72 Enumeration enum = zip.entries();
73 while(enum.hasMoreElements()) {
74 ZipEntry entry = (ZipEntry)enum.nextElement();
75 if(extension != null) {
76 if(entry.getName().endsWith(extension)) {
77 addFile(retlist, entry.getName());
78 }
79 } else {
80 addFile(retlist, entry.getName());
81 }
82 }
83 } catch(ZipException ze) {
84 throw new FinderException(ze);
85 } catch(IOException ioe) {
86 throw new FinderException(ioe);
87 }
88
89 return (File[]) retlist.toArray(new File[0]);
90 }
91
92 private void addFile(List list, String file) {
93 if(file.endsWith("/")) {
94
95 file = file.substring(0, file.length() - 1);
96 int idx = file.lastIndexOf("/");
97 if(idx != -1) {
98 file = file.substring(idx+1);
99 }
100 return;
101 }
102
103 int idx = file.lastIndexOf("/");
104 String directory = "";
105 if(idx != -1) {
106 directory = file.substring(0,idx);
107 file = file.substring(idx+1);
108 }
109 notifyFileFound(new File(directory), new File(directory, file));
110 list.add(file);
111 }
112
113 public void addFindListener(FindListener fl) {
114 if(findListeners == null) {
115 findListeners = new LinkedList();
116 }
117 findListeners.add(fl);
118 }
119
120 public void removeFindListener(FindListener fl) {
121 if(findListeners != null) {
122 findListeners.remove(fl);
123 }
124 }
125
126 public void notifyDirectoryStarted(File directory) {
127 if(findListeners != null) {
128 FindEvent fe = new FindEvent(this,"directoryStarted",directory);
129 Iterator itr = findListeners.iterator();
130 while(itr.hasNext()) {
131 FindListener findListener = (FindListener)itr.next();
132 findListener.directoryStarted( fe );
133 }
134 }
135 }
136
137 public void notifyDirectoryFinished(File directory, File[] files) {
138 if(findListeners != null) {
139 FindEvent fe = new FindEvent(this,"directoryFinished",directory,files);
140 Iterator itr = findListeners.iterator();
141 while(itr.hasNext()) {
142 FindListener findListener = (FindListener)itr.next();
143 findListener.directoryFinished( fe );
144 }
145 }
146 }
147
148 public void notifyFileFound(File directory, File file) {
149 if(findListeners != null) {
150 FindEvent fe = new FindEvent(this,"fileFound",directory,file);
151 Iterator itr = findListeners.iterator();
152 while(itr.hasNext()) {
153 FindListener findListener = (FindListener)itr.next();
154 findListener.fileFound( fe );
155 }
156 }
157 }
158
159 }