001: /*
002: * argun 1.0
003: * Web 2.0 delivery framework
004: * Copyright (C) 2007 Hammurapi Group
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * URL: http://www.hammurapi.biz
021: * e-Mail: support@hammurapi.biz
022: */
023:
024: package biz.hammurapi.web;
025:
026: import java.io.IOException;
027: import java.io.PrintWriter;
028:
029: import javax.servlet.Filter;
030: import javax.servlet.FilterChain;
031: import javax.servlet.FilterConfig;
032: import javax.servlet.ServletException;
033: import javax.servlet.ServletOutputStream;
034: import javax.servlet.ServletRequest;
035: import javax.servlet.ServletResponse;
036: import javax.servlet.http.HttpServletRequest;
037: import javax.servlet.http.HttpServletResponse;
038: import javax.servlet.http.HttpServletResponseWrapper;
039:
040: import org.apache.log4j.Logger;
041:
042: import biz.hammurapi.config.Context;
043: import biz.hammurapi.eval.ExpandingFilterWriter;
044:
045: /**
046: * Replaces response output stream and writer with "parsing" ones, which subsitute ${expression}
047: * occurences with expression evaluation results.
048: * @author Pavel Vlasov
049: * @version $Revision: 1.1 $
050: */
051:
052: public class ExpandingFilter implements Filter {
053:
054: static Logger logger = Logger.getLogger(ExpandingFilter.class);
055:
056: /**
057: * Init method for this filter
058: *
059: */
060: public void init(final FilterConfig filterConfig)
061: throws ServletException {
062: logger.info("Initializing expanding filter");
063: }
064:
065: /**
066: * @param request The servlet request we are processing
067: * @param result The servlet response we are creating
068: * @param chain The filter chain we are processing
069: *
070: * @exception IOException if an input/output error occurs
071: * @exception ServletException if a servlet error occurs
072: */
073: public void doFilter(ServletRequest request,
074: ServletResponse response, FilterChain chain)
075: throws IOException, ServletException {
076: ExpandingResponseWrapper expandingResponseWrapper = new ExpandingResponseWrapper(
077: (HttpServletResponse) response,
078: (HttpServletRequest) request);
079: try {
080: chain.doFilter(request, expandingResponseWrapper);
081: } finally {
082: expandingResponseWrapper.close();
083: }
084: }
085:
086: public void destroy() {
087: // TODO Auto-generated method stub
088:
089: }
090:
091: private class ExpandingResponseWrapper extends
092: HttpServletResponseWrapper {
093: private PrintWriter writer;
094: private ExpandingServletOutputStream out;
095: ExpandingFilterWriter expandingFilterWriter;
096: private Context context;
097:
098: void close() throws IOException {
099: if (out != null) {
100: out.close();
101: }
102:
103: if (expandingFilterWriter != null) {
104: expandingFilterWriter.close();
105: }
106:
107: if (writer != null) {
108: writer.close();
109: }
110: }
111:
112: /**
113: * @param response
114: */
115: public ExpandingResponseWrapper(HttpServletResponse response,
116: HttpServletRequest request) {
117: super (response);
118: context = new RequestContext(request);
119: }
120:
121: public ServletOutputStream getOutputStream() throws IOException {
122: if (out == null) {
123: out = new ExpandingServletOutputStream(super
124: .getOutputStream(), context);
125: }
126: return out;
127: }
128:
129: public PrintWriter getWriter() throws IOException {
130: if (writer == null) {
131: expandingFilterWriter = new ExpandingFilterWriter(super
132: .getWriter(), context);
133: writer = new PrintWriter(expandingFilterWriter);
134: }
135: return writer;
136: }
137: }
138: }
|