1 /* 2 * $Id$ 3 * 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 package org.apache.struts.util; 22 23 import jakarta.servlet.ServletContext; 24 25 import java.io.PrintWriter; 26 import java.io.StringWriter; 27 28 /** 29 * A PrintWriter implementation that uses the logging facilities of a 30 * <code>jakarta.servlet.ServletContext</code> to output its results. Output 31 * will be buffered until a newline character is output, <code>flush()</code> 32 * is called, or until one of the <code>println()</code> methods is called. 33 * Along the way, carriage return characters are skipped. 34 * 35 * @version $Rev$ $Date: 2005-05-07 12:11:38 -0400 (Sat, 07 May 2005) 36 * $ 37 */ 38 public class ServletContextWriter extends PrintWriter { 39 // ------------------------------------------------------------- Properties 40 41 /** 42 * The buffer into which we accumulate lines to be logged. 43 */ 44 protected StringBuffer buffer = new StringBuffer(); 45 46 /** 47 * The servlet context with which we are associated. 48 */ 49 protected ServletContext context = null; 50 51 /** 52 * The error state for this stream. 53 */ 54 protected boolean error = false; 55 56 // ----------------------------------------------------------- Constructors 57 58 /** 59 * Construct a ServletContextWriter associated with the specified 60 * ServletContext instance. 61 * 62 * @param context The associated servlet context 63 */ 64 public ServletContextWriter(ServletContext context) { 65 super(new StringWriter()); 66 this.context = context; 67 } 68 69 // --------------------------------------------------------- Public Methods 70 71 /** 72 * Flush the stream and check for its error state. <strong>IMPLEMENTATION 73 * NOTE</strong> - our associated servlet context gives no indication of 74 * problems with logging, so the only way this method will return 75 * <code>true</code> is if <code>setError()</code> is called. 76 */ 77 public boolean checkError() { 78 flush(); 79 80 return (error); 81 } 82 83 /** 84 * Close the stream. 85 */ 86 public void close() { 87 flush(); 88 } 89 90 /** 91 * Flush the stream. 92 */ 93 public void flush() { 94 if (buffer.length() > 0) { 95 context.log(buffer.toString()); 96 buffer.setLength(0); 97 } 98 } 99 100 /** 101 * Print a boolean value. 102 * 103 * @param b The value to be printed 104 */ 105 public void print(boolean b) { 106 write(String.valueOf(b)); 107 } 108 109 /** 110 * Print a character value. 111 * 112 * @param c The value to be printed 113 */ 114 public void print(char c) { 115 write(c); 116 } 117 118 /** 119 * Print a character array. 120 * 121 * @param c The character array to be printed 122 */ 123 public void print(char[] c) { 124 for (int i = 0; i < c.length; i++) { 125 write(c[i]); 126 } 127 } 128 129 /** 130 * Print a double value. 131 * 132 * @param d The value to be printed 133 */ 134 public void print(double d) { 135 write(String.valueOf(d)); 136 } 137 138 /** 139 * Print a float value. 140 * 141 * @param f The value to be printed 142 */ 143 public void print(float f) { 144 write(String.valueOf(f)); 145 } 146 147 /** 148 * Print an integer value. 149 * 150 * @param i The value to be printed 151 */ 152 public void print(int i) { 153 write(String.valueOf(i)); 154 } 155 156 /** 157 * Print a long value. 158 * 159 * @param l The value to be printed 160 */ 161 public void print(long l) { 162 write(String.valueOf(l)); 163 } 164 165 /** 166 * Print an object. 167 * 168 * @param o The value to be printed 169 */ 170 public void print(Object o) { 171 write(o.toString()); 172 } 173 174 /** 175 * Print a String value. 176 * 177 * @param s The value to be printed 178 */ 179 public void print(String s) { 180 int len = s.length(); 181 182 for (int i = 0; i < len; i++) { 183 write(s.charAt(i)); 184 } 185 } 186 187 /** 188 * Terminate the current line and flush the buffer. 189 */ 190 public void println() { 191 flush(); 192 } 193 194 /** 195 * Print a boolean value and terminate the line. 196 * 197 * @param b The value to be printed 198 */ 199 public void println(boolean b) { 200 println(String.valueOf(b)); 201 } 202 203 /** 204 * Print a character value and terminate the line. 205 * 206 * @param c The value to be printed 207 */ 208 public void println(char c) { 209 write(c); 210 println(); 211 } 212 213 /** 214 * Print a character array and terminate the line. 215 * 216 * @param c The character array to be printed 217 */ 218 public void println(char[] c) { 219 for (int i = 0; i < c.length; i++) { 220 print(c[i]); 221 } 222 223 println(); 224 } 225 226 /** 227 * Print a double value and terminate the line. 228 * 229 * @param d The value to be printed 230 */ 231 public void println(double d) { 232 println(String.valueOf(d)); 233 } 234 235 /** 236 * Print a float value and terminate the line. 237 * 238 * @param f The value to be printed 239 */ 240 public void println(float f) { 241 println(String.valueOf(f)); 242 } 243 244 /** 245 * Print an integer value and terminate the line. 246 * 247 * @param i The value to be printed 248 */ 249 public void println(int i) { 250 println(String.valueOf(i)); 251 } 252 253 /** 254 * Print a long value and terminate the line. 255 * 256 * @param l The value to be printed 257 */ 258 public void println(long l) { 259 println(String.valueOf(l)); 260 } 261 262 /** 263 * Print an object and terminate the line. 264 * 265 * @param o The value to be printed 266 */ 267 public void println(Object o) { 268 println(o.toString()); 269 } 270 271 /** 272 * Print a String value and terminate the line. 273 * 274 * @param s The value to be printed 275 */ 276 public void println(String s) { 277 int len = s.length(); 278 279 for (int i = 0; i < len; i++) { 280 print(s.charAt(i)); 281 } 282 283 println(); 284 } 285 286 /** 287 * Set the error state for this stream. 288 */ 289 public void setError() { 290 this.error = true; 291 } 292 293 /** 294 * Write a single character to this stream. 295 * 296 * @param c The character to be written 297 */ 298 public void write(char c) { 299 if (c == '\n') { 300 flush(); 301 } else if (c != '\r') { 302 buffer.append(c); 303 } 304 } 305 306 /** 307 * Write a single character to this stream. 308 * 309 * @param c The character to be written 310 */ 311 public void write(int c) { 312 write((char) c); 313 } 314 315 /** 316 * Write an array of charaters to this stream. 317 * 318 * @param buf The character array to be written 319 */ 320 public void write(char[] buf) { 321 for (int i = 0; i < buf.length; i++) { 322 write(buf[i]); 323 } 324 } 325 326 /** 327 * Write the specified subset of an array of characters to this stream. 328 * 329 * @param buf The character array from which to write 330 * @param off The zero-relative starting offset to write 331 * @param len The number of characters to write 332 */ 333 public void write(char[] buf, int off, int len) { 334 for (int i = off; i < len; i++) { 335 write(buf[i]); 336 } 337 } 338 339 /** 340 * Write a String to this stream. 341 * 342 * @param s The string to be written 343 */ 344 public void write(String s) { 345 int len = s.length(); 346 347 for (int i = 0; i < len; i++) { 348 write(s.charAt(i)); 349 } 350 } 351 352 /** 353 * Write the specified portion of a String to this stream. 354 * 355 * @param s The String from which to write 356 * @param off The zero-relative starting offset to write 357 * @param len The number of characters to write 358 */ 359 public void write(String s, int off, int len) { 360 for (int i = off; i < len; i++) { 361 write(s.charAt(i)); 362 } 363 } 364 }