View Javadoc

    1   /*
    2    * "Peko" Visual Novel System
    3    *
    4    * All Rights Reserved.
    5    * Copyright (c) 1999-2003 Tsukuba Bunko.
    6    *
    7    * $Id: TypeMapping.java,v 1.1 2005/07/11 12:49:19 ppoi Exp $
    8    */
    9   package tsukuba_bunko.peko.resource;
    10
    11  import	java.io.InputStream;
    12  import	java.io.IOException;
    13
    14  import	java.util.Properties;
    15
    16  import	tsukuba_bunko.peko.InitializationError;
    17  import	tsukuba_bunko.peko.Logger;
    18
    19  import	tsukuba_bunko.resource.DeserializerMapping;
    20  import	tsukuba_bunko.resource.ResourceDeserializer;
    21
    22
    23  /***
    24   * リソース ID と データ型のマッピングを管理します。
    25   * @author	$Author: ppoi $
    26   * @version	$Revision: 1.1 $
    27   */
    28  public class TypeMapping	{
    29
    30  	/***
    31  	 * 唯一のインスタンス
    32  	 */
    33  	private static TypeMapping	_instance = null;
    34
    35
    36  	/***
    37  	 * リソース ID - データ型マップ
    38  	 */
    39  	private Properties	_typeMapping = null;
    40
    41  	/***
    42  	 * DeserializerMapping
    43  	 */
    44  	private DeserializerMapping	_deserializerMapping = null;
    45
    46
    47  	/***
    48  	 * <code>TypeMapping</code> のインスタンスを作成します。
    49  	 */
    50  	protected TypeMapping()
    51  	{
    52  		super();
    53  	}
    54
    55
    56  	/***
    57  	 * 指定されたリソースのデータ型名を取得します。
    58  	 * @param	resourceID	リソース ID
    59  	 * @return	データ型名
    60  	 */
    61  	public String getDataType( String resourceID )
    62  	{
    63  		return _typeMapping.getProperty( resourceID );
    64  	}
    65
    66  	/***
    67  	 * 指定されたリソースをデシリアライズする ResourceDeserializer を取得します。
    68  	 * @param	resourceID	リソース ID
    69  	 * @return	ResourceDeserializer
    70  	 */
    71  	public ResourceDeserializer getResourceDeserializer( String resourceID )
    72  	{
    73  		String	type = _typeMapping.getProperty( resourceID );
    74  		if( type != null )	{
    75  			return _deserializerMapping.getResourceDeserializer( type );
    76  		}
    77  		else	{
    78  			return null;
    79  		}
    80  	}
    81
    82  	/***
    83  	 * DeserializerMapping を取得します。
    84  	 * @return	DeserializerMapping
    85  	 */
    86  	public DeserializerMapping getDeserializerMapping()
    87  	{
    88  		return _deserializerMapping;
    89  	}
    90
    91  	/***
    92  	 * <cpde>TypeMapping</code> を初期化します。
    93  	 * @throws	InitializationError	初期化に失敗した場合
    94  	 */
    95  	protected void initialize()
    96  	{
    97  		ClassLoader	cl = getClass().getClassLoader();
    98  		InputStream	is = cl.getResourceAsStream( "resources.def" );
    99  		if( is == null )	{
    100 			throw new InitializationError( "resources.def not found." );
    101 		}
    102
    103 		Properties	props = new Properties();
    104 		try	{
    105 			props.load( is );
    106 		}
    107 		catch( IOException ioe )	{
    108 			Logger.fatal( "[resource] fail to initialize TypeMapping.", ioe );
    109 			throw new InitializationError( "fail to initialize TypeMapping.", ioe );
    110 		}
    111 		finally	{
    112 			try	{
    113 				is.close();
    114 			}
    115 			catch( IOException ioe )	{
    116 				Logger.fatal( "[resource] fail to initialize TypeMapping.", ioe );
    117 			}
    118 		}
    119 		_typeMapping = props;
    120
    121 		_deserializerMapping = DeserializerMapping.newInstance( "tsukuba_bunko.peko.resource.mapping" );
    122 	}
    123
    124
    125
    126 	/***
    127 	 * 唯一の <code>TypeMapping</code> のインスタンスを取得します。
    128 	 * @return	唯一の <code>TypeMapping</code> のインスタンス
    129 	 * @throws	InitializationError	初期化に失敗した場合
    130 	 */
    131 	public static TypeMapping getInstance()
    132 	{
    133 		if( _instance == null )	{
    134 			synchronized( TypeMapping.class )	{
    135 				if( _instance == null )	{
    136 					_instance = new TypeMapping();
    137 					_instance.initialize();
    138 				}
    139 			}
    140 		}
    141 		return _instance;
    142 	}
    143 }