package bs.util.tool.commongui.plugins;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.SortedMap;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import bs.util.tool.commongui.GuiJPanel;
import bs.util.tool.commongui.GuiUtils;
/**
* 系统信息.
*/
public class SystemInformation extends GuiJPanel {
private static final long serialVersionUID = 1L;
/**
* 查询类别.
*/
private String[] searchTypes = new String[] { "Overview", "Running Status", "System Properties", "Support Charsets",
"Support Fonts" };
/**
* 当前查询类别.
*/
private String curSearchType = searchTypes[0];
/**
* 输出文本域.
*/
private JTextArea textArea = createJTextArea(GuiUtils.font14_cn);
public SystemInformation() {
// 主面板:边界布局,分North、Center两部分,North用于放置条件控件,Center是放置输出
setLayout(new BorderLayout());
JPanel topPanel = new JPanel(new FlowLayout());
add(topPanel, BorderLayout.NORTH);
add(new JScrollPane(textArea), BorderLayout.CENTER);
// North面板
addJLabel(topPanel, "Search Type:", GuiUtils.font14b);
// 查询类别下拉框
addJComboBox(topPanel, searchTypes, GuiUtils.font13, new ActionListener() {
public void actionPerformed(ActionEvent event) {
curSearchType = ((JComboBox) event.getSource()).getSelectedItem().toString();
}
});
addJLabel(topPanel, " ", GuiUtils.font14b);
addJButton(topPanel, " Search ", "", GuiUtils.font14b, new MouseListener() {
public void mouseReleased(MouseEvent e) {
int typeLen = searchTypes.length;
String text = "";
if (searchTypes[typeLen - 5].equals(curSearchType)) {
text = getSystemOverview();
} else if (searchTypes[typeLen - 4].equals(curSearchType)) {
text = getRunningStatus();
} else if (searchTypes[typeLen - 3].equals(curSearchType)) {
text = getSystemProperties();
} else if (searchTypes[typeLen - 2].equals(curSearchType)) {
text = getAvailableCharsets();
} else if (searchTypes[typeLen - 1].equals(curSearchType)) {
text = getAvailableFonts();
}
textArea.append(text);
}
public void mousePressed(MouseEvent e) {
// clear文本域
textArea.setText("");
}
public void mouseExited(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
});
}
/**
* System Information Overview.
*/
private String getSystemOverview() {
StringBuilder sb = new StringBuilder();
sb.append("\n").append(
getPropertiesString(new String[] { "java.runtime.name", "java.runtime.version", "java.vm.name" }));
sb.append("\n").append(
getPropertiesString(new String[] { "os.name", "os.version", "sun.os.patch.level", "os.arch",
"sun.arch.data.model" }));
sb.append("\n").append(
getPropertiesString(new String[] { "user.home", "user.dir", "user.name", "user.timezone",
"user.language", "user.country", "user.variant" }));
sb.append("\n").append(getPropertiesString(new String[] { "java.home", "java.io.tmpdir" }));
sb.append("\n").append(
getPropertiesString(new String[] { "path.separator", "file.separator", "line.separator" }));
sb.append("\n").append(
getPropertiesString(new String[] { "file.encoding", "file.encoding.pkg", "sun.jnu.encoding",
"sun.cpu.endian", "sun.io.unicode.encoding", "sun.cpu.isalist" }));
sb.append("\n").append(
getPropertiesString(new String[] { "sun.boot.library.path", "sun.boot.class.path", "java.ext.dirs",
"java.endorsed.dirs", "java.library.path", "java.class.path" }));
sb.append("\n").append(
getPropertiesString(new String[] { "sun.desktop", "awt.toolkit", "java.awt.graphicsenv",
"java.awt.printerjob" }));
sb.append("\n").append(
getPropertiesString(new String[] { "java.version", "java.vm.info", "java.vm.version",
"java.class.version", "sun.java.launcher", "sun.management.compiler" }));
sb.append("\n").append(
getPropertiesString(new String[] { "java.specification.name", "java.specification.vendor",
"java.specification.version", "java.vendor", "java.vendor.url", "java.vendor.url.bug" }));
sb.append("\n").append(
getPropertiesString(new String[] { "java.vm.specification.name", "java.vm.specification.vendor",
"java.vm.specification.version", "java.vm.vendor" }));
return sb.substring(1);
}
private String getPropertiesString(String[] keys) {
StringBuilder sb = new StringBuilder();
for (String key : keys) {
sb.append("\n").append(GuiUtils.getFillUpString(key, 32));
String value = System.getProperty(key);
if ("line.separator".equals(key)) {
sb.append(value.replace("\n", "\\n").replace("\r", "\\r"));
} else {
sb.append(value);
}
}
return sb.toString();
}
/**
* 虚拟机运行情况.
*/
private String getRunningStatus() {
StringBuilder sb = new StringBuilder();
// 虚拟机开始及总运行时间
RuntimeMXBean runBean = ManagementFactory.getRuntimeMXBean();
sb.append("\n").append(GuiUtils.getFillUpString("Current Time", 32)).append(new Date());
sb.append("\n").append(GuiUtils.getFillUpString("Start Time", 32)).append(new Date(runBean.getStartTime()));
sb.append("\n").append(GuiUtils.getFillUpString("Run Time", 32))
.append(GuiUtils.getCountTime(runBean.getUptime()));
sb.append("\n");
// 操作系统可用处理器数目
OperatingSystemMXBean operateBean = ManagementFactory.getOperatingSystemMXBean();
sb.append("\n").append(GuiUtils.getFillUpString("System Processors", 32))
.append(operateBean.getAvailableProcessors());
// 内存使用情况
MemoryMXBean memBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapMem = memBean.getHeapMemoryUsage();
MemoryUsage nonHeapMem = memBean.getNonHeapMemoryUsage();
sb.append("\n");
sb.append("\n").append(GuiUtils.getFillUpString("Heap Used", 32)).append(getMemoey(heapMem.getUsed()));
sb.append("\n").append(GuiUtils.getFillUpString("Heap Committed", 32))
.append(getMemoey(heapMem.getCommitted()));
sb.append("\n").append(GuiUtils.getFillUpString("Heap Init", 32)).append(getMemoey(heapMem.getInit()));
sb.append("\n").append(GuiUtils.getFillUpString("Heap Max", 32)).append(getMemoey(heapMem.getMax()));
sb.append("\n");
sb.append("\n").append(GuiUtils.getFillUpString("NonHeap Used", 32)).append(getMemoey(nonHeapMem.getUsed()));
sb.append("\n").append(GuiUtils.getFillUpString("NonHeap Committed", 32))
.append(getMemoey(nonHeapMem.getCommitted()));
sb.append("\n").append(GuiUtils.getFillUpString("NonHeap Init", 32)).append(getMemoey(nonHeapMem.getInit()));
sb.append("\n").append(GuiUtils.getFillUpString("NonHeap Max", 32)).append(getMemoey(nonHeapMem.getMax()));
sb.append("\n");
Runtime curRuntime = Runtime.getRuntime();
sb.append("\n").append(GuiUtils.getFillUpString("Free Memory", 32))
.append(getMemoey(curRuntime.freeMemory()));
sb.append("\n").append(GuiUtils.getFillUpString("Total Memory", 32))
.append(getMemoey(curRuntime.totalMemory()));
sb.append("\n").append(GuiUtils.getFillUpString("Max Memory", 32)).append(getMemoey(curRuntime.maxMemory()));
// 当前运行线程
sb.append("\n");
sb.append("\n").append(GuiUtils.getFillUpString(" Thread Name", 32)).append("Thread ID");
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
long[] threads = threadBean.getAllThreadIds();
ThreadInfo[] threadInfos = threadBean.getThreadInfo(threads);
for (int i = threadInfos.length - 1; i > -1; i--) {
sb.append("\n").append(GuiUtils.getFillUpString(threadInfos[i].getThreadName(), 32))
.append(threadInfos[i].getThreadId());
}
return sb.toString();
}
private String getMemoey(long mem) {
return (double) mem / (1024.0 * 1024.0) + "M";
}
/**
* System.getProperties().
*/
private String getSystemProperties() {
StringBuilder sb = new StringBuilder();
Properties properties = System.getProperties();
Set<Object> sets = properties.keySet();
List<String> keys = new ArrayList<String>();
for (Object key : sets) {
keys.add((String) key);
}
Collections.sort(keys);
for (String key : keys) {
sb.append("\n").append(GuiUtils.getFillUpString(key, 32));
String value = properties.getProperty(key);
if ("line.separator".equals(key)) {
sb.append(value.replace("\n", "\\n").replace("\r", "\\r"));
} else {
sb.append(value);
}
}
sb.append("\n\nCount " + sets.size() + " Properties.\n");
return sb.substring(1);
}
/**
* JDK 1.6 中文 API Charset类说明: Java 编程语言的本机字符编码方案是 UTF-16。因此 Java 平台的 charset 定义了 16 位 UTF-16 代码单元序列和字节序列之间的映射关系.
*/
private String getAvailableCharsets() {
int interval = 5;
StringBuilder sb = new StringBuilder();
SortedMap<String, Charset> map = GuiUtils.availableCharsets();
int i = 0; // 首字母小写对应ASCII的十进制值
int i_o = 0; // 上一个首字母小写对应ASCII的十进制值
int l = 0; // 同一字母开头的字符集数目过多, 则10个分一行
for (String key : map.keySet()) {
i = (key.substring(0, 1).toLowerCase()).toCharArray()[0];
if (i_o != 0 && i_o != i) {
i_o = i;
if (l % interval != 0) {
sb.append("\n");
}
l = 0;
}
sb.append(GuiUtils.getFillUpString(key, 22));
l++;
if (i_o == i && l % interval == 0) {
sb.append("\n");
}
if (i_o == 0) {
i_o = i;
}
}
sb.append("\n\nCount " + map.size() + " Charsets.\n");
return sb.toString();
}
/**
* 支持字体.
*/
private String getAvailableFonts() {
StringBuilder sb = new StringBuilder();
Font[] fonts = GuiUtils.availableFonts();
List<String> names = new ArrayList<String>();
for (Font font : fonts) {
names.add(font.getFontName());
}
Collections.sort(names); // 排序
int i = 0;
for (String name : names) {
sb.append(GuiUtils.getFillUpString(name, 42));
i++;
if (i % 3 == 0) {
sb.append("\n");
}
}
sb.append("\n\nCount " + fonts.length + " Fonts.\n");
return sb.toString();
}
}