Source code: er/extensions/ERXNSPrintWriterLogger.java
1 //
2 // ERXNSPrintWriterLogger.java
3 // Project ERExtensions
4 //
5 // Created by tatsuya on Wed Aug 21 2002
6 //
7 package er.extensions;
8
9 import com.webobjects.foundation.*;
10 import java.io.PrintWriter;
11 import java.io.PrintStream;
12 import java.io.OutputStreamWriter;
13 import java.io.ByteArrayOutputStream;
14
15 /**
16 * <code>ERXNSPrintWriterLogger</code> is an alternative of
17 * {@link com.webobjects.foundation.NSLog.PrintStreamLogger NSLog.PrintStreamLogger}
18 * but accepts character oriented {@link java.io.PrintWriter} instead of
19 * byte oriented {@link java.io.PrintStream}
20 * so that the character encoding for logging can be
21 * explicitly set.
22 * <p>
23 * Usage:
24 * <pre>
25 * // Create a PrintWriter with Japanese "SJIS" encoding.
26 * OutputStreamWriter sjisOutWriter = new OutputStreamWriter(new FileOutputStream("app.log"), "SJIS");
27 * PrintWriter sjisPrintWriter = new PrintWriter(sjisOutWriter, true);
28 *
29 * // Create a logger then set it to NSLog.
30 * NSLog.Logger logger = new ERXNSPrintWriterLogger(sjisPrintWriter);
31 * NSLog.setDebug(logger);
32 * NSLog.setOut(logger);
33 * NSLog.setErr(logger);
34 * </pre>
35 */
36 public class ERXNSPrintWriterLogger extends NSLog.Logger {
37
38 /** java.io.PrintWriter to print logs */
39 private PrintWriter _printWriter;
40
41 /**
42 * Apple built-in logger, used internally to generate
43 * a vervose header "[2002-08-31 09:01:00 EDT] <main> "
44 */
45 private NSLog.PrintStreamLogger _vervoseStreamLogger;
46
47 /** an output from _vervoseStreamLogger */
48 private ByteArrayOutputStream _verboseHeaderStream;
49
50 public ERXNSPrintWriterLogger() {
51 _printWriter = new PrintWriter(System.out);
52 }
53
54 public ERXNSPrintWriterLogger(PrintWriter printWriter) {
55 _printWriter = printWriter;
56 }
57
58 public ERXNSPrintWriterLogger(PrintStream printStream) {
59 _printWriter = new PrintWriter(printStream);
60 }
61
62 public ERXNSPrintWriterLogger(String encodingName) throws java.io.UnsupportedEncodingException {
63 _printWriter = new PrintWriter(new OutputStreamWriter(System.out, encodingName));
64 }
65
66 public void appendln() {
67 if (isEnabled())
68 _printWriter.println();
69 }
70
71 public void appendln(Object object) {
72 if (isEnabled()) {
73 if (isVerbose())
74 _printWriter.print(_verboseHeader());
75 _printWriter.println(object);
76 }
77 }
78
79 public void flush() {
80 _printWriter.flush();
81 }
82
83 private String _verboseHeader() {
84 _verboseHeaderStream().reset(); // clear the stream.
85
86 // NSLog.PrintStreamLogger will set below to _verboseHeaderStream ByteArrayOutputStream:
87 // "[2002-08-31 09:01:00 EDT] <main> " + " " + "\n"
88 _vervoseStreamLogger().appendln(" ");
89 String verboseHeader = _verboseHeaderStream().toString();
90
91 // remove " \n" at the end of line
92 int lastIndex = verboseHeader.lastIndexOf(" \n");
93 if (lastIndex > 0) // ignores if " \n" is the first char (lastIndex == 0)
94 verboseHeader = verboseHeader.substring(0, lastIndex);
95 return verboseHeader;
96 }
97
98 private ByteArrayOutputStream _verboseHeaderStream() {
99 if (_verboseHeaderStream == null)
100 _verboseHeaderStream = new ByteArrayOutputStream("[2002-08-31 09:01:00 EDT] <main> ".length() + 20);
101 return _verboseHeaderStream;
102 }
103
104 private NSLog.PrintStreamLogger _vervoseStreamLogger() {
105 if (_vervoseStreamLogger == null)
106 _vervoseStreamLogger = new NSLog.PrintStreamLogger(new PrintStream(_verboseHeaderStream()));
107 return _vervoseStreamLogger;
108 }
109
110 }