This is the hardest part about grasping Tapestry 5, knowing what you
can do and how you can do it when there seems to be an endless way to
tie things together that are loosely if at all documented. So I
apologize if the additional details to my original question lead to
one of these solutions that I am just unable to determine from the
context of the proposed solutions.
I tried to keep my question at simple as possible without revealing
too many details and getting bogged down in integration issues but I
will outline a little more of what I am trying to do for the sake of
seeking clarity.
I am using Acegi-Security, as such I am overriding the
AuthenticationProcessingFilter that the Acegi-Security library sets up
in its module. Now in my library module I construct my specific
version of AuthenticationProcessingFilter which is a subclass of
AuthenticationProcessingFilter and overrides the appropriate methods.
In those methods I am attempting to access the ApplicationStateManager.
As I specified in the earlier email the ApplicationStateManager always
comes in as null.
Here is the code from the Acegi-Security LibraryModule that is
relevant to the AuthenticationProcessingFilter.
public static void contributeAlias(@AcegiServices
SaltSourceService saltSource,
@AcegiServices AuthenticationProcessingFilter
authenticationProcessingFilter,
Configuration<AliasContribution> configuration) {
configuration.add(AliasContribution.create(SaltSourceService.class,
saltSource));
configuration
.add(AliasContribution.create(AuthenticationProcessingFilter.class,
authenticationProcessingFilter));
}
public static void contributeHttpServletRequestHandler(
OrderedConfiguration<HttpServletRequestFilter> configuration,
@InjectService("HttpSessionContextIntegrationFilter")
HttpServletRequestFilter httpSessionContextIntegrationFilter,
@InjectService("AuthenticationProcessingFilter")
HttpServletRequestFilter authenticationProcessingFilter,
@InjectService("RememberMeProcessingFilter")
HttpServletRequestFilter rememberMeProcessingFilter,
@InjectService("SecurityContextHolderAwareRequestFilter")
HttpServletRequestFilter
securityContextHolderAwareRequestFilter,
@InjectService("AnonymousProcessingFilter")
HttpServletRequestFilter anonymousProcessingFilter) {
configuration.add("acegiHttpSessionContextIntegrationFilter",
httpSessionContextIntegrationFilter, "before:acegi*");
configuration.add("acegiAuthenticationProcessingFilter",
authenticationProcessingFilter);
configuration.add("acegiRememberMeProcessingFilter",
rememberMeProcessingFilter);
configuration.add("acegiSecurityContextHolderAwareRequestFilter",
securityContextHolderAwareRequestFilter,
"after:acegiRememberMeProcessingFilter");
configuration.add("acegiAnonymousProcessingFilter",
anonymousProcessingFilter,
"after:acegiRememberMeProcessingFilter",
"after:acegiAuthenticationProcessingFilter");
}
@Marker(AcegiServices.class)
public static AuthenticationProcessingFilter
buildRealAuthenticationProcessingFilter(
@AcegiServices final AuthenticationManager manager,
@AcegiServices final RememberMeServices rememberMeServices,
@Inject @Value("${acegi.check.url}") final String authUrl,
@Inject @Value("${acegi.target.url}") final String targetUrl,
@Inject @Value("${acegi.failure.url}") final String failureUrl)
throws Exception {
AuthenticationProcessingFilter filter = new
AuthenticationProcessingFilter();
filter.setAuthenticationManager(manager);
filter.setAuthenticationFailureUrl(failureUrl);
filter.setDefaultTargetUrl(targetUrl);
filter.setFilterProcessesUrl(authUrl);
filter.setRememberMeServices(rememberMeServices);
filter.afterPropertiesSet();
return filter;
}
@Marker(AcegiServices.class)
public static HttpServletRequestFilter
buildAuthenticationProcessingFilter(final
AuthenticationProcessingFilter filter)
throws Exception {
return new HttpServletRequestFilterWrapper(filter);
}
NOW, in my LibraryModule I have the following methods that I believe
should override the AuthenticationProcessingFilter appropriately but
still ends up resulting in a null for ApplicationStateManager.
public static AuthenticationProcessingFilter
buildMyAuthenticationProcessingFilter(
@AcegiServices final AuthenticationManager manager,
@AcegiServices final RememberMeServices rememberMeServices,
@InjectService ("ApplicationStateManager")
ApplicationStateManager asm,
@Inject @Value( "${acegi.check.url}" ) final String authUrl,
@Inject @Value( "${acegi.target.url}" ) final String targetUrl,
@Inject @Value( "${acegi.failure.url}" ) final String failureUrl
) throws Exception
{
AuthenticationProcessingFilter filter = new
CustomAuthenticationProcessingFilter(asm);
filter.setAuthenticationManager(manager);
filter.setAuthenticationFailureUrl(failureUrl);
filter.setDefaultTargetUrl(targetUrl);
filter.setFilterProcessesUrl(authUrl);
filter.setRememberMeServices(rememberMeServices);
filter.afterPropertiesSet();
return filter;
}
public static void
contributeAliasOverrides(@InjectService("MySaltSource")
SaltSourceService saltSource,
@InjectService("MyAuthenticationProcessingFilter")
AuthenticationProcessingFilter authenticationProcessingFilter,
Configuration<AliasContribution> configuration)
{
configuration.add(AliasContribution.create(SaltSourceService.class,
saltSource));
configuration
.add(AliasContribution.create(AuthenticationProcessingFilter.class,
authenticationProcessingFilter));
}
Now I am not typically the type to post this much detail as I know it
is difficult to help with such an issue, but the Tapestry 5
documentation is lacking in how everything gets weaved together and
what standard patterns are useful, IMHO. So if someone could please
help me to figure out how I can pass the AppliationStateManager
appropriately I would appreciate it.
BTW, I am using .15
Thanks in advance for any help,
Keith
On Nov 1, 2008, at 1:13 PM, Howard Lewis Ship wrote:
When you contribute a filter, you need to instantiate it. Generally
it looks something like:
public void
contributeRequestHandler(OrderedConfiguration<RequestFilter>
configuration, ObjectLocator locator)
{
configuration.add("MyFilter", locator.autobuild(MyFilter.class));
}
The ObjectLocator is a resource of the RequestHandler service that can
be injected into contribute methods for the RequestHandler service and
allows access to other services within the IoC Registry; it also
handle instantiation of objects with injection for you. So MyFilter
doesn't have to be a service but can still be injected. Contributing
an object instance to a filter does not do any injection, but
autobuild() does.
In the current .16 snapshot, you can use @Inject on fields of MyFilter
in addition to injection through the constructor. This was added
because people got confused: in pages and components you use @Inject
on fields, but in service implementation, 5.0.15 requires that
dependencies be passed through the constructor. Again, 5.0.16 allows
you to code services and other objects more consistently (but with the
runtime overhead of using reflection to update the private fields).
On Fri, Oct 31, 2008 at 2:41 PM, Keith Bottner <[EMAIL PROTECTED]>
wrote:
Is it possible to retrieve ApplicationStateManager from within a
Filter?
I tried using an @Inject and it always returns null.
I tried placing it in the constructor of the filter but when it is
accessed
it is null.
Is there a recommend way of doing this or is it even advisable?
Thanks in advance for your help.
Keith
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--
Howard M. Lewis Ship
Creator Apache Tapestry and Apache HiveMind
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]