/* 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);
}
}