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: package de.schlund.pfixxml;
020:
021: import java.io.IOException;
022:
023: import javax.servlet.Filter;
024: import javax.servlet.FilterChain;
025: import javax.servlet.FilterConfig;
026: import javax.servlet.ServletException;
027: import javax.servlet.ServletRequest;
028: import javax.servlet.ServletResponse;
029: import javax.servlet.http.HttpServletRequest;
030: import javax.servlet.http.HttpServletResponse;
031: import javax.servlet.http.HttpSession;
032:
033: import de.schlund.pfixcore.workflow.Context;
034:
035: /**
036: * Abstract base class that can be used to derive a servlet filter that is aware
037: * of Pustefix's {@link Context} object. Implementations have to override the
038: * {@link #doFilter(HttpServletRequest, HttpServletResponse, FilterChain, Context)}
039: * method to implement the actual filter code.
040: *
041: * @author Sebastian Marsching <sebastian.marsching@1und1.de>
042: */
043: public abstract class AbstractContextServletFilter implements Filter {
044:
045: private String contextIdentifier;
046:
047: public void init(FilterConfig config) throws ServletException {
048: contextIdentifier = config.getInitParameter("contextRef");
049: if (contextIdentifier == null) {
050: throw new ServletException(
051: "Init parameter contextRef is not set for serlvet filter "
052: + config.getFilterName());
053: }
054: }
055:
056: public void destroy() {
057: // Nothing to do
058: }
059:
060: public void doFilter(ServletRequest sreq, ServletResponse sres,
061: FilterChain chain) throws IOException, ServletException {
062: if (sreq instanceof HttpServletRequest
063: && sres instanceof HttpServletResponse) {
064: HttpServletRequest req = (HttpServletRequest) sreq;
065: HttpServletResponse res = (HttpServletResponse) sres;
066:
067: Context context = null;
068: HttpSession session = req.getSession(false);
069: if (session != null) {
070: context = SessionContextStore.getInstance(session)
071: .getContext(this .contextIdentifier);
072: }
073:
074: this .doFilter(req, res, chain, context);
075: } else {
076: chain.doFilter(sreq, sres);
077: }
078: }
079:
080: /**
081: * Overwrite this method to implement filter. The method code has either to
082: * handle the request and return a response or to call the
083: * <code>doFilter()</code> method on the supplied <code>FilterChain</code>
084: * object. The method will only be called, if the request is a HTTP request.
085: *
086: * @param req request being filtered. May be wrapped by the filter to change
087: * values / bahavior of the object.
088: * @param res response supplied by the container. May be wrapped by the filter
089: * to add new functionality (e.g. filtering of the output).
090: * @param chain object representing the filter chain. Provides methods to
091: * forward a request to the next filter in the chain.
092: * @param context Pustefix context object for the current session. May be
093: * <code>null</code> if no valid session is available for the current request.
094: * @throws IOException
095: * @throws ServletException
096: */
097: abstract protected void doFilter(HttpServletRequest req,
098: HttpServletResponse res, FilterChain chain, Context context)
099: throws IOException, ServletException;
100:
101: }
|