View Javadoc

1   /*
2    * "Peko" Visual Novel System
3    *
4    * All Rights Reserved.
5    * Copyright (c) 1999-2003 Tsukuba Bunko.
6    *
7    * $Id: LocationConfigurator.java,v 1.1 2005/07/11 12:49:18 ppoi Exp $
8    */
9   package tsukuba_bunko.peko.resource;
10  
11  import	java.io.File;
12  
13  import	java.net.MalformedURLException;
14  import	java.net.URL;
15  
16  import	tsukuba_bunko.resource.Resources;
17  
18  import	tsukuba_bunko.peko.InitializationError;
19  import	tsukuba_bunko.peko.Logger;
20  
21  import	tsukuba_bunko.util.ResourceLocator;
22  
23  
24  /***
25   * ディレクトリロケーション設定を構成する機能を提供します。
26   * @author	$Author: ppoi $
27   * @version	$Revision: 1.1 $
28   */
29  public class LocationConfigurator	{
30  
31  	/***
32  	 * <code>LocationConfigurator</code> のインスタンスを作成します。
33  	 */
34  	public LocationConfigurator()
35  	{
36  		super();
37  	}
38  
39  
40  	/***
41  	 * インストールディレクトリを取得します。
42  	 * @return	インストールディレクトリのファイルシステム上の抽象パス
43  	 */
44  	protected File detectInstallDirectory()
45  	{
46  		File	baseLocation = null;
47  		try	{
48  			ResourceLocator	locator = ResourceLocator.newInstance();
49  			baseLocation = locator.findLocation( "tsukuba_bunko/peko/PekoSystem.class" );
50  
51  			if( baseLocation.isFile() )	{
52  				baseLocation = baseLocation.getParentFile().getParentFile();
53  			}
54  			else	{
55  				baseLocation = baseLocation.getParentFile();
56  			}
57  		}
58  		catch( Exception e )	{
59  			Logger.fatal( MessageIDs.RES0006F, e );
60  			throw new InitializationError( "fail to detect install directory.", e );
61  		}
62  		Logger.debug( "install dir: " + baseLocation.getAbsolutePath() );
63  
64  		return baseLocation;
65  	}
66  
67  	/***
68  	 * ディレクトリ URL を構成します。指定されたディレクトリがファイルだった場合、JAR アーカイブとして処理します。
69  	 * @param	directory	データ格納ディレクトリ名
70  	 * @param	installDir	インストールディレクトリ
71  	 * @return	構成された URL
72  	 */
73  	protected URL configureDirectoryURL( String directory, File installDir )
74  	{
75  		File	dataDirectory = new File( installDir, directory );
76  		Logger.debug( "dir: " + dataDirectory );
77  		if( dataDirectory.isDirectory() )	{
78  			try	{
79  				return dataDirectory.toURL();
80  			}
81  			catch( MalformedURLException mue )	{
82  				InitializationError	ie = new InitializationError( "invalid data directory.", mue );
83  				Logger.fatal( MessageIDs.RES0008F, new Object[]{directory}, ie );
84  				throw ie;
85  			}
86  		}
87  		else if( dataDirectory.isFile() )	{
88  			try	{
89  				return new URL( "jar:" + dataDirectory.toURL().toString() + "!/" );
90  			}
91  			catch( MalformedURLException mue )	{
92  				InitializationError	ie = new InitializationError( "invalid data directory.", mue );
93  				Logger.fatal( MessageIDs.RES0008F, new Object[]{directory}, ie );
94  				throw ie;
95  			}
96  		}
97  		else	{
98  			InitializationError	ie = new InitializationError( "invalid data directory." );
99  			Logger.fatal( MessageIDs.RES0008F, new Object[]{directory}, ie );
100 			throw ie;
101 		}
102 	}
103 
104 	protected File ensureSaveDirectory( String directory, File installDir )
105 	{
106 		File	saveDir = new File( installDir, directory );
107 		if( saveDir.exists() )	{
108 			if( saveDir.isDirectory() )	{
109 				return saveDir;
110 			}
111 			else	{
112 				InitializationError	ie = new InitializationError( "already exist file." );
113 				Logger.fatal( MessageIDs.RES0012F, ie );
114 				throw ie;
115 			}
116 		}
117 		else	{
118 			if( !saveDir.mkdir() )	{
119 				InitializationError ie = new InitializationError( "fail to create dir." );
120 				Logger.fatal( MessageIDs.RES0013F, ie );
121 				throw ie;
122 			}
123 			return saveDir;
124 		}
125 	}
126 
127 
128 	/***
129 	 * システム構成リソースの内容から構成された <code>LocationResources</code> を生成します。
130 	 * @param	systemResources	システム構成リソース
131 	 * @return	構成済みの <code>LocationResources</code> インスタンス
132 	 */
133 	public LocationResources configure( Resources systemResources )
134 	{
135 		LocationResources	locations = new LocationResources();
136 
137 		File	installDir = detectInstallDirectory();
138 
139 		String[]	keys = { "scenes", "images", "sounds", "misc" };
140 		URL	url = null;
141 		String	value = null;
142 		for( int i = 0; i < keys.length; ++i )	{
143 			value = (String)systemResources.getResource( "peko.system.location." + keys[i] );
144 			if( value == null )	{
145 				InitializationError	ie = new InitializationError( "directory is not specified." );
146 				Logger.fatal( MessageIDs.RES0011F, new Object[]{keys[i]}, ie );
147 				throw ie;
148 			}
149 			else	{
150 				url = configureDirectoryURL( value, installDir );
151 				Logger.debug( url.toString() );
152 				locations.setResource( "peko.system.location." + keys[i], url );
153 			}
154 		}
155 
156 		String	saveDirectory = (String)systemResources.getResource( "peko.system.location.save" );
157 		if( saveDirectory == null )	{
158 			saveDirectory = "save";
159 		}
160 		locations.setResource( LocationResources.DIR_SAVE, ensureSaveDirectory(saveDirectory, installDir) );
161 
162 		locations.setResource( LocationResources.DIR_INSTALL, installDir );
163 
164 		return locations;
165 	}
166 }