Subversion Repositories SmartDukaan

Rev

Rev 11084 | Rev 16848 | 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() {
2945 vikas 185
        try {
186
            if(affId == null || affId.isEmpty()) {
3860 vikas 187
                if (referer != null && !referer.isEmpty() && !referer.startsWith("http://www.saholic.com") && !referer.startsWith("http://www.shop2020.in")) {
2945 vikas 188
                    Cookie affCookie = cookiesMap.get(AFF_COOKIE);
3199 vikas 189
                    if(affCookie != null) {
190
                        affCookie.setDomain(cookieDomain);
191
                        affCookie.setPath("/");
192
                        affCookie.setValue("");
193
                        affCookie.setMaxAge(0);
194
                        response.addCookie(affCookie);
195
                    }
1999 vikas 196
                }
2945 vikas 197
                return;
1999 vikas 198
            }
3126 rajveer 199
            UserClient userContextServiceClient = new UserClient();
2945 vikas 200
            in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
1862 vikas 201
            long affiliateId = Long.parseLong(affId);
202
            Affiliate affiliate = userClient.getAffiliateById(affiliateId);
203
            if (affiliate != null) {
1999 vikas 204
                affCookie = (Cookie) cookiesMap.get(AFF_COOKIE);
205
                if (affCookie != null) {
206
                    Long.parseLong(affCookie.getValue());
207
                    if (affiliateId == Long.parseLong(affCookie.getValue())) {
1862 vikas 208
                        return;
209
                    }
210
                }
1999 vikas 211
                // create new aff cookie if affCookie ==null or affiliateId() != affCookie.
212
                Cookie newAffCookie = new Cookie(AFF_COOKIE, String.valueOf(affiliateId));
2936 vikas 213
                newAffCookie.setMaxAge(SECONDS_IN_DAY * 5);
1999 vikas 214
                newAffCookie.setPath("/");
1862 vikas 215
                if (!cookieDomain.isEmpty()) {
1999 vikas 216
                    newAffCookie.setDomain(cookieDomain);
1862 vikas 217
                }
1999 vikas 218
                cookiesMap.put(AFF_COOKIE, newAffCookie);
219
                response.addCookie(newAffCookie);
1862 vikas 220
            }
221
        } catch (Exception e) {
3199 vikas 222
            log.error("Failed to update affcookie.", e);
1862 vikas 223
        }
224
	}
3286 vikas 225
 
5945 mandeep.dh 226
    private String getSource() {    
3286 vikas 227
        String src = "";
3588 vikas 228
 
5466 anupam.sin 229
        /* 
230
         * we are using http://email/ so that it is parsed properly in 
231
         * DailyProductwithSourceAggregatorServlet.getSource()
232
         */
233
        if (utmSrc != null) {
234
            src = "NEWSLETTER : (http://email/)";
235
        }
236
        else if (referer == null || referer.isEmpty()) {
3588 vikas 237
            String queryString = request.getQueryString();
238
            queryString = queryString == null? "" : "?" + queryString;
239
            src = "DIRECT : " + "(" + request.getRequestURL() + "/" + queryString + ")";
240
        } 
241
        else if (referer.startsWith("http://www.saholic.com") || referer.startsWith("http://www.shop2020.in")) {
242
            src = "DIRECT : " + "(" + referer + ")";
243
        } 
244
        else if(paidAffIds.contains(affId)) {
245
            src = "PAID : " + "(" + referer + ")";
3286 vikas 246
        }
3588 vikas 247
        else if (referer.contains("google.co")) {
248
            src = "ORGANIC : " + "(" + referer + ")";
249
        }
250
        else {
251
            src = referer;
252
        }
3286 vikas 253
        return src;
254
    }
1877 vikas 255
}