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