package com.opensymphony.module.sitemesh.util; import java.io.*; /** * A converter from one character type to another * <p> * This class is not threadsafe */ public class OutputConverter { /** * Resin versions 2.1.12 and previously have encoding problems for internationalisation. * <p> * This is fixed in Resin 2.1.13. Once 2.1.13 is used more widely, this parameter (and class) can be removed. */ public static final String WORK_AROUND_RESIN_I18N_BUG = "sitemesh.resin.i18n.workaround"; public static Writer getWriter(Writer out) { if ("true".equalsIgnoreCase(System.getProperty(WORK_AROUND_RESIN_I18N_BUG))) return new ResinWriter(out); else return out; } public static String convert(String inputString) throws IOException { if ("true".equalsIgnoreCase(System.getProperty(WORK_AROUND_RESIN_I18N_BUG))) { StringWriter sr = new StringWriter(); resinConvert(inputString, sr); return sr.getBuffer().toString(); } else return inputString; } /** * To get internationalised characters to work on Resin, some conversions need to take place. */ static class ResinWriter extends Writer { private final Writer target; private final CharArrayWriter buffer = new CharArrayWriter(); public ResinWriter(Writer target) { this.target = target; } public void close() throws IOException { flush(); } public void flush() throws IOException { resinConvert(buffer.toString(), target); buffer.reset(); } public void write(char cbuf[], int off, int len) throws IOException { buffer.write(cbuf, off, len); flush(); } } private static void resinConvert(String inputString, Writer writer) throws IOException { //does this need to be made configurable? Or are these two always correct? InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(inputString.getBytes("UTF-8")), "ISO-8859-1"); int i; while ((i = reader.read()) != -1) { writer.write(i); } writer.flush(); } }