Wicket 1.5(rc3) でURLのファイルパスを暗号化する

Wicket 1.4 では、WebApplication クラスのサブクラスで、 newRequestCycleProcessor() メソッドをオーバライドして、

@Override
protected IRequestCycleProcessor newRequestCycleProcessor() {
	return new WebRequestCycleProcessor() {
		@Override
		protected IRequestCodingStrategy newRequestCodingStrategy() {
			return new CryptedUrlWebRequestCodingStrategy(
					new WebRequestCodingStrategy());
		}
	};
}

と書いていたが、Wicket 1.5 では、同じくWebApplication クラスのサブクラスで、init() メソッドの中で、

protected void init() {
	super.init();
	setRootRequestMapper(new CryptoMapper(getRootRequestMapper(), this));
}

と書く。
詳しくは ここ に記載してある。

Wicket 1.5(rc3) でCSVをダウンロードするLinkコンポーネントを作る

importとコンストラクタは省略している。

public class CSVDownloadLink<T> extends Link<T> {

	@Override
	public final void onClick() {
		//getCsvData()はcsvの内容をString型で取得する。
		String csvData = getCsvData();

		StringResourceStream stream = 
			new StringResourceStream(csvData, "application/octet-stream;");
		stream.setCharset(Charset.forName("Windows-31J"));

		getRequestCycle().replaceAllRequestHandlers(
				new ResourceStreamRequestHandler(stream, "filename.csv");
	}

}

WicketとSessionについてのまとめ

Wicket 1.4.13にアップグレードしてから、StackOverflowError()が頻発する現象が発生。
いろいろ試してみたけれどもどうにも原因がわからず、途方にくれていたところ、id:mdgw 先輩と id:t_yano さんに助けていただきました。
お二方とも、重ね重ねありがとうございました。いつもご助言をいただきまして恐縮です。

ご助言の内容も含めて、簡単にまとめておきたいと思います。

続きを読む

WicketのDateTextField、DatePickerでハマってます

Wicket 1.3 から Wicket 1.4 へマイグレートした後に、仕様変更なのかバグなのか、動作が異なって困る点がいくつかありました。
表題のもその一つで、en(en-US)ロケールでDateTextFieldとDatePickerを使うと、挙動がおかしいというものです。

Foo.html

(略)
<span wicket:id="feedBack"></span>
<form wicket:id="form">
	<input type="text" wicket:id="date" />
	<input type="submit" />
</form>
(略)

Foo.java

import org.apache.wicket.datetime.markup.html.form.DateTextField;
(略)
public class Foo extends WebPage {
	public Foo() {
		Form<Void> form = new Form<Void>("form") {
			@Override
			protected void onSubmit() {
				super.onSubmit();
			}
		};
		DateTextField date = new DateTextField("date", new Model<Date>(new Date()), new StyleDateConverter("M-", true));
		this.add(new FeedbackPanel("feedBack"));
		this.add(form);
		form.add(date);
		date.add(new DatePicker());
	}
}

というソースコードがあったとして、これを実行すると、

といった画面がでます。DatePickerのアイコンで日付を選択すると、

ここまではよし。Wicket素敵。


さて、同じFooクラスを、ロケールをen(en_US)に変更したブラウザで閲覧すると、

と、表記を勝手に MMM dd, yyyy のフォーマットにしてくれて嬉しい。


しかし、ここでDatePickerのアイコンで日付を選択すると、

あれ。MMM dd, yyyy のフォーマットになってない。


ついでにこの状態でonSubmitを実行すると、

このように、バリデータにかかります。


wicket-extentionsの方のDateTextFieldを使って、ロケールにかかわらず yyyy/MM/dd というフォーマットになるようにすれば回避できるんですが、折角StyleDateConverterがあるのに勿体ない orz

なお、この現象が発生している環境は、

です。

日本PostgreSQLユーザ会 北海道支部 勉強会(2010-08-18)に参加してきた

2010-08-18に開催された日本PostgreSQLユーザ会 北海道支部 勉強会に参加してきました.

@syachiさんのテーブル設計の話

syachiさんのオレオレルールの紹介から,ATNDを画面仕様に見立ててテーブル設計を実演されました.
私もSQLを10年近く使っていながら,テーブル設計はこれまで身内としか議論したことが無かったので,外部の方の設計思想がとても勉強になりました.命名規則(時刻テーブルの"foo_at")とか,データをシリアライズして1カラムに保存してしまう設計などは真似したい.

実演中,EclipseのERMasterを実演に使っていらっしゃったのですが,2バイト文字を特定の入力ボックスに入れるとコケるというハプニングが多発で大変なことに……
でもERMasterは使いやすそうだったので,今秋の開発で使ってみたいです.

id:iakioさんのPostgreSQL9のreplicationの話.

iakioさんが,PostgreSQL9で採用されるreplication機能をを実演されました.
WALとかは上辺の知識しか無かったのですが,replicationの流れの輪郭が解りましたし,MasterやSlaveサーバの作り方が意外に簡単で驚きました.replicationの設定は,blogで公開される予定だそうです.
単なるreplicationだけではなく,フェイルオーバーや,参照はSlave,更新はMasterサーバで行うような仕組みもpg-pool3との組み合わせでできる(様になるはず)だそうです.
こちらも一度試してみたい.今のプロジェクトでは予算が無くて,実運用ではサーバーが確保できませんが……

最後に

RETURNINGはモダンですね!

次回のテーマは「論理削除」だそうなので(?),今から楽しみです.
syachiさん,iakikoさん,ありがとうございました.参加された皆さんもお疲れ様でした.

Wicket 1.3 から 1.4 へマイグレートしてみた

数年前から Wicket 1.3 (1.3.7) で開発していたプロジェクトを Wicket 1.4 (1.4.7) へマイグレートした体験談です。
長文の上、ほぼ公式Wikiのマイグレート手順通りなのですが、何かの参考になりましたら。

作業をした当時は1.4.7が最新版だったので。この記事も1.4.7として書いていますが、1.4.8 以降に大きな変更が無いかぎり、同手順でいけるはずです。また、作業はEclipse Galileoで行いました。

続きを読む

AjaxLazyLoadPanelのトラブル対応

Wicket-1.4.7のAjaxLazyLoadPanelでちょっとトラブったのでメモ。

getLazyLoadComponent(String)メソッド内の処理が、HTTPリクエストのTimeout時間内に終了しなかったとき。
特にエラー画面も出ず、ずっと処理中のぐるぐるアニメーションが続くだけになってしまいました。

そもそもタイムアウトするような処理が走るのはどうなんだ、というツッコミもありますが、ひとまずサーバ側のTimeout時間を最適な時間に調整することで解決しました。