そのクラスはPageのサブクラスか

連休にちょっとWicketを触ってみた。練習で、認証ストラテジを実装したら嵌った。Pageのサブクラスで、LoginPage以外は認証が必要、というのが書けずに四苦八苦。結局親クラスをたどることにしたが、もう少しスマートに書けないものだろうか。
まぁ次は素直にMetaDataRoleAuthorizationStrategyを使おう。

(追記)id:t_yanoのアドバイスのおかげでようやくまともになった。

public class MyAutorizationStrategy implements IAuthorizationStrategy {

	public boolean isActionAuthorized(Component arg0, Action arg1) {
		return true;
	}

	public <T extends Component> boolean isInstantiationAuthorized(
			Class<T> component) {

		LoginSession loginSession = (LoginSession) Session.get();
		String userName = loginSession.getUserName();
		boolean isLoginPageOrNotPage = !Page.class.isAssignableFrom(component)
				|| LoginPage.class.isAssignableFrom(component);
		if (isLoginPageOrNotPage || userName!=null) {
			return true;
		} else {
			return false;
		}
	}
}

(修正前)

public class MyAutorizationStrategy implements IAuthorizationStrategy {

	public boolean isActionAuthorized(Component arg0, Action arg1) {
		return true;
	}

	public <T extends Component> boolean isInstantiationAuthorized(
			Class<T> component) {

		Class<? super T> superclass = component;
		boolean isNeedAuthPageComponent = false;
		//親クラスをたどる
		while (superclass != null && !LoginPage.class.equals(component)){
			if (Page.class.equals(superclass)){
				isNeedAuthPageComponent=true;
			}
			superclass = superclass.getSuperclass();
		}
		
		LoginSession loginSession = (LoginSession) Session.get();
		String userName = loginSession.getUserName();
		if (userName != null) {
			return true;
		}else if (!isNeedAuthPageComponent){
			return true;
		} else {
			return false;
		}
	}
}

(修正前ここまで)

"Test Driven"でも薦めてあったが、Wicketはかなり素直にTDDができるように思う。
WicketTesterのインスタンスを作っておけば、コンポーネントは期待した通り振る舞ってくれる。
次なにか作る機会があれば、Wicketも対象にしてみたい。

public class TestHomePage
{
	private WicketTester tester;

	@Before
	public void setUp()
	{
		tester = new WicketTester(new WicketApplication());
	}

	@Test
	public void testRenderMyPage()
	{
		//start and render the test page
		tester.startPage(HomePage.class);

		//assert rendered page class
		tester.assertRenderedPage(HomePage.class);

		//assert rendered label component
		tester.assertLabel("message", "If you see this message wicket is properly configured and running");
	}
}

参考
Java のリフレクションでフィールドを取得する - 集中力なら売り切れたよ
http://d.hatena.ne.jp/r_ikeda/20090423/reflect
rio's blog Wicket の勉強 (4) wicket-auth-roles を使って認証/認可を実現する
http://rio1218.blog26.fc2.com/blog-entry-82.html
Apache Wicket - Home
http://wicket.apache.org/

オープンソース徹底活用WicketによるWebアプリケーション開発

オープンソース徹底活用WicketによるWebアプリケーション開発

Test Driven: TDD and Acceptance TDD for Java Developers

Test Driven: TDD and Acceptance TDD for Java Developers