Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
PathUtil |
|
| 3.5;3.5 |
1 | /* | |
2 | * Copyright 2004-2008 the Seasar Foundation and the Others. | |
3 | * | |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at | |
7 | * | |
8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, | |
13 | * either express or implied. See the License for the specific language | |
14 | * governing permissions and limitations under the License. | |
15 | */ | |
16 | package org.seasar.uruma.util; | |
17 | ||
18 | import org.seasar.framework.util.StringUtil; | |
19 | ||
20 | /** | |
21 | * パスに関するユーティリティメソッドを提供するクラスです。<br /> | |
22 | * | |
23 | * @author y-komori | |
24 | */ | |
25 | public class PathUtil { | |
26 | 0 | private PathUtil() { |
27 | ||
28 | 0 | } |
29 | ||
30 | private static final String YEN_SIGN = "\\"; | |
31 | ||
32 | private static final String SLASH = "/"; | |
33 | ||
34 | private static final char SLASH_CHAR = '/'; | |
35 | ||
36 | private static final String PERIOD = "."; | |
37 | ||
38 | private static final String NULL_STRING = ""; | |
39 | ||
40 | /** | |
41 | * 与えられた基準パスと相対パスから絶対パスを生成します。</br> | |
42 | * <ul> | |
43 | * <li>パス中の <code>\</code> はすべて <code>/</code> に変換します。 | |
44 | * <li>基本動作として <code>basePath</code> と <code>relPath</code> | |
45 | * を連結した文字列を返します。 | |
46 | * <li>この際、<code>basePath</code> が <code>/</code> で終了していない場合、<code>/</code> | |
47 | * を付加します。 | |
48 | * <li><code>relPath</code> が <code>/</code> から始まる場合、<code>relPath</code> | |
49 | * が絶対パスを表していると見なして、<code>basePath</code> は無視されます。 | |
50 | * <li><code>basePath</code> が <code>relPath</code> の先頭に含まれる場合、<code>basePath</code> | |
51 | * は無視されます。 | |
52 | * </ul> | |
53 | * | |
54 | * @param basePath | |
55 | * 基準パス | |
56 | * @param relPath | |
57 | * 相対パス | |
58 | * @return 生成したパス | |
59 | */ | |
60 | public static String createPath(String basePath, String relPath) { | |
61 | 92 | basePath = replaceSeparator(basePath); |
62 | 92 | relPath = replaceSeparator(relPath); |
63 | 92 | String path = ""; |
64 | 92 | if (relPath.charAt(0) == SLASH_CHAR) { |
65 | 64 | basePath = NULL_STRING; |
66 | } | |
67 | 92 | if (!StringUtil.isEmpty(basePath)) { |
68 | 24 | if (!relPath.startsWith(basePath)) { |
69 | 20 | path += basePath; |
70 | 20 | if (!path.endsWith(SLASH)) { |
71 | 16 | path += SLASH; |
72 | } | |
73 | } | |
74 | } | |
75 | 92 | path += relPath; |
76 | 92 | return path; |
77 | } | |
78 | ||
79 | /** | |
80 | * セパレータを「\」から「/」へ変換します。<br /> | |
81 | * | |
82 | * @param path | |
83 | * パス | |
84 | * @return 変換後のパス | |
85 | */ | |
86 | public static String replaceSeparator(final String path) { | |
87 | 192 | if (path != null) { |
88 | 188 | return StringUtil.replace(path, YEN_SIGN, SLASH); |
89 | } else { | |
90 | 4 | return NULL_STRING; |
91 | } | |
92 | } | |
93 | ||
94 | /** | |
95 | * 与えられたパスのベースパスを基準とした相対パスを返します。<br /> | |
96 | * | |
97 | * @param basePath | |
98 | * ベースパス | |
99 | * @param path | |
100 | * パス | |
101 | */ | |
102 | public static String getRelativePath(final String basePath, | |
103 | final String path) { | |
104 | 20 | AssertionUtil.assertNotNull("basePath", basePath); |
105 | 16 | AssertionUtil.assertNotNull("path", path); |
106 | ||
107 | 12 | if (path.startsWith(basePath)) { |
108 | 8 | return path.substring(basePath.length(), path.length()); |
109 | } else { | |
110 | 4 | return path; |
111 | } | |
112 | } | |
113 | ||
114 | /** | |
115 | * 指定されたパスの親ディレクトリ部分を返します。<br /> | |
116 | * セパレータは \ と / の両方を認識します。<br /> | |
117 | * 混在している場合は、より後ろの方を区切りとします。<br /> | |
118 | * | |
119 | * @param path | |
120 | * パス | |
121 | * @return 親ディレクトリ部分 | |
122 | */ | |
123 | public static String getParent(final String path) { | |
124 | 32 | if (path != null) { |
125 | 28 | int slashIndex = path.lastIndexOf(SLASH); |
126 | 28 | int yenIndex = path.lastIndexOf(YEN_SIGN); |
127 | 28 | int pos = (slashIndex > yenIndex) ? slashIndex : yenIndex; |
128 | 28 | if (pos >= 0) { |
129 | 24 | return path.substring(0, pos); |
130 | } else { | |
131 | 4 | return path; |
132 | } | |
133 | } else { | |
134 | 4 | return null; |
135 | } | |
136 | } | |
137 | ||
138 | /** | |
139 | * 指定されたパスのファイル名部分を返します。<br /> | |
140 | * セパレータは \ と / の両方を認識します。<br /> | |
141 | * 混在している場合は、より後ろの方を区切りとします。<br /> | |
142 | * | |
143 | * @param path | |
144 | * パス | |
145 | * @return ファイル名部分 | |
146 | */ | |
147 | public static String getFileName(final String path) { | |
148 | 256 | if (path != null) { |
149 | 252 | int slashIndex = path.lastIndexOf(SLASH); |
150 | 252 | int yenIndex = path.lastIndexOf(YEN_SIGN); |
151 | 252 | int pos = (slashIndex > yenIndex) ? slashIndex : yenIndex; |
152 | 252 | return path.substring(pos + 1, path.length()); |
153 | } else { | |
154 | 4 | return null; |
155 | } | |
156 | } | |
157 | ||
158 | /** | |
159 | * ファイル名から拡張子を除いた部分を返します。<br /> | |
160 | * | |
161 | * @param fileName | |
162 | * フィル名 | |
163 | * @return 拡張子を除いた部分 | |
164 | */ | |
165 | public static String getBaseName(final String fileName) { | |
166 | 244 | if (fileName != null) { |
167 | 240 | return StringUtil.substringFromLast(fileName, PERIOD); |
168 | } else { | |
169 | 4 | return null; |
170 | } | |
171 | } | |
172 | ||
173 | /** | |
174 | * パスの拡張子の部分(最後に登場するピリオド以降)を返します。<br /> | |
175 | * | |
176 | * @param path | |
177 | * パス | |
178 | * @return 拡張子 | |
179 | */ | |
180 | public static String getExt(final String path) { | |
181 | 20 | if (path != null) { |
182 | 16 | if (path.indexOf(PERIOD) > 0) { |
183 | 8 | return StringUtil.substringToLast(path, PERIOD); |
184 | } else { | |
185 | 8 | return NULL_STRING; |
186 | } | |
187 | } else { | |
188 | 4 | return null; |
189 | } | |
190 | } | |
191 | } |