View Javadoc

1   /*
2    * Common Library for TBAS Softwares
3    * Language: Java
4    *
5    * All Rights Reserved.
6    * (c) Copyright 2003 by Tsukuba Bunko.
7    *
8    * $Id: ResourceLocator.java,v 1.1 2005/07/11 12:49:19 ppoi Exp $
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  }