2007年5月29日火曜日

grails-wicket plugin を読む (3)

さて, メタオブジェクトの迷宮からようやく戻ってきた. 残りは wicket を動かすための手続きを grails のコードとして書いているだけだ. WicketGrailsPlugin.groovy に戻ろう.



def doWithSpring = {

def applicationClass = application.allClasses.find { Application.class.isAssignableFrom(it) }



if(applicationClass) {

applicationBean(applicationClass)

}

}




applicationGrailsApplication だということが分かった. そうするとここには「この Grails アプリケーションが持つ (ロードした) すべてのクラスの中で wicket.Application クラスと (ほぼ) 同じクラスがあれば, それを applicationBean としてインスタンス化する (ここで Spring Bean Builder を使っている)」と書いてあることになる. その「wicket.Application クラスと (ほぼ) 同じクラス」というのが, grails-app/controllers/WebApplication.groovy なわけだ.



def doWithWebDescriptor = { xml ->

def servlets = xml.servlet[0]

servlets + {

servlet {

'servlet-name'('wicket')

'servlet-class'('wicket.protocol.http.WicketServlet')

'init-param' {

'param-name'('applicationFactoryClassName')

'param-value'('wicket.spring.SpringWebApplicationFactory')

}

'load-on-startup'(1)

}

}



def mappings = xml.'servlet-mapping'[0]

mappings + {

'servlet-mapping' {

'servlet-name'('wicket')

'url-pattern'('/app/*')

}

}

}




doWithWebDescriptor は (アプリケーション起動時に Grails によって動的に作られる) web-app/WEB-INF/web.xml に関するクロージャ. web.xml の作成時に呼び出され, web.xml に以下を付け加える.



<servlet>

<servlet-name>wicket</servlet-name>

<servlet-class>wicket.protocol.http.WicketServlet</servlet-class>

<init-param>

<param-name>applicationFactoryClassName</param-name>

<param-value>wicket.spring.SpringWebApplicationFactory</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>



<servlet-mapping>

<servlet-name>wicket</servlet-name>

<url-pattern>/app/*</url-pattern>

</servlet-mapping>


こんなくそ XML を書かずに済んでいるのは Groovy の Markup Builder のおかげだ.



で, この plugin がやっているのはこれだけ. つまり普通の J2EE アプリケーションで Wicket を使うときにやる設定の手続きを WicketGrailsPlugin.groovy に書いているのだ. 後は grails の枠組み (特に GORM) がすべてそのまま使えている.



よくできました.