昨日、このバグが登録されたので、早速、対応。まぁ、以前、この問題が起きるだろうな、と思いつつ、UTF-8 で動かしていたので、気にしなかったけど、バグがあがったので、直しておく。ほんとは、InputSourceに書き換えた方がいい気がしたけど、そうすると、いろいろと影響があるので、Readerにcharsetを渡して対応する。同じようなコードをRSSポートレットでも利用していたので、そこから持ってきてやろうとしたけど、そのコードをよく見ると、Readerでencodingを読み込んでInputStreamをresetするのだが、改行コードが存在しないと、markのサイズを超えて、アクセスするので、IOExceptionの危険が・・・。というわけで、mark内のサイズで読んで、resetするように変更。というわけで、以下のようなコードを書いておく。
============================================================================== --- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletApplicationWar.java (original) +++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/util/descriptor/PortletApplicationWar.java Tue Feb 14 14:35:00 2006 @@ -15,6 +15,7 @@ */ package org.apache.jetspeed.util.descriptor; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; @@ -27,6 +28,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; +import java.io.UnsupportedEncodingException; import java.io.Writer; import java.net.MalformedURLException; import java.net.URL; @@ -86,6 +88,8 @@ protected static final String WEB_XML_PATH = "WEB-INF/web.xml"; protected static final String EXTENDED_PORTLET_XML_PATH = "WEB-INF/jetspeed-portlet.xml"; + protected static final int MAX_BUFFER_SIZE = 1024; + public static final String JETSPEED_SERVLET_XPATH = "/web-app/servlet/servlet-name[contains(child::text(), \"JetspeedContainer\")]"; public static final String JETSPEED_SERVLET_MAPPING_XPATH = "/web-app/servlet-mapping/servlet-name[contains(child::text(), \"JetspeedContainer\")]"; @@ -285,7 +289,42 @@ */ protected Reader getReader( String path ) throws IOException { - return new InputStreamReader(getInputStream(path)); + BufferedInputStream is = new BufferedInputStream(getInputStream(path)); + + String enc = "UTF-8"; + try + { + is.mark(MAX_BUFFER_SIZE); + byte[] buf = new byte[MAX_BUFFER_SIZE]; + int size = is.read(buf, 0, MAX_BUFFER_SIZE); + if (size > 0) + { + String key = "encoding=\""; + String data = new String(buf, 0, size, "US-ASCII"); + int lb = data.indexOf("\n"); + if (lb > 0) + { + data = data.substring(0, lb); + } + int off = data.indexOf(key); + if (off > 0) + { + enc = data.substring(off + key.length(), data.indexOf('"', off + key.length())); + } + } + } + catch (UnsupportedEncodingException e) + { + log.warn("Unsupported encoding.", e); + } + catch (IOException e) + { + log.warn("Unsupported encoding.", e); + } + + //Reset the bytes read + is.reset(); + return new InputStreamReader(is, enc); } /**