[seam-dev] Replacing pages.xml

Stuart Douglas stuart at baileyroberts.com.au
Thu Feb 18 23:58:39 EST 2010



I have been thinking about the replacement for pages.xml. Even though JSF2 has made some aspects of pages.xml redundant, pages.xml is still important as it allows you to apply actions/security setting etc to a large number of pages at once using wildcards. With that said however it would be nice to move to a design that is more typesafe and extensible. I have come up with a preliminary idea of how this might work, I will explain with an example:

@PageMetadata
public @Interface SecurityConfig
{
   boolean loginRequired();
   String restrict();
}

/**
 * This bean will only be considered for injection when the context path is
 * /app/restricted/*, and it is the most specific page available.
 */
@ViewId("/app/restricted/*")
@SecurityConfig(loginRequired=true)
public class RestrictedArea extends Page
{

}

This may also be configured via XML using seam-xml.
There is nothing special about the page class, it is an empty class
that is provided solely to be configured with annotations:

<Page>
  <ViewId>/app/restricted/*</ViewId>
  <SecurityConfig loginRequired="true" />
</Page>

The application can get access to this information in a number of ways:

@Inject PageDataProvider<SecurityConfig> data;

public void doStuff()
{
  //get the most specific result
  SecurityConfig security = data.get();

  //get all applicable results
  List<SecurityConfig> secinfo = data.getAll();

  //secinfo is ordered from most to least specific,
  //secinfo.get(0) will be equal to data.get()

}

Alternatively the most specific result can be injected directly:

@Inject SecurityConfig data;

We could also support an event based approach:

public void pageEvent(@Observes @Rendered("/secure/*") Page page, SecurityConfig config)
{
  //do stuff
}

Does this sound like a good approach? I am fairly sure all this can be implemented as a portable extension. 



More information about the seam-dev mailing list