blob: 5319ee18334b8817655bb7697db9dd8d72feef1e [file] [log] [blame]
/*
* Copyright (c) 2016 Google Inc. All Rights Reserved.
*
* 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 com.android.vts.servlet;
import com.android.vts.entity.CoverageEntity;
import com.android.vts.entity.TestSuiteResultEntity;
import com.android.vts.entity.UserEntity;
import com.android.vts.util.EmailHelper;
import com.android.vts.util.GcsHelper;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public abstract class BaseServlet extends HttpServlet {
protected final Logger logger = Logger.getLogger(getClass().getName());
protected String ERROR_MESSAGE_JSP = "WEB-INF/jsp/error_msg.jsp";
// Environment variables
protected static String GERRIT_URI;
protected static String GERRIT_SCOPE;
protected static String CLIENT_ID;
protected static String ANALYTICS_ID;
protected static final String TREE_DEFAULT_PARAM = "treeDefault";
public enum PageType {
TOT("Test", "/"),
RELEASE("Release", "/show_release"),
COVERAGE_OVERVIEW("Coverage", "/show_coverage_overview"),
PROFILING_LIST("Profiling", "/show_profiling_list"),
TABLE("", "/show_table"),
TREE("", "/show_tree"),
GRAPH("Profiling", "/show_graph"),
COVERAGE("Coverage", "/show_coverage"),
PERFORMANCE_DIGEST("Performance Digest", "/show_performance_digest"),
PLAN_RELEASE("", "/show_plan_release"),
PLAN_RUN("Plan Run", "/show_plan_run"),
PROFILING_OVERVIEW("", "/show_profiling_overview");
public final String defaultName;
public final String defaultUrl;
PageType(String defaultName, String defaultUrl) {
this.defaultName = defaultName;
this.defaultUrl = defaultUrl;
}
}
public static class Page {
private final PageType type;
private final String name;
private final String url;
public Page(PageType type) {
this.type = type;
this.name = type.defaultName;
this.url = type.defaultUrl;
}
public Page(PageType type, String name, String url) {
this.type = type;
this.name = type.defaultName + name;
this.url = type.defaultUrl + url;
}
public Page(PageType type, String name, String url, Boolean withoutDefault) {
this.type = type;
this.name = name;
this.url = type.defaultUrl + url;
}
public Page(PageType type, String url) {
this.type = type;
this.name = type.defaultName;
this.url = type.defaultUrl + url;
}
public String getName() {
return name;
}
public String getUrl() {
return url;
}
}
public static final List<Page> navbarLinks;
static {
List<Page> links = new ArrayList<>();
links.add(new Page(PageType.TOT));
links.add(new Page(PageType.RELEASE));
links.add(new Page(PageType.COVERAGE_OVERVIEW));
links.add(new Page(PageType.PROFILING_LIST));
navbarLinks = links;
}
public abstract PageType getNavParentType();
/**
* Get a list of URL/Display name pairs for the breadcrumb hierarchy.
*
* @param request The HttpServletRequest object for the page request.
* @return a list of Page entries.
*/
public abstract List<Page> getBreadcrumbLinks(HttpServletRequest request);
/** System Configuration Property class */
protected static Properties systemConfigProp = new Properties();
@Override
public void init(ServletConfig cfg) throws ServletException {
super.init(cfg);
systemConfigProp =
Properties.class.cast(cfg.getServletContext().getAttribute("systemConfigProp"));
GERRIT_URI = systemConfigProp.getProperty("gerrit.uri");
GERRIT_SCOPE = systemConfigProp.getProperty("gerrit.scope");
CLIENT_ID = systemConfigProp.getProperty("appengine.clientID");
ANALYTICS_ID = systemConfigProp.getProperty("analytics.id");
CoverageEntity.setPropertyValues(systemConfigProp);
TestSuiteResultEntity.setPropertyValues(systemConfigProp);
EmailHelper.setPropertyValues(systemConfigProp);
GcsHelper.setGcsProjectId(systemConfigProp.getProperty("gcs.projectID"));
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// If the user is logged out, allow them to log back in and return to the page.
// Set the logout URL to direct back to a login page that directs to the current request.
UserService userService = UserServiceFactory.getUserService();
Optional<User> currentUser = Optional.ofNullable(userService.getCurrentUser());
String currentUserEmail =
currentUser.isPresent()
? currentUser.map(user -> user.getEmail().trim()).orElse("")
: "";
String requestUri = request.getRequestURI();
String requestArgs = request.getQueryString();
String loginURI = userService.createLoginURL(requestUri + '?' + requestArgs);
String logoutURI = userService.createLogoutURL(loginURI);
if (currentUserEmail != "") {
int activeIndex;
switch (getNavParentType()) {
case PROFILING_LIST:
activeIndex = 3;
break;
case COVERAGE_OVERVIEW:
activeIndex = 2;
break;
case RELEASE:
activeIndex = 1;
break;
default:
activeIndex = 0;
break;
}
if (request.getParameter(TREE_DEFAULT_PARAM) != null) {
HttpSession session = request.getSession(true);
boolean treeDefault = request.getParameter(TREE_DEFAULT_PARAM).equals("true");
session.setAttribute(TREE_DEFAULT_PARAM, treeDefault);
}
request.setAttribute("serverName", request.getServerName());
request.setAttribute("logoutURL", logoutURI);
request.setAttribute("email", currentUserEmail);
request.setAttribute("analyticsID", new Gson().toJson(ANALYTICS_ID));
request.setAttribute("breadcrumbLinks", getBreadcrumbLinks(request));
request.setAttribute("navbarLinks", navbarLinks);
request.setAttribute("activeIndex", activeIndex);
response.setContentType("text/html");
if (currentUserEmail.endsWith("@google.com")
|| UserEntity.getUserList().contains(currentUserEmail)) {
doGetHandler(request, response);
} else {
RequestDispatcher dispatcher =
request.getRequestDispatcher("WEB-INF/jsp/auth_error.jsp");
try {
dispatcher.forward(request, response);
} catch (ServletException e) {
logger.log(Level.SEVERE, "Servlet Exception caught : ", e);
}
}
} else {
response.sendRedirect(loginURI);
}
}
/**
* Implementation of the doGet method to be executed by servlet subclasses.
*
* @param request The HttpServletRequest object.
* @param response The HttpServletResponse object.
*/
public abstract void doGetHandler(HttpServletRequest request, HttpServletResponse response)
throws IOException;
}