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 015 package org.apache.hivemind.service; 016 017 import 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 025 public 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 }