Subversion Repositories SmartDukaan

Rev

Rev 2998 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.serving.interceptors;
import java.util.HashMap;
import java.util.Map;

import in.shop2020.model.v1.user.User;
import in.shop2020.model.v1.user.UserContextService.Client;
import in.shop2020.serving.services.UserSessionInfo;
import in.shop2020.serving.utils.DesEncrypter;
import in.shop2020.thrift.clients.UserClient;

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

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class CreateUserInterceptor extends AbstractInterceptor {

        
        private static final long serialVersionUID = -4125815700236506235L;
        private static Logger log = Logger.getLogger(CreateUserInterceptor.class);
        private Map<String, Cookie> cookiesMap = null;
        private Cookie userCookie = null;
        private String cookieDomain = "";
        private DesEncrypter desEncrypter = new DesEncrypter(UserInterceptor.COOKIE_DECRYPTION_STRING);
        
        public void setCookieDomain(String cookieDomain) {
                this.cookieDomain = cookieDomain;
        }
        
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
                log.info("inside create user interceprot");
                HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession(); // Get the existing session or create a new one

        createCookiesMap(request);
        
        UserSessionInfo userInfo = null;
                Cookie userinfoCookie = cookiesMap.get(UserInterceptor.USER_INFO_COOKIE_NAME);
                //FIXME Remove the if part once we are done with solving the side effected of deleting anonymous users. 
                if(userinfoCookie!=null){
                        userInfo = UserSessionInfo.getUserSessionInfoFromCookieValue(userinfoCookie.getValue());
                        UserClient ucsc = new UserClient();
                        Client userClient = ucsc.getClient();
                        User existingUser = userClient.getUserById(userInfo.getUserId());
                        if(existingUser == null || existingUser.getUserId() == -1){
                        userInfo = new UserSessionInfo(session.getId());
                        request.setAttribute(UserInterceptor.USER_INFO_COOKIE_NAME, userInfo);
                        createUserCookie(userInfo.getUserId(), true);                           
                        }
                }else{
                userInfo = new UserSessionInfo(session.getId());
                request.setAttribute(UserInterceptor.USER_INFO_COOKIE_NAME, userInfo);
                createUserCookie(userInfo.getUserId(), true);
        }
        return invocation.invoke();
        }
        
        
        private void createUserCookie(long userId, boolean force) {
                userCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
                String encryptedUserId = desEncrypter.encrypt(userId + "");
                if(force || userCookie == null || !(encryptedUserId + "").equals(userCookie.getValue())){
                        userCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, encryptedUserId);
                        userCookie.setMaxAge(UserInterceptor.SECONDS_IN_YEAR); // one year
                        userCookie.setPath("/");
                        if(!cookieDomain.isEmpty()) {
                                userCookie.setDomain(cookieDomain);
                        }
                        log.info("Created new cookie.");
                        cookiesMap.put(UserInterceptor.USER_ID_COOKIE_NAME, userCookie);
                HttpServletResponse response = ServletActionContext.getResponse();
                response.addCookie(userCookie);
                }
        }
        
        private void createCookiesMap(HttpServletRequest request) {
                cookiesMap  = new HashMap<String, Cookie>();
                Cookie[] cookies = request.getCookies();
                if(cookies==null)
                        return;
                for (Cookie cookie : cookies) {
                    cookiesMap.put(cookie.getName(), cookie);
                }
        }
        
}