NOTE: This is outdated information that applies only to Tapestry 4, though the approach may be adaptable to Tapestry 5 as well.

This is a code for a Servlet Filter that allows to create shortcuts to Tapestry urls. It is an alternative to urlrewrite. I wrote this code because I'm coding most parameters using the datasqueezer and my shortcuts needs to do more processing than urlrewrite (also I'm allergic to regular expressions).

Inside the web.xml I have

    <filter>
        <filter-name>ActServletFilter</filter-name>
        <filter-class>actualis.web.ServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ActServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

public class ServletFilter implements Filter {

  private FilterConfig m_config;
  
  public void init(FilterConfig config) throws ServletException {
    m_config = config;
    for (UrlPage ipage:UrlPage.values()) {
      ipage.register(this);
    }    
  }   
  
  private DataSqueezer m_datasqueezer;

  public DataSqueezer getDataSqueezer() {
    if (m_datasqueezer == null)
      m_datasqueezer = new DataSqueezer(null);  
    return m_datasqueezer;    
  }
  
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    final HttpServletRequest hrequest = (HttpServletRequest) request;
    final HttpServletResponse hresponse = (HttpServletResponse) response;

    String servletPath = hrequest.getServletPath();

    String compString = servletPath.toUpperCase();
    for (UrlPage ipage:UrlPage.values()) {
      String cString = '/' + ipage.getName();
      if (compString.startsWith(cString.toUpperCase())) {
        ExternalPageInfos infos = ipage.getPageInfos(hrequest); 
        String newURL = hrequest.getContextPath() + "/exec?service=external/" + infos.pageName;
        for (String par:infos.parameters) {
          newURL = newURL + "&" + "sp=" + par;
        }
        
        hresponse.sendRedirect(newURL);
        return;
      }
    }

    chain.doFilter(request, response);    
  }

  public void destroy() {
  }

And here is my enum that contains all the shortcut infos. It creates shortcuts to two Tapestry pages, "FicheArticle" and "Partenaires". The first one is a shortcut article?ref=xxx and calls "FicheArticle". It passes the ref and a 0 as integer to the external page. The second is a shortcut partenaire?part=xxx and calls a page "Partenaires". The getSqueezeInfo method creates a hibernate object reference for the datasqueezer that can then be loaded (using the code I posted on the Hibernate/Spring/Tapestry integration).

import java.io.Serializable;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;

import org.hibernate.Hibernate;

public enum UrlPage {

  Article("article") {
    public ExternalPageInfos getPageInfos(HttpServletRequest request) throws IOException {
      ExternalPageInfos infos = new ExternalPageInfos();
      infos.pageName = "FicheArticle";
      String idArt = getSqueezeInfo(Article.class, request.getParameter("ref"));
      infos.parameters = new String[] { idArt, squeeze(0) };
      return infos;
    }
  },
  Partenaires("partenaires") {
    public ExternalPageInfos getPageInfos(HttpServletRequest request) {
      ExternalPageInfos infos = new ExternalPageInfos();
      infos.pageName = "Partenaires";
      String id_part = request.getParameter("part");
      infos.parameters = new String[] { id_part };
      return infos;
    }
  };

  private String m_urlname;

  private static ServletFilter s_filter;

  private static String squeeze(Object obj) throws IOException {
    return s_filter.getDataSqueezer().squeeze(obj);
  }

  private static String getSqueezeInfo(Class clazz, Object id) throws IOException {
    String info = clazz.getName();
    info = info.concat(ActualisEngine.HIB_SEPARATOR);
    info = info.concat(s_filter.getDataSqueezer().squeeze(id));
    return ActualisEngine.HIB_PREFIX + info;
  }

  UrlPage(String name) {
    m_urlname = name;
  }

  public String getName() {
    return m_urlname;
  }

  public abstract ExternalPageInfos getPageInfos(HttpServletRequest request)
      throws IOException;

  public void register(ServletFilter filter) {
    s_filter = filter;
  }
}

And the last class

public class ExternalPageInfos {

  String pageName;
  
  String[] parameters;
}

ShortcutUrls (last edited 2011-01-02 20:17:36 by BobHarner)