Subversion Repositories SmartDukaan

Rev

Rev 11114 | Rev 11925 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.serving.controllers;

import in.shop2020.model.v1.catalog.Banner;
import in.shop2020.model.v1.catalog.BannerMap;
import in.shop2020.model.v1.catalog.CatalogService.Client;
import in.shop2020.serving.cache.EhcacheWrapper;
import in.shop2020.serving.interceptors.SourceAware;
import in.shop2020.serving.interceptors.TrackingInterceptor;
import in.shop2020.serving.interceptors.UserAware;
import in.shop2020.serving.interceptors.UserInterceptor;
import in.shop2020.serving.services.PageLoaderHandler;
import in.shop2020.serving.services.UserSessionInfo;
import in.shop2020.serving.utils.DesEncrypter;
import in.shop2020.thrift.clients.CatalogClient;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

import net.sf.ehcache.CacheManager;

import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.thrift.TException;

import com.opensymphony.xwork2.ValidationAwareSupport;

/**
 * Base class for all user action handlers i.e. controllers
 * 
 * @author rajveer
 */
public abstract class BaseController extends ValidationAwareSupport implements
ServletResponseAware, ServletRequestAware, UserAware, SourceAware {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        protected Map<String, Cookie> cookiesMap = null;
        protected HttpServletResponse response;
        protected HttpServletRequest request;
        protected HttpSession session;
        protected String domainName;
        protected UserSessionInfo userinfo = null;
        private static Logger log = Logger.getLogger(Class.class);
        private DesEncrypter desEncrypter = new DesEncrypter(UserInterceptor.COOKIE_DECRYPTION_STRING);

        protected Cookie userCookie = null;

        protected Map<String, String> htmlSnippets;

        PageLoaderHandler pageLoader = null;

        protected long sourceId;

        public static Map<String,List<Banner>> activeBanners = null;
        public static Map<String, List<BannerMap>> allBannersMap = null;
        public static Map<String, List<BannerMap>> sideBannersMap = null;

        public void setBanners(){
                EhcacheWrapper<String, Map<String,List<Banner>>> bannerCache = new EhcacheWrapper<String, Map<String,List<Banner>>>(
                                EhcacheWrapper.BANNER_CACHE_NAME, CacheManager.create());
                activeBanners = bannerCache.get("banner_key");
                if (activeBanners!=null) {
                        log.info("Returning banners from cache");
                        return;
                }
                try {
                        CatalogClient catalogServiceClient = new CatalogClient();
                        Client client = catalogServiceClient.getClient();
                        log.info("Populating banner map"); 
                        activeBanners = client.getActiveBanners();
                        if(!activeBanners.isEmpty()){
                                allBannersMap = new HashMap<String, List<BannerMap>>();
                                sideBannersMap = new HashMap<String, List<BannerMap>>();
                                for (Map.Entry<String, List<Banner>> entry :activeBanners.entrySet()){
                                        for (Banner banner : entry.getValue()){
                                                if(banner.getBannerType().getValue()==1){
                                                        allBannersMap.put(banner.getBannerName(), client.getBannerMapDetails(banner.getBannerName(),banner.getBannerType()));
                                                }
                                                else{
                                                        sideBannersMap.put(banner.getBannerName(), client.getBannerMapDetails(banner.getBannerName(),banner.getBannerType()));
                                                }
                                        }
                                }
                        }
                        bannerCache.put("banner_key", activeBanners);
                        log.info("Populating cache again for banners");
                }
                catch (TException e) {
                        log.error("Unable to fetch banners ",e);
                }
        }


        public List<Banner> getActiveBanners() {
                String uri = request.getRequestURI();
                if (uri.equalsIgnoreCase("/")){
                        return activeBanners.get(uri);
                }
                for (String key : activeBanners.keySet()) {
                        if (key.equalsIgnoreCase("/") || key.equalsIgnoreCase("side-banner")){
                                continue;
                        }
                        Pattern p = Pattern.compile(key+".*");
                        Matcher m = p.matcher(uri);
                        if (m.matches()) {
                                return activeBanners.get(uri);
                        }
                }
                return null;
        }

        public List<Banner> getActiveBanners(String uri) {
                return activeBanners.get(uri);
        }

        public List<BannerMap> getbannermapdetails(String bannerName) {
                return allBannersMap.get(bannerName);
        }

        public BaseController() {
                setBanners();
                pageLoader = new PageLoaderHandler();
                htmlSnippets = new HashMap<String, String>();
        }

        @Override
        public void setCookiesMap(Map<String, Cookie> cookiesMap) {
                log.info("Received cookiesMap." + cookiesMap);
                this.cookiesMap = cookiesMap;
        }

        @Override
        public void setServletResponse(HttpServletResponse response) {
                this.response = response;
        }

        @Override
        public void setServletRequest(HttpServletRequest request) {
                this.request = request;
        }

        @Override
        public void setSession(HttpSession session) {
                this.session = session;
        }

        @Override
        public void setUserSessionInfo(UserSessionInfo userInfo) {
                this.userinfo = userInfo;
        }

        @Override
        public void setUserCookie(Cookie userCookie) {
                if(userCookie != null){
                        log.info("cookie name is:" +  userCookie.getName() + "   value is:"+ userCookie.getValue() + " path : " + userCookie.getPath());
                }
                this.userCookie = userCookie;
        }

        @Override
        public void setCookieDomainName(String domainName) {
                this.domainName = domainName;
        }

        @Override
        public void setSourceId(long sourceId){
                log.info("Setting source id "+sourceId);
                this.sourceId = sourceId;
        }

        public String getHeaderSnippet() {
                String url = request.getQueryString();
                log.info("Query String is: " + url);
                if (url == null) {
                        url = "";
                } else {
                        url = "?" + url;
                }
                url = request.getRequestURI() + url;
                return pageLoader.getHeaderHtml(userinfo.isLoggedIn(), userinfo.getEmail(), userinfo.getTotalItems(), url, -1, true, userinfo.isPrivateDealUser());
        }

        public String getThinHeaderSnippet() {
                String url = request.getQueryString();
                log.info("Query String is: " + url);
                if (url == null) {
                        url = "";
                } else {
                        url = "?" + url;
                }
                url = request.getRequestURI() + url;
                return pageLoader.getThinHeaderHtml(userinfo.isLoggedIn(), userinfo.getEmail(), userinfo.getTotalItems(), url, 0, true);
        }

        public String getSearchBarSnippet() {
                //FIXME From where it is called, need to pass category
                return pageLoader.getSearchBarHtml(userinfo.getTotalItems(), 10000);
        }

        public String getCartWidgetSnippet() {
                log.info("UserInfo:" + userinfo);
                log.info("activeBanners.get(\"side-banner\"):" + activeBanners.get("side-banner") );
                return pageLoader.getCartWidgetSnippet(userinfo.getTotalItems(), userinfo.getTotalAmount(),-1,activeBanners.get("side-banner"),sideBannersMap);
        }


        public UserSessionInfo getUserInfo(){
                return this.userinfo;
        }

        @Override
        public List<Cookie> getCookies() {
                List<Cookie> cookies = new ArrayList<Cookie>();
                long userId = userinfo.getUserId();
                if(userId != -1){
                        String newUserinfoCookieValue = UserSessionInfo.getUserinfoCookieValueFromUserSessionInfo(userinfo);
                        Cookie userinfoCookie = cookiesMap.get(UserInterceptor.USER_INFO_COOKIE_NAME); 
                        if( userinfoCookie == null ||  !newUserinfoCookieValue.equals(userinfoCookie.getValue())){
                                log.info("Set user session info cookie if it has been changed.");
                                userinfoCookie = new Cookie(UserInterceptor.USER_INFO_COOKIE_NAME, newUserinfoCookieValue);
                                userinfoCookie.setMaxAge(UserInterceptor.SECONDS_IN_YEAR); // one year
                                userinfoCookie.setPath("/");
                                userinfoCookie.setDomain(domainName);
                                cookiesMap.put(UserInterceptor.USER_INFO_COOKIE_NAME, userinfoCookie);
                                cookies.add(userinfoCookie);
                        }
                        Cookie userCookie = cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
                        String encryptedUserId = desEncrypter.encrypt(userId + "");
                        if(userCookie == null || !(encryptedUserId + "").equals(userCookie.getValue())){
                                userinfoCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, encryptedUserId);
                                userinfoCookie.setMaxAge(UserInterceptor.SECONDS_IN_YEAR); // one year
                                userinfoCookie.setPath("/");
                                userinfoCookie.setDomain(domainName);
                                cookiesMap.put(UserInterceptor.USER_INFO_COOKIE_NAME, userinfoCookie);
                                cookies.add(userinfoCookie);
                        }
                }
                return cookies;
        }

        public void clearUserCookies(){
                Cookie uidCookie = cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
                uidCookie.setDomain(domainName);
                uidCookie.setPath("/");
                uidCookie.setValue("");
                uidCookie.setMaxAge(0);
                this.response.addCookie(uidCookie);

                Cookie uicCookie = cookiesMap.get(UserInterceptor.USER_INFO_COOKIE_NAME);
                uicCookie.setDomain(domainName);
                uicCookie.setPath("/");
                uicCookie.setValue("");
                uicCookie.setMaxAge(0);
                this.response.addCookie(uicCookie);
        }

        /**
         * Get the session_id cookie to track user session.
         * It also creates the new cookie using current jsessionid if it was absent. 
         * 
         * @return sessionId
         */
        public String getSessionId() {
                Cookie sessionIdCookie = cookiesMap.get(TrackingInterceptor.SESSION_ID_COOKIE);
                if (sessionIdCookie == null) {
                        //session id
                        String sessionId = request.getSession().getId();
                        sessionIdCookie = new Cookie(TrackingInterceptor.SESSION_ID_COOKIE, sessionId);
                        sessionIdCookie.setPath("/");
                        if (!domainName.isEmpty()) {
                                sessionIdCookie.setDomain(domainName);
                        }
                        cookiesMap.put(TrackingInterceptor.SESSION_ID_COOKIE, sessionIdCookie);
                        response.addCookie(sessionIdCookie);
                }
                return sessionIdCookie.getValue();
        }

        public String getCookie(String cookieName, boolean isEncripted, String encriptionString) {
                Cookie cookie = (Cookie) cookiesMap.get(cookieName);
                String cookieVal = null;
                if (cookie != null) {
                        cookieVal = cookie.getValue();
                        if (isEncripted) {
                                DesEncrypter desEncrypter = new DesEncrypter(encriptionString);
                                cookieVal = desEncrypter.decrypt(cookieVal);
                        }
                }
                return cookieVal;
        }
}