/**
* $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-impl/src/java/org/sakaiproject/sitestats/impl/report/ReportManagerImpl.java $
* $Id: ReportManagerImpl.java 116954 2012-11-29 04:57:10Z steve.swinsburg@gmail.com $
*
* Copyright (c) 2006-2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.sitestats.impl.report;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Expression;
import org.sakaiproject.content.api.ContentCollection;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.ContentResource;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.event.api.Event;
import org.sakaiproject.event.api.EventTrackingService;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.exception.TypeException;
import org.sakaiproject.javax.PagingPosition;
import org.sakaiproject.memory.api.Cache;
import org.sakaiproject.memory.api.MemoryService;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.sitestats.api.EventStat;
import org.sakaiproject.sitestats.api.ResourceStat;
import org.sakaiproject.sitestats.api.SitePresence;
import org.sakaiproject.sitestats.api.SiteVisits;
import org.sakaiproject.sitestats.api.Stat;
import org.sakaiproject.sitestats.api.StatsAuthz;
import org.sakaiproject.sitestats.api.StatsManager;
import org.sakaiproject.sitestats.api.Util;
import org.sakaiproject.sitestats.api.event.EventInfo;
import org.sakaiproject.sitestats.api.event.EventRegistryService;
import org.sakaiproject.sitestats.api.event.ToolInfo;
import org.sakaiproject.sitestats.api.report.Report;
import org.sakaiproject.sitestats.api.report.ReportDef;
import org.sakaiproject.sitestats.api.report.ReportFormattedParams;
import org.sakaiproject.sitestats.api.report.ReportManager;
import org.sakaiproject.sitestats.api.report.ReportParams;
import org.sakaiproject.sitestats.impl.parser.DigesterUtil;
import org.sakaiproject.sitestats.impl.report.fop.LibraryURIResolver;
import org.sakaiproject.sitestats.impl.report.fop.ReportInputSource;
import org.sakaiproject.sitestats.impl.report.fop.ReportXMLReader;
import org.sakaiproject.time.api.Time;
import org.sakaiproject.time.api.TimeService;
import org.sakaiproject.tool.api.Placement;
import org.sakaiproject.tool.api.ToolManager;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserDirectoryService;
import org.sakaiproject.user.api.UserNotDefinedException;
import org.sakaiproject.util.ResourceLoader;
import org.springframework.core.io.ClassPathResource;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* @author Nuno Fernandes
*
*/
public class ReportManagerImpl extends HibernateDaoSupport implements ReportManager, Observer {
private Log LOG = LogFactory.getLog(ReportManagerImpl.class);
private static ResourceLoader msgs = new ResourceLoader("Messages");
private ReportFormattedParams formattedParams = new ReportFormattedParamsImpl();
/** FOP */
private FopFactory fopFactory = FopFactory.newInstance();
private Templates cachedXmlFoXSLT = null;
private static final String XML_FO_XSL_FILE = "xmlReportToFo.xsl";
/** Date formatters. */
private SimpleDateFormat dateMonthFrmt = new SimpleDateFormat("yyyy-MM");
private SimpleDateFormat dateYearFrmt = new SimpleDateFormat("yyyy");
/** Spring bean members */
/** Sakai services */
private StatsManager M_sm;
private StatsAuthz M_sa;
private EventRegistryService M_ers;
private SiteService M_ss;
private UserDirectoryService M_uds;
private ContentHostingService M_chs;
private ToolManager M_tm;
private TimeService M_ts;
private EventTrackingService M_ets;
private MemoryService M_ms;
/** Caching */
private Cache cacheReportDef = null;
// ################################################################
// Spring bean methods
// ################################################################
public void setStatsManager(StatsManager statsManager) {
this.M_sm = statsManager;
}
public void setStatsAuthz(StatsAuthz statsAuthz) {
this.M_sa = statsAuthz;
}
public void setEventRegistryService(EventRegistryService eventRegistryService) {
this.M_ers = eventRegistryService;
}
public void setSiteService(SiteService siteService) {
this.M_ss = siteService;
}
public void setUserService(UserDirectoryService userService) {
this.M_uds = userService;
}
public void setContentService(ContentHostingService contentService) {
this.M_chs = contentService;
}
public void setToolManager(ToolManager toolManager) {
this.M_tm = toolManager;
}
public void setTimeService(TimeService timeService) {
this.M_ts = timeService;
}
public void setEventTrackingService(EventTrackingService eventTrackingService) {
this.M_ets = eventTrackingService;
}
public void setMemoryService(MemoryService memoryService) {
this.M_ms = memoryService;
}
/** This one is needed for unit testing */
public void setResourceLoader(ResourceLoader msgs) {
this.msgs = msgs;
}
public void init(){
// Initialize cacheReportDef and event observer for cacheReportDef invalidation across cluster
M_ets.addPriorityObserver(this);
cacheReportDef = M_ms.newCache(ReportDef.class.getName());
}
public void destroy(){
M_ets.deleteObserver(this);
}
/** EventTrackingService observer for cache invalidation. */
public void update(Observable obs, Object o) {
if(o instanceof Event){
Event e = (Event) o;
String prefix = StatsManager.LOG_APP + '.' + StatsManager.LOG_OBJ_REPORTDEF;
if(e.getEvent() != null
&& e.getEvent().startsWith(prefix)
&& (e.getEvent().endsWith(StatsManager.LOG_ACTION_NEW)
|| e.getEvent().endsWith(StatsManager.LOG_ACTION_EDIT)
|| e.getEvent().endsWith(StatsManager.LOG_ACTION_DELETE)
)
) {
String[] parts = e.getResource().split("/");
String id = parts[4];
String siteId = parts[2];
// expire report with specified id
LOG.debug("Expiring report for id: "+siteId);
cacheReportDef.expire(id);
// expire list of site reports
LOG.debug("Expiring report lists for site: "+siteId);
cacheReportDef.expire( new KeyReportDefList(siteId, true, true) );
cacheReportDef.expire( new KeyReportDefList(siteId, true, false) );
cacheReportDef.expire( new KeyReportDefList(siteId, false, true) );
cacheReportDef.expire( new KeyReportDefList(siteId, false, false) );
// expire list of predefined reports
// required as event contains siteId and not null (which identifies predefined reports)
LOG.debug("Expiring predefined report lists");
cacheReportDef.expire( new KeyReportDefList(null, true, true) );
cacheReportDef.expire( new KeyReportDefList(null, true, false) );
cacheReportDef.expire( new KeyReportDefList(null, false, true) );
cacheReportDef.expire( new KeyReportDefList(null, false, false) );
}
}
}
// ################################################################
// Interface implementation
// ################################################################
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReport(org.sakaiproject.sitestats.api.report.ReportDef, boolean)
*/
public Report getReport(ReportDef reportDef, boolean restrictToToolsInSite) {
return getReport(reportDef, restrictToToolsInSite, null, true);
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReportRowCount(org.sakaiproject.sitestats.api.report.ReportDef, boolean)
*/
public int getReportRowCount(ReportDef reportDef, boolean restrictToToolsInSite) {
ReportProcessedParams rpp = processReportParams(reportDef.getReportParams(), restrictToToolsInSite, null);
if(reportDef.getReportParams().getWhat().equals(ReportManager.WHAT_RESOURCES)){
return M_sm.getResourceStatsRowCount(rpp.siteId, rpp.resourceAction, rpp.resourceIds, rpp.iDate, rpp.fDate, rpp.userIds, rpp.inverseUserSelection, rpp.totalsBy);
}else{
return M_sm.getEventStatsRowCount(rpp.siteId, rpp.events, rpp.iDate, rpp.fDate, rpp.userIds, rpp.inverseUserSelection, rpp.totalsBy);
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReport(org.sakaiproject.sitestats.api.report.ReportDef, boolean, org.sakaiproject.javax.PagingPosition, boolean)
*/
public Report getReport(ReportDef reportDef, boolean restrictToToolsInSite, PagingPosition pagingPosition, boolean log) {
ReportProcessedParams rpp = processReportParams(reportDef.getReportParams(), restrictToToolsInSite, pagingPosition);
// generate report
Report report = new Report();
List<Stat> data = null;
if(reportDef.getReportParams().getWhat().equals(ReportManager.WHAT_RESOURCES)){
data = M_sm.getResourceStats(rpp.siteId, rpp.resourceAction, rpp.resourceIds, rpp.iDate, rpp.fDate, rpp.userIds, rpp.inverseUserSelection, pagingPosition, rpp.totalsBy, rpp.sortBy, rpp.sortAscending, rpp.maxResults);
}else if(reportDef.getReportParams().getWhat().equals(ReportManager.WHAT_VISITS)
|| reportDef.getReportParams().getWhat().equals(ReportManager.WHAT_EVENTS)){
data = M_sm.getEventStats(rpp.siteId, rpp.events, rpp.iDate, rpp.fDate, rpp.userIds, rpp.inverseUserSelection, pagingPosition, rpp.totalsBy, rpp.sortBy, rpp.sortAscending, rpp.maxResults);
}else if(reportDef.getReportParams().getWhat().equals(ReportManager.WHAT_PRESENCES)){
data = M_sm.getPresenceStats(rpp.siteId, rpp.iDate, rpp.fDate, rpp.userIds, rpp.inverseUserSelection, pagingPosition, rpp.totalsBy, rpp.sortBy, rpp.sortAscending, rpp.maxResults);
}else if(reportDef.getReportParams().getWhat().equals(ReportManager.WHAT_VISITS_TOTALS)){
data = M_sm.getVisitsTotalsStats(rpp.siteId, rpp.iDate, rpp.fDate, pagingPosition, rpp.totalsBy, rpp.sortBy, rpp.sortAscending, rpp.maxResults);
}else if(reportDef.getReportParams().getWhat().equals(ReportManager.WHAT_ACTIVITY_TOTALS)){
data = M_sm.getActivityTotalsStats(rpp.siteId, rpp.events, rpp.iDate, rpp.fDate, pagingPosition, rpp.totalsBy, rpp.sortBy, rpp.sortAscending, rpp.maxResults);
}
// add missing info in report and its parameters
if(report != null) {
reportDef.getReportParams().setWhenFrom(rpp.iDate);
reportDef.getReportParams().setWhenTo(rpp.fDate);
reportDef.getReportParams().setWhoUserIds(rpp.userIds);
reportDef.getReportParams().setHowTotalsBy(rpp.totalsBy);
report.setReportData(data);
report.setReportDefinition(reportDef);
report.setReportGenerationDate(new Date());
if(log && reportDef.getId() != 0) {
String siteId = reportDef.getSiteId();
if(siteId == null) {
siteId = reportDef.getReportParams().getSiteId();
}
M_sm.logEvent(reportDef, StatsManager.LOG_ACTION_VIEW, siteId, true);
}
}
return report;
}
private ReportProcessedParams processReportParams(ReportParams params, boolean restrictToToolsInSite, PagingPosition pagingPosition) {
ReportProcessedParams rpp = new ReportProcessedParams();
// site
rpp.siteId = params.getSiteId();
// what (visits, events, resources)
rpp.events = new ArrayList<String>();
if(params.getWhat().equals(ReportManager.WHAT_VISITS)){
rpp.events.add(StatsManager.SITEVISIT_EVENTID);
}else if(params.getWhat().equals(ReportManager.WHAT_EVENTS)){
if(params.getWhatEventSelType().equals(ReportManager.WHAT_EVENTS_BYTOOL)){
Iterator<ToolInfo> iT = null;
if(rpp.siteId != null) {
iT = M_ers.getEventRegistry(rpp.siteId, restrictToToolsInSite).iterator();
}else{
iT = M_ers.getEventRegistry().iterator();
}
while (iT.hasNext()){
ToolInfo t = iT.next();
if(params.getWhatToolIds().contains(t.getToolId())
|| params.getWhatToolIds().contains(WHAT_EVENTS_ALLTOOLS)){
Iterator<EventInfo> iE = t.getEvents().iterator();
while (iE.hasNext())
rpp.events.add(iE.next().getEventId());
}
}
}else{
List<String> eventIds = params.getWhatEventIds();
if(eventIds != null) {
rpp.events.addAll(eventIds);
}
}
}else if(params.getWhat().equals(ReportManager.WHAT_RESOURCES)){
rpp.resourceIds = null;
rpp.resourceAction = null;
if(params.isWhatLimitedResourceIds() && params.getWhatResourceIds() != null){
rpp.resourceIds = new ArrayList<String>();
Iterator<String> iR = params.getWhatResourceIds().iterator();
while (iR.hasNext())
rpp.resourceIds.add("/content" + iR.next());
}
if(params.isWhatLimitedAction() && params.getWhatResourceAction() != null) {
rpp.resourceAction = params.getWhatResourceAction();
}
}
// when (dates)
rpp.fDate = null;
rpp.iDate = null;
if(params.getWhen().equals(ReportManager.WHEN_CUSTOM)){
rpp.iDate = params.getWhenFrom();
rpp.fDate = params.getWhenTo();
}else rpp.fDate = new Date();
if(params.getWhen().equals(ReportManager.WHEN_ALL)){
if(rpp.siteId != null) {
rpp.iDate = M_sm.getInitialActivityDate(rpp.siteId);
}else{
rpp.iDate = null;
}
}else if(params.getWhen().equals(ReportManager.WHEN_LAST7DAYS)){
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 00);
c.set(Calendar.MINUTE, 00);
c.set(Calendar.SECOND, 00);
c.add(Calendar.DATE, -6);
rpp.iDate = c.getTime();
}else if(params.getWhen().equals(ReportManager.WHEN_LAST30DAYS)){
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 00);
c.set(Calendar.MINUTE, 00);
c.set(Calendar.SECOND, 00);
c.add(Calendar.DATE, -29);
rpp.iDate = c.getTime();
}else if(params.getWhen().equals(ReportManager.WHEN_LAST365DAYS)){
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 00);
c.set(Calendar.MINUTE, 00);
c.set(Calendar.SECOND, 00);
c.add(Calendar.DATE, -364);
rpp.iDate = c.getTime();
}
params.setWhenFrom(rpp.iDate);
params.setWhenTo(rpp.fDate);
// who (users, groups, roles)
rpp.userIds = null;
rpp.inverseUserSelection = false;
if(params.getWho().equals(ReportManager.WHO_ALL)){
;
}else if(params.getWho().equals(ReportManager.WHO_ROLE) && rpp.siteId != null){
rpp.userIds = new ArrayList<String>();
try{
Site site = M_ss.getSite(rpp.siteId);
rpp.userIds.addAll(site.getUsersHasRole(params.getWhoRoleId()));
}catch(IdUnusedException e){
LOG.error("No site with specified siteId.");
}
}else if(params.getWho().equals(ReportManager.WHO_GROUPS) && rpp.siteId != null){
rpp.userIds = new ArrayList<String>();
try{
Site site = M_ss.getSite(rpp.siteId);
rpp.userIds.addAll(site.getGroup(params.getWhoGroupId()).getUsers());
}catch(IdUnusedException e){
LOG.error("No site with specified siteId.");
}
}else if(params.getWho().equals(ReportManager.WHO_CUSTOM)){
rpp.userIds = params.getWhoUserIds();
}else{
// inverse
rpp.inverseUserSelection = true;
}
params.setWhoUserIds(rpp.userIds);
// how
rpp.totalsBy = params.getHowTotalsBy();
if(HOW_SORT_DEFAULT.equals(params.getHowSortBy())) {
rpp.sortBy = null;
}else{
rpp.sortBy = params.getHowSortBy();
}
rpp.sortAscending = params.getHowSortAscending();
if(params.isHowLimitedMaxResults() && params.getHowMaxResults() > 0) {
rpp.maxResults = params.getHowMaxResults();
}else{
rpp.maxResults = 0;
}
return rpp;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReportFormattedParams()
*/
public ReportFormattedParams getReportFormattedParams() {
return formattedParams;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#isReportColumnAvailable(org.sakaiproject.sitestats.api.report.ReportParams, java.lang.String)
*/
public boolean isReportColumnAvailable(ReportParams params, String column) {
List<String> totalsBy = params.getHowTotalsBy();
if(column == null) {
return false;
}else if(column.equals(StatsManager.T_SITE)) {
return totalsBy.contains(StatsManager.T_SITE);
}else if(column.equals(StatsManager.T_USER)) {
return totalsBy.contains(StatsManager.T_USER);
}else if(column.equals(StatsManager.T_EVENT)) {
return totalsBy.contains(StatsManager.T_EVENT) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_TOOL)) {
return totalsBy.contains(StatsManager.T_TOOL) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_RESOURCE)) {
return totalsBy.contains(StatsManager.T_RESOURCE) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_RESOURCE_ACTION)) {
return totalsBy.contains(StatsManager.T_RESOURCE_ACTION) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_DATE)) {
return totalsBy.contains(StatsManager.T_DATE) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_DATEMONTH)) {
return totalsBy.contains(StatsManager.T_DATEMONTH) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_DATEYEAR)) {
return totalsBy.contains(StatsManager.T_DATEYEAR) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_LASTDATE)) {
return totalsBy.contains(StatsManager.T_LASTDATE) && !ReportManager.WHO_NONE.equals(params.getWho());
}else if(column.equals(StatsManager.T_TOTAL)) {
return !ReportManager.WHAT_PRESENCES.equals(params.getWhat()) && !totalsBy.contains(StatsManager.T_DURATION)
&& !ReportManager.WHO_NONE.equals(params.getWho()) && !ReportManager.WHAT_VISITS_TOTALS.equals(params.getWhat())
&& !totalsBy.contains(StatsManager.T_VISITS) && !totalsBy.contains(StatsManager.T_UNIQUEVISITS);
}else if(column.equals(StatsManager.T_VISITS)) {
return totalsBy.contains(StatsManager.T_VISITS);
}else if(column.equals(StatsManager.T_UNIQUEVISITS)) {
return totalsBy.contains(StatsManager.T_UNIQUEVISITS);
}else if(column.equals(StatsManager.T_DURATION)) {
//return totalsBy.contains(StatsManager.T_DURATION);
return ReportManager.WHAT_PRESENCES.equals(params.getWhat());
}else{
LOG.warn("isReportColumnAvailable(): invalid column: "+column);
return false;
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReportDefinition(long)
*/
public ReportDef getReportDefinition(final long id) {
ReportDef reportDef = null;
Object cached = cacheReportDef.get(String.valueOf(id));
if(cached != null){
reportDef = (ReportDef) cached;
}else{
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
return session.load(ReportDef.class, Long.valueOf(id));
}
};
Object o;
try{
o = getHibernateTemplate().execute(hcb);
}catch(DataAccessException e){
o = null;
}
if(o != null) {
reportDef = (ReportDef) o;
cacheReportDef.put(String.valueOf(id), reportDef);
}
}
try{
if(reportDef != null)
reportDef.setReportParams(DigesterUtil.convertXmlToReportParams(reportDef.getReportDefinitionXml()));
}catch(Exception e){
LOG.warn("getReportDefinition(): unable to parse report parameters.");
}
return reportDef;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#saveReportDefinition(org.sakaiproject.sitestats.api.report.ReportDef)
*/
public boolean saveReportDefinition(final ReportDef reportDef) {
if(reportDef.getSiteId() == null && !M_sa.isSiteStatsAdminPage()) {
return false;
}
boolean isNew = reportDef.getId() == 0;
try{
if(reportDef.getCreatedBy() == null) {
reportDef.setCreatedBy(M_uds.getCurrentUser().getId());
}
if(reportDef.getCreatedOn() == null) {
reportDef.setCreatedOn(new Date());
}
if(reportDef.getModifiedBy() == null) {
reportDef.setModifiedBy(M_uds.getCurrentUser().getId());
}
if(reportDef.getModifiedOn() == null) {
reportDef.setModifiedOn(new Date());
}
reportDef.setReportDefinitionXml(DigesterUtil.convertReportParamsToXml(reportDef.getReportParams()));
}catch(Exception e) {
LOG.warn("saveReportDefinition(): unable to generate xml string from report parameters.", e);
return false;
}
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Transaction tx = null;
try{
tx = session.beginTransaction();
session.saveOrUpdate(reportDef);
tx.commit();
}catch(Exception e){
if(tx != null) tx.rollback();
LOG.warn("Unable to commit transaction: ", e);
return Boolean.FALSE;
}
return Boolean.TRUE;
}
};
Boolean success = (Boolean) getHibernateTemplate().execute(hcb);
if(success.booleanValue()) {
String siteId = reportDef.getSiteId();
if(siteId == null) {
siteId = reportDef.getReportParams().getSiteId();
}
M_sm.logEvent(reportDef, isNew ? StatsManager.LOG_ACTION_NEW : StatsManager.LOG_ACTION_EDIT, siteId, false);
}
return success.booleanValue();
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#removeReportDefinition(org.sakaiproject.sitestats.api.report.ReportDef)
*/
public boolean removeReportDefinition(final ReportDef reportDef) {
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Transaction tx = null;
try{
tx = session.beginTransaction();
session.delete(reportDef);
tx.commit();
}catch(Exception e){
if(tx != null) tx.rollback();
LOG.warn("Unable to commit transaction: ", e);
return Boolean.FALSE;
}
return Boolean.TRUE;
}
};
Boolean success = (Boolean) getHibernateTemplate().execute(hcb);
if(success) {
String siteId = reportDef.getSiteId();
if(siteId == null) {
siteId = reportDef.getReportParams().getSiteId();
}
M_sm.logEvent(reportDef, StatsManager.LOG_ACTION_DELETE, siteId, false);
}
return success;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReportDefinitions(java.lang.String, boolean, boolean)
*/
public List<ReportDef> getReportDefinitions(final String siteId, final boolean includedPredefined, final boolean includeHidden) {
List<ReportDef> reportDefs = null;
KeyReportDefList key = new KeyReportDefList(siteId, includedPredefined, includeHidden);
Object cached = cacheReportDef.get(key);
if(cached != null) {
reportDefs = (List<ReportDef>) cached;
LOG.debug("Getting report list from cache for site "+siteId);
}else{
HibernateCallback hcb = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Criteria c = session.createCriteria(ReportDef.class);
if(siteId != null) {
if(includedPredefined) {
c.add(Expression.or(Expression.eq("siteId", siteId), Expression.isNull("siteId")));
}else{
c.add(Expression.eq("siteId", siteId));
}
}else{
c.add(Expression.isNull("siteId"));
}
if(!includeHidden) {
c.add(Expression.eq("hidden", false));
}
return c.list();
}
};
Object o = getHibernateTemplate().execute(hcb);
if(o != null) {
reportDefs = (List<ReportDef>) o;
for(ReportDef reportDef : reportDefs) {
try{
reportDef.setReportParams(DigesterUtil.convertXmlToReportParams(reportDef.getReportDefinitionXml()));
}catch(Exception e){
LOG.warn("getReportDefinition(): unable to parse report parameters.");
reportDef.setReportParams(null);
}
}
cacheReportDef.put(key, reportDefs);
}
}
return reportDefs;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReportAsExcel(org.sakaiproject.sitestats.api.report.Report, java.lang.String)
*/
public byte[] getReportAsExcel(Report report, String sheetName) {
List<Stat> statsObjects = report.getReportData();
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(getFixedExcelSheetName(sheetName));
HSSFRow headerRow = sheet.createRow(0);
// Add the column headers
int ix = 0;
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_SITE)){
headerRow.createCell(ix++).setCellValue(msgs.getString("th_site"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_USER)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_id"));
headerRow.createCell(ix++).setCellValue(msgs.getString("th_user"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOOL)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_tool"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_EVENT)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_event"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_resource"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE_ACTION)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_action"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATE)
|| isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEMONTH)
|| isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEYEAR)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_date"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_LASTDATE)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_lastdate"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOTAL)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_total"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_VISITS)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_visits"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_UNIQUEVISITS)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_uniquevisitors"));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DURATION)) {
headerRow.createCell(ix++).setCellValue(msgs.getString("th_duration") + " (" + msgs.getString("minutes_abbr") + ")");
}
// Fill the spreadsheet cells
Iterator<Stat> i = statsObjects.iterator();
while (i.hasNext()){
HSSFRow row = sheet.createRow(sheet.getLastRowNum() + 1);
Stat se = i.next();
ix = 0;
if (isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_SITE)) {
try {
Site site = M_ss.getSite(se.getSiteId());
row.createCell(ix++).setCellValue(site.getTitle());
} catch (IdUnusedException e) {
logger.debug("can't find site with id: " + se.getSiteId());
row.createCell(ix++).setCellValue(se.getSiteId().toString());
}
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_USER)) {
String userId = se.getUserId();
String userEid = null;
String userName = null;
if (userId != null) {
if(("-").equals(userId)) {
userEid = "-";
userName = msgs.getString("user_anonymous");
}else if(("?").equals(userId)) {
userEid = "-";
userName = msgs.getString("user_anonymous_access");
}else{
try{
User user = M_uds.getUser(userId);
userEid = user.getDisplayId();
userName = M_sm.getUserNameForDisplay(user);
}catch(UserNotDefinedException e1){
userEid = userId;
userName = msgs.getString("user_unknown");
}
}
}else{
userName = msgs.getString("user_unknown");
}
row.createCell(ix++).setCellValue(userEid);
row.createCell(ix++).setCellValue(userName);
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOOL)) {
EventStat es = (EventStat) se;
row.createCell(ix++).setCellValue(M_ers.getToolName(es.getToolId()));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_EVENT)) {
EventStat es = (EventStat) se;
row.createCell(ix++).setCellValue(M_ers.getEventName(es.getEventId()));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE)) {
ResourceStat rs = (ResourceStat) se;
row.createCell(ix++).setCellValue(rs.getResourceRef());
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE_ACTION)) {
ResourceStat rs = (ResourceStat) se;
row.createCell(ix++).setCellValue(rs.getResourceAction());
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATE)) {
row.createCell(ix++).setCellValue(se.getDate().toString());
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEMONTH)) {
row.createCell(ix++).setCellValue(dateMonthFrmt.format(se.getDate()));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEYEAR)) {
row.createCell(ix++).setCellValue(dateYearFrmt.format(se.getDate()));
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_LASTDATE)) {
row.createCell(ix++).setCellValue(se.getDate().toString());
}
if(report.getReportDefinition().getReportParams().getSiteId() != null && !"".equals(report.getReportDefinition().getReportParams().getSiteId())) {
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOTAL)) {
row.createCell(ix++).setCellValue(se.getCount());
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_VISITS)) {
SiteVisits sv = (SiteVisits) se;
row.createCell(ix++).setCellValue(sv.getTotalVisits());
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_UNIQUEVISITS)) {
SiteVisits sv = (SiteVisits) se;
row.createCell(ix++).setCellValue(sv.getTotalUnique());
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DURATION)) {
SitePresence ss = (SitePresence) se;
double durationInMin = ss.getDuration() == 0 ? 0 : Util.round((double)ss.getDuration() / 1000 / 60, 1); // in minutes
row.createCell(ix++).setCellValue(durationInMin);
}
}
ByteArrayOutputStream baos = null;
try{
baos = new ByteArrayOutputStream();
wb.write(baos);
}catch(IOException e){
LOG.error("Error writing Excel bytes from SiteStats report", e);
}finally{
if(baos != null) {
try{ baos.close(); }catch(IOException e){ /* ignore */ }
}
}
if(baos != null) {
return baos.toByteArray();
}else{
return new byte[0];
}
}
private String getFixedExcelSheetName(String sheetName) {
if(sheetName == null || sheetName.trim().length() == 0) {
return "Sheet";
}else{
sheetName = sheetName.replaceAll("\\/", "_").replaceAll("\\\\", "_")
.replaceAll("\\*", "_").replaceAll("\\?", "_")
.replaceAll("\\[", "(").replaceAll("\\]", ")");
if(sheetName.length() > 31) {
sheetName = sheetName.substring(0, 31);
}
return sheetName;
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReportAsCsv(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportAsCsv(Report report) {
List<Stat> statsObjects = report.getReportData();
StringBuilder sb = new StringBuilder();
boolean isFirst = true;
// Add the headers
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_SITE)){
appendQuoted(sb, msgs.getString("th_site"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_USER)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_id"));
sb.append(",");
appendQuoted(sb, msgs.getString("th_user"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOOL)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_tool"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_EVENT)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_event"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_resource"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE_ACTION)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_action"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATE)
|| isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEMONTH)
|| isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEYEAR)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_date"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_LASTDATE)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_lastdate"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOTAL)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_total"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_VISITS)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_visits"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_UNIQUEVISITS)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_uniquevisitors"));
isFirst = false;
}
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DURATION)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, msgs.getString("th_duration") + " (" + msgs.getString("minutes_abbr") + ")");
isFirst = false;
}
sb.append("\n");
// Add the data
Iterator<Stat> i = statsObjects.iterator();
while (i.hasNext()){
Stat se = i.next();
isFirst = true;
//site
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_SITE)){
try {
Site site = M_ss.getSite(se.getSiteId());
appendQuoted(sb, site.getTitle());
} catch (IdUnusedException e) {
logger.debug("can't find site with id: " +se.getSiteId());
appendQuoted(sb, se.getSiteId());
}
isFirst=false;
}
// user
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_USER)) {
if(!isFirst) {
sb.append(",");
}
String userId = se.getUserId();
String userEid = null;
String userName = null;
if (userId != null) {
if(("-").equals(userId)) {
userEid = "-";
userName = msgs.getString("user_anonymous");
}else if(("?").equals(userId)) {
userEid = "-";
userName = msgs.getString("user_anonymous_access");
}else{
try{
User user = M_uds.getUser(userId);
userEid = user.getDisplayId();
userName = M_sm.getUserNameForDisplay(user);
}catch(UserNotDefinedException e1){
userEid = userId;
userName = msgs.getString("user_unknown");
}
}
}else{
userEid = "-";
userName = msgs.getString("user_unknown");
}
appendQuoted(sb, userEid);
sb.append(",");
appendQuoted(sb, userName);
isFirst = false;
}
// tool
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOOL)) {
if(!isFirst) {
sb.append(",");
}
EventStat es = (EventStat) se;
appendQuoted(sb, M_ers.getToolName(es.getToolId()));
isFirst = false;
}
// event
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_EVENT)) {
if(!isFirst) {
sb.append(",");
}
EventStat es = (EventStat) se;
appendQuoted(sb, M_ers.getEventName(es.getEventId()));
isFirst = false;
}
// resource
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE)) {
if(!isFirst) {
sb.append(",");
}
ResourceStat rs = (ResourceStat) se;
appendQuoted(sb, rs.getResourceRef());
isFirst = false;
}
// resource action
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_RESOURCE_ACTION)) {
if(!isFirst) {
sb.append(",");
}
ResourceStat rs = (ResourceStat) se;
appendQuoted(sb, rs.getResourceAction());
isFirst = false;
}
// date
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATE)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, se.getDate().toString());
isFirst = false;
}
// date (year-month)
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEMONTH)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, dateMonthFrmt.format(se.getDate()));
isFirst = false;
}
// date (year)
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DATEYEAR)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, dateYearFrmt.format(se.getDate()));
isFirst = false;
}
// last date
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_LASTDATE)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, se.getDate().toString());
isFirst = false;
}
// total
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_TOTAL)) {
if(!isFirst) {
sb.append(",");
}
appendQuoted(sb, Long.toString(se.getCount()));
isFirst = false;
}
// visits
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_VISITS)) {
if(!isFirst) {
sb.append(",");
}
SiteVisits sv = (SiteVisits) se;
appendQuoted(sb, Long.toString(sv.getTotalVisits()));
isFirst = false;
}
// unique visitors
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_UNIQUEVISITS)) {
if(!isFirst) {
sb.append(",");
}
SiteVisits sv = (SiteVisits) se;
appendQuoted(sb, Long.toString(sv.getTotalUnique()));
isFirst = false;
}
// duration
if(isReportColumnAvailable(report.getReportDefinition().getReportParams(), StatsManager.T_DURATION)) {
if(!isFirst) {
sb.append(",");
}
SitePresence ss = (SitePresence) se;
double durationInMin = ss.getDuration() == 0 ? 0 : Util.round((double)ss.getDuration() / 1000 / 60, 1); // in minutes
appendQuoted(sb, Double.toString(durationInMin));
isFirst = false;
}
sb.append("\n");
}
return sb.toString();
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportManager#getReportAsPDF(org.sakaiproject.sitestats.api.report.Report)
*/
public byte[] getReportAsPDF(Report report) {
ByteArrayOutputStream out = null;
try{
// Setup a buffer to obtain the content length
out = new ByteArrayOutputStream();
fopFactory.setURIResolver(new LibraryURIResolver());
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup XSLT
if(cachedXmlFoXSLT == null) {
ClassPathResource xsltCPR = new ClassPathResource("org/sakaiproject/sitestats/config/fop/"+XML_FO_XSL_FILE);
InputStream xslt = xsltCPR.getInputStream();
TransformerFactory factory = TransformerFactory.newInstance();
cachedXmlFoXSLT = factory.newTemplates(new StreamSource(xslt));
}
Transformer transformer = cachedXmlFoXSLT.newTransformer();
// Setup input for XSLT transformation
Source src = new SAXSource(new ReportXMLReader(), new ReportInputSource(report));
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
transformer.transform(src, res);
}catch(TransformerConfigurationException e){
LOG.error("TransformerConfigurationException while writing SiteStats PDF report", e);
}catch(FOPException e){
LOG.error("FOPException while writing SiteStats PDF report", e);
}catch(TransformerException e){
LOG.error("TransformerException while writing SiteStats PDF report", e);
}catch(Exception e){
LOG.error("Exception while generating SiteStats PDF report", e);
}finally{
try{
if(out != null) {
out.close();
return out.toByteArray();
}
}catch(IOException e){
LOG.error("IOException while writing SiteStats PDF report", e);
}
}
return null;
}
// ################################################################
// Utility methods
// ################################################################
private Report consolidateAnonymousEvents(Report report) {
List<Stat> consolidated = new ArrayList<Stat>();
List<Stat> list = report.getReportData();
Map<String, Stat> anonMap = new HashMap<String, Stat>();
for(Stat s : list){
if(s instanceof EventStat) {
EventStat es = (EventStat) s;
String eventId = es.getEventId();
if(!isAnonymousEvent(eventId)){
consolidated.add(s);
}else{
Stat sMapped = anonMap.get(eventId);
if(sMapped != null){
sMapped.setCount(sMapped.getCount() + s.getCount());
if(s.getDate().after(sMapped.getDate()))
sMapped.setDate(s.getDate());
anonMap.put(eventId, sMapped);
}else{
s.setUserId(null);
anonMap.put(eventId, s);
}
}
}
}
for(Stat s : anonMap.values()){
consolidated.add(s);
}
report.setReportData(consolidated);
return report;
}
private boolean isAnonymousEvent(String eventId) {
for(ToolInfo ti : M_ers.getEventRegistry()){
for(EventInfo ei : ti.getEvents()){
if(ei.getEventId().equals(eventId)){
return ei.isAnonymous();
}
}
}
return false;
}
private StringBuilder appendQuoted(StringBuilder sb, String toQuote) {
if((toQuote.indexOf(',') >= 0) || (toQuote.indexOf('"') >= 0)){
String out = toQuote.replaceAll("\"", "\"\"");
if(LOG.isDebugEnabled()) LOG.debug("Turning '" + toQuote + "' to '" + out + "'");
sb.append("\"").append(out).append("\"");
}else{
sb.append(toQuote);
}
return sb;
}
private String getUserDisplayId(String userId) {
String userEid = null;
if (userId != null) {
if(("-").equals(userId) || ("?").equals(userId)) {
userEid = "-";
}else{
try{
userEid = M_uds.getUser(userId).getDisplayId();
}catch(UserNotDefinedException e1){
userEid = userId;
}
}
}else{
userEid = msgs.getString("user_unknown");
}
return userEid;
}
private String getUserDisplayName(String userId) {
String userName = null;
if (userId != null) {
if(("-").equals(userId)) {
userName = msgs.getString("user_anonymous");
}else if(("?").equals(userId)) {
userName = msgs.getString("user_anonymous_access");
}else{
userName = M_sm.getUserNameForDisplay(userId);
}
}else{
userName = msgs.getString("user_unknown");
}
return userName;
}
public String getSiteGroupTitle(String groupId) {
try{
Placement placement = M_tm.getCurrentPlacement();
Site site = M_ss.getSite(placement.getContext());
return site.getGroup(groupId).getTitle();
}catch(IdUnusedException e){
LOG.warn("ReportManager: unable to get group title with id: " + groupId);
}
return null;
}
private static class ReportProcessedParams {
public String siteId;
public List<String> events;
public List<String> anonymousEvents;
public List<String> resourceIds;
public String resourceAction;
public Date iDate;
public Date fDate;
public List<String> userIds;
public List<String> totalsBy;
public boolean inverseUserSelection;
public PagingPosition page;
public String sortBy;
public boolean sortAscending;
public int maxResults;
}
class ReportFormattedParamsImpl implements ReportFormattedParams {
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportSite(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportSite(Report report) {
String site = report.getReportDefinition().getReportParams().getSiteId();
if(site != null) {
return M_ss.getSiteDisplay(site);
}else{
return msgs.getString("report_reportsite_all");
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportTitle(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportTitle(Report report) {
String title = report.getReportDefinition().getTitle();
if(title != null && title.length() != 0) {
if(isStringLocalized(title)) {
return msgs.getString(report.getReportDefinition().getTitleBundleKey());
}else{
return title;
}
}else{
return null;
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportDescription(org.sakaiproject.sitestats.api.report.ReportDef)
*/
public String getReportDescription(Report report) {
String description = report.getReportDefinition().getDescription();
if(description != null && description.length() != 0) {
if(isStringLocalized(description)) {
return msgs.getString(report.getReportDefinition().getDescriptionBundleKey());
}else{
return description;
}
}else{
return null;
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#isStringLocalized(java.lang.String)
*/
public boolean isStringLocalized(String string) {
if(string.startsWith("${") && string.endsWith("}")) {
return true;
}else{
return false;
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportGenerationDate(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportGenerationDate(Report report) {
if(report.getReportGenerationDate() == null)
report.setReportGenerationDate(new Date());
return report.getLocalizedReportGenerationDate();
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportActivityBasedOn(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportActivityBasedOn(Report report) {
if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_VISITS)
|| report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_VISITS_TOTALS))
return msgs.getString("report_what_visits");
else if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_PRESENCES))
return msgs.getString("report_what_presences");
else if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_EVENTS)
|| report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_ACTIVITY_TOTALS)){
StringBuilder buff = new StringBuilder();
buff.append(msgs.getString("report_what_events"));
String eventSelType = report.getReportDefinition().getReportParams().getWhatEventSelType();
if(eventSelType != null) {
if(eventSelType.equals(ReportManager.WHAT_EVENTS_BYTOOL)){
buff.append(" (");
buff.append(msgs.getString("report_what_events_bytool"));
buff.append(")");
}else{
buff.append(" (");
buff.append(msgs.getString("report_what_events_byevent"));
buff.append(")");
}
}
return buff.toString();
}else if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_RESOURCES)) {
return msgs.getString("report_what_resources");
}else{
return msgs.getString("report_what_events");
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportActivitySelectionTitle(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportActivitySelectionTitle(Report report) {
if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_VISITS))
return msgs.getString("report_what_visits");
else if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_PRESENCES))
return msgs.getString("report_what_presences");
else if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_EVENTS)){
if(report.getReportDefinition().getReportParams().getWhatEventSelType().equals(ReportManager.WHAT_EVENTS_BYTOOL))
return msgs.getString("reportres_summ_act_tools_selected");
else
return msgs.getString("reportres_summ_act_events_selected");
}else
return msgs.getString("reportres_summ_act_rsrc_selected");
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportActivitySelection(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportActivitySelection(Report report) {
if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_VISITS)
|| report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_PRESENCES)){
// visits
return null;
}else if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_EVENTS)){
if(report.getReportDefinition().getReportParams().getWhatEventSelType().equals(ReportManager.WHAT_EVENTS_BYTOOL)){
// tools
List<String> list = report.getReportDefinition().getReportParams().getWhatToolIds();
int listSize = list.size();
StringBuilder buff = new StringBuilder();
if(listSize > 0) {
for(int i=0; i<listSize - 1; i++){
String toolId = list.get(i);
buff.append(M_ers.getToolName(toolId));
buff.append(", ");
}
String toolId = list.get(listSize - 1);
buff.append(M_ers.getToolName(toolId));
}
return buff.toString();
}else{
// events
List<String> list = report.getReportDefinition().getReportParams().getWhatEventIds();
int listSize = list.size();
StringBuilder buff = new StringBuilder();
if(listSize > 0) {
for(int i=0; i<listSize - 1; i++){
String eventId = list.get(i);
buff.append(M_ers.getEventName(eventId));
buff.append(", ");
}
String eventId = list.get(listSize - 1);
buff.append(M_ers.getEventName(eventId));
}
return buff.toString();
}
}else{
// resources
List<String> list = report.getReportDefinition().getReportParams().getWhatResourceIds();
if(report.getReportDefinition().getReportParams().getWhatResourceIds() == null
|| report.getReportDefinition().getReportParams().getWhatResourceIds().size() == 0 )
return null;
if(list.contains("all"))
return msgs.getString("report_what_all");
StringBuilder buff = new StringBuilder();
String siteId = report.getReportDefinition().getReportParams().getSiteId();
String resourcesCollectionId = M_chs.getSiteCollection(siteId);
String dropboxCollectionId = M_chs.getDropboxCollection(siteId);
String attachmentsCollectionId = resourcesCollectionId.replaceFirst(StatsManager.RESOURCES_DIR, StatsManager.ATTACHMENTS_DIR);
for(int i=0; i<list.size(); i++){
String resourceId = list.get(i);
try{
if(resourceId.endsWith("/")) {
if(StatsManager.RESOURCES_DIR.equals(resourceId) || resourceId.equals(resourcesCollectionId)) {
buff.append(M_tm.getTool(StatsManager.RESOURCES_TOOLID).getTitle());
}else if(StatsManager.DROPBOX_DIR.equals(resourceId) || resourceId.equals(dropboxCollectionId)) {
buff.append(M_tm.getTool(StatsManager.DROPBOX_TOOLID).getTitle());
}else if(resourceId.startsWith(dropboxCollectionId)) {
buff.append(M_tm.getTool(StatsManager.DROPBOX_TOOLID).getTitle());
buff.append(": ");
ContentCollection cc = M_chs.getCollection(resourceId);
String ccName = cc.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME);
buff.append(ccName);
}else if(StatsManager.ATTACHMENTS_DIR.equals(resourceId) || resourceId.equals(attachmentsCollectionId)) {
buff.append(msgs.getString("report_content_attachments"));
}else if(resourceId.startsWith(attachmentsCollectionId)) {
buff.append(msgs.getString("report_content_attachments"));
buff.append(": ");
ContentCollection cc = M_chs.getCollection(resourceId);
String ccName = cc.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME);
buff.append(ccName);
}else{
ContentCollection cc = M_chs.getCollection(resourceId);
String ccName = cc.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME);
buff.append(ccName);
}
}else{
ContentResource cr = M_chs.getResource(resourceId);
String crName = cr.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME);
buff.append(crName);
}
if(list.size() > 1 && i != list.size() - 1) {
buff.append(", ");
}
}catch(PermissionException e){
e.printStackTrace();
}catch(IdUnusedException e){
e.printStackTrace();
}catch(TypeException e){
e.printStackTrace();
}
}
return buff.toString();
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportResourceActionTitle(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportResourceActionTitle(Report report) {
if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_RESOURCES)
&& report.getReportDefinition().getReportParams().getWhatResourceAction() != null)
return msgs.getString("reportres_summ_act_rsrc_action");
return null;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportResourceAction(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportResourceAction(Report report) {
if(report.getReportDefinition().getReportParams().getWhat().equals(ReportManager.WHAT_RESOURCES)
&& report.getReportDefinition().getReportParams().getWhatResourceAction() != null){
return msgs.getString("action_" + report.getReportDefinition().getReportParams().getWhatResourceAction());
}else
return null;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportTimePeriod(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportTimePeriod(Report report) {
if(report.getReportDefinition().getReportParams().getWhen().equals(ReportManager.WHEN_ALL)){
return msgs.getString("report_when_all");
}else{
Time from = M_ts.newTime(report.getReportDefinition().getReportParams().getWhenFrom().getTime());
Time to = M_ts.newTime(report.getReportDefinition().getReportParams().getWhenTo().getTime());
return from.toStringLocalFull() + " - " + to.toStringLocalFull();
}
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportUserSelectionType(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportUserSelectionType(Report report) {
if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_ALL))
return msgs.getString("report_who_all");
else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_GROUPS))
return msgs.getString("report_who_group");
else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_ROLE))
return msgs.getString("report_who_role");
else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_CUSTOM))
return msgs.getString("report_who_custom");
else
return msgs.getString("report_who_not_match");
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportUserSelectionTitle(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportUserSelectionTitle(Report report) {
if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_ALL))
return null;
else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_GROUPS))
return msgs.getString("reportres_summ_usr_group_selected");
else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_ROLE))
return msgs.getString("reportres_summ_usr_role_selected");
else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_CUSTOM))
return msgs.getString("reportres_summ_usr_users_selected");
else
return null;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.report.ReportFormattedParams#getReportUserSelection(org.sakaiproject.sitestats.api.report.Report)
*/
public String getReportUserSelection(Report report) {
if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_GROUPS)){
return getSiteGroupTitle(report.getReportDefinition().getReportParams().getWhoGroupId());
}else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_ROLE)){
return report.getReportDefinition().getReportParams().getWhoRoleId();
}else if(report.getReportDefinition().getReportParams().getWho().equals(ReportManager.WHO_CUSTOM)){
// users
List<String> list = report.getReportDefinition().getReportParams().getWhoUserIds();
StringBuilder buff = new StringBuilder();
for(int i=0; i<list.size() - 1; i++){
String userId = list.get(i);
buff.append(getUserDisplayId(userId));
buff.append(", ");
}
String userId = list.get(list.size() - 1);
buff.append(getUserDisplayId(userId));
return buff.toString();
}else
return null;
}
}
private static class KeyReportDefList {
public String siteId;
public boolean includedPredefined;
public boolean includeHidden;
public KeyReportDefList(String siteId, boolean includedPredefined, boolean includeHidden){
this.siteId = siteId;
this.includedPredefined = includedPredefined;
this.includeHidden = includeHidden;
}
@Override
public boolean equals(Object o) {
if(o instanceof KeyReportDefList) {
KeyReportDefList u = (KeyReportDefList) o;
return
(
(siteId == null && u.siteId == null)
|| (siteId != null && siteId.equals(u.siteId))
)
&& includedPredefined==u.includedPredefined
&& includeHidden==u.includeHidden;
}
return false;
}
@Override
public int hashCode() {
return (siteId!=null?siteId.hashCode():0)
+ (includedPredefined?1:0)
+ (includeHidden?1:0);
}
}
}