OSDN Git Service

1ce75a564a75e3c995a086505bb998f6d9161225
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / config / EnvInfo.java
1 /*
2  * environment information
3  *
4  * License : The MIT License
5  * Copyright(c) 2009 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.config;
9
10 import java.io.File;
11 import java.text.MessageFormat;
12 import java.util.Arrays;
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.SortedMap;
16 import java.util.TreeMap;
17
18 /**
19  * 実行環境に関する各種情報。
20  */
21 public final class EnvInfo{
22
23     /** OS名。 */
24     public static final String OS_NAME;
25     /** OSバージョン。 */
26     public static final String OS_VERSION;
27     /** アーキテクチャ種別。 */
28     public static final String OS_ARCH;
29     /** Java実行系ベンダ。 */
30     public static final String JAVA_VENDOR;
31     /** Java実行形バージョン。 */
32     public static final String JAVA_VERSION;
33
34     /** 最大ヒープメモリ。 */
35     public static final long MAX_MEMORY;
36
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';
63
64     static{
65         Runtime runtime = Runtime.getRuntime();
66         MAX_MEMORY = runtime.maxMemory();
67
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");
76
77         String classpath = PROPERTY_MAP.get("java.class.path");
78         CLASSPATHS = buildClassPathList(classpath);
79     }
80
81
82     /**
83      * 隠れコンストラクタ。
84      */
85     private EnvInfo(){
86         assert false;
87     }
88
89
90     /**
91      * 主要環境変数マップを作成する。
92      *
93      * @return 主要環境変数マップ
94      */
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);
107         }
108
109         SortedMap<String, String> result;
110         result = Collections.unmodifiableSortedMap(envmap);
111
112         return result;
113     }
114
115     /**
116      * 主要システムプロパティ値マップを作成する。
117      *
118      * @return 主要システムプロパティ値マップ
119      */
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);
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
158         return result;
159     }
160
161     /**
162      * VM詳細情報を文字列化する。
163      * @return VM詳細情報
164      */
165     public static String getVMInfo(){
166         StringBuilder result = new StringBuilder();
167
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);
174
175         return result.toString();
176     }
177
178     /**
179      * システムプロパティ要覧を返す。
180      *
181      * <p>java.class.pathの値は除く。
182      *
183      * @return システムプロパティ要覧
184      */
185     private static CharSequence getSysPropInfo(){
186         StringBuilder result = new StringBuilder();
187         result.append("主要システムプロパティ:\n");
188
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                 });
198
199         return result;
200     }
201
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                 });
218
219         return result;
220     }
221
222     /**
223      * クラスパス情報要覧を返す。
224      *
225      * @return クラスパス情報要覧
226      */
227     private static CharSequence getClassPathInfo(){
228         StringBuilder result = new StringBuilder("クラスパス:\n");
229
230         CLASSPATHS.stream().forEachOrdered(path -> {
231             result.append(INDENT).append(path).append(NL);
232         });
233
234         return result;
235     }
236
237 }