たぷつきません

おなかがでてきた。もうたぷついてるやん。

Tapestry

解放されない リフレクションクラス 4

社内向けにはレポートしてたけど、ここにパッチをアップするのをすっかり忘れていました。 そういうわけでここ*1に修正の入ったOgnlRuntime.javaを置いておきます(ちょっと無理やり1つのクラスだけに収めた感があるので恥ずかしいですが)。 実装としては…

解放されない リフレクションクラス 3

WeakHashMapで解決したというのは、見間違い、勘違い、気の迷いでした。JavaDocにある、 実装上の注意: WeakHashMap 内の値オブジェクトは、通常の強参照によって保持されます。このため、値のオブジェクトが直接的にも間接的にも強くそれ自体のキーを参照し…

解放されない リフレクションクラス 2

どんぴしゃ!犯人確保できました。ognl.OgnlRuntimeが、リフレクションメソッドをクラスごとに永久にキャッシュしているのが問題でした。OGNLは「クラスはアンロードされるもの」という前提では設計されていないのです。 ちょっと待てよ、ということは…Tapes…

解放されないリフレクションクラス

ある基幹システムを、Tomcat+Postgres+Tapestry+Seasar2+S2Tapestry+S2Daoの構成で開発したが、数日間連続稼動していると、パーマネント領域(以下Perm)がジワジワと減っていくという現象に悩まされている。Tenuredは十分ありGC/FullGC時の下限の平均は100MB…

リセットサービスの罠

TapestryでHTMLテンプレートをアップしなおして、service=reset/Home しても、効かない時があります。 ひとつひとつ疑って調べてみました。しかし犯人はTapestryじゃないしブラウザでもないことまで判明。誰かがキャッシュしていると思われる。ローカルでは…

Bodyコンポーネントにご注意

入力フォームの value などが、UNICODEでエスケープしてしまい、携帯のページをどうしようかと悩んでいたのですが、なんと@Bodyを使っていたからでした。単純に削除するだけでOKなんですが、なんで@Body付けただけでUNICODEにエスケープされるのか、謎。 …

property-specification の persistent=yes の罠

ページやコンポーネントにプロパティを書いて、「永続化する」と意思表示さえしておけば、セッションに配置してくれるという便利な機能が property-specification ですが、実は永続化するにはセッターを呼ばないといけない という約束があります。つい先日、…

Tapestryマルチブラウザ対応

TapestryはLocaleでテンプレートを変えられる(プロパティファイルのようにね)けど、同じような仕組みでUser-Agentごとにテンプレートが変えられるようにしてみた。 ?xml version="1.0" encoding="UTF-8" ?> <template-config> <user-agent-mapping> <default suffix=""/> <match pattern="UP.Browser" suffix="_cf"/> <match pattern="DoCoMo" suffix="_cf"/> </match></match></default></user-agent-mapping></template-config>

DefaultMultipartDecoder駄目デコーダーだ。ぐはっ!

Tapestry3.0.3のDefaultMultipartDecoderは、commons.FileUploadはちゃんと取得しているにも関らず、Multipartの1つ1つのFileItemのContent-Typeを見てない。。。例えば以下のようなパケットダンプ例を見ても分かりますが、 Content-Type: multipart/form-…

PageRedirectExceptionを発生させるタイミングについての罠

Tapestryで表示ページをリダイレクトして切り替える便利なPageRedirectException例外ですが、throwさせる場所には注意が必要です。昨日同僚が抱えていた問題で明らかになりました。問題とは、 submitの中であればOKだけど、PageBeginRender(PageRenderListen…