package is.idega.idegaweb.tracker.business; import is.idega.idegaweb.tracker.data.DomainStatistics; import is.idega.idegaweb.tracker.data.PageStatistics; import is.idega.idegaweb.tracker.data.PageStatisticsHome; import is.idega.idegaweb.tracker.data.PageTotalStatistics; import is.idega.idegaweb.tracker.data.ReferrerStatistics; import is.idega.idegaweb.tracker.data.UserAgentStatistics; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Vector; import javax.transaction.TransactionManager; import com.idega.builder.business.BuilderLogic; import com.idega.builder.business.BuilderConstants; import com.idega.core.builder.data.ICDomain; import com.idega.core.localisation.business.ICLocaleBusiness; import com.idega.data.IDOLegacyEntity; import com.idega.data.IDOLookup; import com.idega.idegaweb.IWCacheManager; import com.idega.presentation.IWContext; import com.idega.transaction.IdegaTransactionManager; import com.idega.util.IWTimestamp; //synchronized //unsynchronized //unsynchronized /** * Title: is.idega.idegaweb.tracker.business.TrackerBusiness * Description: The main business object for the idegaWeb Tracker statistics application * Copyright: Copyright (c) 2002 * Company: Idega software * @author Eirikur S. Hrafnsson * @version 1.0 */ public class TrackerBusiness { public static final String IW_BUNDLE_IDENTIFIER = "is.idega.tracker"; private static IWCacheManager cm; private static ICDomain domainEntity; private static String TR_USER_AGENT_KEY = "tr.ua"; private static String TR_PAGE_CACHE_KEY = "tr.pg"; private static String TR_PAGE_TOTAL_CACHE_KEY = "tr.pgt"; private static String TR_REFERRER_CACHE_KEY = "tr.re"; private static String TR_DOMAIN_CACHE_KEY = "tr.do"; private static Map pages; private static Map referers; private static Map agents; private static Map pageSessions; private static Map pageHits; private static Map sessions; private static int totalHits = 0; private static int totalSessions = 0; private static String domainName; private static boolean notWritingToDB = true; public TrackerBusiness() { } private static void init(IWContext iwc){ if( cm == null ) cm = IWCacheManager.getInstance(iwc.getIWMainApplication()); if( domainEntity == null ) domainEntity = BuilderLogic.getInstance().getCurrentDomain(iwc);/**@todo add multidomain support**/ if( pages == null ){pages = new HashMap();} if( agents == null ){ agents = new Hashtable();} } private static void incrementPageHits(String pageId){ if( pageHits == null ){ pageHits = new Hashtable();} Integer hits = (Integer) pageHits.get(pageId); pageHits.put(pageId,getIncrementedInteger(hits)); } private static void incrementPageSessions(String pageId){ if( pageSessions == null ){ pageSessions = new Hashtable();} Integer hits = (Integer) pageSessions.get(pageId); pageSessions.put(pageId,getIncrementedInteger(hits)); } private static Integer getIncrementedInteger(Integer i){ if( i == null ) i = new Integer(1); else { i = new Integer(i.intValue()+1); } return i; } public static void runThroughTheStatsMachine(IWContext iwc){ if( notWritingToDB ){ init(iwc); handlePageStats(iwc); handleSessionsRelated(iwc); } } public static void handlePageStats(IWContext iwc){ int pageId = getCurrentPageId(iwc); String sPageId = String.valueOf(pageId); String sessionId = iwc.getSession().getId(); if(pageId!=-1){ PageStatistics page = ((is.idega.idegaweb.tracker.data.PageStatisticsHome)com.idega.data.IDOLookup.getHomeLegacy(PageStatistics.class)).createLegacy();/**@todo clone this?**/ page.setPageId(pageId); page.setPreviousPageId(pageId);/**@todo this shit here**/ page.setLocale(iwc.getCurrentLocaleId()); page.setUserId(iwc.getUserId()); page.setModificationDate(IWTimestamp.getTimestampRightNow()); page.setGenerationTime(200);/**@todo this shit here**/ ArrayList pageLog = (ArrayList) pages.get(sessionId); if( pageLog == null ){ pageLog = new ArrayList(); //session stuff totalSessions++; incrementPageSessions(sPageId);/**@todo only counts once!**/ } pageLog.add(page); pages.put(sessionId,pageLog); //hit stuff totalHits++; incrementPageHits(sPageId); } } public static void handleReferrerStats(IWContext iwc){ String referer = iwc.getReferer(); if( domainName == null ) domainName = iwc.getServerName(); if( referers == null ){ referers = new Hashtable();} if( (referer!=null) && (referer.indexOf(domainName)==-1) ){ ReferrerStatistics stats = (ReferrerStatistics) referers.get(referer); if( stats == null ){ stats = ((is.idega.idegaweb.tracker.data.ReferrerStatisticsHome)com.idega.data.IDOLookup.getHomeLegacy(ReferrerStatistics.class)).createLegacy(); stats.setReferrerUrl(referer); stats.setSessions(1); stats.setModificationDate(IWTimestamp.getTimestampRightNow()); referers.put(stats.getReferrerUrl(),stats); } else{ stats.setSessions(stats.getSessions()+1); } } } public static ArrayList getRefererArrayList(){ ArrayList list = new ArrayList(); if( referers!=null ){ Iterator iter = referers.keySet().iterator(); while (iter.hasNext()) { ReferrerStatistics item = (ReferrerStatistics) referers.get((String)iter.next()); list.add(item); } } return list; } public static ArrayList getPageHitsArrayList(){ ArrayList list = new ArrayList(); try { if( pageHits!=null ){ PageStatisticsHome rhome = (PageStatisticsHome)IDOLookup.getHome(PageStatistics.class); Iterator iter = pageHits.keySet().iterator(); String key; while (iter.hasNext()) { key = (String)iter.next(); PageStatistics page = rhome.create(); page.setPageId(Integer.parseInt(key)); page.setHits(((Integer)pageHits.get(key)).intValue()); list.add(page); } } } catch (Exception ex) { ex.printStackTrace(); } return list; } public static ArrayList getPageHitsArrayListSortedByHits(){ PageComparator comparer = new PageComparator(PageComparator.ORDER_BY_HITS); return comparer.sortedArrayList(getPageHitsArrayList()); } public static ArrayList getPageHitsArrayListReverseSortedByHits(){ PageComparator comparer = new PageComparator(PageComparator.REVERSE_ORDER_BY_HITS); return comparer.sortedArrayList(getPageHitsArrayList()); } public static ArrayList getPageHitsArrayListSortedByURL(){ PageComparator comparer = new PageComparator(PageComparator.ORDER_BY_PAGE_NAME); return comparer.sortedArrayList(getPageHitsArrayList()); } public static ArrayList getRefererArrayListSortedBySessions(){ RefererComparator comparer = new RefererComparator(RefererComparator.ORDER_BY_SESSIONS); return comparer.sortedArrayList(getRefererArrayList()); } public static ArrayList getRefererArrayListReverseSortedBySessions(){ RefererComparator comparer = new RefererComparator(RefererComparator.REVERSE_ORDER_BY_SESSIONS); return comparer.sortedArrayList(getRefererArrayList()); } public static ArrayList getRefererArrayListSortedByURL(){ RefererComparator comparer = new RefererComparator(RefererComparator.ORDER_BY_URL); return comparer.sortedArrayList(getRefererArrayList()); } public static ArrayList getAgentArrayList(){ ArrayList list = new ArrayList(); if( agents!=null ){ Iterator iter = agents.keySet().iterator(); while (iter.hasNext()) { UserAgentStatistics item = (UserAgentStatistics) agents.get((String)iter.next()); list.add(item); } } return list; } public static ArrayList getAgentArrayListSortedBySessions(){ AgentComparator comparer = new AgentComparator(AgentComparator.ORDER_BY_SESSIONS); return comparer.sortedArrayList(getAgentArrayList()); } public static ArrayList getAgentArrayListReverseSortedBySessions(){ AgentComparator comparer = new AgentComparator(AgentComparator.REVERSE_ORDER_BY_SESSIONS); return comparer.sortedArrayList(getAgentArrayList()); } public static ArrayList getAgentArrayListSortedByAgent(){ AgentComparator comparer = new AgentComparator(AgentComparator.ORDER_BY_AGENT); return comparer.sortedArrayList(getAgentArrayList()); } public static void handleUserAgentStats(IWContext iwc){ String userAgent = iwc.getUserAgent(); if( agents == null ){ agents = new Hashtable();} if(userAgent!=null){ UserAgentStatistics stats = (UserAgentStatistics) agents.get(userAgent); if( stats == null ){ stats = ((is.idega.idegaweb.tracker.data.UserAgentStatisticsHome)com.idega.data.IDOLookup.getHomeLegacy(UserAgentStatistics.class)).createLegacy(); stats.setUserAgent(userAgent); stats.setSessions(1); stats.setModificationDate(IWTimestamp.getTimestampRightNow()); agents.put(stats.getUserAgent(),stats); } else{ stats.setSessions(stats.getSessions()+1); } } } public static int getCurrentPageId(IWContext iwc){ int returner = -1; String pageId = iwc.getParameter(BuilderConstants.IB_PAGE_PARAMETER); if(pageId==null) pageId = String.valueOf(BuilderLogic.getInstance().getStartPageId(iwc)); if(pageId==null) pageId = iwc.getParameter(BuilderConstants.IB_PAGE_PARAMETER); try { if(pageId!=null){ returner = Integer.parseInt(pageId); } } catch (Exception ex) { //do nothing } return returner; } public static int getCurrentPageHits(IWContext iwc){ if( pageHits == null ){ pageHits = new Hashtable();} Integer hits = (Integer) pageHits.get(String.valueOf(getCurrentPageId(iwc))); if( hits == null ) return 0; else return hits.intValue(); } public static int getCurrentPageSessions(IWContext iwc){ if( pageSessions == null ){ pageSessions = new Hashtable();} Integer sessions = (Integer) pageSessions.get(String.valueOf(getCurrentPageId(iwc))); if( sessions == null ) return 0; else return sessions.intValue(); } private static void handleSessionsRelated(IWContext iwc){ if( sessions == null ){ sessions = new Hashtable(); } String sId = iwc.getSessionId(); if( sessions.get(sId)==null ){ handleReferrerStats(iwc); handleUserAgentStats(iwc); } sessions.put(sId,sId); } public static int getTotalHits(){ return totalHits; } public static int getTotalSessions(){ return totalSessions; } public static Map getReferers(){ return referers; } public static Map getUserAgents(){ return agents; } //********** save to database functions **************// public static void saveStatsToDB(){ notWritingToDB = false;//stop updating for a while /* saveMapToDB(5); saveMapToDB(referers); saveMapToDB(agents); pageSessions; pageHits; domain; totalHits; totalSessions; */ notWritingToDB = true;//start updating again } private static void saveMapToDB(Map stats){ if( stats!=null ){ TransactionManager t = IdegaTransactionManager.getInstance(); try { t.begin(); Iterator iter = stats.keySet().iterator(); while (iter.hasNext()) { IDOLegacyEntity item = (IDOLegacyEntity) iter.next(); item.insert(); } t.commit(); } catch (Exception e) { e.printStackTrace(System.err); try { t.rollback(); } catch (Exception e1) { e1.printStackTrace(System.err); } } } } private static void calculateAndInsertTotalPageAndDomainStats(IWContext iwc){ HashMap totalPage = new HashMap(); HashMap totalDomain = new HashMap(); Vector locales = (Vector) iwc.getIWMainApplication().getAvailableLocales(); Iterator iter = locales.iterator(); while (iter.hasNext()) { Locale item = (Locale)iter.next(); int localeId = ICLocaleBusiness.getLocaleId(item); PageTotalStatistics stats = ((is.idega.idegaweb.tracker.data.PageTotalStatisticsHome)com.idega.data.IDOLookup.getHomeLegacy(PageTotalStatistics.class)).createLegacy();//virkar ekki svona DomainStatistics stats2 = ((is.idega.idegaweb.tracker.data.DomainStatisticsHome)com.idega.data.IDOLookup.getHomeLegacy(DomainStatistics.class)).createLegacy(); totalPage.put(new Integer(localeId),stats); totalDomain.put(new Integer(localeId),stats2); } } }