The interface HandlerHook can be implemented by a bean that needs to bypass the portability offered by RSF and is wanting to take control of the complete request cycle in RSF. The interface is somewhat minimal reflecting the fact that the required dependencies of a HandlerHook cannot be known, since in general they will be highly non-portable (for example HttpServletRequest) and environmental:

{{{
/** Register a hook in the "handler chain" from the RootBeanHandler.
 * The hook returns <code>true</code> if it has successfully handled this
 * request, in which case further processing should terminate.
 */
public interface HandlerHook {
  public boolean handle();
}
}}}
It's worth noting that HandlerHook fulfils a very similar function to the [HandlerInterceptor|http://www.springframework.org/docs/api/org/springframework/web/servlet/HandlerInterceptor.html] interface supplied as part of SpringMVC. However unlike HandlerInterceptor, our interface is considerably more slimline, and also completely portable, not even containing any RSF dependencies. This is possible through RSF's widespread use of request-scope IoC. We need just one interface for every environment RSF is deployed into.

For efficiency reasons HandlerHooks must be declared at application scope. This would initially seem to represent a problem since many of the required dependencies will lie in the request scope - however RSF defines application-scope proxies for the majority of request-scope properties that it knows about (ViewParameters, HttpServletRequest, etc.) which can bridge to the HandlerHook. For example, an application-scope declaration of a HandlerHook might look as follows:

{{{
  <bean id="darwinHandlerHook" 
    class="uk.org.ponder.darwin.rsf.DarwinHandlerHook">
    <property name="httpServletRequest" ref="httpServletRequestProxy"/>
    <property name="httpServletResponse" ref="httpServletResponseProxy"/>
    <property name="requestTypeProxy" ref="requestTypeProxy"/>
    <property name="viewParametersProxy" ref="viewParametersProxy"/>
    <property name="pageRenderer" ref="pageRenderer"/>
  </bean>
}}}

HandlerHooks are registered with RSF using the standard parent definition (via [TLAB|TargetListAggregatingBean]) of {{handlerHookParent}}. For example the above HandlerHook would be registered using this definition:

{{{
  <bean parent="handlerHookParent">
    <property name="value" ref="darwinHandlerHook"/>
  </bean>
}}}

On the other hand, one may choose to declare the HandlerHook itself at request scope, where its dependencies may be acquired directly, and instead register a proxy for the HandlerHook. This may be done very compactly using a compound Spring definition like the following at application scope:

{{{
  <bean parent="handlerHookParent">
    <property name="value">
      <bean parent="RSACBridgeProxy">
        <property name="targetBeanName" value="reportHandlerHook" />
      </bean>
    </property>
  </bean>
}}}

In this case {{reportHandlerHook}} would be a request-scope bean registered with [RSAC]. More information on the [RSACBridgeProxy] which appears above is on its own page.