001: /*
002: * This file is part of PFIXCORE.
003: *
004: * PFIXCORE is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU Lesser General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * PFIXCORE is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public License
015: * along with PFIXCORE; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: */
019:
020: package de.schlund.pfixxml.exceptionprocessor;
021:
022: import java.io.IOException;
023: import java.util.Properties;
024:
025: import javax.servlet.RequestDispatcher;
026: import javax.servlet.ServletContext;
027: import javax.servlet.ServletException;
028: import javax.servlet.http.HttpServletRequest;
029: import javax.servlet.http.HttpServletResponse;
030:
031: import org.apache.log4j.Logger;
032:
033: import de.schlund.pfixxml.PfixServletRequest;
034:
035: /**
036: * This class is simple implementation of the
037: * {@link ExceptionProcessor ExceptionProcessor}-interface. Look at the
038: * {@link #process(Exception, ExceptionConfig, PfixServletRequest, HttpServletRequest, HttpServletResponse) process()}-method
039: * for details.
040: *
041: * @author <a href="mailto:benjamin@schlund.de">Benjamin Reitzammer</a>
042: * @version $Id: PageForwardingExceptionProcessor.java 3351 2008-02-05 10:11:33Z smarsching $
043: */
044: public class PageForwardingExceptionProcessor implements
045: ExceptionProcessor {
046:
047: private final static Logger LOG = Logger
048: .getLogger(PageForwardingExceptionProcessor.class);
049:
050: /**
051: * The request gets forwarded to the page specified by the 'page'-attribute
052: * of {@link ExceptionConfig ExceptionConfig}. Also, the 'forward'-attribute
053: * of the exceptionConfig must be true, else this method will throw an exception.
054: *
055: * @param exception {@inheritDoc}
056: * @param exConfig {@inheritDoc}
057: * @param pfixReq {@inheritDoc}
058: * @param servletContext {@inheritDoc}
059: * @param req {@inheritDoc}
060: * @param res {@inheritDoc}
061: * @exception ServletException if the state of the <code>ExceptionConfig</code>-object
062: * is not sufficient for the processing of the provided <code>exception</code>
063: * @exception IOException if an IOException occurs while forwarding the request
064: */
065: public void processException(Throwable exception,
066: ExceptionConfig exConfig, PfixServletRequest pfixReq,
067: ServletContext context, HttpServletRequest req,
068: HttpServletResponse res, Properties props)
069: throws IOException, ServletException {
070: if (!exConfig.getForward() || exConfig.getPage() == null)
071: throw new ServletException(
072: "Wrong ExceptionConfig! 'forward' is false or 'page' is null : \n"
073: + exConfig);
074:
075: String forwardPage = exConfig.getPage();
076: pfixReq.setLastException(exception);
077: if (!forwardPage.startsWith("/"))
078: forwardPage = "/" + forwardPage;
079:
080: LOG.info("Processing Exception of type: "
081: + exception.getClass());
082: LOG.info("Trying to forward to page: " + forwardPage);
083:
084: RequestDispatcher dispatcher = context
085: .getRequestDispatcher(forwardPage);
086: if (dispatcher == null) {
087: ServletContext context2 = context.getContext(forwardPage);
088: if (context2 != null)
089: dispatcher = context2.getRequestDispatcher(forwardPage);
090: }
091:
092: // if the asked for context is not the context of the current servlet,
093: // and the environment is security conscious, context can be null
094: // sorry, can't do anything about it -- the forward page is unreachable from here then
095: if (dispatcher == null)
096: throw new ServletException("Can't forward to page "
097: + forwardPage
098: + "! Page is in an inaccessible ServletContext");
099:
100: dispatcher.forward(req, res);
101: }
102: }
|