Subversion Repositories SmartDukaan

Rev

Rev 3588 | Rev 5466 | 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;
55
 
56
    static {
57
        paidAffIds = new HashSet<String>();
58
        paidAffIds.add("6");
59
        paidAffIds.add("38");
3860 vikas 60
        paidAffIds.add("41");
61
        paidAffIds.add("43");
62
        paidAffIds.add("45");
3588 vikas 63
    }
2945 vikas 64
 
1862 vikas 65
    public void setCookieDomain(String cookieDomain) {
66
        this.cookieDomain = cookieDomain;
67
    }
1999 vikas 68
 
2021 vikas 69
    @Override
2945 vikas 70
    public String intercept(ActionInvocation invocation) throws Exception {
71
        request = ServletActionContext.getRequest();
72
        response = ServletActionContext.getResponse();
3860 vikas 73
        referer = request.getHeader("referer");
74
        affId = request.getParameter("afid");
3494 vikas 75
 
2945 vikas 76
        createCookiesMap();
77
        updateFirstSourceCookie();
78
        updateSessionSourceCookie();
1862 vikas 79
 
3588 vikas 80
        updateAffCookie();
1862 vikas 81
        return invocation.invoke();
2945 vikas 82
    }
1862 vikas 83
 
2021 vikas 84
    /**
2637 vikas 85
     * Update first source cookie
2021 vikas 86
     * 
87
     */
88
    private void updateFirstSourceCookie() {
89
        firstSourceCookie = (Cookie) cookiesMap.get(SRC_COOKIE);
90
        if (firstSourceCookie != null) {
91
            return;
92
        }
3286 vikas 93
        String src = getSource();
2817 vikas 94
        DesEncrypter des = new DesEncrypter(ENCRIPTION_STRING);
2021 vikas 95
        String sourceCookieVal = des.encrypt(src);
2945 vikas 96
 
3860 vikas 97
        firstSourceCookie = createCookie(SRC_COOKIE, cookieDomain, sourceCookieVal, SECONDS_IN_YEAR);
98
        firstSourceTimeCookie = createCookie(SRC_TIME_COOKIE, cookieDomain, Long.toString((new Date()).getTime()), SECONDS_IN_YEAR);
99
 
2021 vikas 100
        cookiesMap.put(SRC_COOKIE, firstSourceCookie);
2817 vikas 101
        cookiesMap.put(SRC_TIME_COOKIE, firstSourceTimeCookie);
2945 vikas 102
 
2021 vikas 103
        response.addCookie(firstSourceCookie);
2817 vikas 104
        response.addCookie(firstSourceTimeCookie);
2021 vikas 105
    }
2945 vikas 106
 
3860 vikas 107
    private Cookie createCookie(String name, String domain, String value, Integer age) {
108
        Cookie cookie = new Cookie(name, value);
109
        if (age != null) {
110
            cookie.setMaxAge(age);
111
        }
112
        cookie.setPath("/");
113
        if (!domain.isEmpty()) {
114
            cookie.setDomain(domain);
115
        }
116
        return cookie;
117
    }
118
 
2637 vikas 119
    /**
120
     * Update first source cookie
121
     * 
122
     */
123
    private void updateSessionSourceCookie() {
124
        sessionSourceCookie = (Cookie) cookiesMap.get(SESSION_SRC_COOKIE);
125
        if (sessionSourceCookie != null) {
3860 vikas 126
            if (referer == null || referer.isEmpty() || referer.startsWith("http://www.saholic.com") || referer.startsWith("http://local.shop2020.in")) {
127
                log.info("No change in session cookie");
128
                return;
129
            }
2637 vikas 130
        }
3286 vikas 131
        String src = getSource();
132
 
2817 vikas 133
        DesEncrypter des = new DesEncrypter(ENCRIPTION_STRING);
2637 vikas 134
        String sessionSourceCookieVal = des.encrypt(src);
2945 vikas 135
 
3185 vikas 136
        //session source
3860 vikas 137
        sessionSourceCookie = createCookie(SESSION_SRC_COOKIE, cookieDomain, sessionSourceCookieVal, null);
2637 vikas 138
        cookiesMap.put(SESSION_SRC_COOKIE, sessionSourceCookie);
3860 vikas 139
        log.info("new session cookie : " + sessionSourceCookieVal);
2945 vikas 140
 
3185 vikas 141
        //session time
3860 vikas 142
        sessionSourceTimeCookie = createCookie(SESSION_SRC_TIME_COOKIE, cookieDomain, Long.toString((new Date()).getTime()), null);
2817 vikas 143
        cookiesMap.put(SESSION_SRC_TIME_COOKIE, sessionSourceTimeCookie);
3185 vikas 144
 
3860 vikas 145
        UserSessionInfo userInfo = (UserSessionInfo) request
146
            .getAttribute(UserInterceptor.USER_INFO_COOKIE_NAME);
147
 
148
        //session id for chaining user actions over one year 
149
        sessionIdCookie = (Cookie) cookiesMap.get(SESSION_ID_COOKIE);
150
        if (sessionIdCookie == null) {
151
            String sessionId = request.getSession().getId();
152
            sessionIdCookie = createCookie(SESSION_ID_COOKIE, cookieDomain, sessionId, SECONDS_IN_YEAR);
153
            cookiesMap.put(SESSION_ID_COOKIE, sessionIdCookie);
154
 
155
            response.addCookie(sessionIdCookie);
156
            String firstSrc = "";
157
            firstSourceCookie = (Cookie) cookiesMap.get(SRC_COOKIE);
158
            if (firstSourceCookie != null) {
159
                firstSrc = des.decrypt(firstSourceCookie.getValue());
160
            }
161
            DataLogger.logData(EventType.NEW_SESSION, cookiesMap.get(SESSION_ID_COOKIE).getValue(),
162
                    userInfo.getUserId(), userInfo.getEmail(), src, firstSrc);
3185 vikas 163
        }
164
 
2637 vikas 165
        response.addCookie(sessionSourceCookie);
2817 vikas 166
        response.addCookie(sessionSourceTimeCookie);
2637 vikas 167
    }
