/*
* Copyright 2004-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.jboss.seam.mail.ui.context;
import java.io.IOException;
import java.io.Writer;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.context.ResponseWriter;
/**
* The ResponseWriter for mail objects needs to support unencoded plain text
* output.
*/
public class MailResponseWriter extends ResponseWriter
{
public static String TEXT_PLAIN_CONTENT_TYPE = "text/plain";
public static String HTML_PLAIN_CONTENT_TYPE = "text/html";
private String contentType;
private ResponseWriter delegate;
public MailResponseWriter(ResponseWriter responseWriter, String contentType)
throws FacesException
{
this.delegate = responseWriter;
this.contentType = contentType;
}
@Override
public String getContentType()
{
if (contentType == null)
{
return delegate.getContentType();
}
else
{
return contentType;
}
}
@Override
public String getCharacterEncoding()
{
return delegate.getCharacterEncoding();
}
@Override
public void flush() throws IOException
{
delegate.flush();
}
@Override
public void startDocument() throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
// Do nothing, can't write tags/attributes to plaintext!
}
else
{
delegate.startDocument();
}
}
@Override
public void endDocument() throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
// Do nothing, can't write tags/attributes to plaintext!
}
else
{
delegate.endDocument();
}
}
@Override
public void startElement(String name, UIComponent component) throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
// Do nothing, can't write tags/attributes to plaintext!
}
else
{
delegate.startElement(name, component);
}
}
@Override
public void endElement(String name) throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
// Do nothing, can't write tags/attributes to plaintext!
}
else
{
delegate.endElement(name);
}
}
@Override
public void writeAttribute(String name, Object value, String property)
throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
// Do nothing, can't write tags/attributes to plaintext!
}
else
{
delegate.writeAttribute(name, value, property);
}
}
@Override
public void writeURIAttribute(String name, Object value, String componentPropertyName)
throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
// Do nothing, can't write tags/attributes to plaintext!
}
else
{
delegate.writeURIAttribute(name, value, componentPropertyName);
}
}
@Override
public void writeComment(Object comment) throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
// Do nothing, can't write comments to plaintext!
}
else
{
delegate.writeComment(comment);
}
}
@Override
public void writeText(Object value, String componentPropertyName) throws IOException
{
if (TEXT_PLAIN_CONTENT_TYPE.equals(getContentType()))
{
if (value == null)
{
throw new NullPointerException("Text must not be null.");
}
String strValue = value.toString();
write(strValue);
}
else
{
delegate.writeText(value, componentPropertyName);
}
}
@Override
public void writeText(char cbuf[], int off, int len) throws IOException
{
if (cbuf == null)
{
throw new NullPointerException("cbuf name must not be null");
}
if (cbuf.length < off + len)
{
throw new IndexOutOfBoundsException((off + len) + " > " + cbuf.length);
}
String strValue = new String(cbuf, off, len);
write(strValue);
}
@Override
public ResponseWriter cloneWithWriter(Writer writer)
{
return cloneWithWriter(writer, null);
}
public MailResponseWriter cloneWithWriter(Writer writer, String contentType)
{
MailResponseWriter newWriter = new MailResponseWriter(delegate.cloneWithWriter(writer), contentType);
return newWriter;
}
// Writer methods
@Override
public void close() throws IOException
{
delegate.close();
}
@Override
public void write(char cbuf[], int off, int len) throws IOException
{
String strValue = new String(cbuf, off, len);
write(strValue);
}
@Override
public void write(int c) throws IOException
{
delegate.write(c);
}
@Override
public void write(char cbuf[]) throws IOException
{
String strValue = new String(cbuf);
write(strValue);
}
@Override
public void write(String str) throws IOException
{
delegate.write(str);
}
@Override
public void write(String str, int off, int len) throws IOException
{
String strValue = str.substring(off, off + len);
write(strValue);
}
}