Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
package com.example.wicket.filter;

import org.apache.wicket.Application;
import org.apache.wicket.protocol.http.WebApplication;

import javax.servlet.*;
import java.io.IOException;

/**
 * Filter that sets the wicket application, just like {@link org.apache.wicket.protocol.http.WicketFilter}
 * would do.
 *
 * <p>This implementation assumes that it is placed in a filter chain, <i>after</i> WicketFilter,
 * for URLs that are not handled by the WicketFilter.
 *
 * <p>The filter name of the wicket filter is retrieved from the init parameter wicketFilterName.
 *
 * @author Erik van Oosten
 */
public class WicketApplicationFilter implements Filter {

    private WebApplication webApplication;

    public void init(FilterConfig filterConfig) throws ServletException {
        // Get instance of the Wicket application, it is set by the Wicket filter.
        String contextKey = "wicket:" + filterConfig.getInitParameter("wicketFilterName");
        webApplication = (WebApplication) filterConfig.getServletContext().getAttribute(contextKey);

        if (webApplication == null) {
            throw new ServletException("Could not find the Wicket application, please make " +
                    "sure filter WicketApplicationFilter is embedded in Wicket's filter");
        }
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            // Set the webapplication for this thread
            Application.set(webApplication);
            // for wicket 1.5.x this is:
            // org.apache.wicket.ThreadContext.setApplication(webApplication);
            
            chain.doFilter(request, response);

        } finally {
            // always unset the application thread local
            Application.unset();

            // wicket 1.5.x:
            // org.apache.wicket.ThreadContext.setApplication(null);
        }
    }

    public void destroy() {
        webApplication = null;
    }
}