Mercurial Hosting > luan
comparison src/org/eclipse/jetty/io/UncheckedPrintWriter.java @ 802:3428c60d7cfc
replace jetty jars with source
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 07 Sep 2016 21:15:48 -0600 |
parents | |
children | 8e9db0bbf4f9 |
comparison
equal
deleted
inserted
replaced
801:6a21393191c1 | 802:3428c60d7cfc |
---|---|
1 // | |
2 // ======================================================================== | |
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. | |
4 // ------------------------------------------------------------------------ | |
5 // All rights reserved. This program and the accompanying materials | |
6 // are made available under the terms of the Eclipse Public License v1.0 | |
7 // and Apache License v2.0 which accompanies this distribution. | |
8 // | |
9 // The Eclipse Public License is available at | |
10 // http://www.eclipse.org/legal/epl-v10.html | |
11 // | |
12 // The Apache License v2.0 is available at | |
13 // http://www.opensource.org/licenses/apache2.0.php | |
14 // | |
15 // You may elect to redistribute this code under either of these licenses. | |
16 // ======================================================================== | |
17 // | |
18 | |
19 package org.eclipse.jetty.io; | |
20 | |
21 import java.io.BufferedWriter; | |
22 import java.io.IOException; | |
23 import java.io.InterruptedIOException; | |
24 import java.io.OutputStream; | |
25 import java.io.OutputStreamWriter; | |
26 import java.io.PrintWriter; | |
27 import java.io.Writer; | |
28 | |
29 import org.eclipse.jetty.util.log.Log; | |
30 import org.eclipse.jetty.util.log.Logger; | |
31 | |
32 /* ------------------------------------------------------------ */ | |
33 /** | |
34 * A wrapper for the {@link java.io.PrintWriter} that re-throws the instances of | |
35 * {@link java.io.IOException} thrown by the underlying implementation of | |
36 * {@link java.io.Writer} as {@link RuntimeIOException} instances. | |
37 */ | |
38 public class UncheckedPrintWriter extends PrintWriter | |
39 { | |
40 private static final Logger LOG = Log.getLogger(UncheckedPrintWriter.class); | |
41 | |
42 private boolean _autoFlush = false; | |
43 private IOException _ioException; | |
44 private boolean _isClosed = false; | |
45 | |
46 /* ------------------------------------------------------------ */ | |
47 /** | |
48 * Line separator string. This is the value of the line.separator property | |
49 * at the moment that the stream was created. | |
50 */ | |
51 private String _lineSeparator; | |
52 | |
53 public UncheckedPrintWriter(Writer out) | |
54 { | |
55 this(out,false); | |
56 } | |
57 | |
58 /* ------------------------------------------------------------ */ | |
59 /** | |
60 * Create a new PrintWriter. | |
61 * | |
62 * @param out | |
63 * A character-output stream | |
64 * @param autoFlush | |
65 * A boolean; if true, the println() methods will flush the | |
66 * output buffer | |
67 */ | |
68 public UncheckedPrintWriter(Writer out, boolean autoFlush) | |
69 { | |
70 super(out,autoFlush); | |
71 this._autoFlush = autoFlush; | |
72 this._lineSeparator = System.getProperty("line.separator"); | |
73 } | |
74 | |
75 /* ------------------------------------------------------------ */ | |
76 /** | |
77 * Create a new PrintWriter, without automatic line flushing, from an | |
78 * existing OutputStream. This convenience constructor creates the necessary | |
79 * intermediate OutputStreamWriter, which will convert characters into bytes | |
80 * using the default character encoding. | |
81 * | |
82 * @param out | |
83 * An output stream | |
84 * | |
85 * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream) | |
86 */ | |
87 public UncheckedPrintWriter(OutputStream out) | |
88 { | |
89 this(out,false); | |
90 } | |
91 | |
92 /* ------------------------------------------------------------ */ | |
93 /** | |
94 * Create a new PrintWriter from an existing OutputStream. This convenience | |
95 * constructor creates the necessary intermediate OutputStreamWriter, which | |
96 * will convert characters into bytes using the default character encoding. | |
97 * | |
98 * @param out | |
99 * An output stream | |
100 * @param autoFlush | |
101 * A boolean; if true, the println() methods will flush the | |
102 * output buffer | |
103 * | |
104 * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream) | |
105 */ | |
106 public UncheckedPrintWriter(OutputStream out, boolean autoFlush) | |
107 { | |
108 this(new BufferedWriter(new OutputStreamWriter(out)),autoFlush); | |
109 } | |
110 | |
111 | |
112 /* ------------------------------------------------------------ */ | |
113 public boolean checkError() | |
114 { | |
115 return _ioException!=null || super.checkError(); | |
116 } | |
117 | |
118 /* ------------------------------------------------------------ */ | |
119 private void setError(Throwable th) | |
120 { | |
121 | |
122 super.setError(); | |
123 | |
124 if (th instanceof IOException) | |
125 _ioException=(IOException)th; | |
126 else | |
127 { | |
128 _ioException=new IOException(String.valueOf(th)); | |
129 _ioException.initCause(th); | |
130 } | |
131 | |
132 LOG.debug(th); | |
133 } | |
134 | |
135 | |
136 @Override | |
137 protected void setError() | |
138 { | |
139 setError(new IOException()); | |
140 } | |
141 | |
142 /* ------------------------------------------------------------ */ | |
143 /** Check to make sure that the stream has not been closed */ | |
144 private void isOpen() throws IOException | |
145 { | |
146 if (_ioException!=null) | |
147 throw new RuntimeIOException(_ioException); | |
148 | |
149 if (_isClosed) | |
150 throw new IOException("Stream closed"); | |
151 } | |
152 | |
153 /* ------------------------------------------------------------ */ | |
154 /** | |
155 * Flush the stream. | |
156 */ | |
157 @Override | |
158 public void flush() | |
159 { | |
160 try | |
161 { | |
162 synchronized (lock) | |
163 { | |
164 isOpen(); | |
165 out.flush(); | |
166 } | |
167 } | |
168 catch (IOException ex) | |
169 { | |
170 setError(ex); | |
171 } | |
172 } | |
173 | |
174 /* ------------------------------------------------------------ */ | |
175 /** | |
176 * Close the stream. | |
177 */ | |
178 @Override | |
179 public void close() | |
180 { | |
181 try | |
182 { | |
183 synchronized (lock) | |
184 { | |
185 out.close(); | |
186 _isClosed = true; | |
187 } | |
188 } | |
189 catch (IOException ex) | |
190 { | |
191 setError(ex); | |
192 } | |
193 } | |
194 | |
195 /* ------------------------------------------------------------ */ | |
196 /** | |
197 * Write a single character. | |
198 * | |
199 * @param c | |
200 * int specifying a character to be written. | |
201 */ | |
202 @Override | |
203 public void write(int c) | |
204 { | |
205 try | |
206 { | |
207 synchronized (lock) | |
208 { | |
209 isOpen(); | |
210 out.write(c); | |
211 } | |
212 } | |
213 catch (InterruptedIOException x) | |
214 { | |
215 Thread.currentThread().interrupt(); | |
216 } | |
217 catch (IOException ex) | |
218 { | |
219 setError(ex); | |
220 } | |
221 } | |
222 | |
223 /* ------------------------------------------------------------ */ | |
224 /** | |
225 * Write a portion of an array of characters. | |
226 * | |
227 * @param buf | |
228 * Array of characters | |
229 * @param off | |
230 * Offset from which to start writing characters | |
231 * @param len | |
232 * Number of characters to write | |
233 */ | |
234 @Override | |
235 public void write(char buf[], int off, int len) | |
236 { | |
237 try | |
238 { | |
239 synchronized (lock) | |
240 { | |
241 isOpen(); | |
242 out.write(buf,off,len); | |
243 } | |
244 } | |
245 catch (InterruptedIOException x) | |
246 { | |
247 Thread.currentThread().interrupt(); | |
248 } | |
249 catch (IOException ex) | |
250 { | |
251 setError(ex); | |
252 } | |
253 } | |
254 | |
255 /* ------------------------------------------------------------ */ | |
256 /** | |
257 * Write an array of characters. This method cannot be inherited from the | |
258 * Writer class because it must suppress I/O exceptions. | |
259 * | |
260 * @param buf | |
261 * Array of characters to be written | |
262 */ | |
263 @Override | |
264 public void write(char buf[]) | |
265 { | |
266 this.write(buf,0,buf.length); | |
267 } | |
268 | |
269 /* ------------------------------------------------------------ */ | |
270 /** | |
271 * Write a portion of a string. | |
272 * | |
273 * @param s | |
274 * A String | |
275 * @param off | |
276 * Offset from which to start writing characters | |
277 * @param len | |
278 * Number of characters to write | |
279 */ | |
280 @Override | |
281 public void write(String s, int off, int len) | |
282 { | |
283 try | |
284 { | |
285 synchronized (lock) | |
286 { | |
287 isOpen(); | |
288 out.write(s,off,len); | |
289 } | |
290 } | |
291 catch (InterruptedIOException x) | |
292 { | |
293 Thread.currentThread().interrupt(); | |
294 } | |
295 catch (IOException ex) | |
296 { | |
297 setError(ex); | |
298 } | |
299 } | |
300 | |
301 /* ------------------------------------------------------------ */ | |
302 /** | |
303 * Write a string. This method cannot be inherited from the Writer class | |
304 * because it must suppress I/O exceptions. | |
305 * | |
306 * @param s | |
307 * String to be written | |
308 */ | |
309 @Override | |
310 public void write(String s) | |
311 { | |
312 this.write(s,0,s.length()); | |
313 } | |
314 | |
315 private void newLine() | |
316 { | |
317 try | |
318 { | |
319 synchronized (lock) | |
320 { | |
321 isOpen(); | |
322 out.write(_lineSeparator); | |
323 if (_autoFlush) | |
324 out.flush(); | |
325 } | |
326 } | |
327 catch (InterruptedIOException x) | |
328 { | |
329 Thread.currentThread().interrupt(); | |
330 } | |
331 catch (IOException ex) | |
332 { | |
333 setError(ex); | |
334 } | |
335 } | |
336 | |
337 /* ------------------------------------------------------------ */ | |
338 /** | |
339 * Print a boolean value. The string produced by <code>{@link | |
340 * java.lang.String#valueOf(boolean)}</code> is translated into bytes | |
341 * according to the platform's default character encoding, and these bytes | |
342 * are written in exactly the manner of the <code>{@link | |
343 * #write(int)}</code> method. | |
344 * | |
345 * @param b | |
346 * The <code>boolean</code> to be printed | |
347 */ | |
348 @Override | |
349 public void print(boolean b) | |
350 { | |
351 this.write(b?"true":"false"); | |
352 } | |
353 | |
354 /* ------------------------------------------------------------ */ | |
355 /** | |
356 * Print a character. The character is translated into one or more bytes | |
357 * according to the platform's default character encoding, and these bytes | |
358 * are written in exactly the manner of the <code>{@link | |
359 * #write(int)}</code> method. | |
360 * | |
361 * @param c | |
362 * The <code>char</code> to be printed | |
363 */ | |
364 @Override | |
365 public void print(char c) | |
366 { | |
367 this.write(c); | |
368 } | |
369 | |
370 /* ------------------------------------------------------------ */ | |
371 /** | |
372 * Print an integer. The string produced by <code>{@link | |
373 * java.lang.String#valueOf(int)}</code> is translated into bytes according | |
374 * to the platform's default character encoding, and these bytes are written | |
375 * in exactly the manner of the <code>{@link #write(int)}</code> method. | |
376 * | |
377 * @param i | |
378 * The <code>int</code> to be printed | |
379 * @see java.lang.Integer#toString(int) | |
380 */ | |
381 @Override | |
382 public void print(int i) | |
383 { | |
384 this.write(String.valueOf(i)); | |
385 } | |
386 | |
387 /* ------------------------------------------------------------ */ | |
388 /** | |
389 * Print a long integer. The string produced by <code>{@link | |
390 * java.lang.String#valueOf(long)}</code> is translated into bytes according | |
391 * to the platform's default character encoding, and these bytes are written | |
392 * in exactly the manner of the <code>{@link #write(int)}</code> method. | |
393 * | |
394 * @param l | |
395 * The <code>long</code> to be printed | |
396 * @see java.lang.Long#toString(long) | |
397 */ | |
398 @Override | |
399 public void print(long l) | |
400 { | |
401 this.write(String.valueOf(l)); | |
402 } | |
403 | |
404 /* ------------------------------------------------------------ */ | |
405 /** | |
406 * Print a floating-point number. The string produced by <code>{@link | |
407 * java.lang.String#valueOf(float)}</code> is translated into bytes | |
408 * according to the platform's default character encoding, and these bytes | |
409 * are written in exactly the manner of the <code>{@link #write(int)}</code> | |
410 * method. | |
411 * | |
412 * @param f | |
413 * The <code>float</code> to be printed | |
414 * @see java.lang.Float#toString(float) | |
415 */ | |
416 @Override | |
417 public void print(float f) | |
418 { | |
419 this.write(String.valueOf(f)); | |
420 } | |
421 | |
422 /* ------------------------------------------------------------ */ | |
423 /** | |
424 * Print a double-precision floating-point number. The string produced by | |
425 * <code>{@link java.lang.String#valueOf(double)}</code> is translated into | |
426 * bytes according to the platform's default character encoding, and these | |
427 * bytes are written in exactly the manner of the <code>{@link | |
428 * #write(int)}</code> method. | |
429 * | |
430 * @param d | |
431 * The <code>double</code> to be printed | |
432 * @see java.lang.Double#toString(double) | |
433 */ | |
434 @Override | |
435 public void print(double d) | |
436 { | |
437 this.write(String.valueOf(d)); | |
438 } | |
439 | |
440 /* ------------------------------------------------------------ */ | |
441 /** | |
442 * Print an array of characters. The characters are converted into bytes | |
443 * according to the platform's default character encoding, and these bytes | |
444 * are written in exactly the manner of the <code>{@link #write(int)}</code> | |
445 * method. | |
446 * | |
447 * @param s | |
448 * The array of chars to be printed | |
449 * | |
450 * @throws NullPointerException | |
451 * If <code>s</code> is <code>null</code> | |
452 */ | |
453 @Override | |
454 public void print(char s[]) | |
455 { | |
456 this.write(s); | |
457 } | |
458 | |
459 /* ------------------------------------------------------------ */ | |
460 /** | |
461 * Print a string. If the argument is <code>null</code> then the string | |
462 * <code>"null"</code> is printed. Otherwise, the string's characters are | |
463 * converted into bytes according to the platform's default character | |
464 * encoding, and these bytes are written in exactly the manner of the | |
465 * <code>{@link #write(int)}</code> method. | |
466 * | |
467 * @param s | |
468 * The <code>String</code> to be printed | |
469 */ | |
470 @Override | |
471 public void print(String s) | |
472 { | |
473 if (s == null) | |
474 { | |
475 s = "null"; | |
476 } | |
477 this.write(s); | |
478 } | |
479 | |
480 /* ------------------------------------------------------------ */ | |
481 /** | |
482 * Print an object. The string produced by the <code>{@link | |
483 * java.lang.String#valueOf(Object)}</code> method is translated into bytes | |
484 * according to the platform's default character encoding, and these bytes | |
485 * are written in exactly the manner of the <code>{@link #write(int)}</code> | |
486 * method. | |
487 * | |
488 * @param obj | |
489 * The <code>Object</code> to be printed | |
490 * @see java.lang.Object#toString() | |
491 */ | |
492 @Override | |
493 public void print(Object obj) | |
494 { | |
495 this.write(String.valueOf(obj)); | |
496 } | |
497 | |
498 /* ------------------------------------------------------------ */ | |
499 /** | |
500 * Terminate the current line by writing the line separator string. The line | |
501 * separator string is defined by the system property | |
502 * <code>line.separator</code>, and is not necessarily a single newline | |
503 * character (<code>'\n'</code>). | |
504 */ | |
505 @Override | |
506 public void println() | |
507 { | |
508 this.newLine(); | |
509 } | |
510 | |
511 /* ------------------------------------------------------------ */ | |
512 /** | |
513 * Print a boolean value and then terminate the line. This method behaves as | |
514 * though it invokes <code>{@link #print(boolean)}</code> and then | |
515 * <code>{@link #println()}</code>. | |
516 * | |
517 * @param x | |
518 * the <code>boolean</code> value to be printed | |
519 */ | |
520 @Override | |
521 public void println(boolean x) | |
522 { | |
523 synchronized (lock) | |
524 { | |
525 this.print(x); | |
526 this.println(); | |
527 } | |
528 } | |
529 | |
530 /* ------------------------------------------------------------ */ | |
531 /** | |
532 * Print a character and then terminate the line. This method behaves as | |
533 * though it invokes <code>{@link #print(char)}</code> and then <code>{@link | |
534 * #println()}</code>. | |
535 * | |
536 * @param x | |
537 * the <code>char</code> value to be printed | |
538 */ | |
539 @Override | |
540 public void println(char x) | |
541 { | |
542 synchronized (lock) | |
543 { | |
544 this.print(x); | |
545 this.println(); | |
546 } | |
547 } | |
548 | |
549 /* ------------------------------------------------------------ */ | |
550 /** | |
551 * Print an integer and then terminate the line. This method behaves as | |
552 * though it invokes <code>{@link #print(int)}</code> and then <code>{@link | |
553 * #println()}</code>. | |
554 * | |
555 * @param x | |
556 * the <code>int</code> value to be printed | |
557 */ | |
558 @Override | |
559 public void println(int x) | |
560 { | |
561 synchronized (lock) | |
562 { | |
563 this.print(x); | |
564 this.println(); | |
565 } | |
566 } | |
567 | |
568 /* ------------------------------------------------------------ */ | |
569 /** | |
570 * Print a long integer and then terminate the line. This method behaves as | |
571 * though it invokes <code>{@link #print(long)}</code> and then | |
572 * <code>{@link #println()}</code>. | |
573 * | |
574 * @param x | |
575 * the <code>long</code> value to be printed | |
576 */ | |
577 @Override | |
578 public void println(long x) | |
579 { | |
580 synchronized (lock) | |
581 { | |
582 this.print(x); | |
583 this.println(); | |
584 } | |
585 } | |
586 | |
587 /* ------------------------------------------------------------ */ | |
588 /** | |
589 * Print a floating-point number and then terminate the line. This method | |
590 * behaves as though it invokes <code>{@link #print(float)}</code> and then | |
591 * <code>{@link #println()}</code>. | |
592 * | |
593 * @param x | |
594 * the <code>float</code> value to be printed | |
595 */ | |
596 @Override | |
597 public void println(float x) | |
598 { | |
599 synchronized (lock) | |
600 { | |
601 this.print(x); | |
602 this.println(); | |
603 } | |
604 } | |
605 | |
606 /* ------------------------------------------------------------ */ | |
607 /** | |
608 * Print a double-precision floating-point number and then terminate the | |
609 * line. This method behaves as though it invokes <code>{@link | |
610 * #print(double)}</code> and then <code>{@link #println()}</code>. | |
611 * | |
612 * @param x | |
613 * the <code>double</code> value to be printed | |
614 */ | |
615 /* ------------------------------------------------------------ */ | |
616 @Override | |
617 public void println(double x) | |
618 { | |
619 synchronized (lock) | |
620 { | |
621 this.print(x); | |
622 this.println(); | |
623 } | |
624 } | |
625 | |
626 /* ------------------------------------------------------------ */ | |
627 /** | |
628 * Print an array of characters and then terminate the line. This method | |
629 * behaves as though it invokes <code>{@link #print(char[])}</code> and then | |
630 * <code>{@link #println()}</code>. | |
631 * | |
632 * @param x | |
633 * the array of <code>char</code> values to be printed | |
634 */ | |
635 @Override | |
636 public void println(char x[]) | |
637 { | |
638 synchronized (lock) | |
639 { | |
640 this.print(x); | |
641 this.println(); | |
642 } | |
643 } | |
644 | |
645 /* ------------------------------------------------------------ */ | |
646 /** | |
647 * Print a String and then terminate the line. This method behaves as though | |
648 * it invokes <code>{@link #print(String)}</code> and then | |
649 * <code>{@link #println()}</code>. | |
650 * | |
651 * @param x | |
652 * the <code>String</code> value to be printed | |
653 */ | |
654 @Override | |
655 public void println(String x) | |
656 { | |
657 synchronized (lock) | |
658 { | |
659 this.print(x); | |
660 this.println(); | |
661 } | |
662 } | |
663 | |
664 /* ------------------------------------------------------------ */ | |
665 /** | |
666 * Print an Object and then terminate the line. This method behaves as | |
667 * though it invokes <code>{@link #print(Object)}</code> and then | |
668 * <code>{@link #println()}</code>. | |
669 * | |
670 * @param x | |
671 * the <code>Object</code> value to be printed | |
672 */ | |
673 @Override | |
674 public void println(Object x) | |
675 { | |
676 synchronized (lock) | |
677 { | |
678 this.print(x); | |
679 this.println(); | |
680 } | |
681 } | |
682 } |