001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.hivemind.service;
016
017import java.text.MessageFormat;
018
019/**
020 * Utility class for assembling the <em>body</em> used with Javassist as a method or catch block.
021 * 
022 * @author Howard Lewis Ship
023 */
024
025public class BodyBuilder
026{
027    /**
028     * Feels right for the size of a typical body.
029     */
030    private static final int DEFAULT_LENGTH = 200;
031
032    private static final char QUOTE = '"';
033
034    private StringBuffer _buffer = new StringBuffer(DEFAULT_LENGTH);
035
036    private static final String INDENT = "  ";
037
038    private int _nestingDepth = 0;
039
040    private boolean _atNewLine = true;
041
042    /**
043     * Clears the builder, returning it to its initial, empty state.
044     */
045    public void clear()
046    {
047        _nestingDepth = 0;
048        _atNewLine = true;
049        _buffer.setLength(0);
050    }
051
052    /**
053     * Adds text to the current line, without terminating the line.
054     */
055    public void add(String text)
056    {
057        indent();
058
059        _buffer.append(text);
060    }
061
062    /**
063     * Adds text to the current line, without terminating the line.
064     * 
065     * @param pattern
066     *            a string pattern, used with
067     *            {@link java.text.MessageFormat#format(java.lang.String, java.lang.Object[])}
068     * @param arguments
069     *            arguments used witht the format string
070     */
071
072    public void add(String pattern, Object[] arguments)
073    {
074        add(MessageFormat.format(pattern, arguments));
075    }
076
077    /**
078     * Convience for {@link #add(String, Object[])}
079     */
080
081    public void add(String pattern, Object arg0)
082    {
083        add(pattern, new Object[]
084        { arg0 });
085    }
086
087    /**
088     * Convience for {@link #add(String, Object[])}
089     */
090
091    public void add(String pattern, Object arg0, Object arg1)
092    {
093        add(pattern, new Object[]
094        { arg0, arg1 });
095    }
096
097    /**
098     * Convience for {@link #add(String, Object[])}
099     */
100
101    public void add(String pattern, Object arg0, Object arg1, Object arg2)
102    {
103        add(pattern, new Object[]
104        { arg0, arg1, arg2 });
105    }
106
107    /**
108     * Adds text to the current line then terminates the line.
109     * 
110     * @param pattern
111     *            a string pattern, used with
112     *            {@link java.text.MessageFormat#format(java.lang.String, java.lang.Object[])}
113     * @param arguments
114     *            arguments used witht the format string
115     */
116
117    public void addln(String pattern, Object[] arguments)
118    {
119        addln(MessageFormat.format(pattern, arguments));
120    }
121
122    /**
123     * Convience for {@link #addln(String, Object[])}
124     */
125
126    public void addln(String pattern, Object arg0)
127    {
128        addln(pattern, new Object[]
129        { arg0 });
130    }
131
132    /**
133     * Convience for {@link #addln(String, Object[])}.
134     */
135
136    public void addln(String pattern, Object arg0, Object arg1)
137    {
138        addln(pattern, new Object[]
139        { arg0, arg1 });
140    }
141
142    /**
143     * Convience for {@link #addln(String, Object[])}.
144     */
145
146    public void addln(String pattern, Object arg0, Object arg1, Object arg2)
147    {
148        addln(pattern, new Object[]
149        { arg0, arg1, arg2 });
150    }
151
152    /**
153     * Adds the text to the current line, surrounded by double quotes.
154     * <em>Does not escape quotes in the text</em>.
155     */
156
157    public void addQuoted(String text)
158    {
159        indent();
160        _buffer.append(QUOTE);
161        _buffer.append(text);
162        _buffer.append(QUOTE);
163    }
164
165    /**
166     * Adds the text to the current line, and terminates the line.
167     */
168
169    public void addln(String text)
170    {
171        add(text);
172
173        newline();
174    }
175
176    private void newline()
177    {
178        _buffer.append("\n");
179        _atNewLine = true;
180    }
181
182    /**
183     * Begins a new block. Emits a "{", properly indented, on a new line.
184     */
185    public void begin()
186    {
187        if (!_atNewLine)
188            newline();
189
190        indent();
191        _buffer.append("{");
192        newline();
193
194        _nestingDepth++;
195    }
196
197    /**
198     * Ends the current block. Emits a "}", propertly indented, on a new line.
199     */
200    public void end()
201    {
202        if (!_atNewLine)
203            newline();
204
205        _nestingDepth--;
206
207        indent();
208        _buffer.append("}");
209
210        newline();
211    }
212
213    private void indent()
214    {
215        if (_atNewLine)
216        {
217            for (int i = 0; i < _nestingDepth; i++)
218                _buffer.append(INDENT);
219
220            _atNewLine = false;
221        }
222    }
223
224    /**
225     * Returns the current contents of the buffer.
226     */
227    public String toString()
228    {
229        return _buffer.toString();
230    }
231}