view 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 source

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