org.wahlzeit.servlets.MainServlet.java Source code

Java tutorial

Introduction

Here is the source code for org.wahlzeit.servlets.MainServlet.java

Source

/*
 * Copyright (c) 2006-2009 by Dirk Riehle, http://dirkriehle.com
 *
 * This file is part of the Wahlzeit photo rating application.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

package org.wahlzeit.servlets;

import com.google.api.client.util.Charsets;
import com.google.appengine.api.images.Image;
import com.google.appengine.api.images.ImagesServiceFactory;
import com.google.common.io.CharStreams;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.wahlzeit.handlers.PartUtil;
import org.wahlzeit.handlers.WebFormHandler;
import org.wahlzeit.handlers.WebPageHandler;
import org.wahlzeit.handlers.WebPartHandlerManager;
import org.wahlzeit.model.User;
import org.wahlzeit.model.UserSession;
import org.wahlzeit.services.LogBuilder;
import org.wahlzeit.services.SessionManager;
import org.wahlzeit.webparts.WebPart;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

/**
 * The main servlet class for handling incoming and outgoing requests.
 */
public class MainServlet extends AbstractServlet {

    private static final Logger log = Logger.getLogger(MainServlet.class.getName());
    /**
     *
     */
    private static final long serialVersionUID = 42L; // any one does; class never serialized

    /**
     *
     */
    public void myPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        long startTime = System.currentTimeMillis();

        UserSession us = (UserSession) SessionManager.getThreadLocalSession();
        String link = request.getRequestURI();
        int linkStart = link.lastIndexOf("/") + 1;
        int linkEnd = link.indexOf(".form");
        if (linkEnd != -1) {
            link = link.substring(linkStart, linkEnd);
        } else {
            link = PartUtil.NULL_FORM_NAME;
        }
        log.info(LogBuilder.createUserMessage().addParameter("posted to", link).toString());

        Map args = getRequestArgs(request, us);
        log.info(LogBuilder.createSystemMessage().addParameter("POST arguments", getRequestArgsAsString(us, args))
                .toString());

        WebFormHandler formHandler = WebPartHandlerManager.getWebFormHandler(link);
        link = PartUtil.DEFAULT_PAGE_NAME;
        if (formHandler != null) {
            link = formHandler.handlePost(us, args);
        }

        redirectRequest(response, link);
        us.addProcessingTime(System.currentTimeMillis() - startTime);
        SessionManager.dropThreadLocalSession();
    }

    /**
     *
     */
    public void myGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        long startTime = System.currentTimeMillis();

        UserSession us = (UserSession) SessionManager.getThreadLocalSession();
        String link = request.getRequestURI();
        int linkStart = link.lastIndexOf("/") + 1;
        int linkEnd = link.indexOf(".html");
        if (linkEnd == -1) {
            linkEnd = link.length();
        }

        link = link.substring(linkStart, linkEnd);
        log.info(LogBuilder.createUserMessage().addParameter("requested URI", request.getRequestURI()).toString());

        WebPageHandler handler = WebPartHandlerManager.getWebPageHandler(link);
        String newLink = PartUtil.DEFAULT_PAGE_NAME;
        if (handler != null) {
            Map args = getRequestArgs(request, us);
            log.info(LogBuilder.createSystemMessage()
                    .addParameter("GET arguments", getRequestArgsAsString(us, args)).toString());
            newLink = handler.handleGet(us, link, args);
        }

        if (newLink.equals(link)) { // no redirect necessary
            WebPart result = handler.makeWebPart(us);
            us.addProcessingTime(System.currentTimeMillis() - startTime);
            configureResponse(us, response, result);
            us.clearSavedArgs(); // saved args go from post to next get
            us.resetProcessingTime();
        } else {
            redirectRequest(response, newLink);
            us.addProcessingTime(System.currentTimeMillis() - startTime);
        }
        SessionManager.dropThreadLocalSession();
    }

    /**
     *
     */
    protected Map getRequestArgs(HttpServletRequest request, UserSession us) throws IOException, ServletException {
        String contentType = request.getContentType();
        if ((contentType != null) && contentType.startsWith("multipart/form-data")) {
            return getMultiPartRequestArgs(request, us);
        } else {
            return request.getParameterMap();
        }
    }

    /**
     * Searches for files in the request and puts them in the resulting map with the key "fileName". When a file is
     * found, you can access its path by searching for elements with the key "fileName".
     */
    protected Map getMultiPartRequestArgs(HttpServletRequest request, UserSession us)
            throws IOException, ServletException {
        Map<String, String> result = new HashMap<String, String>();
        result.putAll(request.getParameterMap());
        try {
            ServletFileUpload upload = new ServletFileUpload();
            FileItemIterator iterator = upload.getItemIterator(request);

            while (iterator.hasNext()) {
                FileItemStream fileItemStream = iterator.next();
                String filename = fileItemStream.getName();

                if (!fileItemStream.isFormField()) {
                    InputStream inputStream = fileItemStream.openStream();
                    Image image = getImage(inputStream);
                    User user = (User) us.getClient();
                    user.setUploadedImage(image);
                    result.put("fileName", filename);
                    log.config(
                            LogBuilder.createSystemMessage().addParameter("Uploaded image", filename).toString());
                } else {
                    String key = fileItemStream.getFieldName();
                    InputStream is = fileItemStream.openStream();
                    String value = CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8));
                    result.put(key, value);
                    log.config(LogBuilder.createSystemMessage().addParameter("Key of uploaded parameter", key)
                            .addParameter("value", value).toString());
                }
            }
        } catch (Exception ex) {
            throw new ServletException(ex);
        }

        return result;
    }

    /**
     * Create an Image object from the Input stream.
     */
    private Image getImage(InputStream input) throws IOException {
        Image image;
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024 * 1024];
            int bytesRead = input.read(buffer);
            while (bytesRead != -1) {
                outputStream.write(buffer, 0, bytesRead);
                bytesRead = input.read(buffer);
            }
            image = ImagesServiceFactory.makeImage(outputStream.toByteArray());
        } finally {
            input.close();
        }
        return image;
    }
}