1
2
3
4
5
6
7
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 }