package com.perforce.filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import com.perforce.ApplicationException;
import com.perforce.Constants;
import com.perforce.P4Helper;
import com.perforce.model.UserInfo;
/**
* Servlet Filter implementation class CheckPerforceFilter
*/
public class CheckPerforceFilter implements Filter {
static Logger logger = Logger.getLogger(CheckPerforceFilter.class.getName());
/**
* Default constructor.
*/
public CheckPerforceFilter() {
}
/**
* @see Filter#destroy()
*/
public void destroy() {
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(request instanceof HttpServletRequest) {
HttpServletRequest hRequest = (HttpServletRequest) request;
Boolean configured = (Boolean) hRequest.getServletContext().getAttribute(Constants.CONFIGURED);
HttpSession session = hRequest.getSession();
P4Helper helper = (P4Helper) session.getAttribute(Constants.P4HELPER_SESSIONKEY);
if(helper == null) {
synchronized(session) {
try {
helper = new P4Helper();
session.setAttribute(Constants.P4HELPER_SESSIONKEY, helper);
if(helper.canPing()) {
helper.configServer();
}
} catch (ApplicationException e) {
e.printStackTrace();
}
}
}
SecurityContext sContext = SecurityContextHolder.getContext();
if(sContext != null) {
Authentication authentication = sContext.getAuthentication();
if(authentication != null) {
Object principal = authentication.getPrincipal();
if(principal != null && principal instanceof UserInfo) {
helper.setUserInfo((UserInfo)principal);
}
}
}
if(helper.canPing()) {
if(configured) {
boolean connected = helper.isConnected();
if(!connected) {
try {
helper.configServer();
connected = helper.isConnected();
} catch (ApplicationException ae) {
logger.error(ae.getMessage());
}
}
logger.debug("### CONNECTED=" + Boolean.toString(connected));
if(connected) {
// pass the request along the filter chain
request.setAttribute("isConnected", connected);
chain.doFilter(request, response);
} else {
RequestDispatcher rd = request.getRequestDispatcher("/unavailable.htm");
rd.forward(request, response);
}
} else {
RequestDispatcher rd = request.getRequestDispatcher("/admin/configure.htm");
rd.forward(request, response);
}
} else {
RequestDispatcher rd = request.getRequestDispatcher("/unavailable.htm");
rd.forward(request, response);
}
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
}
}