Subversion Repositories SmartDukaan

Rev

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

package in.shop2020.serving.interceptors;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import in.shop2020.model.v1.user.Affiliate;
import in.shop2020.model.v1.user.Tracker;
import in.shop2020.thrift.clients.UserContextServiceClient;

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

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

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

public class TrackingInterceptor extends AbstractInterceptor {


        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private static Logger log = Logger.getLogger(TrackingInterceptor.class);
        
        private static final int SECONDS_IN_TWO_MONTHS = 60*60*24*60;
        public static final String TRACKER = "tracker";
        
        private String cookieDomain = "";
        private Cookie trackerCookie = null;
    private Map<String, Cookie> cookiesMap = null;
    
    public void setCookieDomain(String cookieDomain) {
        this.cookieDomain = cookieDomain;
    }
        
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
                HttpServletRequest request = ServletActionContext.getRequest();

                String affId = request.getParameter("afid");
                
                if(affId != null && !affId.isEmpty()) {
                    createCookiesMap(request);
                    updateTrackerCookie(affId);
                }

        return invocation.invoke();
        }

    private void createCookiesMap(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 updateTrackerCookie(String affId) {
        try {
            UserContextServiceClient userContextServiceClient = new UserContextServiceClient();
            in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient
                    .getClient();
            long affiliateId = Long.parseLong(affId);
            Affiliate affiliate = userClient.getAffiliateById(affiliateId);
            if (affiliate != null) {
                trackerCookie = (Cookie) cookiesMap.get(TRACKER);
                if (trackerCookie != null) {
                    Tracker tracker = userClient.getTrackerById(Long.parseLong(trackerCookie.getValue()));
                    if (tracker.getAffiliateId() == affiliateId) {
                        return;
                    }
                }
                // create new tracker and cookie if trackerCookie ==null or tracker.getAffiliateId() != affiliateId.
                Tracker newTracker = userClient.createTracker(affiliateId, (new Date()).getTime());
                trackerCookie = new Cookie(TRACKER, String.valueOf(newTracker.getId()));
                trackerCookie.setMaxAge(SECONDS_IN_TWO_MONTHS);
                trackerCookie.setPath("/");
                if (!cookieDomain.isEmpty()) {
                    trackerCookie.setDomain(cookieDomain);
                }
                cookiesMap.put(TRACKER, trackerCookie);
                HttpServletResponse response = ServletActionContext.getResponse();
                response.addCookie(trackerCookie);
            }
        } catch (Exception e) {
            log.error(e);
        }
        }
}