package org.netevolved.reporting; import java.util.Date; import java.util.GregorianCalendar; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.entermediadb.asset.MediaArchive; import org.entermediadb.elasticsearch.ElasticHitTracker; import org.entermediadb.elasticsearch.ElasticSearchQuery; import org.entermediadb.scripts.Script; import org.entermediadb.scripts.ScriptLogger; import org.entermediadb.scripts.ScriptManager; import org.entermediadb.scripts.TextAppender; import org.ijsolutions.testbench.modules.BaseTestingModule; import org.json.simple.JSONObject; import org.netevolved.tincan.BenchAnalytics; import org.openedit.Data; import org.openedit.ModuleManager; import org.openedit.WebPageRequest; import org.openedit.data.Searcher; import org.openedit.hittracker.HitTracker; import org.openedit.page.Page; import org.openedit.store.Store; public class BenchReportModule extends BaseTestingModule { private static Log log = LogFactory.getLog(BenchReportModule.class); protected ModuleManager fieldModuleManager; protected ScriptManager fieldScriptManager; protected BenchAnalytics fieldBenchAnalytics; public BenchAnalytics getBenchAnalytics(String inCatalogId) { if (fieldBenchAnalytics == null) { fieldBenchAnalytics = (BenchAnalytics) getModuleManager().getBean(inCatalogId, "benchAnalytics"); } return fieldBenchAnalytics; } public void setBenchAnalytics(BenchAnalytics inBenchAnalytics) { fieldBenchAnalytics = inBenchAnalytics; } public ScriptManager getScriptManager() { if (fieldScriptManager == null) { fieldScriptManager = (ScriptManager) getModuleManager().getBean("scriptManager"); } return fieldScriptManager; } public void setScriptManager(ScriptManager inScriptManager) { fieldScriptManager = inScriptManager; } public ModuleManager getModuleManager() { return fieldModuleManager; } public void setModuleManager(ModuleManager inModuleManager) { fieldModuleManager = inModuleManager; } public Data loadReport(WebPageRequest inReq) { MediaArchive archive = getMediaArchive(inReq); String reportid = inReq.findValue("reportid"); if(reportid == null) { reportid = inReq.getRequestParameter("id"); } Data report = archive.getData("reports", reportid); inReq.putPageValue("report", report); inReq.putPageValue("data", report); String searchtype = report.get("searchtype"); //String catalogid = inReq.getUserProfileValue("reportcatalogid"); if (searchtype != null) { Searcher searcher = archive.getSearcher(searchtype); inReq.putPageValue("reportsearcher", searcher); } return report; } public void runReport(WebPageRequest inReq) throws Exception { MediaArchive archive = getMediaArchive(inReq); Data report = loadReport(inReq); if (report == null) { return; } String script = report.get("script"); String searchtype = report.get("searchtype"); if (searchtype == null) { searchtype = "lrsactivities"; //default search type } if (script == null) { script = "reporting/" + searchtype + ".groovy"; } Page page = getPageManager().getPage("/" + archive.getCatalogId() + "/events/scripts/" + script); if (!page.exists()) { log.info("No script, running standard search"); inReq.setRequestParameter("searchtype", searchtype); inReq.setRequestParameter(searchtype + "includefacets", "true"); Searcher searcher = loadSearcher(inReq); if(searcher == null) { return ; } ElasticSearchQuery query = (ElasticSearchQuery) searcher.addStandardSearchTerms(inReq); if(query == null) { query = (ElasticSearchQuery) searcher.query().since("date", 30).getQuery(); //make this customizable? } else { if(query.getTermByDetailId("date") == null) { GregorianCalendar cal = new GregorianCalendar(); Date now = new Date(); cal.setTime(now); cal.add(GregorianCalendar.DAY_OF_MONTH, -30); query.addBetween("date", cal.getTime(),now); } } String aggs = report.get("aggs"); query.setAggregationJson(aggs); query.setEndUserSearch(true); HitTracker hits = searcher.search( query); BenchAnalytics analytics = getBenchAnalytics(archive.getCatalogId()); if (hits != null) { String name = inReq.findValue("hitsname"); inReq.putPageValue(name, hits); inReq.putSessionValue(hits.getSessionId(), hits); JSONObject resultset = analytics.getChartData((ElasticHitTracker)hits, report); inReq.putPageValue("resultset", resultset); inReq.putPageValue("hits", hits); } inReq.putPageValue("searcher", searcher); return; } Script reportscript = getScriptManager().loadScript(page.getPath()); final StringBuffer output = new StringBuffer(); TextAppender appender = new TextAppender() { public void appendText(String inText) { output.append(inText); output.append("
"); } }; ScriptLogger logs = new ScriptLogger(); logs.setPrefix(reportscript.getType()); logs.setTextAppender(appender); try { logs.startCapture(); Map variableMap = inReq.getPageMap(); variableMap.put("context", inReq); variableMap.put("log", logs); Object returned = getScriptManager().execScript(variableMap, reportscript); if (returned != null) { output.append("returned: " + returned); } } finally { logs.stopCapture(); } inReq.putPageValue("output", output); } public void createOrderReport(WebPageRequest inReq) { String hitssessionid = inReq.findValue("hitssessionid"); MediaArchive archive = getMediaArchive(inReq); OrderReport report = (OrderReport) getModuleManager().getBean(archive.getCatalogId(), "orderReport"); HitTracker orderHits = (HitTracker) inReq.getSessionValue(hitssessionid); report.setOrders(orderHits); report.setUser(inReq.getUser()); report.setDate(new Date()); report.setMediaArchive(archive); report.setStore((Store) inReq.getPageValue("store")); inReq.putPageValue("report", report); } public void createLearningGroupReport(WebPageRequest inReq) { String hitssessionid = inReq.findValue("hitssessionid"); MediaArchive archive = getMediaArchive(inReq); LearningGroupReport report = (LearningGroupReport) getModuleManager().getBean(archive.getCatalogId(), "learninggroupReport"); HitTracker hits = (HitTracker) inReq.getSessionValue(hitssessionid); report.setHitTracker(hits); report.setUser(inReq.getUser()); report.setDate(new Date()); report.setMediaArchive(archive); inReq.putPageValue("report", report); } }