package org.jboss.resteasy.plugins.providers.multipart;
import org.jboss.resteasy.plugins.providers.AbstractEntityProvider;
import org.jboss.resteasy.spi.ReaderException;
import org.jboss.resteasy.spi.WriterException;
import org.jboss.resteasy.resteasy_jaxrs.i18n.*;
import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
/**
* A provider to handle multipart representations. This implementation will be
* invoked when a method parameter takes a {@link MimeMultipart} as a method
* parameter or a return value and the
*
* @author <a href="mailto:ryan@damnhandy.com">Ryan J. McDonough</a>
* @Consumes value is either multipart/mixed or multipart/form-data.
* <p/>
* <code>
* @POST
* @Consumes("multipart/form-data") public void postData(MimeMultipart multipart) {
* ...
* </code>
* <p/>
* When the {@link MimeMultipart} is passed to the method body, it is up to the
* developer to extract the various parts.
*/
@Provider
@Produces("multipart/mixed")
@Consumes({"multipart/mixed", "multipart/form-data"})
public class MimeMultipartProvider extends AbstractEntityProvider<MimeMultipart>
{
/**
* @param in
* @param mediaType
* @return
* @throws IOException
*/
public static DataSource readDataSource(InputStream in, MediaType mediaType) throws IOException
{
ByteArrayDataSource ds = new ByteArrayDataSource(new BufferedInputStream(in), mediaType
.toString());
return ds;
}
/**
* @param type
* @param genericType
* @param annotations
* @return
*/
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
{
return MimeMultipart.class.equals(type);
}
/**
* @param type
* @param genericType
* @param annotations
* @return
*/
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
{
return MimeMultipart.class.equals(type);
}
/**
* FIXME Comment this
*
* @param type
* @param genericType
* @param annotations
* @param mediaType
* @param httpHeaders
* @param entityStream
* @return
* @throws IOException
* @throws WebApplicationException
* @see @see javax.ws.rs.ext.MessageBodyReader#readFrom(java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[], javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap, java.io.InputStream)
*/
public MimeMultipart readFrom(Class<MimeMultipart> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException
{
try
{
LogMessages.LOGGER.debugf("Provider : %s, Method : readFrom", getClass().getName());
DataSource ds = readDataSource(entityStream, mediaType);
return new MimeMultipart(ds);
}
catch (MessagingException e)
{
throw new ReaderException(e);
}
}
/**
* FIXME Comment this
*
* @param mimeMultipart
* @param type
* @param genericType
* @param annotations
* @param mediaType
* @param httpHeaders
* @param entityStream
* @throws IOException
* @see @see javax.ws.rs.ext.MessageBodyWriter#writeTo(java.lang.Object, java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[], javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap, java.io.OutputStream)
*/
public void writeTo(MimeMultipart mimeMultipart,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException
{
try
{
LogMessages.LOGGER.debugf("Provider : %s, Method : writeTo", getClass().getName());
// replace the Content-Type header to include the boundry
// information
httpHeaders.putSingle("Content-Type", MediaType.valueOf(mimeMultipart.getContentType()));
mimeMultipart.writeTo(entityStream);
}
catch (MessagingException e)
{
throw new WriterException(e);
}
}
}