1 /**
2 *
3 * Copyright 2005 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.geronimo.kernel.config;
18
19 import java.io.File;
20 import java.io.FileInputStream;
21 import java.io.FileOutputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.io.OutputStream;
25 import java.io.Reader;
26 import java.io.Writer;
27 import java.net.MalformedURLException;
28 import java.net.URL;
29 import java.util.Collections;
30 import java.util.Enumeration;
31 import java.util.Iterator;
32 import java.util.LinkedHashMap;
33 import java.util.LinkedHashSet;
34 import java.util.Map;
35 import java.util.Set;
36 import java.util.jar.JarFile;
37 import java.util.zip.ZipEntry;
38
39 /**
40 * @version $Rev: 410741 $ $Date: 2006-05-31 21:35:48 -0700 (Wed, 31 May 2006) $
41 */
42 public class IOUtil {
43 public static void recursiveCopy(File srcDir, File destDir) throws IOException {
44 if (srcDir == null) throw new NullPointerException("sourceDir is null");
45 if (destDir == null) throw new NullPointerException("destDir is null");
46 if (!srcDir.isDirectory() || ! srcDir.canRead()) {
47 throw new IllegalArgumentException("Source directory must be a readable directory " + srcDir);
48 }
49 if (destDir.exists()) {
50 throw new IllegalArgumentException("Destination directory already exists " + destDir);
51 }
52 if (srcDir.equals(destDir)) {
53 throw new IllegalArgumentException("Source and destination directory are the same " + srcDir);
54 }
55
56 destDir.mkdirs();
57 if (!destDir.exists()) {
58 throw new IOException("Could not create destination directory " + destDir);
59 }
60
61
62 File[] srcFiles = srcDir.listFiles();
63 if (srcFiles != null) {
64 for (int i = 0; i < srcFiles.length; i++) {
65 File srcFile = srcFiles[i];
66 File destFile = new File(destDir, srcFile.getName());
67 if (srcFile.isDirectory()) {
68 recursiveCopy(srcFile, destFile);
69 } else {
70 copyFile(srcFile, destFile);
71 }
72 }
73 }
74 }
75
76 public static void copyFile(File source, File destination) throws IOException {
77 File destinationDir = destination.getParentFile();
78 if (!destinationDir.exists() && !destinationDir.mkdirs()) {
79 throw new IOException("Cannot create directory : " + destinationDir);
80 }
81
82 InputStream in = null;
83 OutputStream out = null;
84 try {
85 in = new FileInputStream(source);
86 out = new FileOutputStream(destination);
87 writeAll(in, out);
88 } finally {
89 close(in);
90 close(out);
91 }
92 }
93
94 public static void writeAll(InputStream in, OutputStream out) throws IOException {
95 byte[] buffer = new byte[4096];
96 int count;
97 while ((count = in.read(buffer)) > 0) {
98 out.write(buffer, 0, count);
99 }
100 out.flush();
101 }
102
103 public static boolean recursiveDelete(File root) {
104 if (root == null) {
105 return true;
106 }
107
108 if (root.isDirectory()) {
109 File[] files = root.listFiles();
110 if (files != null) {
111 for (int i = 0; i < files.length; i++) {
112 File file = files[i];
113 if (file.isDirectory()) {
114 recursiveDelete(file);
115 } else {
116 file.delete();
117 }
118 }
119 }
120 }
121 return root.delete();
122 }
123
124 public static void flush(OutputStream thing) {
125 if (thing != null) {
126 try {
127 thing.flush();
128 } catch(Exception ignored) {
129 }
130 }
131 }
132
133 public static void flush(Writer thing) {
134 if (thing != null) {
135 try {
136 thing.flush();
137 } catch(Exception ignored) {
138 }
139 }
140 }
141
142 public static void close(JarFile thing) {
143 if (thing != null) {
144 try {
145 thing.close();
146 } catch(Exception ignored) {
147 }
148 }
149 }
150
151 public static void close(InputStream thing) {
152 if (thing != null) {
153 try {
154 thing.close();
155 } catch(Exception ignored) {
156 }
157 }
158 }
159
160 public static void close(OutputStream thing) {
161 if (thing != null) {
162 try {
163 thing.close();
164 } catch(Exception ignored) {
165 }
166 }
167 }
168
169 public static void close(Reader thing) {
170 if (thing != null) {
171 try {
172 thing.close();
173 } catch(Exception ignored) {
174 }
175 }
176 }
177
178 public static void close(Writer thing) {
179 if (thing != null) {
180 try {
181 thing.close();
182 } catch(Exception ignored) {
183 }
184 }
185 }
186
187 public static Set search(File root, String pattern) throws MalformedURLException {
188 if (root.isDirectory()) {
189 if (!SelectorUtils.hasWildcards(pattern)) {
190 File match = new File(root, pattern);
191 if (match.exists() && match.canRead()) {
192 return Collections.singleton(match.toURL());
193 } else {
194 return Collections.EMPTY_SET;
195 }
196 } else {
197 Set matches = new LinkedHashSet();
198 Map files = listAllFileNames(root);
199 for (Iterator iterator = files.entrySet().iterator(); iterator.hasNext();) {
200 Map.Entry entry = (Map.Entry) iterator.next();
201 String fileName = (String) entry.getKey();
202 if (SelectorUtils.matchPath(pattern, fileName)) {
203 File file = (File) entry.getValue();
204 matches.add(file.toURL());
205 }
206 }
207 return matches;
208 }
209 } else {
210 JarFile jarFile = null;
211 try {
212 jarFile = new JarFile(root);
213 URL baseURL = new URL("jar:" + root.toURL().toString() + "!/");
214 if (!SelectorUtils.hasWildcards(pattern)) {
215 ZipEntry entry = jarFile.getEntry(pattern);
216 if (entry != null) {
217 URL match = new URL(baseURL, entry.getName());
218 return Collections.singleton(match);
219 } else {
220 return Collections.EMPTY_SET;
221 }
222 } else {
223 Set matches = new LinkedHashSet();
224 Enumeration entries = jarFile.entries();
225 while (entries.hasMoreElements()) {
226 ZipEntry entry = (ZipEntry) entries.nextElement();
227 String fileName = entry.getName();
228 if (SelectorUtils.matchPath(pattern, fileName)) {
229 URL url = new URL(baseURL, fileName);
230 matches.add(url);
231 }
232 }
233 return matches;
234 }
235 } catch (MalformedURLException e) {
236 throw e;
237 } catch (IOException e) {
238 return Collections.EMPTY_SET;
239 } finally {
240 close(jarFile);
241 }
242 }
243 }
244
245 public static Map listAllFileNames(File base) {
246 return listAllFileNames(base, "");
247 }
248
249 private static Map listAllFileNames(File base, String prefix) {
250 if (!base.canRead() || !base.isDirectory()) {
251 throw new IllegalArgumentException(base.getAbsolutePath());
252 }
253 Map map = new LinkedHashMap();
254 File[] hits = base.listFiles();
255 for (int i = 0; i < hits.length; i++) {
256 File hit = hits[i];
257 if (hit.canRead()) {
258 if (hit.isDirectory()) {
259 map.putAll(listAllFileNames(hit, prefix.equals("") ? hit.getName() : prefix + "/" + hit.getName()));
260 } else {
261 map.put(prefix.equals("") ? hit.getName() : prefix + "/" + hit.getName(), hit);
262 }
263 }
264 }
265 map.put(prefix, base);
266 return map;
267 }
268 }