/* * Copyright (C) 2002-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 com.arsdigita.dispatcher.RequestEvent; import com.arsdigita.developersupport.DeveloperSupport; import com.arsdigita.util.Assert; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; /** *

The CCM main dispatcher. This servlet serves as the main * servlet (mapped to "/someprefix/*") for requests to the CCM * webapp.

* *

Upon finding an {@link com.arsdigita.web.Application application} at the * requested URL, this class sets a request attribute storing the ID of the * application and forwards to the servlet associated with it. If instead no * application is found, the request is forwarded to the fallback servlet, * if defined.

* *

This servlet may be deployed using web.xml entries like * these:

* *
 * <servlet>
 *   <servlet-name>ccm-dispatcher</servlet-name>
 *   <servlet-class>com.arsdigita.web.DispatcherServlet</servlet-class>
 *   <init-param>
 *     <param-name>fallback-servlet</param-name>
 *     <param-value>the-old-site-node-dispatcher</param-value>
 *   </init-param>
 * </servlet>
 *
 * <servlet-mapping>
 *   <servlet-name>ccm-dispatcher</servlet-name>
 *   <url-pattern>/ccm/*</url-pattern>
 * </servlet-mapping>
 * 
* *

It's important to also edit the com.arsdigita.web.Initializer * options to reflect where you've put your dispatcher.

* *
 * init com.arsdigita.web.Initializer {
 *     ...
 *     // This corresponds to a servlet mapping of "/ccm/*" and
 *     // assumes CCM is the default webapp.
 *     dispatcherContextPath = "";
 *     dispatcherServletPath = "/ccm";
 *     ...
 * }
 * 
* * @see com.arsdigita.web.BaseApplicationServlet * @author Justin Ross <jross@redhat.com> * @version $Id: DispatcherServlet.java 738 2005-09-01 12:36:52Z sskracic $ */ public class DispatcherServlet extends BaseServlet { private static Logger s_log = Logger.getLogger(DispatcherServlet.class); public static final String FALLBACK_SERVLET_PARAMETER = "fallback-servlet"; public static final String FALLING_BACK_ATTRIBUTE = DispatcherServlet.class.getName() + ".falling_back"; private String m_fallbackName = null; private final BaseDispatcher m_dispatcher; /** * */ public DispatcherServlet() { m_dispatcher = new BaseDispatcher(); } @Override public void doInit() throws ServletException { m_fallbackName = getServletConfig().getInitParameter(FALLBACK_SERVLET_PARAMETER); Assert.exists(m_fallbackName, String.class); Assert.exists(getServletConfig().getServletContext().getNamedDispatcher (m_fallbackName), RequestDispatcher.class); } @Override protected void doService(final HttpServletRequest sreq, final HttpServletResponse sresp) throws ServletException, IOException { DeveloperSupport.requestStart(new RequestEvent( sreq, sresp, null, true, false)); if (s_log.isDebugEnabled()) { s_log.debug("Servicing request '" + sreq.getRequestURI() + "'"); } DeveloperSupport.startStage("BaseDispatcher.dispatch"); /* Try to dispatch to an applications servlet (i.e. new style legacy free) */ boolean dispatched = m_dispatcher.dispatch(sreq, sresp); DeveloperSupport.endStage("BaseDispatcher.dispatch"); if (dispatched) { s_log.debug("Successfully dispatched to an application"); } else { s_log.debug("Could not dispatch this request to an " + "application; using the fallback servlet"); sreq.setAttribute(FALLING_BACK_ATTRIBUTE, Boolean.TRUE); DeveloperSupport.startStage("BaseDispatcher.forward"); RequestDispatcher fallbackDispatcher = getServletConfig().getServletContext().getNamedDispatcher (m_fallbackName); m_dispatcher.forward(fallbackDispatcher, sreq, sresp); DeveloperSupport.endStage("BaseDispatcher.forward"); } } @Override protected void doDestroy() { m_fallbackName = null; } }