[seam-dev] jsf in seam 3
Pete Muir
pmuir at redhat.com
Thu May 28 09:00:39 EDT 2009
On 27 May 2009, at 05:59, Dan Allen wrote:
> Regarding the discussion of the design for StatusMessages...
>
> On Tue, May 5, 2009 at 7:59 AM, Clint Popetz <cpopetz at gmail.com>
> wrote:
> I want to
> point out that using a deployment type and @Specializes would seem to
> place us in the same situation as Seam 2.x with respect to the view
> layers co-existing in the same deployment, which
> https://jira.jboss.org/jira/browse/JBSEAM-3645 was meant to address.
>
> In other words, I'd rather that the choice of the StatusMessages bean
> that will be activated isn't based on deployment type, but rather is
> chosen at runtime based on the type of request, using the pattern in
> the patch for the above jira issue. Deployment types would of course
> still be used to choose which implementations of things like
> StatusMessages are available.
>
> I have taken a first stab at solving this problem. I'm open to other
> approaches, but first let me explain what I've done. As Clint points
> out, from one request to the next, you may be dealing with different
> frameworks (Wicket vs JSF for instance). But within the request, you
> want to be able to take specific actions relating to the current
> framework. Clearly, this is not the appropriate scenario for a
> deployment type since that is design for a setting/environment that
> is fixed. So I did some brainstorming.
>
> What I realized is that StatusMessages are really a generic
> repository that should be updated and consumed by the framework-
> specific activity. Therefore, it seems to me like there should be
> one and only one conversation-scoped StatusMessages. Then, if you
> want to have some extra methods for convenience (for instance in JSF
> to add a StatusMessage from an existing FacesMessage) you create a
> class which extends and wraps the StatusMessages component
> (StatusMessages would be injected into it and all overrides
> delegating to it). You could also override the onBeforeRender()
> method where you might put the logic for converting and transfering
> to the native message type and storage. The executor of that
> conversion would be implemented in the framework-specific listener.
>
> For instance, 9 out of 10 times you simply inject the StatusMessages
> to use in your application:
>
> @Current StatusMessages statusMessages;
>
> For JSF, there is a FacesMessages bean which inherits from
> StatusMessages (to keep the API the same) and delegates calls to the
> StatusMessages instance. It also adds the logic to create
> FacesMessage objects in the onBeforeRender() method
>
> public void onBeforeRender() {
> super.onBeforeRender();
> // create FacesMessage objects and register them here
> }
>
> The ConvertStatusMessagesListener (a JSF system event listener)
> executes the onBeforeRender() call.
>
> manager.getInstanceByType(StatusMessages.class, new
> AnnotationLiteral<Faces>() {}).onBeforeRender();
>
> There are also some convenience methods on the FacesMessages
> instance. If you want to use them, you inject as follows:
>
> @Faces FacesMessages facesMessages;
>
> I can't use @Current here because otherwise the resolution would be
> ambigous. I could just clone the StatusMessages API in the
> FacesMessages class to avoid having to use this binding type, so if
> you have a feeling/advice there, I would be glad to here it.
This is a reasonable approach IMO.
>
>
> Okay, that's one approach. Now for something different. There is a
> similar specialization w/ the Expressions class (an EL convenience
> API). If working within the JSF request, we want to override some
> methods so that the bean uses the current JSF EL context. In this
> case, I decided to try Clint's approach described in the cited issue
> report. A producer method will locate beans that have the binding
> type @RuntimeSelected and will consult the isActive() method to
> determine which one is prepared to handle the current request. The
> isActive() method comes from the RuntimeSelectedBean interface. So
> the bean must have both the binding type and the interface. There is
> a second binding type, @Default, which indicates which
> implementation should be used when there are no @RuntimeSelected
> implementations present or active. It is mutually exclusive with
> @RuntimeSelected.
>
> So you have:
> public @Default class Expressions { ... }
> public @RuntimeSelected class FacesExpressions extends Expressions,
> RuntimeSelectedBean {
> public boolean isActive()
> {
> return FacesContext.getCurrentInstance() != null;
> }
> }
>
> public @RuntimeSelected class WicketExpressions extends Expressions,
> RuntimeSelectedBean {
> public boolean isActive()
> {
> return Application.exists();
> }
> }
>
> The producer type for the Expressions bean is application-scoped and
> the producer method is dependent-scoped (or request-scoped?). The
> available instances are looked up when the producer is initialized
> and the instance is selected from this set each time the producer is
> resolved.
>
> Of course, I could have used this strategy for the StatusMessages
> too, except in the case of StatusMessages it is logical to use the
> shared/generic StatusMessages bean. It's only when you need to
> convert the messages do you need the specialization and therefore I
> think we can avoid having to do the runtime selection.
>
> I've committed all of this to the Seam trunk if you want to check it
> out. I'm open to suggestions...I'm just trying to get used WB and
> find a workable approach. The solutions we decide on are important
> because the define a standard practice we will follow as more cases
> arise.
>
> -Dan
>
> --
> Dan Allen
> Senior Software Engineer, Red Hat | Author of Seam in Action
>
> http://mojavelinux.com
> http://mojavelinux.com/seaminaction
> http://in.relation.to/Bloggers/Dan
>
> NOTE: While I make a strong effort to keep up with my email on a daily
> basis, personal or other work matters can sometimes keep me away
> from my email. If you contact me, but don't hear back for more than
> a week,
> it is very likely that I am excessively backlogged or the message was
> caught in the spam filters. Please don't hesitate to resend a
> message if
> you feel that it did not reach my attention.
> _______________________________________________
> seam-dev mailing list
> seam-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/seam-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/seam-dev/attachments/20090528/61a9618a/attachment.html
More information about the seam-dev
mailing list