You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.
This is the solution I came up with to log user requests:
@Startup
@Scope(ScopeType.APPLICATION)
@Name("mypackage.loggingFilter")
@BypassInterceptors
@Filter
public class LoggingFilter extends AbstractFilter
{
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException
{
if (HttpServletRequest.class.isAssignableFrom(arg0.getClass()))
{
HttpServletRequest r = (HttpServletRequest) arg0;
try
{
Lifecycle.beginCall();
HttpSession ses = r.getSession(false);
if (ses != null)
{
UserLog log = (UserLog) ses.getAttribute("userLog");
if (log != null)
{
UserTransaction transaction = (UserTransaction) Component
.getInstance("org.jboss.seam.transaction.transaction");
try
{
transaction.begin();
EntityManager e = (EntityManager) Component
.getInstance("entityManager");
e.joinTransaction();
log.setLastRequest(new Date());
e.merge(log);
e.flush();
} finally
{
transaction.commit();
}
}
}
} catch (Exception e)
{
System.out.println("COULD NOT LOG USER ACTIVITY " + e.getMessage());
} finally
{
Lifecycle.endCall();
}
}
arg2.doFilter(arg0, arg1);
}
}
In this simple case all it is updating the last request time for a session scoped UserLog entity. A few things to note: