001 package com.mockrunner.mock.web; 002 003 import java.io.IOException; 004 import java.io.PrintWriter; 005 import java.io.StringWriter; 006 import java.io.Writer; 007 008 import javax.servlet.http.HttpServletResponse; 009 import javax.servlet.jsp.JspWriter; 010 011 import com.mockrunner.base.NestedApplicationException; 012 013 /** 014 * Mock implementation of <code>JspWriter</code>. 015 * Collects the output data. 016 */ 017 public class MockJspWriter extends JspWriter 018 { 019 private PrintWriter printWriter; 020 private Writer writer; 021 private HttpServletResponse response; 022 private boolean providedWriter; 023 024 public MockJspWriter() 025 { 026 super(0, true); 027 this.writer = new StringWriter(); 028 printWriter = new PrintWriter(writer); 029 response = null; 030 providedWriter = false; 031 } 032 033 public MockJspWriter(HttpServletResponse response) throws IOException 034 { 035 super(0, true); 036 this.writer = response.getWriter(); 037 this.response = response; 038 printWriter = new PrintWriter(writer); 039 providedWriter = false; 040 } 041 042 public MockJspWriter(Writer writer) 043 { 044 super(0, true); 045 this.writer = writer; 046 printWriter = new PrintWriter(writer); 047 response = null; 048 providedWriter = true; 049 } 050 051 /** 052 * Returns the output. 053 * @return the output 054 */ 055 public String getOutputAsString() 056 { 057 try 058 { 059 flush(); 060 if(!providedWriter) 061 { 062 if(null == response) 063 { 064 return ((StringWriter)writer).toString(); 065 } 066 if(response instanceof MockHttpServletResponse) 067 { 068 return ((MockHttpServletResponse)response).getOutputStreamContent(); 069 } 070 } 071 return ""; 072 } 073 catch(IOException exc) 074 { 075 throw new NestedApplicationException(exc); 076 } 077 } 078 079 /** 080 * Delegates to {@link #getOutputAsString} 081 */ 082 public String toString() 083 { 084 return getOutputAsString(); 085 } 086 087 /** 088 * Clears the output. This method throws an <code>IOException</code>, 089 * if a <code>Writer</code> was provided according to spec. 090 */ 091 public void clear() throws IOException 092 { 093 if(!providedWriter) 094 { 095 clearWriter(); 096 } 097 else 098 { 099 throw new IOException("Illegal call if writer is provided."); 100 } 101 } 102 103 /** 104 * Clears the output. This method does nothing, 105 * if a <code>Writer</code> was provided according to spec. 106 */ 107 public void clearBuffer() throws IOException 108 { 109 if(!providedWriter) 110 { 111 clearWriter(); 112 } 113 } 114 115 private void clearWriter() throws IOException 116 { 117 if(null == response) 118 { 119 this.writer = new StringWriter(); 120 printWriter = new PrintWriter(writer); 121 } 122 else 123 { 124 flush(); 125 response.resetBuffer(); 126 } 127 } 128 129 public void close() throws IOException 130 { 131 flush(); 132 printWriter.close(); 133 } 134 135 public int getRemaining() 136 { 137 return 0; 138 } 139 140 public void flush() throws IOException 141 { 142 printWriter.flush(); 143 } 144 145 public void newLine() throws IOException 146 { 147 print(System.getProperty("line.separator")); 148 } 149 150 public void print(boolean value) throws IOException 151 { 152 printWriter.print(value); 153 } 154 155 public void print(char value) throws IOException 156 { 157 printWriter.print(value); 158 } 159 160 public void print(char[] value) throws IOException 161 { 162 printWriter.print(value); 163 } 164 165 public void print(double value) throws IOException 166 { 167 printWriter.print(value); 168 } 169 170 public void print(float value) throws IOException 171 { 172 printWriter.print(value); 173 } 174 175 public void print(int value) throws IOException 176 { 177 printWriter.print(value); 178 } 179 180 public void print(long value) throws IOException 181 { 182 printWriter.print(value); 183 } 184 185 public void print(Object value) throws IOException 186 { 187 printWriter.print(value); 188 } 189 190 public void print(String value) throws IOException 191 { 192 printWriter.print(value); 193 } 194 195 public void println() throws IOException 196 { 197 printWriter.println(); 198 } 199 200 public void println(boolean value) throws IOException 201 { 202 printWriter.println(value); 203 } 204 205 public void println(char value) throws IOException 206 { 207 printWriter.println(value); 208 } 209 210 public void println(char[] value) throws IOException 211 { 212 printWriter.println(value); 213 } 214 215 public void println(double value) throws IOException 216 { 217 printWriter.println(value); 218 } 219 220 public void println(float value) throws IOException 221 { 222 printWriter.println(value); 223 } 224 225 public void println(int value) throws IOException 226 { 227 printWriter.println(value); 228 } 229 230 public void println(long value) throws IOException 231 { 232 printWriter.println(value); 233 } 234 235 public void println(Object value) throws IOException 236 { 237 printWriter.println(value); 238 } 239 240 public void println(String value) throws IOException 241 { 242 printWriter.println(value); 243 } 244 245 public void write(char[] cbuf, int off, int len) throws IOException 246 { 247 printWriter.write(cbuf, off, len); 248 } 249 }