Subversion Repositories SmartDukaan

Rev

Rev 719 | Blame | Last modification | View Log | RSS feed

package in.shop2020.serving.controllers;

import in.shop2020.serving.services.PageLoaderHandler;
import in.shop2020.serving.services.UserSessionInfo;
import in.shop2020.serving.utils.DesEncrypter;
import in.shop2020.serving.utils.Utils;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpUtils;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.struts2.interceptor.CookiesAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.velocity.VelocityContext;

import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.ValidationAwareSupport;

/**
 * Base class for all user action handlers i.e. controllers
 * 
 * @author rajveer
 */
public abstract class BaseController extends ValidationAwareSupport implements  CookiesAware, ServletResponseAware, ServletRequestAware {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        protected Map<String, Cookie> cookiesMap = null;
    protected HttpServletResponse response;
    protected HttpServletRequest request;
    protected HttpSession session;
    protected UserSessionInfo userinfo = null;
        private static Log log = LogFactory.getLog(BaseController.class);
        
    private DesEncrypter desEncrypter = new DesEncrypter("shop2020");
    
    protected Cookie userCookie = null;
    
    protected Map<String,String> htmlSnippets;
    
    PageLoaderHandler pageLoader = null;
        public BaseController() {
                pageLoader = new PageLoaderHandler();
                htmlSnippets = new HashMap<String, String>();
        }
        
        public Map getCookiesMap() {
                return cookiesMap;
        }
        
        @Override
        public void setCookiesMap(Map cookiesMap) {
                log.info("Received cookiesMap and it is " + cookiesMap);
                this.cookiesMap = cookiesMap;
        }
        
        @Override
        public void setServletResponse(HttpServletResponse response)
        {
                this.response = response;
                if(userCookie!=null)
                        response.addCookie(userCookie);
        }
        
        @Override
        public void setServletRequest(HttpServletRequest request){
                this.request = request;
//              log.debug("REQUESTED URL: " + request.getRequestURL().toString());
//              log.debug("Remote host "+ request.getRemoteHost());
//              log.debug("requested Session Id "+ request.getRequestedSessionId());
//              log.debug("Session Id "+ request.getSession().getId());
//              log.debug("QUERY STRING IS: " + this.request.getQueryString());
//              
//              Enumeration names = request.getHeaderNames();
//          while (names.hasMoreElements()) {
//            String name = (String) names.nextElement();
//            Enumeration values = request.getHeaders(name);  // support multiple values
//            if (values != null) {
//              while (values.hasMoreElements()) {
//                String value = (String) values.nextElement();
//                log.debug(name + ": " + value);
//              }
//            }
//          }
//              
//              for(Object param: request.getParameterMap().keySet()){
//                      log.debug("PARAMS: " + param + " = "+ request.getParameter((String)param));
//              }
                
                this.session = request.getSession();    // Get the existing session or create a new one
                getCookiesMap(request);
                String requestedSessionId = request.getRequestedSessionId();
                
                // Check if this is a brand new request with no prior cookies set; OR
                // If the request is for an active session.
                if(requestedSessionId == null || request.isRequestedSessionIdValid()){
                        log.info("Request received for valid session: " + requestedSessionId);
                        // Set the userinfo and the uid cookie if they're not already set.
                        this.session = request.getSession();
                        setUserSessionInfo(this.session.getId());
                        createUserCookie(this.userinfo.getUserId(), false);
                } else {
                        log.info("Request received for invalid session: " + requestedSessionId);
                        // If the requested session is inactive, do the following:
                        // 1. Retrieve the user for the requested session from the user cookie
                        // 2. Add the retrieved user to the newly created session above.
                        // 3. Update the uid cookie to ensure that a valid user is set in the session
                        recreateSessionFromUIDCookie(this.session.getId());
                        createUserCookie(this.userinfo.getUserId(), true);
                }
        }

        private void getCookiesMap(HttpServletRequest request) {
                cookiesMap  = new HashMap<String, Cookie>();
                Cookie[] cookies = request.getCookies();
                // This check is necessary for the first request when no cookies are
                // sent.
                if(cookies==null)
                        return;
                for (Cookie cookie : cookies)
                        cookiesMap.put(cookie.getName(), cookie);
        }

        private void setUserSessionInfo(String jsessionid){
                this.userinfo = (UserSessionInfo) this.session.getAttribute("userinfo");
                if(this.userinfo == null || this.userinfo.getUserId() == -1){
                        this.userinfo = new UserSessionInfo(jsessionid);
                        this.session.setAttribute("userinfo", this.userinfo);
                }
        }

        protected void createUserCookie(long userId, boolean force) {
                userCookie = (Cookie) cookiesMap.get("uid");
                if(force || userCookie == null || !(userId + "").equals(userCookie.getValue())){
                        String encryptedUserId = desEncrypter.encrypt(userId + "");  
                        userCookie = new Cookie("uid", encryptedUserId);
                }
        }
        
        private void recreateSessionFromUIDCookie(String jsessionid) {
                Cookie userCookie = (Cookie) cookiesMap.get("uid");
                if(userCookie != null){
                        String uidString = userCookie.getValue();
                        if(uidString != null){
                                try {
                                        Long receivedUID = Long.parseLong(desEncrypter.decrypt(uidString));
                                        this.userinfo = new UserSessionInfo(receivedUID, jsessionid);
                                        this.session.setAttribute("userinfo", this.userinfo);
                                } catch (NumberFormatException nfe) {
                                        log.error("The UID cookie contains an unparseable userID");
                                }
                        }
                }
                if(this.userinfo==null)
                        setUserSessionInfo(jsessionid);
        }
        
        public UserSessionInfo getUserInfo(){
                return this.userinfo;
        }

        public String getHeaderSnippet(){
                return pageLoader.getHeaderHtml(userinfo.isLoggedIn(), userinfo.getNameOfUser());
        }

        public String getMainMenuSnippet(){
                return pageLoader.getMainMenuHtml();
        }
        
        public String getSearchBarSnippet(){
                return pageLoader.getSearchBarHtml(userinfo.getTotalItems(), 10000);
        }
    
        public String getCustomerServiceSnippet(){
                return pageLoader.getCustomerServiceHtml();
        }
        
        public String getMyResearchSnippet(){
                return pageLoader.getMyResearchHtml(userinfo.getUserId(), userinfo.isLoggedIn());
        }

        public String getBrowseHistorySnippet(){
                return pageLoader.getBrowseHistoryHtml(userinfo.getUserId(), userinfo.isLoggedIn());
        }

        public String getFooterSnippet(){
                return pageLoader.getFooterHtml();
        }
        
        public String getRedirectUrl(){
                return (String)this.request.getSession().getAttribute("REDIRECT_URL");
        }

        public void setRedirectUrl(){
                String queryString = this.request.getQueryString();
                log.info("Query String is: "+queryString);
                if(queryString==null){
                        queryString="";
                }else{
                        queryString = "?" + queryString;
                }
                this.request.getSession().setAttribute("REDIRECT_URL", this.request.getRequestURI() + queryString);
        }
        
        public void resetRedirectUrl(){
                this.request.getSession().removeAttribute("REDIRECT_URL");
        }
}