portlet.xmlがデフォルトエンコーディングで読まれる問題:JS2-497

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

コメントを残す

メールアドレスが公開されることはありません。