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

Save This Page
Home » sitemesh-2.3 » com.opensymphony.module » sitemesh » util » [javadoc | source]