/* * Copyright 2004-2012 the Seasar Foundation and the Others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.seasar.util.io; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; import org.seasar.util.exception.IORuntimeException; import org.seasar.util.exception.ResourceNotFoundRuntimeException; import org.seasar.util.jar.JarFileUtil; import org.seasar.util.net.URLUtil; import static org.seasar.util.misc.AssertionUtil.*; /** * リソース用のユーティリティクラスです。 * * @author higa */ public abstract class ResourceUtil { /** * リソースパスを返します。 * * @param path * パス。{@literal null}であってはいけません * @param extension * 拡張子 * @return リソースパス */ public static String getResourcePath(final String path, final String extension) { assertArgumentNotNull("path", path); if (extension == null) { return path; } final String ext = "." + extension; if (path.endsWith(ext)) { return path; } return path.replace('.', '/') + ext; } /** * リソースパスを返します。 * * @param clazz * クラス。{@literal null}であってはいけません * @return リソースパス */ public static String getResourcePath(final Class<?> clazz) { assertArgumentNotNull("clazz", clazz); return clazz.getName().replace('.', '/') + ".class"; } /** * コンテキストクラスローダを返します。 * * @return コンテキストクラスローダ */ public static ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); } /** * コンテキストクラスローダからリソースを返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @return リソースの{@link URL} * @see #getResource(String, String) */ public static URL getResource(final String path) { assertArgumentNotEmpty("path", path); return getResource(path, null); } /** * コンテキストクラスローダからリソースを返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @param extension * リソースの拡張子 * @return リソースの{@link URL} */ public static URL getResource(final String path, final String extension) { assertArgumentNotEmpty("path", path); final URL url = getResourceNoException(path, extension); if (url != null) { return url; } throw new ResourceNotFoundRuntimeException(getResourcePath( path, extension)); } /** * コンテキストクラスローダからリソースを返します。見つからなかった場合は<code>null</code>を返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @return リソースの{@link URL} * @see #getResourceNoException(String, String) */ public static URL getResourceNoException(final String path) { assertArgumentNotEmpty("path", path); return getResourceNoException(path, null); } /** * コンテキストクラスローダからリソースを返します。見つからなかった場合は<code>null</code>を返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @param extension * 拡張子 * @return リソースの{@link URL} * @see #getResourceNoException(String, String, ClassLoader) */ public static URL getResourceNoException(final String path, final String extension) { assertArgumentNotEmpty("path", path); return getResourceNoException(path, extension, Thread .currentThread() .getContextClassLoader()); } /** * 指定のクラスローダからリソースを返します。見つからなかった場合は<code>null</code>を返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @param extension * リソースの拡張子 * @param loader * リソースを検索するクラスローダ。{@literal null}であってはいけません * @return リソース * @see #getResourcePath(String, String) */ public static URL getResourceNoException(final String path, final String extension, final ClassLoader loader) { assertArgumentNotNull("loader", loader); if (path == null || loader == null) { return null; } final String p = getResourcePath(path, extension); return loader.getResource(p); } /** * コンテキストクラスローダからリソースを検索してストリームとして返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @return ストリーム * @see #getResourceAsStream(String, String) */ public static InputStream getResourceAsStream(final String path) { assertArgumentNotEmpty("path", path); return getResourceAsStream(path, null); } /** * コンテキストクラスローダからリソースを検索してストリームとして返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @param extension * リソースの拡張子 * @return ストリーム * @see #getResource(String, String) */ public static InputStream getResourceAsStream(final String path, final String extension) { assertArgumentNotEmpty("path", path); final URL url = getResource(path, extension); return URLUtil.openStream(url); } /** * コンテキストクラスローダからリソースを検索してストリームとして返します。 リソースが見つからなかった場合は<code>null</code> * を返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @return ストリーム * @see #getResourceAsStreamNoException(String, String) */ public static InputStream getResourceAsStreamNoException(final String path) { assertArgumentNotEmpty("path", path); return getResourceAsStreamNoException(path, null); } /** * コンテキストクラスローダからリソースを検索してストリームとして返します。 リソースが見つからなかった場合は<code>null</code> * を返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @param extension * リソースの拡張子 * @return ストリーム * @see #getResourceNoException(String, String) */ public static InputStream getResourceAsStreamNoException(final String path, final String extension) { assertArgumentNotEmpty("path", path); final URL url = getResourceNoException(path, extension); if (url == null) { return null; } try { return url.openStream(); } catch (final IOException e) { return null; } } /** * コンテキストクラスローダにリソースが存在するかどうかを返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @return リソースが存在すれば{@literal true} * @see #getResourceNoException(String) */ public static boolean isExist(final String path) { assertArgumentNotEmpty("path", path); return getResourceNoException(path) != null; } /** * コンテキストクラスローダからプロパティファイルをロードして返します。 * * @param path * プロパティファイルのパス。{@literal null}や空文字列であってはいけません * @return プロパティファイル */ public static Properties getProperties(final String path) { assertArgumentNotEmpty("path", path); final Properties props = new Properties(); final InputStream is = getResourceAsStream(path); try { props.load(is); return props; } catch (final IOException ex) { throw new IORuntimeException(ex); } finally { CloseableUtil.close(is); } } /** * パスの拡張子を返します。 * * @param path * パス。{@literal null}であってはいけません * @return 拡張子 */ public static String getExtension(final String path) { assertArgumentNotNull("path", path); final int extPos = path.lastIndexOf("."); if (extPos >= 0) { return path.substring(extPos + 1); } return null; } /** * パスから拡張子を取り除きます。 * * @param path * パス。{@literal null}であってはいけません * @return 拡張子を取り除いたパス */ public static String removeExtension(final String path) { assertArgumentNotNull("path", path); final int extPos = path.lastIndexOf("."); if (extPos >= 0) { return path.substring(0, extPos); } return path; } /** * 指定されたクラスのクラスファイルが置かれているルートディレクトリを返します。 * * @param clazz * クラス。{@literal null}であってはいけません * @return ルートディレクトリ * @see #getBuildDir(String) */ public static File getBuildDir(final Class<?> clazz) { assertArgumentNotNull("clazz", clazz); return getBuildDir(getResourcePath(clazz)); } /** * クラスファイルが置かれているルートディレクトリを返します。 * * @param path * クラスファイルのパス。{@literal null}や空文字列であってはいけません * @return ルートディレクトリ */ public static File getBuildDir(final String path) { assertArgumentNotEmpty("path", path); File dir = null; final URL url = getResource(path); if ("file".equals(url.getProtocol())) { final int num = path.split("/").length; dir = new File(getFileName(url)); for (int i = 0; i < num; ++i) { dir = dir.getParentFile(); } } else { dir = new File(JarFileUtil.toJarFilePath(url)); } return dir; } /** * リソースのURLを外部形式に変換します。 * * @param url * リソースのURL。{@literal null}であってはいけません * @return 外部形式 */ public static String toExternalForm(final URL url) { assertArgumentNotNull("url", url); final String s = url.toExternalForm(); return URLUtil.decode(s, "UTF8"); } /** * リソースのファイル名を返します。 * * @param url * リソースのURL。{@literal null}であってはいけません * @return ファイル名 */ public static String getFileName(final URL url) { assertArgumentNotNull("url", url); final String s = url.getFile(); return URLUtil.decode(s, "UTF8"); } /** * リソースのファイルを返します。 * * @param url * リソースのURL。{@literal null}であってはいけません * @return ファイル */ public static File getFile(final URL url) { assertArgumentNotNull("url", url); final File file = new File(getFileName(url)); if (file != null && file.exists()) { return file; } return null; } /** * リソースをファイルとして返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @return ファイル * @see #getResourceAsFile(String, String) */ public static File getResourceAsFile(final String path) { assertArgumentNotEmpty("path", path); return getResourceAsFile(path, null); } /** * リソースをファイルとして返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @param extension * リソースの拡張子 * @return ファイル * @see #getFile(URL) */ public static File getResourceAsFile(final String path, final String extension) { assertArgumentNotEmpty("path", path); return getFile(getResource(path, extension)); } /** * クラスファイルを表すリソースをファイルとして返します。リソースが見つからない場合は<code>null</code>を返します。 * * @param clazz * クラス。{@literal null}であってはいけません * @return ファイル * @see #getResourceAsFileNoException(String) */ public static File getResourceAsFileNoException(final Class<?> clazz) { assertArgumentNotNull("clazz", clazz); return getResourceAsFileNoException(getResourcePath(clazz)); } /** * リソースをファイルとして返します。リソースが見つからない場合は<code>null</code>を返します。 * * @param path * リソースのパス。{@literal null}や空文字列であってはいけません * @return ファイル * @see #getResourceNoException(String) */ public static File getResourceAsFileNoException(final String path) { assertArgumentNotEmpty("path", path); final URL url = getResourceNoException(path); if (url == null) { return null; } return getFile(url); } /** * パスを変換します。 * * @param path * リソースのパス * @param clazz * クラス * @return 変換された結果 */ public static String convertPath(final String path, final Class<?> clazz) { assertArgumentNotEmpty("path", path); assertArgumentNotNull("clazz", clazz); if (isExist(path)) { return path; } final String prefix = clazz.getName().replace('.', '/').replaceFirst("/[^/]+$", ""); final String extendedPath = prefix + "/" + path; if (ResourceUtil.getResourceNoException(extendedPath) != null) { return extendedPath; } return path; } }