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

org.directwebremoting.convert.FileConverter Maven / Gradle / Ivy

package org.directwebremoting.convert;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import org.directwebremoting.Container;
import org.directwebremoting.ConversionException;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.extend.AbstractConverter;
import org.directwebremoting.extend.ContainerUtil;
import org.directwebremoting.extend.DataUrlDownloadManager;
import org.directwebremoting.extend.DownloadManager;
import org.directwebremoting.extend.FormField;
import org.directwebremoting.extend.InboundVariable;
import org.directwebremoting.extend.NonNestedOutboundVariable;
import org.directwebremoting.extend.OutboundContext;
import org.directwebremoting.extend.OutboundVariable;
import org.directwebremoting.io.FileTransfer;
import org.directwebremoting.io.InputStreamFactory;
import org.directwebremoting.util.BrowserDetect;
import org.directwebremoting.util.CopyUtils;
import org.directwebremoting.util.UserAgent;

/**
 * The FileConverter can only convert inbound files, convertOutbound is not
 * supported.
 * Files come from an <input type="file"/> on the client.
 * @author Lance Semmens [uklance at gmail dot com]
 * @author Joe Walker [joe at getahead dot org]
 * @author Niklas Johansson [niklas dot json at gmail dot com]
 */
public class FileConverter extends AbstractConverter
{
    /* (non-Javadoc)
     * @see org.directwebremoting.extend.Converter#convertInbound(java.lang.Class, org.directwebremoting.extend.InboundVariable, org.directwebremoting.extend.InboundContext)
     */
    public Object convertInbound(Class paramType, InboundVariable data) throws ConversionException
    {
        if (data.isNull())
        {
            return null;
        }

        try
        {
            final FormField formField = data.getFormField();
            if (paramType == FileTransfer.class)
            {
                InputStreamFactory inFactory = new InputStreamFactory()
                {
                    public InputStream getInputStream() throws IOException
                    {
                        return formField.getInputStream();
                    }

                    public void close() throws IOException
                    {
                        formField.getInputStream().close();
                    }
                };
                return new FileTransfer(formField.getName(), formField.getMimeType(), formField.getFileSize(), inFactory);
            }
            else if (paramType == InputStream.class)
            {
                return formField.getInputStream();
            }
            else if (paramType == BufferedImage.class)
            {
                return ImageIO.read(formField.getInputStream());
            }
            else if (paramType.isArray() && paramType.getComponentType() == Byte.TYPE)
            {
                InputStream in = formField.getInputStream();
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                CopyUtils.copy(in, out);
                return out.toByteArray();
            }
        }
        catch (IOException ex)
        {
            throw new ConversionException(paramType, ex);
        }

        throw new ConversionException(paramType, "File conversion is not possible for a " + paramType);
    }

    /* (non-Javadoc)
     * @see org.directwebremoting.extend.Converter#convertOutbound(java.lang.Object, org.directwebremoting.extend.OutboundContext)
     */
    public OutboundVariable convertOutbound(final Object object, OutboundContext outboundContext) throws ConversionException
    {
        if (object == null)
        {
            return new NonNestedOutboundVariable("null");
        }

        try
        {
            FileTransfer transfer;

            if (object instanceof BufferedImage)
            {
                transfer = new FileTransfer((BufferedImage) object, "png");
            }
            else if (object instanceof InputStream)
            {
                final InputStream in = (InputStream) object;
                transfer = new FileTransfer("download.dat", "binary/octet-stream", -1, new InputStreamFactory()
                {
                    public InputStream getInputStream() throws IOException
                    {
                        return in;
                    }

                    public void close() throws IOException
                    {
                        in.close();
                    }
                });
            }
            else if (object instanceof FileTransfer)
            {
                transfer = (FileTransfer) object;
            }
            else if (object.getClass().isArray() && object.getClass().getComponentType() == Byte.TYPE)
            {
                transfer = new FileTransfer("download.dat", "binary/octet-stream", (byte[]) object);
            }
            else
            {
                throw new ConversionException(object.getClass());
            }

            Container container = WebContextFactory.get().getContainer();
            boolean preferDataUrlSchema = ContainerUtil.getBooleanSetting(container, "preferDataUrlSchema", false);

            DownloadManager downloadManager;
            if (preferDataUrlSchema && isDataUrlAvailable())
            {
                downloadManager = new DataUrlDownloadManager();
            }
            else
            {
                downloadManager = container.getBean(DownloadManager.class);
            }

            String url = downloadManager.addFileTransfer(transfer);
            return new NonNestedOutboundVariable(url);
        }
        catch (IOException ex)
        {
            throw new ConversionException(getClass(), ex);
        }
    }

    /**
     * Is the data: URL allowed by the current browser.
     * @return true if data: is allowed
     */
    protected boolean isDataUrlAvailable()
    {
        HttpServletRequest request = WebContextFactory.get().getHttpServletRequest();

        return BrowserDetect.atLeast(request, UserAgent.IE, 8) ||
               BrowserDetect.atLeast(request, UserAgent.Gecko, 20041107) ||
               BrowserDetect.atLeast(request, UserAgent.AppleWebKit, 2) ||
               BrowserDetect.atLeast(request, UserAgent.Opera, 8);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy