Mercurial Hosting > nabble
diff src/nabble/view/web/util/VisitCounter.java @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nabble/view/web/util/VisitCounter.java Thu Mar 21 19:15:52 2019 -0600 @@ -0,0 +1,97 @@ +package nabble.view.web.util; + +import nabble.model.DailyNumber; +import nabble.view.lib.Jtp; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + + +public final class VisitCounter extends HttpServlet { + private static final Logger logger = LoggerFactory.getLogger(VisitCounter.class); + + protected void service(HttpServletRequest request,HttpServletResponse response) + throws ServletException, IOException + { + response.setHeader("Content-Type", "application/x-javascript" ); + Jtp.dontCache(response); + String referrer = request.getParameter("referrer"); + logger.debug("VisitCounter referrer="+referrer); + String url = request.getHeader("Referer"); + logger.debug("VisitCounter url="+url); + countVisit( request, referrer, url ); + } + + private static void countVisit(HttpServletRequest request,String referrer, String url) { + DailyNumber.totalVisits.inc(); + if( referrer==null || referrer.equals("") ) { + DailyNumber.directVisits.inc(); + } else if( isFromAd(url) ) { + DailyNumber.adVisits.inc(); + } else if( isSearchEngine(referrer) ) { + DailyNumber.searchEngineVisits.inc(); + } else { + DailyNumber.externalVisits.inc(); + } + } + + private static boolean isFromAd(String url) { + return url != null && url.indexOf("?keyword=") >= 0; + } + + // logic from _uOrg() in urchin.js + private static boolean isSearchEngine(String referrer) { + int i = referrer.indexOf("://"); + if( i == -1 ) + return false; + String h = referrer.substring(i+3); + if (h.indexOf("/") > -1) { + h = h.substring(0,h.indexOf("/")); + } + for (SearchEngine se : searchEngines) { + boolean isSearchEngine = h.indexOf(se.name) > -1; + boolean isQuery = referrer.indexOf("?" + se.query + "=") > -1|| referrer.indexOf("&" + se.query + "=") > -1; + if (isSearchEngine && isQuery) + return true; + } + return false; + } + + private static final class SearchEngine { + final String name; + final String query; + + SearchEngine(String name,String query) { + this.name = name; + this.query = query; + } + } + + private static final SearchEngine[] searchEngines = new SearchEngine[]{ + new SearchEngine("google","q"), + new SearchEngine("yahoo","p"), + new SearchEngine("msn","q"), + new SearchEngine("aol","query"), + new SearchEngine("lycos","query"), + new SearchEngine("ask","q"), + new SearchEngine("altavista","q"), + new SearchEngine("search","q"), + new SearchEngine("netscape","query"), + new SearchEngine("earthlink","q"), + new SearchEngine("cnn","query"), + new SearchEngine("looksmart","key"), + new SearchEngine("about","terms"), + new SearchEngine("excite","qkw"), + new SearchEngine("mamma","query"), + new SearchEngine("alltheweb","q"), + new SearchEngine("gigablast","q"), + new SearchEngine("voila","kw"), + new SearchEngine("virgilio","qs"), + new SearchEngine("teoma","q"), + }; +}