昨日、このバグが登録されたので、早速、対応。まぁ、以前、この問題が起きるだろうな、と思いつつ、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);
}
/**