01: package com.opensymphony.module.sitemesh.util;
02:
03: import java.io.*;
04:
05: /**
06: * A converter from one character type to another
07: * <p>
08: * This class is not threadsafe
09: */
10: public class OutputConverter {
11: /**
12: * Resin versions 2.1.12 and previously have encoding problems for internationalisation.
13: * <p>
14: * This is fixed in Resin 2.1.13. Once 2.1.13 is used more widely, this parameter (and class) can be removed.
15: */
16: public static final String WORK_AROUND_RESIN_I18N_BUG = "sitemesh.resin.i18n.workaround";
17:
18: public static Writer getWriter(Writer out) {
19: if ("true".equalsIgnoreCase(System
20: .getProperty(WORK_AROUND_RESIN_I18N_BUG)))
21: return new ResinWriter(out);
22: else
23: return out;
24: }
25:
26: public static String convert(String inputString) throws IOException {
27: if ("true".equalsIgnoreCase(System
28: .getProperty(WORK_AROUND_RESIN_I18N_BUG))) {
29: StringWriter sr = new StringWriter();
30: resinConvert(inputString, sr);
31: return sr.getBuffer().toString();
32: } else
33: return inputString;
34: }
35:
36: /**
37: * To get internationalised characters to work on Resin, some conversions need to take place.
38: */
39: static class ResinWriter extends Writer {
40: private final Writer target;
41: private final CharArrayWriter buffer = new CharArrayWriter();
42:
43: public ResinWriter(Writer target) {
44: this .target = target;
45: }
46:
47: public void close() throws IOException {
48: flush();
49: }
50:
51: public void flush() throws IOException {
52: resinConvert(buffer.toString(), target);
53: buffer.reset();
54: }
55:
56: public void write(char cbuf[], int off, int len)
57: throws IOException {
58: buffer.write(cbuf, off, len);
59: flush();
60: }
61: }
62:
63: private static void resinConvert(String inputString, Writer writer)
64: throws IOException {
65: //does this need to be made configurable? Or are these two always correct?
66: InputStreamReader reader = new InputStreamReader(
67: new ByteArrayInputStream(inputString.getBytes("UTF-8")),
68: "ISO-8859-1");
69: int i;
70: while ((i = reader.read()) != -1) {
71: writer.write(i);
72: }
73: writer.flush();
74: }
75:
76: }
|