Subversion Repositories SmartDukaan

Rev

Rev 12616 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1862 vikas 1
package in.shop2020.serving.interceptors;
2
 
2637 vikas 3
import in.shop2020.datalogger.EventType;
1862 vikas 4
import in.shop2020.model.v1.user.Affiliate;
2637 vikas 5
import in.shop2020.serving.services.UserSessionInfo;
2021 vikas 6
import in.shop2020.serving.utils.DesEncrypter;
3126 rajveer 7
import in.shop2020.thrift.clients.UserClient;
2637 vikas 8
import in.shop2020.utils.DataLogger;
1862 vikas 9
 
2817 vikas 10
import java.util.Date;
2637 vikas 11
import java.util.HashMap;
3588 vikas 12
import java.util.HashSet;
2637 vikas 13
import java.util.Map;
3588 vikas 14
import java.util.Set;
2637 vikas 15
 
1862 vikas 16
import javax.servlet.http.Cookie;
17
import javax.servlet.http.HttpServletRequest;
18
import javax.servlet.http.HttpServletResponse;
19
 
20
import org.apache.log4j.Logger;
21
import org.apache.struts2.ServletActionContext;
22
 
23
import com.opensymphony.xwork2.ActionInvocation;
24
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
25
 
26
public class TrackingInterceptor extends AbstractInterceptor {
27
 
2945 vikas 28
    private static final long serialVersionUID = 1L;
29
    private static Logger log = Logger.getLogger(TrackingInterceptor.class);
30
 
31
    private static final int SECONDS_IN_YEAR = 60 * 60 * 24 * 365;
32
    private static final int SECONDS_IN_DAY = 60 * 60 * 24;
33
    public static final String AFF_COOKIE = "uafc";
34
    public static final String SRC_COOKIE = "usrcc";
35
    public static final String SESSION_SRC_COOKIE = "sess_srcc";
36
    public static final String SRC_TIME_COOKIE = "usrctc";
2817 vikas 37
    public static final String SESSION_SRC_TIME_COOKIE = "sess_srctc";
3185 vikas 38
    public static final String SESSION_ID_COOKIE = "sess_idc";
2945 vikas 39
    public static final String ENCRIPTION_STRING = "Saholic";
3588 vikas 40
    private static final Set<String> paidAffIds;
41
 
2945 vikas 42
    private String cookieDomain = "";
43
    private Cookie affCookie = null;
44
    private Cookie firstSourceCookie = null;
45
    private Cookie sessionSourceCookie = null;
46
    private Cookie firstSourceTimeCookie = null;
2817 vikas 47
    private Cookie sessionSourceTimeCookie = null;
3185 vikas 48
    private Cookie sessionIdCookie = null;
1862 vikas 49
    private Map<String, Cookie> cookiesMap = null;
3860 vikas 50
 
2945 vikas 51
    private HttpServletRequest request;
52
    private HttpServletResponse response;
3860 vikas 53
    private String referer;
3588 vikas 54
    private String affId = null;
5466 anupam.sin 55
    private String utmSrc = null;
3588 vikas 56
 
57
    static {
58
        paidAffIds = new HashSet<String>();
59
        paidAffIds.add("6");
60
        paidAffIds.add("38");
3860 vikas 61
        paidAffIds.add("41");
62
        paidAffIds.add("43");
63
        paidAffIds.add("45");
3588 vikas 64
    }
2945 vikas 65
 
1862 vikas 66
    public void setCookieDomain(String cookieDomain) {
67
        this.cookieDomain = cookieDomain;
68
    }
1999 vikas 69
 
2021 vikas 70
    @Override
2945 vikas 71
    public String intercept(ActionInvocation invocation) throws Exception {
72
        request = ServletActionContext.getRequest();
73
        response = ServletActionContext.getResponse();
3860 vikas 74
        referer = request.getHeader("referer");
75
        affId = request.getParameter("afid");
5466 anupam.sin 76
        utmSrc = request.getParameter("utm_source");
3494 vikas 77
 
2945 vikas 78
        createCookiesMap();
79
        updateFirstSourceCookie();
80
        updateSessionSourceCookie();
1862 vikas 81
 
3588 vikas 82
        updateAffCookie();
1862 vikas 83
        return invocation.invoke();
2945 vikas 84
    }
1862 vikas 85
 
2021 vikas 86
    /**
2637 vikas 87
     * Update first source cookie
2021 vikas 88
     * 
89
     */
90
    private void updateFirstSourceCookie() {
91
        firstSourceCookie = (Cookie) cookiesMap.get(SRC_COOKIE);
92
        if (firstSourceCookie != null) {
93
            return;
94
        }
3286 vikas 95
        String src = getSource();
2817 vikas 96
        DesEncrypter des = new DesEncrypter(ENCRIPTION_STRING);
2021 vikas 97
        String sourceCookieVal = des.encrypt(src);
2945 vikas 98
 
3860 vikas 99
        firstSourceCookie = createCookie(SRC_COOKIE, cookieDomain, sourceCookieVal, SECONDS_IN_YEAR);
100
        firstSourceTimeCookie = createCookie(SRC_TIME_COOKIE, cookieDomain, Long.toString((new Date()).getTime()), SECONDS_IN_YEAR);
101
 
2021 vikas 102
        cookiesMap.put(SRC_COOKIE, firstSourceCookie);
2817 vikas 103
        cookiesMap.put(SRC_TIME_COOKIE, firstSourceTimeCookie);
2945 vikas 104
 
2021 vikas 105
        response.addCookie(firstSourceCookie);
2817 vikas 106
        response.addCookie(firstSourceTimeCookie);
2021 vikas 107
    }
2945 vikas 108
 
3860 vikas 109
    private Cookie createCookie(String name, String domain, String value, Integer age) {
110
        Cookie cookie = new Cookie(name, value);
111
        if (age != null) {
112
            cookie.setMaxAge(age);
113
        }
114
        cookie.setPath("/");
115
        if (!domain.isEmpty()) {
116
            cookie.setDomain(domain);
117
        }
118
        return cookie;
119
    }
120
 
2637 vikas 121
    /**
122
     * Update first source cookie
123
     * 
124
     */
125
    private void updateSessionSourceCookie() {
126
        sessionSourceCookie = (Cookie) cookiesMap.get(SESSION_SRC_COOKIE);
127
        if (sessionSourceCookie != null) {
3860 vikas 128
            if (referer == null || referer.isEmpty() || referer.startsWith("http://www.saholic.com") || referer.startsWith("http://local.shop2020.in")) {
129
                log.info("No change in session cookie");
130
                return;
131
            }
2637 vikas 132
        }
3286 vikas 133
        String src = getSource();
134
 
2817 vikas 135
        DesEncrypter des = new DesEncrypter(ENCRIPTION_STRING);
2637 vikas 136
        String sessionSourceCookieVal = des.encrypt(src);
2945 vikas 137
 
3185 vikas 138
        //session source
3860 vikas 139
        sessionSourceCookie = createCookie(SESSION_SRC_COOKIE, cookieDomain, sessionSourceCookieVal, null);
2637 vikas 140
        cookiesMap.put(SESSION_SRC_COOKIE, sessionSourceCookie);
3860 vikas 141
        log.info("new session cookie : " + sessionSourceCookieVal);
2945 vikas 142
 
3185 vikas 143
        //session time
3860 vikas 144
        sessionSourceTimeCookie = createCookie(SESSION_SRC_TIME_COOKIE, cookieDomain, Long.toString((new Date()).getTime()), null);
2817 vikas 145
        cookiesMap.put(SESSION_SRC_TIME_COOKIE, sessionSourceTimeCookie);
3185 vikas 146
 
3860 vikas 147
        UserSessionInfo userInfo = (UserSessionInfo) request
148
            .getAttribute(UserInterceptor.USER_INFO_COOKIE_NAME);
149
 
150
        //session id for chaining user actions over one year 
151
        sessionIdCookie = (Cookie) cookiesMap.get(SESSION_ID_COOKIE);
152
        if (sessionIdCookie == null) {
153
            String sessionId = request.getSession().getId();
154
            sessionIdCookie = createCookie(SESSION_ID_COOKIE, cookieDomain, sessionId, SECONDS_IN_YEAR);
155
            cookiesMap.put(SESSION_ID_COOKIE, sessionIdCookie);
156
 
157
            response.addCookie(sessionIdCookie);
158
            String firstSrc = "";
159
            firstSourceCookie = (Cookie) cookiesMap.get(SRC_COOKIE);
160
            if (firstSourceCookie != null) {
161
                firstSrc = des.decrypt(firstSourceCookie.getValue());
162
            }
12616 anikendra 163
			// DataLogger.logData(EventType.NEW_SESSION, cookiesMap.get(SESSION_ID_COOKIE).getValue(),
164
//                    userInfo.getUserId(), userInfo.getEmail(), src, firstSrc);
3185 vikas 165
        }
166
 
2637 vikas 167
        response.addCookie(sessionSourceCookie);
2817 vikas 168
        response.addCookie(sessionSourceTimeCookie);
2637 vikas 169
    }
2021 vikas 170
 
2945 vikas 171
    private void createCookiesMap() {
172
        cookiesMap = new HashMap<String, Cookie>();
1862 vikas 173
        Cookie[] cookies = request.getCookies();
174
        // This check is necessary for the first request when no cookies are
175
        // sent.
2945 vikas 176
        if (cookies == null)
1862 vikas 177
            return;
178
        for (Cookie cookie : cookies) {
11084 amit.gupta 179
        	log.info("Cookie:"+cookie);
1862 vikas 180
            cookiesMap.put(cookie.getName(), cookie);
181
        }
182
    }
2945 vikas 183
 
3588 vikas 184
    private void updateAffCookie() {
16848 amit.gupta 185
		try {
186
			UserClient userContextServiceClient = new UserClient();
187
			in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
188
			long affiliateId = Long.parseLong(affId);
189
			Affiliate affiliate = userClient.getAffiliateById(affiliateId);
190
			if (affiliate != null) {
191
				affCookie = (Cookie) cookiesMap.get(AFF_COOKIE);
192
				if (affCookie != null) {
193
					Long.parseLong(affCookie.getValue());
194
					if (affiliateId == Long.parseLong(affCookie.getValue())) {
195
						return;
196
					}
197
				}
198
				// create new aff cookie if affCookie ==null or affiliateId() !=
199
				// affCookie.
200
				Cookie newAffCookie = new Cookie(AFF_COOKIE,String.valueOf(affiliateId));
201
				newAffCookie.setMaxAge(SECONDS_IN_DAY * 5);
202
				newAffCookie.setPath("/");
203
				if (!cookieDomain.isEmpty()) {
204
					newAffCookie.setDomain(cookieDomain);
205
				}
206
				cookiesMap.put(AFF_COOKIE, newAffCookie);
207
				response.addCookie(newAffCookie);
208
			}
209
		} catch (Exception e) {
210
            if (referer != null && !referer.isEmpty() && !referer.startsWith("http://www.saholic.com") && !referer.startsWith("http://www.shop2020.in")) {
211
                Cookie affCookie = cookiesMap.get(AFF_COOKIE);
212
                if(affCookie != null) {
213
                    affCookie.setDomain(cookieDomain);
214
                    affCookie.setPath("/");
215
                    affCookie.setValue("");
216
                    affCookie.setMaxAge(0);
217
                    response.addCookie(affCookie);
1999 vikas 218
                }
219
            }
16848 amit.gupta 220
			log.error("Failed to update affcookie.", e);
221
		}
1862 vikas 222
	}
3286 vikas 223
 
5945 mandeep.dh 224
    private String getSource() {    
3286 vikas 225
        String src = "";
3588 vikas 226
 
5466 anupam.sin 227
        /* 
228
         * we are using http://email/ so that it is parsed properly in 
229
         * DailyProductwithSourceAggregatorServlet.getSource()
230
         */
231
        if (utmSrc != null) {
232
            src = "NEWSLETTER : (http://email/)";
233
        }
234
        else if (referer == null || referer.isEmpty()) {
3588 vikas 235
            String queryString = request.getQueryString();
236
            queryString = queryString == null? "" : "?" + queryString;
237
            src = "DIRECT : " + "(" + request.getRequestURL() + "/" + queryString + ")";
238
        } 
239
        else if (referer.startsWith("http://www.saholic.com") || referer.startsWith("http://www.shop2020.in")) {
240
            src = "DIRECT : " + "(" + referer + ")";
241
        } 
242
        else if(paidAffIds.contains(affId)) {
243
            src = "PAID : " + "(" + referer + ")";
3286 vikas 244
        }
3588 vikas 245
        else if (referer.contains("google.co")) {
246
            src = "ORGANIC : " + "(" + referer + ")";
247
        }
248
        else {
249
            src = referer;
250
        }
3286 vikas 251
        return src;
252
    }
1877 vikas 253
}