0
|
1 package nabble.view.web.util;
|
|
2
|
|
3 import nabble.model.DailyNumber;
|
|
4 import nabble.view.lib.Jtp;
|
|
5 import org.slf4j.Logger;
|
|
6 import org.slf4j.LoggerFactory;
|
|
7
|
|
8 import javax.servlet.ServletException;
|
|
9 import javax.servlet.http.HttpServlet;
|
|
10 import javax.servlet.http.HttpServletRequest;
|
|
11 import javax.servlet.http.HttpServletResponse;
|
|
12 import java.io.IOException;
|
|
13
|
|
14
|
|
15 public final class VisitCounter extends HttpServlet {
|
|
16 private static final Logger logger = LoggerFactory.getLogger(VisitCounter.class);
|
|
17
|
|
18 protected void service(HttpServletRequest request,HttpServletResponse response)
|
|
19 throws ServletException, IOException
|
|
20 {
|
|
21 response.setHeader("Content-Type", "application/x-javascript" );
|
|
22 Jtp.dontCache(response);
|
|
23 String referrer = request.getParameter("referrer");
|
|
24 logger.debug("VisitCounter referrer="+referrer);
|
|
25 String url = request.getHeader("Referer");
|
|
26 logger.debug("VisitCounter url="+url);
|
|
27 countVisit( request, referrer, url );
|
|
28 }
|
|
29
|
|
30 private static void countVisit(HttpServletRequest request,String referrer, String url) {
|
|
31 DailyNumber.totalVisits.inc();
|
|
32 if( referrer==null || referrer.equals("") ) {
|
|
33 DailyNumber.directVisits.inc();
|
|
34 } else if( isFromAd(url) ) {
|
|
35 DailyNumber.adVisits.inc();
|
|
36 } else if( isSearchEngine(referrer) ) {
|
|
37 DailyNumber.searchEngineVisits.inc();
|
|
38 } else {
|
|
39 DailyNumber.externalVisits.inc();
|
|
40 }
|
|
41 }
|
|
42
|
|
43 private static boolean isFromAd(String url) {
|
|
44 return url != null && url.indexOf("?keyword=") >= 0;
|
|
45 }
|
|
46
|
|
47 // logic from _uOrg() in urchin.js
|
|
48 private static boolean isSearchEngine(String referrer) {
|
|
49 int i = referrer.indexOf("://");
|
|
50 if( i == -1 )
|
|
51 return false;
|
|
52 String h = referrer.substring(i+3);
|
|
53 if (h.indexOf("/") > -1) {
|
|
54 h = h.substring(0,h.indexOf("/"));
|
|
55 }
|
|
56 for (SearchEngine se : searchEngines) {
|
|
57 boolean isSearchEngine = h.indexOf(se.name) > -1;
|
|
58 boolean isQuery = referrer.indexOf("?" + se.query + "=") > -1|| referrer.indexOf("&" + se.query + "=") > -1;
|
|
59 if (isSearchEngine && isQuery)
|
|
60 return true;
|
|
61 }
|
|
62 return false;
|
|
63 }
|
|
64
|
|
65 private static final class SearchEngine {
|
|
66 final String name;
|
|
67 final String query;
|
|
68
|
|
69 SearchEngine(String name,String query) {
|
|
70 this.name = name;
|
|
71 this.query = query;
|
|
72 }
|
|
73 }
|
|
74
|
|
75 private static final SearchEngine[] searchEngines = new SearchEngine[]{
|
|
76 new SearchEngine("google","q"),
|
|
77 new SearchEngine("yahoo","p"),
|
|
78 new SearchEngine("msn","q"),
|
|
79 new SearchEngine("aol","query"),
|
|
80 new SearchEngine("lycos","query"),
|
|
81 new SearchEngine("ask","q"),
|
|
82 new SearchEngine("altavista","q"),
|
|
83 new SearchEngine("search","q"),
|
|
84 new SearchEngine("netscape","query"),
|
|
85 new SearchEngine("earthlink","q"),
|
|
86 new SearchEngine("cnn","query"),
|
|
87 new SearchEngine("looksmart","key"),
|
|
88 new SearchEngine("about","terms"),
|
|
89 new SearchEngine("excite","qkw"),
|
|
90 new SearchEngine("mamma","query"),
|
|
91 new SearchEngine("alltheweb","q"),
|
|
92 new SearchEngine("gigablast","q"),
|
|
93 new SearchEngine("voila","kw"),
|
|
94 new SearchEngine("virgilio","qs"),
|
|
95 new SearchEngine("teoma","q"),
|
|
96 };
|
|
97 }
|