OSDN Git Service

Set optimal mime types and executable settings.
[mikumikustudio/MikuMikuStudio.git] / src / com / jme / util / logging / BetterFormatter.java
1 package com.jme.util.logging;
2
3 import java.io.PrintWriter;
4 import java.io.StringWriter;
5 import java.text.MessageFormat;
6 import java.util.Date;
7 import java.util.logging.Formatter;
8 import java.util.logging.LogRecord;
9
10 public class BetterFormatter extends Formatter {
11
12     Date dat = new Date();
13 //    private final static String format = "{0,date} {0,time}";
14     private final static String format = "{0,time}";
15     private MessageFormat formatter;
16
17     private Object args[] = new Object[1];
18
19     // Line separator string. This is the value of the line.separator
20     // property at the moment that the SimpleFormatter was created.
21     private String lineSeparator = (String) java.security.AccessController
22             .doPrivileged(new sun.security.action.GetPropertyAction(
23                     "line.separator"));
24
25     /**
26      * Format the given LogRecord.
27      * 
28      * @param record
29      *            the log record to be formatted.
30      * @return a formatted log record
31      */
32     public synchronized String format(LogRecord record) {
33         StringBuffer sb = new StringBuffer();
34         
35         dat.setTime(record.getMillis());
36         args[0] = dat;
37         StringBuffer text = new StringBuffer();
38         if (formatter == null) {
39             formatter = new MessageFormat(format);
40         }
41         formatter.format(args, text, null);
42         sb.append(text);
43
44         sb.append(" [");
45         sb.append(record.getThreadID());
46         sb.append("] ");
47
48         if (record.getSourceClassName() != null) {
49             sb.append(record.getSourceClassName());
50         } else {
51             sb.append(record.getLoggerName());
52         }
53         if (record.getSourceMethodName() != null) {
54             sb.append("->");
55             sb.append(record.getSourceMethodName());
56             sb.append("()");
57         }
58
59         sb.append(" - ");
60         String message = formatMessage(record);
61         sb.append(record.getLevel().getLocalizedName());
62         sb.append(": ");
63         sb.append(message);
64         sb.append(" ");
65
66         Object[] params = record.getParameters();
67         if (params != null) {
68             sb.append("{");
69             for (int i=0; i<params.length; i++) {
70                 sb.append(params[i]);
71                 if (i < params.length - 1) {
72                     sb.append(", ");
73                 }
74             }            
75             sb.append("}");
76 //            sb.append(lineSeparator);
77         }
78         
79         // Find all the threads
80 //        ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
81 //        while (root.getParent() != null) {
82 //            root = root.getParent();
83 //        }
84 //        visit(sb, root, 0);
85
86         if (record.getThrown() != null) {
87             sb.append(lineSeparator);
88             try {
89                 StringWriter sw = new StringWriter();
90                 PrintWriter pw = new PrintWriter(sw);
91                 record.getThrown().printStackTrace(pw);
92                 pw.close();
93                 sb.append(sw.toString());
94             } catch (Exception ex) {
95             }
96         }
97
98         sb.append(lineSeparator);
99
100         return sb.toString();
101     }
102     
103     // This method recursively visits all thread groups under `group'.
104     private void visit(StringBuffer sb, ThreadGroup group, int level) {
105         // Get threads in `group'
106         int numThreads = group.activeCount();
107         Thread[] threads = new Thread[numThreads*2];
108         numThreads = group.enumerate(threads, false);
109     
110         // Enumerate each thread in `group'
111         for (int i=0; i<numThreads; i++) {
112             // Get thread
113             Thread thread = threads[i];
114             
115             sb.append(thread.getName() + "[" + thread.getId() + "]");
116             sb.append(lineSeparator);
117         }
118     
119         // Get thread subgroups of `group'
120         int numGroups = group.activeGroupCount();
121         ThreadGroup[] groups = new ThreadGroup[numGroups*2];
122         numGroups = group.enumerate(groups, false);
123     
124         // Recursively visit each subgroup
125         for (int i=0; i<numGroups; i++) {
126             visit(sb, groups[i], level+1);
127         }
128     }
129 }