/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.view.internal.servlet;
import java.io.IOException;
import java.security.AccessControlException;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.model.User;
import org.eclipse.skalli.services.Services;
import org.eclipse.skalli.services.configuration.ConfigurationService;
import org.eclipse.skalli.services.group.GroupUtils;
import org.eclipse.skalli.services.project.ProjectService;
import org.eclipse.skalli.services.search.SearchService;
import org.eclipse.skalli.view.Consts;
import org.eclipse.skalli.view.LoginUtils;
import org.eclipse.skalli.view.internal.config.NewsConfig;
/**
* Servlet implementation class Servlet.
* This servlet currently is mapped to the following paths (see web.xml):
* <ol>
* <li><tt>/</tt></li>
* <li><tt>/news</tt></li>
* <li><tt>/reindex</tt></li>
* <li><tt>/create</tt></li>
* </ol>
* This servlet is <b>not</b> mapped to <tt>/projects/<projectid></tt> (see
* {@link org.eclipse.skalli.view.internal.servlet.ProjectServlet}),
* <tt>/myprojects</tt> (see <tt>myprojects.jsp</tt>), <tt>/tags</tt> (see
* <tt>tagcloud.jsp</tt>), theme resources (<tt>/Vaadin/*</tt>, see
* {@link org.eclipse.skalli.view.internal.servlet.ResourceServlet})
* and the welcome page (see <tt>welcome.jsp</tt>).
*/
public class Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Servlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String requestURI = request.getRequestURI();
User user = new LoginUtils(request).getLoggedInUser();
if (requestURI.endsWith(Consts.URL_NEWS)) {
ConfigurationService confService = Services.getRequiredService(ConfigurationService.class);
if (confService != null) {
NewsConfig newsConfig = confService.readConfiguration(NewsConfig.class);
if (newsConfig != null) {
redirect(newsConfig.getUrl(), response);
return;
}
}
// else - do nothing, news is not configured or configuration service not available,
// welcome page should be rendered in this case
} else if (requestURI.endsWith(Consts.URL_REINDEX)) {
if (GroupUtils.isAdministrator(user)) {
reindex();
redirect(Consts.URL_WELCOME, response);
return;
}
} else if (requestURI.equals(Consts.URL_CREATEPROJECT)) {
if (user != null) {
forward(Consts.URL_PROJECTS + "/" + UUID.randomUUID(), request, response); //$NON-NLS-1$
return;
}
} else if (requestURI.equals(Consts.URL_FAVICON)) {
forward(Consts.FILE_FAVICON, request, response);
return;
} else if (requestURI.equals(Consts.URL_SEARCH_PLUGIN)) {
forward(Consts.FILE_SEARCH_PLUGIN, request, response);
return;
} else if (requestURI.equals(Consts.URL_MYPROJECTS)) {
if (user != null) {
forward(Consts.URL_PROJECTS_USER + user.getUserId(), request, response);
return;
} else {
Exception e = new AccessControlException("User is not authorized to call this page.");
request.setAttribute("exception", e); //$NON-NLS-1$
forward(Consts.URL_ERROR, request, response);
return;
}
}
forward(Consts.JSP_WELCOME, request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
}
/***********
* private
**********/
private void reindex() {
SearchService searchService = Services.getService(SearchService.class);
ProjectService projectService = Services.getService(ProjectService.class);
Set<Project> projects = new HashSet<Project>();
for (Project project : projectService.getAll()) {
projects.add(project);
}
searchService.reindex(projects);
}
private void forward(String url, HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
if (!response.isCommitted()) {
ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher(url);
dispatcher.forward(request, response);
} // else {
// do nothing as response is already committed, probably forwarded to error page because of a filter exception
// }
}
private void redirect(String url, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect(url);
}
}