mashups.eventpub.EventPublisherServlet.java Source code

Java tutorial

Introduction

Here is the source code for mashups.eventpub.EventPublisherServlet.java

Source

/* Copyright (c) 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package mashups.eventpub;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.PropertiesConfiguration;

/**
 * Servlet to control requests for publishing events from Spreadsheets to
 * Calendar and Base.
 *
 * 
 */
public class EventPublisherServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

    public static final long serialVersionUID = 1;

    /**
     * The session attribute in which to store the AuthSub token.  The
     * AuthSub token, after being upgraded from a single-use to a session token,
     * is held between the requests using the servlet container's session 
     * management capability.
     */
    public static final String SESSION_ATTR_SS_AUTH_TOKEN = "ssAuthSubToken";

    /**
     * Names of other session attributes
     */
    public static final String SESSION_ATTR_SS_CELL_FEED = "ssCellFeed";
    public static final String SESSION_ATTR_FIELD_MAP = "fieldMap";
    public static final String SESSION_ATTR_EVENTS_TO_PUBLISH = "eventsToPublish";

    private Configuration config;

    public EventPublisherServlet() throws Exception {
        super();
        config = new PropertiesConfiguration("EventPublisher.properties");
    }

    private String getCurrentUrl(HttpServletRequest request) throws MalformedURLException {
        URL currentUrl = new URL(request.getScheme(), request.getServerName(), request.getServerPort(),
                request.getRequestURI());
        return currentUrl.toString();
    }

    /**
     * Save AuthSubToken into session
     * 
     * @param request The request 
     * @param response The response 
     */
    private void processAcceptAuthSubToken(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * Request is caused by a user being redirected back from AuthSub login
         */
        if (request.getParameter("token") != null) {
            EventPublisher ep = new EventPublisher();
            try {
                ep.setSsAuthSubToken(request.getParameter("token"), true);
                request.getSession().setAttribute(SESSION_ATTR_SS_AUTH_TOKEN, ep.getSsAuthSubToken());
                /*
                 * Redirect to clear the token from the URL and list available 
                 * spreadsheets.
                 */
                response.sendRedirect("?action=outputSsList");
            } catch (EPAuthenticationException e) {
                System.err.println("Authentication exception: " + e.getMessage());
            }
        }
    }

    /**
     * Default action - output intro page 
     *
     * @param request The request 
     * @param response The response 
     */
    private void processOutputIntroPage(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String ssAuthUrl = EventPublisher.getSsAuthSubUrl(getCurrentUrl(request) + "?action=acceptAuthSubToken");
        request.setAttribute("ssAuthUrl", ssAuthUrl);
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/outputIntroPage.jsp");
        dispatcher.forward(request, response);
    }

    /**
     * Output list of spreadsheets owned by authenticated account 
     *
     * @param request The request 
     * @param response The response 
     */
    private void processOutputSsList(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        EventPublisher ep = new EventPublisher();
        try {
            ep.setSsAuthSubToken((String) request.getSession().getAttribute(SESSION_ATTR_SS_AUTH_TOKEN), false);
            request.setAttribute("ssList", ep.getSsList());
        } catch (EPAuthenticationException e) {
            System.err.println("Authentication exception: " + e.getMessage());
        }
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/outputSsList.jsp");
        dispatcher.forward(request, response);
    }

    /**
     * Output list of worksheets in chosen spreadsheet 
     *
     * @param request The request 
     * @param response The response 
     */
    private void processOutputWsList(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        EventPublisher ep = new EventPublisher();
        try {
            ep.setSsAuthSubToken((String) request.getSession().getAttribute(SESSION_ATTR_SS_AUTH_TOKEN), false);
            request.setAttribute("token", ep.getSsAuthSubToken());
            request.setAttribute("wsList", ep.getWsList((String) request.getParameter("wsFeed")));
        } catch (EPAuthenticationException e) {
            System.err.println("Authentication exception: " + e.getMessage());
        }

        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/outputWsList.jsp");
        dispatcher.forward(request, response);
    }

    /**
     * Output list of columns in chosen worksheet
     *
     * @param request The request 
     * @param response The response 
     */
    private void processOutputColumnList(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        EventPublisher ep = new EventPublisher();
        try {
            ep.setSsAuthSubToken((String) request.getSession().getAttribute(SESSION_ATTR_SS_AUTH_TOKEN), false);
            request.setAttribute("token", ep.getSsAuthSubToken());
            request.setAttribute("columnList", ep.getColumnList((String) request.getParameter("cellFeed")));
            request.getSession().setAttribute(SESSION_ATTR_SS_CELL_FEED, (String) request.getParameter("cellFeed"));
        } catch (EPAuthenticationException e) {
            System.err.println("Authentication exception: " + e.getMessage());
        }

        RequestDispatcher dispatcher = getServletContext()
                .getRequestDispatcher("/WEB-INF/jsp/outputColumnList.jsp");
        dispatcher.forward(request, response);
    }

    /**
     * Lists events to be published and also sets the custom field map.
     *
     * @param request The request 
     * @param response The response 
     */
    private void processListEvents(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        EventPublisher ep = new EventPublisher();

        /*
         * Set the EventPublisher's list feed
         */
        ep.setSsUrl(
                ((String) request.getSession().getAttribute(SESSION_ATTR_SS_CELL_FEED)).replace("cells", "list"));

        if (request.getParameter("fdTitle") != null) {
            SpreadsheetCustomFieldMap fieldMap = new SpreadsheetCustomFieldMap(
                    (String) request.getParameter("fdTitle"), (String) request.getParameter("fdDescription"),
                    (String) request.getParameter("fdStartDate"), (String) request.getParameter("fdEndDate"),
                    (String) request.getParameter("fdLocation"), (String) request.getParameter("fdWebSite"),
                    (String) request.getParameter("fdCalendarUrl"), (String) request.getParameter("fdBaseUrl"));
            ep.setFieldMap(fieldMap);
            request.getSession().setAttribute(SESSION_ATTR_FIELD_MAP, fieldMap);
        } else {
            ep.setFieldMap((SpreadsheetCustomFieldMap) request.getSession().getAttribute(SESSION_ATTR_FIELD_MAP));
        }

        try {
            ep.setSsAuthSubToken((String) request.getSession().getAttribute(SESSION_ATTR_SS_AUTH_TOKEN), false);
            List<Event> listEvents = ep.getEventsFromSpreadsheet();
            request.setAttribute("events", listEvents);
            request.getSession().setAttribute(SESSION_ATTR_EVENTS_TO_PUBLISH, listEvents);
            javax.servlet.RequestDispatcher dispatcher = getServletContext()
                    .getRequestDispatcher("/WEB-INF/jsp/outputEventList.jsp");
            dispatcher.forward(request, response);
        } catch (EPAuthenticationException e) {
            System.err.println("Authentication exception: " + e.getMessage());
        }
    }

    /**
     * Publish all events to Calendar and/or Base 
     *
     * @param request The request 
     * @param response The response 
     */
    @SuppressWarnings("unchecked")
    private void processPublishEvents(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        EventPublisher ep = new EventPublisher();
        ep.setFieldMap((SpreadsheetCustomFieldMap) request.getSession().getAttribute(SESSION_ATTR_FIELD_MAP));
        try {
            ep.setSsAuthSubToken((String) request.getSession().getAttribute(SESSION_ATTR_SS_AUTH_TOKEN), false);
        } catch (EPAuthenticationException e) {
            System.err.println("Authentication exception: " + e.getMessage());
        }

        LinkedList<Event> eventList = (LinkedList<Event>) request.getSession()
                .getAttribute(SESSION_ATTR_EVENTS_TO_PUBLISH);

        if (request.getParameter("calendar") != null && "checked".equals(request.getParameter("calendar"))) {
            String calUsername = config.getString("calendar.username");
            String calPassword = config.getString("calendar.password");
            String calUrl = config.getString("calendar.url");
            ep.setCalUsernamePassword(calUsername, calPassword);
            ep.setCalUrl(calUrl);
            ep.publishEventsToCalendar(eventList);
        }
        if (request.getParameter("base") != null && "checked".equals(request.getParameter("base"))) {
            String baseUsername = config.getString("gbase.username");
            String basePassword = config.getString("gbase.password");
            ep.setBaseUsernamePassword(baseUsername, basePassword);
            ep.publishEventsToBase(eventList);
        }
        javax.servlet.RequestDispatcher dispatcher = getServletContext()
                .getRequestDispatcher("/WEB-INF/jsp/outputPublishingResults.jsp");
        dispatcher.forward(request, response);
    }

    /** 
     * Process all requests to this servlet
     *
     * @param request The request 
     * @param response The response 
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /* 
         * Determine action attempted
         */
        String action = (request.getParameter("action")) == null ? "outputIntroPage"
                : request.getParameter("action");

        if ("outputIntroPage".equals(action)) {
            processOutputIntroPage(request, response);
        } else if ("acceptAuthSubToken".equals(action)) {
            processAcceptAuthSubToken(request, response);
        } else if ("outputSsList".equals(action)) {
            processOutputSsList(request, response);
        } else if ("outputWsList".equals(action)) {
            processOutputWsList(request, response);
        } else if ("outputColumnList".equals(action)) {
            processOutputColumnList(request, response);
        } else if ("listEvents".equals(action)) {
            processListEvents(request, response);
        } else if ("publish".equals(action)) {
            processPublishEvents(request, response);
        }
    }

    /** 
     * Process GET requests by calling the doPost method 
     *
     * @param request The request 
     * @param response The response 
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}