package org.exoplatform.platform.common.software.register.web;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.commons.utils.PropertyManager;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.platform.common.software.register.UnlockService;
import org.exoplatform.platform.common.software.register.service.SoftwareRegistrationService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.web.filter.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Filter platform registration screen displaying.
* <p>
* Conditions to forward to platform registration page:
* <ul>
* <li>eXo Community is not reachable</li>
* <li>User can skip registration</li>
* <li>User is not register local PLF with community</li>
* </ul>
*
* @author ToanNH
*
*/
public class SoftwareRegisterFilter implements Filter {
public static final String NOT_REACHABLE = "NOT_REACHABLE";
private static final Log logger = ExoLogger.getLogger(SoftwareRegisterFilter.class);
private static final String PLF_COMMUNITY_SERVLET_CTX = "/registration";
private static final String SR_SERVLET_URL = "/software-register";
private static final String INITIAL_URI_PARAM_NAME = "initialURI";
private static String REST_URI;
private SoftwareRegistrationService plfRegisterService;
public SoftwareRegisterFilter() {
REST_URI = ExoContainerContext.getCurrentContainer().getContext().getRestContextName();
}
private boolean checkRequest(boolean requestSkip){
plfRegisterService = PortalContainer.getInstance().getComponentInstanceOfType(SoftwareRegistrationService.class);
if(!requestSkip) return true;
if(plfRegisterService.canSkipRegister() || (UnlockService.isUnlocked())){
return false;
}
return !plfRegisterService.canSkipRegister();
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
plfRegisterService = PortalContainer.getInstance().getComponentInstanceOfType(SoftwareRegistrationService.class);
String requestUri = httpServletRequest.getRequestURI();
boolean isRestUri = (requestUri.contains(REST_URI));
boolean requestSkip = plfRegisterService.isRequestSkip();
String notReachable = (String)httpServletRequest.getSession().getAttribute("notReachable");
boolean isDevMod = PropertyManager.isDevelopping();
if(notReachable==null) {
notReachable = httpServletRequest.getQueryString();
if (StringUtils.equals(notReachable, this.NOT_REACHABLE)) {
notReachable="true";
httpServletRequest.getSession().setAttribute("notReachable", notReachable);
}
}
if(!isRestUri && !plfRegisterService.isSoftwareRegistered() && !isDevMod
&& !StringUtils.equals(notReachable, "true") && checkRequest(requestSkip)
&& !plfRegisterService.isSkipPlatformRegistration()) {
// Get full url
String reqUri = httpServletRequest.getRequestURI().toString();
String queryString = httpServletRequest.getQueryString();
if (queryString != null) {
reqUri =new StringBuffer(reqUri).append("?").append(queryString).toString();
}
ServletContext platformRegisterContext = httpServletRequest.getSession().getServletContext().getContext(PLF_COMMUNITY_SERVLET_CTX);
String uriTarget = (new StringBuilder()).append(SR_SERVLET_URL).append("?").append(INITIAL_URI_PARAM_NAME)
.append("=").append(reqUri).toString();
platformRegisterContext.getRequestDispatcher(uriTarget).forward(httpServletRequest, httpServletResponse);
return;
}
chain.doFilter(request, response);
}
}