1
2
3
4
5
6
7
8
9
10 package tsukuba_bunko.util;
11
12 import java.io.File;
13
14
15 /***
16 * リソースのファイルシステム上での位置(ファイルパス)を取得する機能を提供します。
17 * @author $Author: ppoi $
18 * @version $Revision: 1.1 $
19 */
20 public abstract class ResourceLocator {
21
22 /***
23 * インスタンス化する <code>ResourceLocator</code> 実装クラスを指定するシステムプロパティ:"tsukuba_bunko.util.ResourceLocator.impl"
24 */
25 public static final String IMPL_CLASS_PROPERTY = "tsukuba_bunko.util.ResourceLocator.impl";
26
27
28 /***
29 * <code>ResourceLocator</code> のインスタンスを生成します。
30 */
31 protected ResourceLocator()
32 {
33 super();
34 }
35
36
37 /***
38 * <code>resourceName</code> で指定されるリソースを現在のスレッドのコンテクストで検索し、そのファイルシステム上での位置を取得します。
39 * @param resourceName ファイルパスを取得するリソースのリソース名
40 * @return リソースのファイルパス。検出不能な場合 <code>null</code>
41 * @throws ResourceDetectionException リソースの検出に失敗した場合
42 */
43 public File findLocation( String resourceName )
44 throws ResourceDetectionException
45 {
46 return findLocation( resourceName, Thread.currentThread().getContextClassLoader() );
47 }
48
49 /***
50 * <code>resourceName</code> で指定されるリソースを指定されたクラスローダで検索し、そのファイルシステム上での位置を取得します。
51 * @param resourceName ファイルパスを取得するリソースのリソース名
52 * @param classLoader リソースを検索するクラスローダ
53 * @return リソースのファイルパス
54 * @throws ResourceDetectionException リソースの検出に失敗した場合
55 */
56 public abstract File findLocation( String resourceName, ClassLoader classLoader )
57 throws ResourceDetectionException;
58
59
60
61
62
63 /***
64 * <code>ResourceLocator</code> インスタンスを生成します。
65 * 生成される <code>ResourceLocator</code> インスタンスのクラスはシステムプロパティを元に決定されます。プロパティ名は {@link #IMPL_CLASS_PROPERTY} を参照してください。
66 * システムプロパティが設定されていない場合、デフォルトの <code>ResourceLocator</code> 実装クラスが使用されます。
67 * @return 生成された <code>ResourceLocator</code> インスタンス
68 * @throws ClassNotFoundException 指定されたクラスが現在のスレッドのコンテクストで見つからなかった場合
69 * @throws InstantiationException 実装クラスのインスタンス化に失敗した場合
70 * @throws IllegalAccessException 実装クラス、またはそのコンストラクタのアクセス権が public でない場合
71 */
72 public static ResourceLocator newInstance()
73 throws ClassNotFoundException, InstantiationException, IllegalAccessException
74 {
75 String className = System.getProperty( ResourceLocator.IMPL_CLASS_PROPERTY, "tsukuba_bunko.util.locator.ResourceLocatorImpl" );
76 return newInstance( Thread.currentThread().getContextClassLoader().loadClass(className) );
77 }
78
79 /***
80 * <code>ResourceLocator</code> インスタンスを生成します。
81 * @param implClass <code>ResourceLocator</code> 実装クラス
82 * @return 生成された <code>ResourceLocator</code> インスタンス
83 * @throws InstantiationException 実装クラスのインスタンス化に失敗した場合
84 * @throws IllegalAccessException 実装クラス、またはそのコンストラクタのアクセス権が public でない場合
85 */
86 public static ResourceLocator newInstance( Class implClass )
87 throws InstantiationException, IllegalAccessException
88 {
89 if( implClass == null ) {
90 throw new IllegalArgumentException( "implement class is not specified." );
91 }
92 else if( !ResourceLocator.class.isAssignableFrom(implClass) ) {
93 throw new IllegalArgumentException( implClass.getName() + " is not extends from ResourceLocator." );
94 }
95
96 return (ResourceLocator)implClass.newInstance();
97 }
98 }