All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ajax4jsf.framework.ajax.xmlfilter.CacheContent Maven / Gradle / Ivy

Go to download

Ajax4jsf is an open source extension to the JavaServer Faces standard that adds AJAX capability to JSF applications without requiring the writing of any JavaScript.

The newest version!
/**
 * Licensed under the Common Development and Distribution License,
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.sun.com/cddl/
 *   
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package org.ajax4jsf.framework.ajax.xmlfilter;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.Writer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.ajax4jsf.io.FastBufferOutputStream;
import org.ajax4jsf.io.FastBufferWriter;

/**
 * @author shura (latest modification by $Author: alexsmirnov $)
 * @version $Revision: 1.9 $ $Date: 2007/01/05 20:24:53 $
 *
 */
public class CacheContent implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 8120940486890871177L;
//	private transient ByteArrayOutputStream outputStream ;
	private transient FastBufferOutputStream outputStream ;
	private transient FastBufferWriter stringOutputWriter;
	private transient PrintWriter servletWriter;
	private transient ServletOutputStream servletStream;
	// content to send.
	private byte[] content = null;
	private String writerContent = null;

	boolean filledOutputStream = false;
	boolean filledOutputWriter = false;
	private Map headers = new HashMap();
	private String contentType;
	
	/**
	 * Send saved content to http responce
	 * @param response
	 * @throws IOException
	 */
	public void send(HttpServletResponse response) throws IOException{
		if (filledOutputStream) {
			OutputStream out = response.getOutputStream();
			if(content != null) {
				out.write(content);
			} else {
				this.outputStream.writeTo(out);
			}
//			out.flush();
//			out.close();
		} else if (filledOutputWriter) {
			Writer out = response.getWriter();
			if (null != writerContent) {
				out.write(writerContent);
			} else {
				stringOutputWriter.writeTo(out);
			}
//			out.flush();
//			out.close();
		}
	}
	
	/**
	 * Send saved headers to http responce.
	 * @param response
	 */
	public void sendHeaders(HttpServletResponse response){
		for (Iterator iter = headers.entrySet().iterator(); iter.hasNext();) {
			Map.Entry element = (Map.Entry) iter.next();
			String header = (String) element.getKey();
			if (element.getValue() instanceof Long) {
				Long time = (Long) element.getValue();
				response.setDateHeader(header,time.longValue());
			} else if (element.getValue() instanceof Integer) {
				Integer value = (Integer) element.getValue();
				response.setIntHeader(header,value.intValue());
			} else {
				response.setHeader(header,(String) element.getValue());
			}
			// set real content-length.
			
///			if (null != content) {
			if (filledOutputStream) {
///				response.setIntHeader("Content-Length", content.length);
				response.setIntHeader("Content-Length", outputStream.getLength());
			} // TODO - calculate content-lenght for writer ?
			if( null != contentType){
				response.setContentType(this.contentType);
			}
		}
	}
	
	public void setDateHeader(String name, long value) {
		// Expires not stored in cache - must be re-calculated for every response.
		if(!"Expires".equals(name)){
			headers.put(name, new Long(value));
		}
	}

	/* (non-Javadoc)
	 * @see org.ajax4jsf.framework.resource.ResourceContext#setHeader(java.lang.String, java.lang.String)
	 */
	public void setHeader(String name, String value) {
		headers.put(name,value);
	}

	/* (non-Javadoc)
	 * @see org.ajax4jsf.framework.resource.ResourceContext#setIntHeader(java.lang.String, int)
	 */
	public void setIntHeader(String name, int value) {
		headers.put(name, new Integer(value));
	}

	/**
	 * Create UNIX command 'tee' like stream - send all data to servlet 
	 * @param responseStream
	 * @return
	 */
	public OutputStream getOutputStream(final OutputStream responseStream){
		if (null == servletStream) {
			outputStream = new FastBufferOutputStream(1024);
			servletStream = new ServletOutputStream(){
				
				/* (non-Javadoc)
				* @see java.io.OutputStream#close()
				*/
				public void close() throws IOException {
					filledOutputStream = true;
///					content  = outputStream.toByteArray();
					responseStream.close();
					content = null;
				}
				
				/* (non-Javadoc)
				* @see java.io.OutputStream#flush()
				*/
				public void flush() throws IOException {
					responseStream.flush();
				}
				
				/* (non-Javadoc)
				* @see java.io.OutputStream#write(byte[], int, int)
				*/
				public void write(byte[] b, int off, int len) throws IOException {
					outputStream.write(b, off, len);
					responseStream.write(b, off, len);
				}
				
				/* (non-Javadoc)
				* @see java.io.OutputStream#write(byte[])
				*/
				public void write(byte[] b) throws IOException {
					outputStream.write(b);
					responseStream.write(b);
				}
				
				public void write(int b) throws IOException {
					outputStream.write(b);
					responseStream.write(b);
				}
				
			};
		}
		return servletStream;
	}
	
	public PrintWriter getWriter( final Writer responseWriter) {
		if (null == servletWriter) {
			stringOutputWriter = new FastBufferWriter(1024);
			Writer out = new Writer() {

				public void write(char[] cbuf, int off, int len)
						throws IOException {
					responseWriter.write(cbuf, off, len);
					stringOutputWriter.write(cbuf, off, len);
				}

				public void flush() throws IOException {
					responseWriter.flush();
				}

				public void close() throws IOException {
					responseWriter.close();
///					writerContent = stringOutputWriter.toString();
					filledOutputWriter = true;
					writerContent = null;
				}

			};
			servletWriter = new PrintWriter(out);
		}
	  return servletWriter;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
		
	}

	/**
	 * @return Returns the contentType.
	 */
	public String getContentType() {
		return contentType;
	}
	
	private void writeObject(java.io.ObjectOutputStream s) throws IOException {
		if(filledOutputStream) {
			if(outputStream != null) {
				content = outputStream.toByteArray();
			}
		} else if(filledOutputWriter) {
			if(stringOutputWriter != null) {
				char[] cs = stringOutputWriter.toCharArray();
				writerContent = new String(cs);
			}
		}
		s.defaultWriteObject();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy