View Javadoc

1   /*
2    * Common Library for TBAS Softwares
3    *
4    * All Rights Reserved.
5    * (c) Copyright 2002 by Tsukuba Bunko.
6    *
7    * $Id: DeserializerMapping.java,v 1.1 2005/07/11 12:49:18 ppoi Exp $
8    */
9   package tsukuba_bunko.resource;
10  
11  import	java.util.Enumeration;
12  import	java.util.Map;
13  import	java.util.ResourceBundle;
14  
15  
16  /***
17   * データ型名と <code>ResourceDeserializer</code> のマップを管理します。このクラスは thread-safe ではありませんので、malti-thread
18   * 環境で使用する場合は、同期の制御を行ってください。
19   * @author	$Author: ppoi $
20   * @version	$Revision: 1.1 $
21   */
22  public class DeserializerMapping	{
23  
24  	/***
25  	 * データ型名 - ResourceDeserializer マップ
26  	 */
27  	private Map	_registry = new java.util.HashMap( 89 );
28  
29  
30  	/***
31  	 * <code>DeserializerMapping</code> のインスタンスを作成します。
32  	 */
33  	public DeserializerMapping()
34  	{
35  		super();
36  	}
37  
38  
39  	/***
40  	 * データ型 <code>dataType</code> に <code>ResourceDeserializer</code> クラス
41  	 * <code>deserializerClass</code> を関連づけます。
42  	 * @param	typeName	データ型名
43  	 * @param	deserializer	使用する <code>ResourceDeserializer</code>
44  	 * @exception	IllegalArgumentException	<code>deserializerClass</code> が妥当な <code>ResourceDeserializer</code> サブクラスではない場合
45  	 */
46  	public void register( String typeName, ResourceDeserializer deserializer )
47  	{
48  		deserializer.setDeserializerMapping( this );
49  		deserializer.setTypeName( typeName );
50  		_registry.put( typeName, deserializer );
51  	}
52  
53  	/***
54  	 * データ型 <code>typeName</code> に関連づけられた <code>ResourceDeserializer</code> クラスを削除します。
55  	 * @param	typeName
56  	 */
57  	public void unregister( String typeName )
58  	{
59  		_registry.remove( typeName );
60  	}
61  
62  	/***
63  	 * <code>dataType</code> に関連づけられた <code>ResourceDeserializer</code> を取得します。
64  	 * @param	dataType	データ型名
65  	 * @return	関連づけられている <code>ResourceDeserializer</code>
66  	 * @exception	IllegalStateException	<code>ValueDeserialzier</code> の取得に失敗した場合
67  	 */
68  	public ResourceDeserializer getResourceDeserializer( String dataType )
69  	{
70  		return (ResourceDeserializer)_registry.get( dataType );
71  	}
72  
73  	/***
74  	 * 指定された reosurce bundle を使用して <code>DeserializerMapping</code> のインスタンスを作成します。
75  	 * @param	bundleName	ResourceBundle のベースクラス名
76  	 * @return	作成された <code>DeserializerMapping</code> のインスタンス
77  	 */
78  	public static DeserializerMapping newInstance( String bundleName )
79  	{
80  		DeserializerMapping	mapping = new DeserializerMapping();
81  
82  		ResourceBundle	source = ResourceBundle.getBundle( bundleName );
83  		ClassLoader	cl = DeserializerMapping.class.getClassLoader();
84  
85  		Enumeration	keys = source.getKeys();
86  		String	key = null;
87  		while( keys.hasMoreElements() )	{
88  			key = (String)keys.nextElement();
89  			String	className = source.getString( key );
90  			try	{
91  				mapping.register( key, (ResourceDeserializer)cl.loadClass(className).newInstance() );
92  			}
93  			catch( Exception e )	{
94  				System.err.println( "[libtbas] ERROR : illegal class \"" + className + "\"" );
95  				e.printStackTrace();
96  			}
97  		}
98  
99  		return mapping;
100 	}
101 
102 	/***
103 	 * リソースで指定された内容から <code>DeserializerMapping</code> のインスタンスを作成します。
104 	 * @return	作成された <code>DeserializerMapping</code> のインスタンス
105 	 */
106 	public static DeserializerMapping newInstance()
107 	{
108 		return newInstance( System.getProperty("libtbas.resource.mapping", "tsukuba_bunko.resource.mapping") );
109 	}
110 }