昨日、言語選択機能が壊れたと言われたものについては、修正した。でも、今日は、Davidから、それは新しい認証で動くのかみたいな感じのメールが来た。新しい認証?そういや、何かが昨日追加されていたな・・・。というわけで、確認してみる。現在、無効になっているので、コードから動作を想像するに、サーブレットフィルタでユーザーとパスワードがリクエストに与えられているときに、そのフィルタでログイン処理を実行している。おぉ、なるほど。現在の別ページに転送されて、処理されるよりかは全然良いな。そこのところで、ログインが成功したときに、セッションにあるロケール情報を消せば、解決されるような気がする。ということで、そのことをDavidへ伝える。この認証方法なら、レイアウトデコレータにログインフォームを置いておいて、アクセスすれば、ログインできてしまうことになるな。まだ、いくつか問題があると言っていたけど、これがそのうち、デフォルトになりそうな予感。
カテゴリー: Apache
言語選択
Davidから、言語選択機能を壊したかもと言われた。一応、確認してみると、壊れている。でも、今まで、リクエストの度に言語取得をしに、データベースまでアクセスしているので、確かにそれでは良くないので、別な方法が必要そうだ。やるとしたら、ログイン時にセッションに入っている言語情報を削除して、ログイン時に取得できるようにすることだろうか。
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); } /**