de.mpg.imeji.presentation.servlet.ImageServlet.java Source code

Java tutorial

Introduction

Here is the source code for de.mpg.imeji.presentation.servlet.ImageServlet.java

Source

/**
 * License: src/main/resources/license/escidoc.license
 */
package de.mpg.imeji.presentation.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.log4j.Logger;

import de.mpg.imeji.presentation.util.LoginHelper;
import de.mpg.imeji.presentation.util.PropertyReader;
import de.mpg.imeji.presentation.util.ProxyHelper;

/**
 * A servlet for retrieving and redirecting the content objects urls.
 * 
 * @author franke (initial creation)
 * @author $Author: mfranke $ (last modification)
 * @version $Revision: 3780 $ $LastChangedDate: 2010-07-23 10:01:12 +0200 (Fri, 23 Jul 2010) $
 */
public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = 5502546330318540997L;
    private static Logger logger = Logger.getLogger(ImageServlet.class);
    private String userHandle;
    private String frameworkUrl;
    private static int counter = 0;

    @Override
    public void init() {
        try {
            frameworkUrl = PropertyReader.getProperty("escidoc.framework_access.framework.url");
            logger.info("ImageServlet initialized");
        } catch (Exception e) {
            throw new RuntimeException("Image servlet not initialized! " + e);
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String imageUrl = req.getParameter("imageUrl");
        GetMethod method = null;
        try {
            if (imageUrl == null) {
                resp.sendError(404, "URL null");
            } else {
                method = new GetMethod(imageUrl);
                method.setFollowRedirects(false);
                if (userHandle == null) {
                    userHandle = LoginHelper.login(PropertyReader.getProperty("imeji.escidoc.user"),
                            PropertyReader.getProperty("imeji.escidoc.password"));
                }
                method.addRequestHeader("Cookie", "escidocCookie=" + userHandle);
                method.addRequestHeader("Cache-Control", "public");
                method.setRequestHeader("Connection", "close");
                // Execute the method with HttpClient.
                HttpClient client = new HttpClient();
                ProxyHelper.setProxy(client, frameworkUrl);
                client.executeMethod(method);
                // byte[] input;
                InputStream input;
                if (method.getStatusCode() == 302) {
                    // try again
                    logger.info("try load image again");
                    method.releaseConnection();
                    userHandle = LoginHelper.login(
                            de.mpg.imeji.presentation.util.PropertyReader.getProperty("imeji.escidoc.user"),
                            PropertyReader.getProperty("imeji.escidoc.password"));
                    method = new GetMethod(imageUrl);
                    method.setFollowRedirects(true);
                    method.addRequestHeader("Cookie", "escidocCookie=" + userHandle);
                    client.executeMethod(method);
                }
                if (method.getStatusCode() != 200) {
                    ProxyHelper.setProxy(client, PropertyReader.getProperty("escidoc.imeji.instance.url"));
                    method = new GetMethod(PropertyReader.getProperty("escidoc.imeji.instance.url")
                            + "/resources/icon/defaultThumb.gif");
                    client.executeMethod(method);
                    // out = resp.getOutputStream();
                    if (method.getStatusCode() == 302) {
                        method.releaseConnection();
                        throw new RuntimeException("error code " + method.getStatusCode());
                    }
                    input = method.getResponseBodyAsStream();
                } else {
                    for (Header header : method.getResponseHeaders()) {
                        resp.setHeader(header.getName(), header.getValue());
                    }
                    input = method.getResponseBodyAsStream();
                }
                OutputStream out = resp.getOutputStream();
                byte[] buffer = new byte[1024];
                int numRead;
                long numWritten = 0;
                while ((numRead = input.read(buffer)) != -1) {
                    out.write(buffer, 0, numRead);
                    // out.flush();
                    numWritten += numRead;
                }
                input.close();
                method.releaseConnection();
                out.flush();
                out.close();
                // ReadableByteChannel inputChannel = Channels.newChannel(input);
                // WritableByteChannel outputChannel = Channels.newChannel(out);
                // fastChannelCopy(inputChannel, outputChannel);
                // inputChannel.close();
                // outputChannel.close();
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            if (method != null)
                method.releaseConnection();
        }
    }

    public static void fastChannelCopy(final ReadableByteChannel src, final WritableByteChannel dest)
            throws IOException {
        final ByteBuffer buffer = ByteBuffer.allocateDirect(16 * 1024);
        while (src.read(buffer) != -1) {
            // prepare the buffer to be drained
            buffer.flip();
            // write to the channel, may block
            dest.write(buffer);
            // If partial transfer, shift remainder down
            // If buffer is empty, same as doing clear()
            buffer.compact();
        }
        // EOF will leave buffer in fill state
        buffer.flip();
        // make sure the buffer is fully drained.
        while (buffer.hasRemaining()) {
            dest.write(buffer);
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // No post action
        return;
    }
}