1 /* 2 * $Source$ 3 * $Revision$ 4 * 5 * Copyright (C) 2000 William Chesters 6 * 7 * Part of Melati (http://melati.org), a framework for the rapid 8 * development of clean, maintainable web applications. 9 * 10 * Melati is free software; Permission is granted to copy, distribute 11 * and/or modify this software under the terms either: 12 * 13 * a) the GNU General Public License as published by the Free Software 14 * Foundation; either version 2 of the License, or (at your option) 15 * any later version, 16 * 17 * or 18 * 19 * b) any version of the Melati Software License, as published 20 * at http://melati.org 21 * 22 * You should have received a copy of the GNU General Public License and 23 * the Melati Software License along with this program; 24 * if not, write to the Free Software Foundation, Inc., 25 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA to obtain the 26 * GNU General Public License and visit http://melati.org to obtain the 27 * Melati Software License. 28 * 29 * Feel free to contact the Developers of Melati (http://melati.org), 30 * if you would like to work out a different arrangement than the options 31 * outlined here. It is our intention to allow Melati to be used by as 32 * wide an audience as possible. 33 * 34 * This program is distributed in the hope that it will be useful, 35 * but WITHOUT ANY WARRANTY; without even the implied warranty of 36 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 37 * GNU General Public License for more details. 38 * 39 * Contact details for copyright holder: 40 * 41 * William Chesters <williamc At paneris.org> 42 * http://paneris.org/~williamc 43 * Obrechtstraat 114, 2517VX Den Haag, The Netherlands 44 */ 45 package org.melati.util; 46 47 import java.io.PrintWriter; 48 49 /** 50 * A <code>PrintWriter</code> which can throw an <code>Exception</code>. 51 */ 52 public final class ThrowingPrintWriter extends PrintWriter { 53 private PrintWriter pw; 54 55 /** Description of this PrintWriter. */ 56 public final String description; 57 58 /** 59 * Thrown when a programmer attempts to use <code>super.out</code>. 60 */ 61 public static class SuperUseException extends BugException { 62 private static final long serialVersionUID = 1L; 63 /** 64 * Constructor. 65 */ 66 public SuperUseException() { 67 super("ThrowingPrintWriter tried to use super.out"); 68 } 69 } 70 71 /** 72 * Constructor. 73 * @param pw Preint writer to write to 74 * @param description A description 75 */ 76 public ThrowingPrintWriter(PrintWriter pw, String description) { 77 super(pw); 78 this.pw = pw; 79 this.description = description; 80 } 81 82 /** 83 * Thrown if there is a problem writing to this 84 * <code>ThowingPrintWriter</code>. 85 */ 86 public class TroubleException extends MelatiRuntimeException { 87 private static final long serialVersionUID = 1L; 88 /** 89 * {@inheritDoc} 90 * @see org.melati.util.MelatiRuntimeException#getMessage() 91 */ 92 public String getMessage() { 93 return "An exception condition occurred writing to " + 94 (description == null ? "a PrintWriter" : description); 95 } 96 } 97 98 /** 99 * Check for problem and throw it if found. 100 */ 101 public void throwOnTrouble() { 102 if (pw.checkError()) 103 throw new TroubleException(); 104 } 105 106 /** 107 * Delegated method. 108 * {@inheritDoc} 109 * @see java.io.PrintWriter#flush() 110 */ 111 public void flush() { 112 pw.flush(); 113 throwOnTrouble(); 114 } 115 116 /** 117 * Delegated method. 118 * {@inheritDoc} 119 * @see java.io.PrintWriter#close() 120 */ 121 public void close() { 122 pw.close(); 123 throwOnTrouble(); 124 } 125 126 /** 127 * Delegated method. 128 * {@inheritDoc} 129 * @see java.io.PrintWriter#checkError() 130 */ 131 public boolean checkError() { 132 return pw.checkError(); 133 } 134 135 /** 136 * Delegated method. 137 * {@inheritDoc} 138 * @see java.io.PrintWriter#write(int) 139 */ 140 public void write(int c) { 141 pw.write(c); 142 throwOnTrouble(); 143 } 144 145 /** 146 * Delegated method. 147 * {@inheritDoc} 148 * @see java.io.PrintWriter#write(char[], int, int) 149 */ 150 public void write(char buf[], int off, int len) { 151 pw.write(buf, off, len); 152 throwOnTrouble(); 153 } 154 155 /** 156 * Delegated method. 157 * {@inheritDoc} 158 * @see java.io.PrintWriter#write(java.lang.String, int, int) 159 */ 160 public void write(String buf, int off, int len) { 161 pw.write(buf, off, len); 162 throwOnTrouble(); 163 } 164 165 /** 166 * Delegated method. 167 * {@inheritDoc} 168 * @see java.io.PrintWriter#println() 169 */ 170 public void println() { 171 pw.println(); 172 throwOnTrouble(); 173 } 174 }