001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.kernel.config;
018
019 import java.io.File;
020 import java.io.FileInputStream;
021 import java.io.FileOutputStream;
022 import java.io.IOException;
023 import java.io.InputStream;
024 import java.io.OutputStream;
025 import java.io.Reader;
026 import java.io.Writer;
027 import java.net.MalformedURLException;
028 import java.net.URL;
029 import java.util.Collections;
030 import java.util.Enumeration;
031 import java.util.Iterator;
032 import java.util.LinkedHashMap;
033 import java.util.LinkedHashSet;
034 import java.util.Map;
035 import java.util.Set;
036 import java.util.jar.JarFile;
037 import java.util.zip.ZipEntry;
038
039 /**
040 * @version $Rev: 526866 $ $Date: 2007-04-09 14:28:33 -0400 (Mon, 09 Apr 2007) $
041 */
042 public class IOUtil {
043 public static void recursiveCopy(File srcDir, File destDir) throws IOException {
044 if (srcDir == null) throw new NullPointerException("sourceDir is null");
045 if (destDir == null) throw new NullPointerException("destDir is null");
046 if (!srcDir.isDirectory() || ! srcDir.canRead()) {
047 throw new IllegalArgumentException("Source directory must be a readable directory " + srcDir);
048 }
049 if (destDir.exists()) {
050 throw new IllegalArgumentException("Destination directory already exists " + destDir);
051 }
052 if (srcDir.equals(destDir)) {
053 throw new IllegalArgumentException("Source and destination directory are the same " + srcDir);
054 }
055
056 destDir.mkdirs();
057 if (!destDir.exists()) {
058 throw new IOException("Could not create destination directory " + destDir);
059 }
060
061
062 File[] srcFiles = srcDir.listFiles();
063 if (srcFiles != null) {
064 for (int i = 0; i < srcFiles.length; i++) {
065 File srcFile = srcFiles[i];
066 File destFile = new File(destDir, srcFile.getName());
067 if (srcFile.isDirectory()) {
068 recursiveCopy(srcFile, destFile);
069 } else {
070 copyFile(srcFile, destFile);
071 }
072 }
073 }
074 }
075
076 public static void copyFile(File source, File destination) throws IOException {
077 File destinationDir = destination.getParentFile();
078 if (!destinationDir.exists() && !destinationDir.mkdirs()) {
079 throw new IOException("Cannot create directory : " + destinationDir);
080 }
081
082 InputStream in = null;
083 OutputStream out = null;
084 try {
085 in = new FileInputStream(source);
086 out = new FileOutputStream(destination);
087 writeAll(in, out);
088 } finally {
089 close(in);
090 close(out);
091 }
092 }
093
094 public static void writeAll(InputStream in, OutputStream out) throws IOException {
095 byte[] buffer = new byte[4096];
096 int count;
097 while ((count = in.read(buffer)) > 0) {
098 out.write(buffer, 0, count);
099 }
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( new URL( "file:" + match.toURI().normalize().getPath() ) );
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( new URL( "file:" + file.toURI().normalize().getPath() ) );
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 }