160 lines
4.9 KiB
Java
Executable File
160 lines
4.9 KiB
Java
Executable File
/*
|
|
* 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;
|
|
|
|
/**
|
|
* <p>
|
|
* A simple servlet for dispatching abstract URLs
|
|
* to concrete JSP files.
|
|
* </p>
|
|
* <p>
|
|
* 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.
|
|
* </p>
|
|
* <p>
|
|
* The application should set its web.xml to contain
|
|
* </p>
|
|
* <pre>
|
|
* <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>
|
|
* </pre>
|
|
* <p>
|
|
* In the Application class it should define:
|
|
* </p>
|
|
* <pre>
|
|
* public String getContextPath() {
|
|
* return "ccm-mywebapp";
|
|
* }
|
|
*
|
|
* public String getServletPath() {
|
|
* return "/files";
|
|
* }
|
|
* </pre>
|
|
* <p>
|
|
* 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
|
|
* </p>
|
|
* <pre>
|
|
* /ccm/myparentapp/myappinstance/foo.jsp
|
|
* </pre>
|
|
* <p>
|
|
* gets resolved to
|
|
* </p>
|
|
* <pre>
|
|
* /templaates/myparentapp/myappinstance/foo.jsp
|
|
* /templates/myparentapp/foo.jsp
|
|
* /templates/foo.jsp
|
|
* </pre>
|
|
* <p>
|
|
* until one matches.
|
|
* </p>
|
|
*/
|
|
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);
|
|
}
|
|
|
|
}
|