IndentingPrintWriter.java revision 560:dca8c03d693d
1/*
2 * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package build.tools.logutil;
27
28import java.io.PrintWriter ;
29import java.io.Writer ;
30import java.io.OutputStream ;
31import java.io.BufferedWriter ;
32import java.io.OutputStreamWriter ;
33import java.util.StringTokenizer ;
34
35public class IndentingPrintWriter extends PrintWriter {
36    private int level = 0 ;
37    private int indentWidth = 4 ;
38    private String indentString = "" ;
39
40    public void printMsg( String msg, Object... data )
41    {
42        // System.out.println( "printMsg called with msg=" + msg + " data=" + data ) ;
43        StringTokenizer st = new StringTokenizer( msg, "@", true ) ;
44        StringBuffer result = new StringBuffer() ;
45        String token = null ;
46        int pos = 0;
47
48        while (st.hasMoreTokens()) {
49            token = st.nextToken() ;
50            if (token.equals("@")) {
51                if (pos < data.length) {
52                    result.append( data[pos] );
53                    ++pos;
54                } else {
55                    throw new Error( "List too short for message" ) ;
56                }
57            } else {
58                result.append( token ) ;
59            }
60        }
61
62        // System.out.println( "Printing result " + result + " to file" ) ;
63        print( result ) ;
64        println() ;
65    }
66
67    public IndentingPrintWriter (Writer out) {
68        super( out, true ) ;
69        // System.out.println( "Constructing a new IndentingPrintWriter with Writer " + out ) ;
70    }
71
72    public IndentingPrintWriter(Writer out, boolean autoFlush) {
73        super( out, autoFlush ) ;
74        // System.out.println( "Constructing a new IndentingPrintWriter with Writer " + out ) ;
75    }
76
77    public IndentingPrintWriter(OutputStream out) {
78        super(out, true);
79        // System.out.println( "Constructing a new IndentingPrintWriter with OutputStream " + out ) ;
80    }
81
82    public IndentingPrintWriter(OutputStream out, boolean autoFlush) {
83        super(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);
84        // System.out.println( "Constructing a new IndentingPrintWriter with OutputStream " + out ) ;
85    }
86
87    public void setIndentWidth( int indentWidth )
88    {
89        this.indentWidth = indentWidth ;
90        updateIndentString() ;
91    }
92
93    public void indent()
94    {
95        level++ ;
96        updateIndentString() ;
97    }
98
99    public void undent()
100    {
101        if (level > 0) {
102            level-- ;
103            updateIndentString() ;
104        }
105    }
106
107    private void updateIndentString()
108    {
109        int size = level * indentWidth ;
110        StringBuffer sbuf = new StringBuffer( size ) ;
111        for (int ctr = 0; ctr<size; ctr++ )
112            sbuf.append( " " ) ;
113        indentString = sbuf.toString() ;
114    }
115
116    // overridden from PrintWriter
117    public void println()
118    {
119        super.println() ;
120
121        print( indentString ) ;
122    }
123}
124