Jindolfプロジェクトは、CGIゲーム「人狼BBS」を快適にプレイするための専用クライアントを製作するために発足したオープンソースプロジェクトです。
修订版 | 040951920e972e5d37328e8e9c99e77c69c7467f (tree) |
---|---|
时间 | 2020-07-10 03:41:03 |
作者 | Olyutorskii <olyutorskii@user...> |
Commiter | Olyutorskii |
modify envinfo.
@@ -141,31 +141,31 @@ public final class JindolfMain { | ||
141 | 141 | |
142 | 142 | return; |
143 | 143 | } |
144 | - | |
144 | + | |
145 | 145 | /** |
146 | 146 | * 起動時の諸々の情報をログ出力する。 |
147 | - * | |
147 | + * | |
148 | 148 | * @param optinfo コマンドラインオプション |
149 | 149 | */ |
150 | 150 | private static void logBootInfo(OptionInfo optinfo){ |
151 | 151 | StringBuilder bootArgs = new StringBuilder(); |
152 | - | |
152 | + | |
153 | 153 | bootArgs.append("\n\n").append("起動時引数:\n"); |
154 | - optinfo.getInvokeArgList().forEach(arg -> | |
154 | + optinfo.getInvokeArgList().forEach(arg -> | |
155 | 155 | bootArgs.append("\u0020\u0020").append(arg).append('\n') |
156 | 156 | ); |
157 | 157 | bootArgs.append('\n'); |
158 | - | |
158 | + | |
159 | 159 | bootArgs.append(EnvInfo.getVMInfo()); |
160 | - | |
160 | + | |
161 | 161 | LOGGER.info(bootArgs.toString()); |
162 | 162 | |
163 | 163 | return; |
164 | 164 | } |
165 | - | |
165 | + | |
166 | 166 | /** |
167 | 167 | * 起動時の諸々の情報をログ出力する。 |
168 | - * | |
168 | + * | |
169 | 169 | * @param configStore 設定ディレクトリ情報 |
170 | 170 | */ |
171 | 171 | private static void logBootInfo(ConfigStore configStore){ |
@@ -176,7 +176,7 @@ public final class JindolfMain { | ||
176 | 176 | } |
177 | 177 | return; |
178 | 178 | } |
179 | - | |
179 | + | |
180 | 180 | /** |
181 | 181 | * JindolfMain のスタートアップエントリ。 |
182 | 182 | * @param args コマンドライン引数 |
@@ -263,11 +263,11 @@ public final class JindolfMain { | ||
263 | 263 | |
264 | 264 | logBootInfo(); |
265 | 265 | logBootInfo(optinfo); |
266 | - | |
266 | + | |
267 | 267 | final AppSetting appSetting = new AppSetting(optinfo); |
268 | 268 | ConfigStore configStore = appSetting.getConfigStore(); |
269 | 269 | logBootInfo(configStore); |
270 | - | |
270 | + | |
271 | 271 | ConfigDirUi.prepareConfigDir(configStore); |
272 | 272 | ConfigDirUi.tryLock(configStore); |
273 | 273 | // ここから設定格納ディレクトリ解禁 |
@@ -294,7 +294,7 @@ public final class JindolfMain { | ||
294 | 294 | |
295 | 295 | int exitCode = 0; |
296 | 296 | try{ |
297 | - EventQueue.invokeAndWait(() -> | |
297 | + EventQueue.invokeAndWait(() -> | |
298 | 298 | startGUI(appSetting) |
299 | 299 | ); |
300 | 300 | }catch(InvocationTargetException | InterruptedException e){ |
@@ -8,8 +8,10 @@ | ||
8 | 8 | package jp.sfjp.jindolf.config; |
9 | 9 | |
10 | 10 | import java.io.File; |
11 | -import java.text.NumberFormat; | |
12 | -import java.util.Set; | |
11 | +import java.text.MessageFormat; | |
12 | +import java.util.Arrays; | |
13 | +import java.util.Collections; | |
14 | +import java.util.List; | |
13 | 15 | import java.util.SortedMap; |
14 | 16 | import java.util.TreeMap; |
15 | 17 |
@@ -32,36 +34,48 @@ public final class EnvInfo{ | ||
32 | 34 | /** 最大ヒープメモリ。 */ |
33 | 35 | public static final long MAX_MEMORY; |
34 | 36 | |
35 | - private static final SortedMap<String, String> PROPERTY_MAP = | |
36 | - new TreeMap<>(); | |
37 | - | |
38 | - private static final SortedMap<String, String> ENVIRONMENT_MAP = | |
39 | - new TreeMap<>(); | |
40 | - | |
41 | - private static final String[] CLASSPATHS; | |
37 | + private static final SortedMap<String, String> PROPERTY_MAP; | |
38 | + private static final SortedMap<String, String> ENVIRONMENT_MAP; | |
39 | + | |
40 | + private static final List<String> CLASSPATHS; | |
41 | + | |
42 | + private static final String[] PROPNAMES = { | |
43 | + "os.name", | |
44 | + "os.version", | |
45 | + "os.arch", | |
46 | + "java.vendor", | |
47 | + "java.version", | |
48 | + "java.class.path", | |
49 | + }; | |
50 | + | |
51 | + private static final String[] ENVNAMES = { | |
52 | + "LANG", | |
53 | + "DISPLAY", | |
54 | + //"PATH", | |
55 | + //"TEMP", | |
56 | + //"USER", | |
57 | + }; | |
58 | + | |
59 | + private static final String FORM_MEM = | |
60 | + "最大ヒープメモリ量: {0,number} bytes\n"; | |
61 | + private static final String INDENT = "\u0020\u0020"; | |
62 | + private static final char NL = '\n'; | |
42 | 63 | |
43 | 64 | static{ |
44 | - OS_NAME = getSecureProperty("os.name"); | |
45 | - OS_VERSION = getSecureProperty("os.version"); | |
46 | - OS_ARCH = getSecureProperty("os.arch"); | |
47 | - JAVA_VENDOR = getSecureProperty("java.vendor"); | |
48 | - JAVA_VERSION = getSecureProperty("java.version"); | |
49 | - | |
50 | - getSecureEnvironment("LANG"); | |
51 | - getSecureEnvironment("DISPLAY"); | |
52 | - | |
53 | 65 | Runtime runtime = Runtime.getRuntime(); |
54 | 66 | MAX_MEMORY = runtime.maxMemory(); |
55 | 67 | |
56 | - String classpath = getSecureProperty("java.class.path"); | |
57 | - String[] pathVec; | |
58 | - if(classpath != null){ | |
59 | - pathVec = classpath.split(File.pathSeparator); | |
60 | - }else{ | |
61 | - pathVec = new String[0]; | |
62 | - } | |
63 | - CLASSPATHS = pathVec; | |
68 | + ENVIRONMENT_MAP = buildEnvMap(); | |
69 | + | |
70 | + PROPERTY_MAP = buildPropMap(); | |
71 | + OS_NAME = PROPERTY_MAP.get("os.name"); | |
72 | + OS_VERSION = PROPERTY_MAP.get("os.version"); | |
73 | + OS_ARCH = PROPERTY_MAP.get("os.arch"); | |
74 | + JAVA_VENDOR = PROPERTY_MAP.get("java.vendor"); | |
75 | + JAVA_VERSION = PROPERTY_MAP.get("java.version"); | |
64 | 76 | |
77 | + String classpath = PROPERTY_MAP.get("java.class.path"); | |
78 | + CLASSPATHS = buildClassPathList(classpath); | |
65 | 79 | } |
66 | 80 | |
67 | 81 |
@@ -69,39 +83,78 @@ public final class EnvInfo{ | ||
69 | 83 | * 隠れコンストラクタ。 |
70 | 84 | */ |
71 | 85 | private EnvInfo(){ |
72 | - throw new AssertionError(); | |
86 | + assert false; | |
73 | 87 | } |
74 | 88 | |
75 | 89 | |
76 | 90 | /** |
77 | - * 可能ならシステムプロパティを読み込む。 | |
78 | - * @param key キー | |
79 | - * @return プロパティ値。セキュリティ上読み込み禁止の場合はnull。 | |
91 | + * 主要環境変数マップを作成する。 | |
92 | + * | |
93 | + * @return 主要環境変数マップ | |
80 | 94 | */ |
81 | - private static String getSecureProperty(String key){ | |
82 | - String result; | |
83 | - try{ | |
84 | - result = System.getProperty(key); | |
85 | - if(result != null) PROPERTY_MAP.put(key, result); | |
86 | - }catch(SecurityException e){ | |
87 | - result = null; | |
95 | + private static SortedMap<String, String> buildEnvMap(){ | |
96 | + SortedMap<String, String> envmap = new TreeMap<>(); | |
97 | + | |
98 | + for(String name : ENVNAMES){ | |
99 | + String val; | |
100 | + try{ | |
101 | + val = System.getenv(name); | |
102 | + }catch(SecurityException e){ | |
103 | + continue; | |
104 | + } | |
105 | + if(val == null) continue; | |
106 | + envmap.put(name, val); | |
88 | 107 | } |
108 | + | |
109 | + SortedMap<String, String> result; | |
110 | + result = Collections.unmodifiableSortedMap(envmap); | |
111 | + | |
89 | 112 | return result; |
90 | 113 | } |
91 | 114 | |
92 | 115 | /** |
93 | - * 可能なら環境変数を読み込む。 | |
94 | - * @param name 環境変数名 | |
95 | - * @return 環境変数値。セキュリティ上読み込み禁止の場合はnull。 | |
116 | + * 主要システムプロパティ値マップを作成する。 | |
117 | + * | |
118 | + * @return 主要システムプロパティ値マップ | |
96 | 119 | */ |
97 | - private static String getSecureEnvironment(String name){ | |
98 | - String result; | |
99 | - try{ | |
100 | - result = System.getenv(name); | |
101 | - if(result != null) ENVIRONMENT_MAP.put(name, result); | |
102 | - }catch(SecurityException e){ | |
103 | - result = null; | |
120 | + private static SortedMap<String, String> buildPropMap(){ | |
121 | + SortedMap<String, String> propmap = new TreeMap<>(); | |
122 | + | |
123 | + for(String name : PROPNAMES){ | |
124 | + String val; | |
125 | + try{ | |
126 | + val = System.getProperty(name); | |
127 | + }catch(SecurityException e){ | |
128 | + continue; | |
129 | + } | |
130 | + if(val == null) continue; | |
131 | + propmap.put(name, val); | |
104 | 132 | } |
133 | + | |
134 | + SortedMap<String, String> result; | |
135 | + result = Collections.unmodifiableSortedMap(propmap); | |
136 | + | |
137 | + return result; | |
138 | + } | |
139 | + | |
140 | + /** | |
141 | + * クラスパスリストを作成する。 | |
142 | + * | |
143 | + * @param 連結クラスパス値 | |
144 | + * @return クラスパスリスト | |
145 | + */ | |
146 | + private static List<String> buildClassPathList(String classpath){ | |
147 | + String[] pathArray; | |
148 | + if(classpath != null){ | |
149 | + pathArray = classpath.split(File.pathSeparator); | |
150 | + }else{ | |
151 | + pathArray = new String[0]; | |
152 | + } | |
153 | + | |
154 | + List result; | |
155 | + result = Arrays.asList(pathArray); | |
156 | + result = Collections.unmodifiableList(result); | |
157 | + | |
105 | 158 | return result; |
106 | 159 | } |
107 | 160 |
@@ -111,44 +164,74 @@ public final class EnvInfo{ | ||
111 | 164 | */ |
112 | 165 | public static String getVMInfo(){ |
113 | 166 | StringBuilder result = new StringBuilder(); |
114 | - NumberFormat nform = NumberFormat.getNumberInstance(); | |
115 | 167 | |
116 | - result.append("最大ヒープメモリ量: ") | |
117 | - .append(nform.format(MAX_MEMORY)) | |
118 | - .append(" bytes\n"); | |
168 | + String memform = MessageFormat.format(FORM_MEM, MAX_MEMORY); | |
169 | + result.append(memform).append(NL); | |
170 | + | |
171 | + result.append(getSysPropInfo()).append(NL); | |
172 | + result.append(getEnvInfo()).append(NL); | |
173 | + result.append(getClassPathInfo()).append(NL); | |
119 | 174 | |
120 | - result.append("\n"); | |
175 | + return result.toString(); | |
176 | + } | |
121 | 177 | |
178 | + /** | |
179 | + * システムプロパティ要覧を返す。 | |
180 | + * | |
181 | + * <p>java.class.pathの値は除く。 | |
182 | + * | |
183 | + * @return システムプロパティ要覧 | |
184 | + */ | |
185 | + private static CharSequence getSysPropInfo(){ | |
186 | + StringBuilder result = new StringBuilder(); | |
122 | 187 | result.append("主要システムプロパティ:\n"); |
123 | - Set<String> propKeys = PROPERTY_MAP.keySet(); | |
124 | - for(String propKey : propKeys){ | |
125 | - if(propKey.equals("java.class.path")) continue; | |
126 | - String value = PROPERTY_MAP.get(propKey); | |
127 | - result.append(" "); | |
128 | - result.append(propKey).append("=").append(value).append("\n"); | |
129 | - } | |
130 | 188 | |
131 | - result.append("\n"); | |
189 | + PROPERTY_MAP.entrySet().stream() | |
190 | + .filter(entry -> ! entry.getKey().equals("java.class.path")) | |
191 | + .forEachOrdered(entry -> { | |
192 | + result.append(INDENT); | |
193 | + result.append(entry.getKey()); | |
194 | + result.append("="); | |
195 | + result.append(entry.getValue()); | |
196 | + result.append(NL); | |
197 | + }); | |
132 | 198 | |
133 | - result.append("主要環境変数:\n"); | |
134 | - Set<String> envKeys = ENVIRONMENT_MAP.keySet(); | |
135 | - for(String envKey : envKeys){ | |
136 | - String value = ENVIRONMENT_MAP.get(envKey); | |
137 | - result.append(" "); | |
138 | - result.append(envKey).append("=").append(value).append("\n"); | |
139 | - } | |
199 | + return result; | |
200 | + } | |
140 | 201 | |
141 | - result.append("\n"); | |
202 | + /** | |
203 | + * 環境変数要覧を返す。 | |
204 | + * | |
205 | + * @return 環境変数要覧 | |
206 | + */ | |
207 | + private static CharSequence getEnvInfo(){ | |
208 | + StringBuilder result = new StringBuilder("主要環境変数:\n"); | |
209 | + | |
210 | + ENVIRONMENT_MAP.entrySet().stream() | |
211 | + .forEachOrdered(entry -> { | |
212 | + result.append(INDENT); | |
213 | + result.append(entry.getKey()); | |
214 | + result.append('='); | |
215 | + result.append(entry.getValue()); | |
216 | + result.append(NL); | |
217 | + }); | |
142 | 218 | |
143 | - result.append("クラスパス:\n"); | |
144 | - for(String path : CLASSPATHS){ | |
145 | - result.append(" "); | |
146 | - result.append(path).append("\n"); | |
147 | - } | |
219 | + return result; | |
220 | + } | |
148 | 221 | |
149 | - result.append("\n"); | |
222 | + /** | |
223 | + * クラスパス情報要覧を返す。 | |
224 | + * | |
225 | + * @return クラスパス情報要覧 | |
226 | + */ | |
227 | + private static CharSequence getClassPathInfo(){ | |
228 | + StringBuilder result = new StringBuilder("クラスパス:\n"); | |
150 | 229 | |
151 | - return result.toString(); | |
230 | + CLASSPATHS.stream().forEachOrdered(path -> { | |
231 | + result.append(INDENT).append(path).append(NL); | |
232 | + }); | |
233 | + | |
234 | + return result; | |
152 | 235 | } |
153 | 236 | |
154 | 237 | } |