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"),
+	};
+}