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 }