S2Click 1.0.4でのでのページインターセプター

Apache Clickには2.2.0からページインターセプターという機能が追加されており、ページの作成前後、レスポンス前、廃棄前後に処理を差し込むことができます。click.xmlでこんな感じで設定します。

<page-interceptor classname="com.mycorp.PageSecurityInterceptor" 
    scope="application"> 
  <property name="notAuthenticatedPath" value="/not-authenticated.htm"/> 
  <property name="notAuthorizedPath" value="/not-authorized.htm"/> 
</page-interceptor> 

見ての通り、インターセプターに設定するパラメータや、ライフサイクルなども指定することができます。
S2Clickではclick.xmlを使わずにs2click.diconですべての設定を行っているのですが、思い切ってページインターセプターはS2Containerで管理するようにしてみました。上記の例と同じ設定をするには以下のような感じになります。

<!-- ページインターセプターをコンポーネントとして定義 -->
<component name="pageSecurityInterceptor" 
  class="com.mycorp.PageSecurityInterceptor">
  <property name="notAuthenticatedPath">"/not-authenticated.htm"</property>
  <property name="notAuthorizedPath">"/not-authorized.htm"</property>
</component>

<component class="org.seasar.s2click.s2ClickConfig">
  ...
  <!-- ページインターセプターのコンポーネント名を指定 -->
  <initMethod name="addPageInterecptor">
    <arg>"pageSecurityInterceptor"</arg>
  </initMethod>
</component>

ライフサイクルやプロパティの設定はS2Container側に任せてしまっています。今まではLogServiceやTemplateService、ResourceServiceもClassオブジェクトとプロパティ設定用のMapをs2click.diconで設定するようにしていたのですが、これにあわせてS2ClickConfigに直接インスタンスをDIする形にしています。
たとえばいままでこんな感じだったのが…

<component class="org.seasar.s2click.s2ClickConfig">
  ...
  <property name="logService">
    @sample.service.SampleLogService@class
  </property>
  <!-- プロパティを指定する場合 -->
  <initMethod name="addTemplateServiceProperty">
    <arg>"output"</arg>
    <arg>"/var/log/sample.log"</arg>
  </initMethod>
</component>

こんな感じになります。

<component class="org.seasar.s2click.s2ClickConfig">
  ...
  <property name="logService">
    <component class="sample.service.SampleLogService">
      <property name="output">"/var/log/sample.log"</property>
    </component>
  </property>
</component>

というわけで、S2Clickの次のバージョン(1.0.4)ではサービスをカスタマイズする場合の設定方法が変更になります。