cltestgrid.GetBlob.java Source code

Java tutorial

Introduction

Here is the source code for cltestgrid.GetBlob.java

Source

/* Copyright (C) 2011 Anton Vodonosov (avodonosov@yandex.ru)
 * See LICENSE for details.
 */
package cltestgrid;

import com.google.appengine.api.files.AppEngineFile;
import com.google.appengine.api.files.FileReadChannel;
import com.google.appengine.api.files.FileServiceFactory;
import org.apache.commons.io.IOUtils;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channels;
import java.util.zip.GZIPInputStream;

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

public class GetBlob extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        String userAgent = req.getHeader("User-Agent");
        if (userAgent != null && userAgent.contains("Baiduspider")) {
            resp.setStatus(SC_MOVED_PERMANENTLY);
            resp.setHeader("Location", "http://www.baidu.com/search/spider.html");
            resp.setHeader("X-READ-ME",
                    "Please honor robots.txt and don't waste our resources. http://cl-test-grid.appspot.com/robots.txt");
            return;
        }

        final String key = req.getParameter("key");
        String filename = "/gs/cl-test-grid-logs/" + key;
        AppEngineFile file = new AppEngineFile(filename);
        FileReadChannel readChannel = null;
        InputStream inputStream = null;
        try {
            final boolean lock = false;
            readChannel = FileServiceFactory.getFileService().openReadChannel(file, lock);
            inputStream = Channels.newInputStream(readChannel);
            resp.setContentType("text/plain");
            // The log files are gzipped, but we can't serve gzipped content,
            // because GAE gzips servlet output itlself and so logs would end-up gzipped twice.
            // Therefore we need to ungzip the log.
            InputStream ungzipper = new GZIPInputStream(new BufferedInputStream(inputStream, 100 * 1024));
            IOUtils.copy(ungzipper, resp.getOutputStream());
            resp.getOutputStream().flush();
        } finally {
            IOUtils.closeQuietly(inputStream);
            IOUtils.closeQuietly(readChannel);
        }
    }
}