Subversion Repositories SmartDukaan

Rev

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