/* * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package com.arsdigita.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletConfig; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.arsdigita.dispatcher.DispatcherHelper; import com.arsdigita.util.Assert; import com.arsdigita.util.Classes; import org.apache.log4j.Logger; /** *

* A simple servlet for dispatching abstract URLs * to concrete JSP files. *

*

* This is intended to be used in all places where BebopMapServlet would * have traditionally been used, since it allows projects to override the * JSP at a particular location & add additional JSPs at new URLs without * Java code changes. *

*

* The application should set its web.xml to contain *

*
 * <web-app>
 *   <servlet>
 *     <servlet-name>files</servlet-name>
 *     <servlet-class>com.arsdigita.web.ApplicationFileServlet</servlet-class>
 *     <init-param>
 *       <param-name>template-path</param-name>
 *       <param-value>/templates/ccm-mywebapp</param-value>
 *     </init-param>
 *   </servlet>
 * 
 *   <servlet-mapping>
 *     <servlet-name>files</servlet-name>
 *     <url-pattern>/files/*</url-pattern>
 *   </servlet-mapping>
 * </web-app>
 * 
*

* In the Application class it should define: *

*
 *  public String getContextPath() {
 *     return "ccm-mywebapp";
 *  }
 * 
 *  public String getServletPath() {
 *    return "/files";
 *  }
 * 
*

* It can then put JSP files in a 'templates/ccm-mywebapp' directory at * the root of its private webapp. Files in this directory can be scoped by * application URL stub, so a link to *

*
 * /ccm/myparentapp/myappinstance/foo.jsp
 * 
*

* gets resolved to *

*
 * /templaates/myparentapp/myappinstance/foo.jsp
 * /templates/myparentapp/foo.jsp
 * /templates/foo.jsp
 * 
*

* until one matches. *

*/ public class ApplicationFileServlet extends BaseApplicationServlet { private static Logger s_log = Logger.getLogger(ApplicationFileServlet.class); private String m_templatePath; private ApplicationFileResolver m_resolver; /** * * @param config * @throws ServletException */ public void init(ServletConfig config) throws ServletException { super.init(config); m_templatePath = config.getInitParameter("template-path"); Assert.exists(m_templatePath, String.class); Assert.isTrue(m_templatePath.startsWith("/"), "template-path starts with '/'"); Assert.isTrue(!m_templatePath.endsWith("/"), "template-path does not end with '/'"); String resolverName = config.getInitParameter("file-resolver"); if (resolverName == null) { m_resolver = Web.getConfig().getApplicationFileResolver(); } else { m_resolver = (ApplicationFileResolver)Classes.newInstance(resolverName); } if (s_log.isDebugEnabled()) { s_log.debug("Template path is " + m_templatePath + " with resolver " + m_resolver.getClass().getName()); } } protected void doService(HttpServletRequest sreq, HttpServletResponse sresp, Application app) throws ServletException, IOException { RequestDispatcher rd = m_resolver.resolve(m_templatePath, sreq, sresp, app); if (rd == null) { if (s_log.isDebugEnabled()) { s_log.debug("No template found, sending 404"); } sresp.sendError(HttpServletResponse.SC_NOT_FOUND); return; } if (s_log.isDebugEnabled()) { s_log.debug("Dispatching with " + rd); } sreq = DispatcherHelper.restoreOriginalRequest(sreq); rd.forward(sreq, sresp); } }