view src/nabble/view/web/util/VisitCounter.java @ 62:4674ed7d56df default tip

remove n2
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 30 Sep 2023 20:25:29 -0600
parents 7ecd1a4ef557
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"),
	};
}