/**
* $Id: StatisticsTransformer.java 4402 2009-10-07 08:31:24Z mdiggory $
* $URL: https://scm.dspace.org/svn/repo/modules/dspace-stats/trunk/dspace-xmlui-stats/src/main/java/org/dspace/app/xmlui/aspect/statistics/StatisticsTransformer.java $
* *************************************************************************
* Copyright (c) 2002-2009, DuraSpace. All rights reserved
* Licensed under the DuraSpace Foundation License.
*
* A copy of the DuraSpace License has been included in this
* distribution and is available at: http://scm.dspace.org/svn/repo/licenses/LICENSE.txt
*/
package org.dspace.app.xmlui.aspect.statistics;
import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrServerException;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.HandleUtil;
import org.dspace.app.xmlui.utils.UIException;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.element.*;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Constants;
import org.dspace.statistics.Dataset;
import org.dspace.statistics.content.*;
import org.dspace.handle.HandleManager;
import org.xml.sax.SAXException;
public class StatisticsTransformer extends AbstractDSpaceTransformer {
private static Logger log = Logger.getLogger(StatisticsTransformer.class);
private static final Message T_dspace_home = message("xmlui.general.dspace_home");
private static final Message T_head_title = message("xmlui.statistics.title");
private static final Message T_statistics_trail = message("xmlui.statistics.trail");
private static final String T_head_visits_total = "xmlui.statistics.visits.total";
private static final String T_head_visits_month = "xmlui.statistics.visits.month";
private static final String T_head_visits_views = "xmlui.statistics.visits.views";
private static final String T_head_visits_countries = "xmlui.statistics.visits.countries";
private static final String T_head_visits_cities = "xmlui.statistics.visits.cities";
private static final String T_head_visits_bitstream = "xmlui.statistics.visits.bitstreams";
/**
* Add a page title and trail links
*/
public void addPageMeta(PageMeta pageMeta) throws SAXException, WingException, UIException, SQLException, IOException, AuthorizeException {
//Try to find our dspace object
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
pageMeta.addTrailLink(contextPath + "/",T_dspace_home);
if(dso != null)
HandleUtil.buildHandleTrail(dso,pageMeta,contextPath);
pageMeta.addTrailLink(contextPath + "/handle" + (dso != null && dso.getHandle() != null ? "/" + dso.getHandle() : "/statistics"), T_statistics_trail);
// Add the page title
pageMeta.addMetadata("title").addContent(T_head_title);
}
/**
* What to add at the end of the body
*/
public void addBody(Body body) throws SAXException, WingException,
UIException, SQLException, IOException, AuthorizeException {
//Try to find our dspace object
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
try
{
if(dso != null)
{
renderViewer(body, dso);
}
/* TODO: Fix rendering of Home Page Statistics
else
{
renderHome(body);
}
*/
} catch (Throwable t) {
log.error(t.getMessage(), t);
}
}
public void renderHome(Body body) throws WingException {
Division home = body.addDivision("home", "primary repository");
Division division = home.addDivision("stats", "secondary stats");
division.setHead(T_head_title);
try {
StatisticsTable statisticsTable = new StatisticsTable(
new StatisticsDataVisits());
statisticsTable.setTitle(T_head_visits_month);
statisticsTable.setId("tab1");
DatasetTimeGenerator timeAxis = new DatasetTimeGenerator();
timeAxis.setDateInterval("month", "-6", "+1");
statisticsTable.addDatasetGenerator(timeAxis);
addDisplayTable(division, statisticsTable);
} catch (Exception e) {
log.error("Error occured while creating statistics for home page",
e);
}
try {
StatisticsListing statListing = new StatisticsListing(
new StatisticsDataVisits());
statListing.setTitle(T_head_visits_total);
statListing.setId("list1");
addDisplayListing(division, statListing);
} catch (Exception e) {
log.error("Error occured while creating statistics for home page", e);
}
}
public void renderViewer(Body body, DSpaceObject dso) throws WingException {
Division home = body.addDivision(
Constants.typeText[dso.getType()].toLowerCase() + "-home",
"primary repository " + Constants.typeText[dso.getType()].toLowerCase());
// Build the collection viewer division.
Division division = home.addDivision("stats", "secondary stats");
division.setHead(T_head_title);
try {
StatisticsListing statListing = new StatisticsListing(
new StatisticsDataVisits(dso));
statListing.setTitle(T_head_visits_total);
statListing.setId("list1");
DatasetDSpaceObjectGenerator dsoAxis = new DatasetDSpaceObjectGenerator();
dsoAxis.addDsoChild(dso.getType(), 10, false, -1);
statListing.addDatasetGenerator(dsoAxis);
addDisplayListing(division, statListing);
} catch (Exception e) {
log.error(
"Error occured while creating statistics for dso with ID: "
+ dso.getID() + " and type " + dso.getType()
+ " and handle: " + dso.getHandle(), e);
}
try {
StatisticsTable statisticsTable = new StatisticsTable(new StatisticsDataVisits(dso));
statisticsTable.setTitle(T_head_visits_month);
statisticsTable.setId("tab1");
DatasetTimeGenerator timeAxis = new DatasetTimeGenerator();
timeAxis.setDateInterval("month", "-6", "+1");
statisticsTable.addDatasetGenerator(timeAxis);
DatasetDSpaceObjectGenerator dsoAxis = new DatasetDSpaceObjectGenerator();
dsoAxis.addDsoChild(dso.getType(), 10, false, -1);
statisticsTable.addDatasetGenerator(dsoAxis);
addDisplayTable(division, statisticsTable);
} catch (Exception e) {
log.error(
"Error occured while creating statistics for dso with ID: "
+ dso.getID() + " and type " + dso.getType()
+ " and handle: " + dso.getHandle(), e);
}
if(dso instanceof org.dspace.content.Item){
//Make sure our item has at least one bitstream
org.dspace.content.Item item = (org.dspace.content.Item) dso;
try {
if(item.hasUploadedFiles()){
StatisticsListing statsList = new StatisticsListing(new StatisticsDataVisits(dso));
statsList.setTitle(T_head_visits_bitstream);
statsList.setId("list-bit");
DatasetDSpaceObjectGenerator dsoAxis = new DatasetDSpaceObjectGenerator();
dsoAxis.addDsoChild(Constants.BITSTREAM, 10, false, -1);
statsList.addDatasetGenerator(dsoAxis);
addDisplayListing(division, statsList);
}
} catch (Exception e) {
log.error(
"Error occured while creating statistics for dso with ID: "
+ dso.getID() + " and type " + dso.getType()
+ " and handle: " + dso.getHandle(), e);
}
}
try {
StatisticsListing statListing = new StatisticsListing(
new StatisticsDataVisits(dso));
statListing.setTitle(T_head_visits_countries);
statListing.setId("list2");
// DatasetDSpaceObjectGenerator dsoAxis = new DatasetDSpaceObjectGenerator();
// dsoAxis.addDsoChild(dso.getType(), 10, false, -1);
DatasetTypeGenerator typeAxis = new DatasetTypeGenerator();
typeAxis.setType("countryCode");
typeAxis.setMax(10);
statListing.addDatasetGenerator(typeAxis);
addDisplayListing(division, statListing);
} catch (Exception e) {
log.error(
"Error occured while creating statistics for dso with ID: "
+ dso.getID() + " and type " + dso.getType()
+ " and handle: " + dso.getHandle(), e);
}
try {
StatisticsListing statListing = new StatisticsListing(
new StatisticsDataVisits(dso));
statListing.setTitle(T_head_visits_cities);
statListing.setId("list3");
// DatasetDSpaceObjectGenerator dsoAxis = new DatasetDSpaceObjectGenerator();
// dsoAxis.addDsoChild(dso.getType(), 10, false, -1);
DatasetTypeGenerator typeAxis = new DatasetTypeGenerator();
typeAxis.setType("city");
typeAxis.setMax(10);
statListing.addDatasetGenerator(typeAxis);
addDisplayListing(division, statListing);
} catch (Exception e) {
log.error(
"Error occured while creating statistics for dso with ID: "
+ dso.getID() + " and type " + dso.getType()
+ " and handle: " + dso.getHandle(), e);
}
}
/**
* Adds a table layout to the page
*
* @param mainDiv
* the div to add the table to
* @param display
* @throws SAXException
* @throws WingException
* @throws ParseException
* @throws IOException
* @throws SolrServerException
* @throws SQLException
*/
private void addDisplayTable(Division mainDiv, StatisticsTable display)
throws SAXException, WingException, SQLException,
SolrServerException, IOException, ParseException {
String title = display.getTitle();
Dataset dataset = display.getDataset();
if (dataset == null) {
/** activate dataset query */
dataset = display.getDataset(context);
}
if (dataset != null) {
String[][] matrix = dataset.getMatrixFormatted();
/** Generate Table */
Division wrapper = mainDiv.addDivision("tablewrapper");
Table table = wrapper.addTable("list-table", 1, 1,
title == null ? "" : "tableWithTitle");
if (title != null)
table.setHead(message(title));
/** Generate Header Row */
Row headerRow = table.addRow();
headerRow.addCell("spacer", Cell.ROLE_DATA, "labelcell");
String[] cLabels = dataset.getColLabels().toArray(new String[0]);
for (int row = 0; row < cLabels.length; row++) {
Cell cell = headerRow.addCell(0 + "-" + row + "-h",
Cell.ROLE_DATA, "labelcell");
cell.addContent(cLabels[row]);
}
/** Generate Table Body */
for (int row = 0; row < matrix.length; row++) {
Row valListRow = table.addRow();
/** Add Row Title */
valListRow.addCell("" + row, Cell.ROLE_DATA, "labelcell")
.addContent(dataset.getRowLabels().get(row));
/** Add Rest of Row */
for (int col = 0; col < matrix[row].length; col++) {
Cell cell = valListRow.addCell(row + "-" + col,
Cell.ROLE_DATA, "datacell");
cell.addContent(matrix[row][col]);
}
}
}
}
private void addDisplayListing(Division mainDiv, StatisticsListing display)
throws SAXException, WingException, SQLException,
SolrServerException, IOException, ParseException {
String title = display.getTitle();
Dataset dataset = display.getDataset();
if (dataset == null) {
/** activate dataset query */
dataset = display.getDataset(context);
}
if (dataset != null) {
String[][] matrix = dataset.getMatrixFormatted();
// String[] rLabels = dataset.getRowLabels().toArray(new String[0]);
Table table = mainDiv.addTable("list-table", matrix.length, 2,
title == null ? "" : "tableWithTitle");
if (title != null)
table.setHead(message(title));
Row headerRow = table.addRow();
headerRow.addCell("", Cell.ROLE_DATA, "labelcell");
headerRow.addCell("", Cell.ROLE_DATA, "labelcell").addContent(message(T_head_visits_views));
/** Generate Table Body */
for (int col = 0; col < matrix[0].length; col++) {
Row valListRow = table.addRow();
Cell catCell = valListRow.addCell(col + "1", Cell.ROLE_DATA,
"labelcell");
catCell.addContent(dataset.getColLabels().get(col));
Cell valCell = valListRow.addCell(col + "2", Cell.ROLE_DATA,
"datacell");
valCell.addContent(matrix[0][col]);
}
if (!"".equals(display.getCss())) {
List attrlist = mainDiv.addList("divattrs");
attrlist.addItem("style", display.getCss());
}
}
}
}