2021 vikas 168
 
2945 vikas 169
    private void createCookiesMap() {
170
        cookiesMap = new HashMap<String, Cookie>();
1862 vikas 171
        Cookie[] cookies = request.getCookies();
172
        // This check is necessary for the first request when no cookies are
173
        // sent.
2945 vikas 174
        if (cookies == null)
1862 vikas 175
            return;
176
        for (Cookie cookie : cookies) {
177
            cookiesMap.put(cookie.getName(), cookie);
178
        }
179
    }
2945 vikas 180
 
3588 vikas 181
    private void updateAffCookie() {
2945 vikas 182
        try {
183
            if(affId == null || affId.isEmpty()) {
3860 vikas 184
                if (referer != null && !referer.isEmpty() && !referer.startsWith("http://www.saholic.com") && !referer.startsWith("http://www.shop2020.in")) {
2945 vikas 185
                    Cookie affCookie = cookiesMap.get(AFF_COOKIE);
3199 vikas 186
                    if(affCookie != null) {
187
                        affCookie.setDomain(cookieDomain);
188
                        affCookie.setPath("/");
189
                        affCookie.setValue("");
190
                        affCookie.setMaxAge(0);
191
                        response.addCookie(affCookie);
192
                    }
1999 vikas 193
                }
2945 vikas 194
                return;
1999 vikas 195
            }
3126 rajveer 196
            UserClient userContextServiceClient = new UserClient();
2945 vikas 197
            in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
1862 vikas 198
            long affiliateId = Long.parseLong(affId);
199
            Affiliate affiliate = userClient.getAffiliateById(affiliateId);
200
            if (affiliate != null) {
1999 vikas 201
                affCookie = (Cookie) cookiesMap.get(AFF_COOKIE);
202
                if (affCookie != null) {
203
                    Long.parseLong(affCookie.getValue());
204
                    if (affiliateId == Long.parseLong(affCookie.getValue())) {
1862 vikas 205
                        return;
206
                    }
207
                }
1999 vikas 208
                // create new aff cookie if affCookie ==null or affiliateId() != affCookie.
209
                Cookie newAffCookie = new Cookie(AFF_COOKIE, String.valueOf(affiliateId));
2936 vikas 210
                newAffCookie.setMaxAge(SECONDS_IN_DAY * 5);
1999 vikas 211
                newAffCookie.setPath("/");
1862 vikas 212
                if (!cookieDomain.isEmpty()) {
1999 vikas 213
                    newAffCookie.setDomain(cookieDomain);
1862 vikas 214
                }
1999 vikas 215
                cookiesMap.put(AFF_COOKIE, newAffCookie);
216
                response.addCookie(newAffCookie);
1862 vikas 217
            }
218
        } catch (Exception e) {
3199 vikas 219
            log.error("Failed to update affcookie.", e);
1862 vikas 220
        }
221
	}
3286 vikas 222
 
223
    private String getSource() {
224
        String src = "";
3588 vikas 225
 
226
        if (referer == null || referer.isEmpty()) {
227
            String queryString = request.getQueryString();
228
            queryString = queryString == null? "" : "?" + queryString;
229
            src = "DIRECT : " + "(" + request.getRequestURL() + "/" + queryString + ")";
230
        } 
231
        else if (referer.startsWith("http://www.saholic.com") || referer.startsWith("http://www.shop2020.in")) {
232
            src = "DIRECT : " + "(" + referer + ")";
233
        } 
234
        else if(paidAffIds.contains(affId)) {
235
            src = "PAID : " + "(" + referer + ")";
3286 vikas 236
        }
3588 vikas 237
        else if (referer.contains("google.co")) {
238
            src = "ORGANIC : " + "(" + referer + ")";
239
        }
240
        else {
241
            src = referer;
242
        }
3286 vikas 243
        return src;
244
    }
1877 vikas 245
}