OSDN Git Service

s2jdbc-genのAntランチャーを移植
[ea2ddl/ea2ddl.git] / ea2ddl-common / src / main / java / org / seasar / extension / jdbc / gen / internal / util / FileUtil.java
1 /*\r
2  * Copyright 2004-2008 the Seasar Foundation and the Others.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, \r
13  * either express or implied. See the License for the specific language\r
14  * governing permissions and limitations under the License.\r
15  */\r
16 package org.seasar.extension.jdbc.gen.internal.util;\r
17 \r
18 import java.io.BufferedInputStream;\r
19 import java.io.BufferedOutputStream;\r
20 import java.io.File;\r
21 import java.io.FilenameFilter;\r
22 import java.io.IOException;\r
23 import java.util.Arrays;\r
24 import java.util.Comparator;\r
25 \r
26 import org.seasar.framework.exception.IORuntimeException;\r
27 import org.seasar.framework.util.FileInputStreamUtil;\r
28 import org.seasar.framework.util.FileOutputStreamUtil;\r
29 import org.seasar.framework.util.InputStreamUtil;\r
30 import org.seasar.framework.util.OutputStreamUtil;\r
31 \r
32 /**\r
33  * {@link File}に関するユーティリティクラスです。\r
34  * \r
35  * @author taedium\r
36  */\r
37 public class FileUtil {\r
38 \r
39     /**\r
40      * \r
41      */\r
42     protected FileUtil() {\r
43     }\r
44 \r
45     /**\r
46      * ディレクトリをコピーします。\r
47      * \r
48      * @param srcDir\r
49      *            コピー元ディレクトリ\r
50      * @param destDir\r
51      *            コピー先ディレクトリ\r
52      * @param filter\r
53      *            フィルタ\r
54      */\r
55     public static void copyDirectory(File srcDir, File destDir,\r
56             FilenameFilter filter) {\r
57         if (!srcDir.isDirectory()) {\r
58             throw new IllegalArgumentException("srcDir");\r
59         }\r
60         if (!getCanonicalPath(srcDir).equals(getCanonicalPath(srcDir))\r
61                 && getCanonicalPath(srcDir)\r
62                         .startsWith(getCanonicalPath(srcDir))) {\r
63             throw new IllegalArgumentException("destDir");\r
64         }\r
65         copyDir(srcDir, destDir, filter);\r
66     }\r
67 \r
68     /**\r
69      * ディレクトリを再帰的にコピーします。\r
70      * \r
71      * @param srcDir\r
72      *            コピー元ディレクトリ\r
73      * @param destDir\r
74      *            コピー先ディレクトリ\r
75      * @param filter\r
76      *            フィルタ\r
77      */\r
78     protected static void copyDir(File srcDir, File destDir,\r
79             FilenameFilter filter) {\r
80         destDir.mkdirs();\r
81         File[] srcFiles = srcDir.listFiles(filter);\r
82         for (File src : srcFiles) {\r
83             File dest = new File(destDir, src.getName());\r
84             if (src.isDirectory()) {\r
85                 copyDir(src, dest, filter);\r
86             } else {\r
87                 copyFile(src, dest);\r
88             }\r
89         }\r
90     }\r
91 \r
92     /**\r
93      * ファイルをコピーします。\r
94      * \r
95      * @param src\r
96      *            コピー元ファイル\r
97      * @param dest\r
98      *            コピー先ファイル\r
99      */\r
100     protected static void copyFile(File src, File dest) {\r
101         BufferedInputStream in = null;\r
102         BufferedOutputStream out = null;\r
103         try {\r
104             in = new BufferedInputStream(FileInputStreamUtil.create(src));\r
105             out = new BufferedOutputStream(FileOutputStreamUtil.create(dest));\r
106             byte[] buf = new byte[1024];\r
107             int length;\r
108             while (-1 < (length = in.read(buf))) {\r
109                 out.write(buf, 0, length);\r
110                 out.flush();\r
111             }\r
112         } catch (IOException e) {\r
113             throw new IORuntimeException(e);\r
114         } finally {\r
115             InputStreamUtil.close(in);\r
116             OutputStreamUtil.close(out);\r
117         }\r
118     }\r
119 \r
120     /**\r
121      * ディレクトリを削除します。\r
122      * \r
123      * @param dir\r
124      *            ディレクトリ\r
125      */\r
126     public static void deleteDirectory(File dir) {\r
127         if (!dir.isDirectory()) {\r
128             throw new IllegalArgumentException("dir");\r
129         }\r
130         if (!dir.exists()) {\r
131             throw new IllegalArgumentException("dir");\r
132         }\r
133         deleteDir(dir);\r
134     }\r
135 \r
136     /**\r
137      * ディレクトリを再帰的に削除します。\r
138      * \r
139      * @param dir\r
140      *            ディレクトリ\r
141      */\r
142     protected static void deleteDir(File dir) {\r
143         for (File file : dir.listFiles()) {\r
144             if (file.isDirectory()) {\r
145                 deleteDir(file);\r
146                 file.delete();\r
147             } else {\r
148                 file.delete();\r
149             }\r
150         }\r
151         dir.delete();\r
152     }\r
153 \r
154     /**\r
155      * この抽象パス名の正規のパス名文字列を返します。\r
156      * \r
157      * @param file\r
158      *            ファイル\r
159      * @return この抽象パス名と同じファイルまたはディレクトリを示す正規パス名文字列\r
160      */\r
161     public static String getCanonicalPath(File file) {\r
162         try {\r
163             return file.getCanonicalPath();\r
164         } catch (IOException e) {\r
165             throw new IORuntimeException(e);\r
166         }\r
167     }\r
168 \r
169     /**\r
170      * この抽象パス名の正規の形式を返します。\r
171      * \r
172      * @param file\r
173      *            ファイル\r
174      * @return この抽象パス名と同じファイルまたはディレクトリを示す正規の形式\r
175      */\r
176     public static File getCanonicalFile(File file) {\r
177         try {\r
178             return file.getCanonicalFile();\r
179         } catch (IOException e) {\r
180             throw new IORuntimeException(e);\r
181         }\r
182     }\r
183 \r
184     /**\r
185      * ディレクトリを横断します。\r
186      * \r
187      * @param dir\r
188      * @param filter\r
189      * @param comparator\r
190      * @param handler\r
191      */\r
192     public static void traverseDirectory(File dir, FilenameFilter filter,\r
193             Comparator<File> comparator, FileHandler handler) {\r
194         if (!dir.exists()) {\r
195             return;\r
196         }\r
197         File[] files = dir.listFiles(filter);\r
198         if (files == null) {\r
199             return;\r
200         }\r
201         Arrays.sort(files, comparator);\r
202         for (File file : files) {\r
203             if (file.isDirectory()) {\r
204                 traverseDirectory(file, filter, comparator, handler);\r
205             }\r
206             handler.handle(file);\r
207         }\r
208     }\r
209 \r
210     /**\r
211      * Javaファイルを作成します。\r
212      * \r
213      * @param baseDir\r
214      *            ベースディレクトリ\r
215      * @param packageName\r
216      *            パッケージ名\r
217      * @param shortClassName\r
218      *            クラスの単純名\r
219      * @return Javaファイル\r
220      */\r
221     public static File createJavaFile(File baseDir, String packageName,\r
222             String shortClassName) {\r
223         File packageDir;\r
224         if (packageName == null) {\r
225             packageDir = baseDir;\r
226         } else {\r
227             packageDir = new File(baseDir, packageName.replace('.',\r
228                     File.separatorChar));\r
229         }\r
230         return new File(packageDir, shortClassName + ".java");\r
231     }\r
232 \r
233     /**\r
234      * ファイルを扱うインタフェースです・\r
235      * \r
236      * @author taedium\r
237      */\r
238     public interface FileHandler {\r
239 \r
240         /**\r
241          * 処理します。\r
242          * \r
243          * @param file\r
244          */\r
245         void handle(File file);\r
246     }\r
247 }\r