org.dspace.app.statistics.CreateStatReport.java Source code

Java tutorial

Introduction

Here is the source code for org.dspace.app.statistics.CreateStatReport.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.app.statistics;

import java.io.File;
import java.io.FileInputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Properties;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;

import org.dspace.core.Context;
import org.dspace.core.ConfigurationManager;

/**
 * This class allows the running of the DSpace statistic tools
 * 
 * Usage: java CreateStatReport -r <statistic to run>
 * Available:    <stat-initial> <stat-general> <stat-monthly> <stat-report-initial> 
 *             <stat-report-general> <stat-report-monthly>
 * 
 * @author Chris Yates
 *
 */

public class CreateStatReport {

    /**Current date and time*/
    private static Calendar calendar = null;

    /**Reporting start date and time*/
    private static Calendar reportStartDate = null;

    /**Path of log directory*/
    private static String outputLogDirectory = null;

    /**Path of reporting directory*/
    private static String outputReportDirectory = null;

    /**File suffix for log files*/
    private static String outputSuffix = ".dat";

    /**User context*/
    private static Context context;

    /** the config file from which to configure the analyser */
    private static String configFile = ConfigurationManager.getProperty("dspace.dir") + File.separator + "config"
            + File.separator + "dstat.cfg";

    /*
    * Main method to be run from the command line executes individual statistic methods
    * 
    * Usage: java CreateStatReport -r <statistic to run> 
    */
    public static void main(String[] argv) throws Exception {

        // Open the statistics config file
        FileInputStream fis = new java.io.FileInputStream(new File(configFile));
        Properties config = new Properties();
        config.load(fis);
        int startMonth = 0;
        int startYear = 2005;
        try {
            startYear = Integer.parseInt(config.getProperty("start.year", "1").trim());
        } catch (NumberFormatException nfe) {
            System.err.println("start.year is incorrectly set in dstat.cfg. Must be a number (e.g. 2005).");
            System.exit(0);
        }
        try {
            startMonth = Integer.parseInt(config.getProperty("start.month", "2005").trim());
        } catch (NumberFormatException nfe) {
            System.err.println("start.month is incorrectly set in dstat.cfg. Must be a number between 1 and 12.");
            System.exit(0);
        }
        reportStartDate = new GregorianCalendar(startYear, startMonth - 1, 1);
        calendar = new GregorianCalendar();

        // create context as super user
        context = new Context();
        context.setIgnoreAuthorization(true);

        //get paths to directories
        outputLogDirectory = ConfigurationManager.getProperty("log.dir") + File.separator;
        outputReportDirectory = ConfigurationManager.getProperty("report.dir") + File.separator;

        //read in command line variable to determine which statistic to run
        CommandLineParser parser = new PosixParser();
        Options options = new Options();
        options.addOption("r", "report", true, "report");
        CommandLine line = parser.parse(options, argv);

        String statAction = null;

        if (line.hasOption('r')) {
            statAction = line.getOptionValue('r');
        }

        if (statAction == null) {
            usage();
            System.exit(0);
        }

        //call appropriate statistics method
        if (statAction.equals("stat-monthly")) {
            statMonthly();
        }

        if (statAction.equals("stat-general")) {
            statGeneral();
        }

        if (statAction.equals("stat-initial")) {
            statInitial();
        }

        if (statAction.equals("stat-report-general")) {
            statReportGeneral();
        }

        if (statAction.equals("stat-report-initial")) {
            statReportInitial();
        }

        if (statAction.equals("stat-report-monthly")) {
            statReportMonthly();
        }
    }

    /**
     * This method generates a report from the first of the current month to the end of the current month.
     * 
     * @throws Exception
     */
    private static void statMonthly() throws Exception {

        //Output Prefix
        String outputPrefix = "dspace-log-monthly-";

        // set up our command line variables
        String myLogDir = null;
        String myFileTemplate = null;
        String myConfigFile = null;
        StringBuffer myOutFile = null;
        Date myStartDate = null;
        Date myEndDate = null;
        boolean myLookUp = false;

        Calendar start = new GregorianCalendar(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        myStartDate = start.getTime();

        Calendar end = new GregorianCalendar(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        myEndDate = end.getTime();

        myOutFile = new StringBuffer(outputLogDirectory);
        myOutFile.append(outputPrefix);
        myOutFile.append(calendar.get(Calendar.YEAR));
        myOutFile.append("-");
        myOutFile.append(calendar.get(Calendar.MONTH) + 1);
        myOutFile.append(outputSuffix);

        LogAnalyser.processLogs(context, myLogDir, myFileTemplate, myConfigFile, myOutFile.toString(), myStartDate,
                myEndDate, myLookUp);
    }

    /**
     * This method generates a full report based on the full log period
     * 
     * @throws Exception
     */
    private static void statGeneral() throws Exception {

        //Output Prefix
        String outputPrefix = "dspace-log-general-";

        // set up our command line variables
        String myLogDir = null;
        String myFileTemplate = null;
        String myConfigFile = null;
        StringBuffer myOutFile = null;
        Date myStartDate = null;
        Date myEndDate = null;
        boolean myLookUp = false;

        myOutFile = new StringBuffer(outputLogDirectory);
        myOutFile.append(outputPrefix);
        myOutFile.append(calendar.get(Calendar.YEAR));
        myOutFile.append("-");
        myOutFile.append(calendar.get(Calendar.MONTH) + 1);
        myOutFile.append("-");
        myOutFile.append(calendar.get(Calendar.DAY_OF_MONTH));
        myOutFile.append(outputSuffix);

        LogAnalyser.processLogs(context, myLogDir, myFileTemplate, myConfigFile, myOutFile.toString(), myStartDate,
                myEndDate, myLookUp);
    }

    /**
     * This script starts from the year and month specified below and loops each month until the current month
     * generating a monthly aggregation files for the DStat system.
     * 
     * @throws Exception
     */
    private static void statInitial() throws Exception {

        //Output Prefix
        String outputPrefix = "dspace-log-monthly-";

        // set up our command line variables
        String myLogDir = null;
        String myFileTemplate = null;
        String myConfigFile = null;
        StringBuffer myOutFile = null;
        Date myStartDate = null;
        Date myEndDate = null;
        boolean myLookUp = false;

        Calendar reportEndDate = new GregorianCalendar(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

        Calendar currentMonth = (Calendar) reportStartDate.clone();
        while (currentMonth.before(reportEndDate)) {

            Calendar start = new GregorianCalendar(currentMonth.get(Calendar.YEAR),
                    currentMonth.get(Calendar.MONTH), currentMonth.getActualMinimum(Calendar.DAY_OF_MONTH));
            myStartDate = start.getTime();

            Calendar end = new GregorianCalendar(currentMonth.get(Calendar.YEAR), currentMonth.get(Calendar.MONTH),
                    currentMonth.getActualMaximum(Calendar.DAY_OF_MONTH));
            myEndDate = end.getTime();

            myOutFile = new StringBuffer(outputLogDirectory);
            myOutFile.append(outputPrefix);
            myOutFile.append(currentMonth.get(Calendar.YEAR));
            myOutFile.append("-");
            myOutFile.append(currentMonth.get(Calendar.MONTH) + 1);
            myOutFile.append(outputSuffix);

            LogAnalyser.processLogs(context, myLogDir, myFileTemplate, myConfigFile, myOutFile.toString(),
                    myStartDate, myEndDate, myLookUp);

            currentMonth.add(Calendar.MONTH, 1);
        }
    }

    /**
     * This method generates a full report based on the full log period
     * 
     * @throws Exception
     */
    private static void statReportGeneral() throws Exception {

        //Prefix
        String inputPrefix = "dspace-log-general-";
        String outputPrefix = "report-general-";

        String myFormat = "html";
        StringBuffer myInput = null;
        StringBuffer myOutput = null;
        String myMap = null;

        myInput = new StringBuffer(outputLogDirectory);
        myInput.append(inputPrefix);
        myInput.append(calendar.get(Calendar.YEAR));
        myInput.append("-");
        myInput.append(calendar.get(Calendar.MONTH) + 1);
        myInput.append("-");
        myInput.append(calendar.get(Calendar.DAY_OF_MONTH));
        myInput.append(outputSuffix);

        myOutput = new StringBuffer(outputReportDirectory);
        myOutput.append(outputPrefix);
        myOutput.append(calendar.get(Calendar.YEAR));
        myOutput.append("-");
        myOutput.append(calendar.get(Calendar.MONTH) + 1);
        myOutput.append("-");
        myOutput.append(calendar.get(Calendar.DAY_OF_MONTH));
        myOutput.append(".");
        myOutput.append(myFormat);

        ReportGenerator.processReport(context, myFormat, myInput.toString(), myOutput.toString(), myMap);
    }

    /**
     * This script starts from the year and month specified below and loops each month until the current month
     * generating monthly reports from the DStat aggregation files
     * 
     * @throws Exception
     */
    private static void statReportInitial() throws Exception {

        //Prefix
        String inputPrefix = "dspace-log-monthly-";
        String outputPrefix = "report-";

        String myFormat = "html";
        StringBuffer myInput = null;
        StringBuffer myOutput = null;
        String myMap = null;

        Calendar reportEndDate = new GregorianCalendar(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

        Calendar currentMonth = (Calendar) reportStartDate.clone();

        while (currentMonth.before(reportEndDate)) {

            myInput = new StringBuffer(outputLogDirectory);
            myInput.append(inputPrefix);
            myInput.append(currentMonth.get(Calendar.YEAR));
            myInput.append("-");
            myInput.append(currentMonth.get(Calendar.MONTH) + 1);
            myInput.append(outputSuffix);

            myOutput = new StringBuffer(outputReportDirectory);
            myOutput.append(outputPrefix);
            myOutput.append(currentMonth.get(Calendar.YEAR));
            myOutput.append("-");
            myOutput.append(currentMonth.get(Calendar.MONTH) + 1);
            myOutput.append(".");
            myOutput.append(myFormat);

            ReportGenerator.processReport(context, myFormat, myInput.toString(), myOutput.toString(), myMap);

            currentMonth.add(Calendar.MONTH, 1);
        }
    }

    /**
     * This method generates a report from the aggregation files which have been run for the most recent month
     * 
     * @throws Exception
     */
    private static void statReportMonthly() throws Exception {
        //Prefix
        String inputPrefix = "dspace-log-monthly-";
        String outputPrefix = "report-";

        String myFormat = "html";
        StringBuffer myInput = null;
        StringBuffer myOutput = null;
        String myMap = null;

        myInput = new StringBuffer(outputLogDirectory);
        myInput.append(inputPrefix);
        myInput.append(calendar.get(Calendar.YEAR));
        myInput.append("-");
        myInput.append(calendar.get(Calendar.MONTH) + 1);
        myInput.append(outputSuffix);

        myOutput = new StringBuffer(outputReportDirectory);
        myOutput.append(outputPrefix);
        myOutput.append(calendar.get(Calendar.YEAR));
        myOutput.append("-");
        myOutput.append(calendar.get(Calendar.MONTH) + 1);
        myOutput.append(".");
        myOutput.append(myFormat);

        ReportGenerator.processReport(context, myFormat, myInput.toString(), myOutput.toString(), myMap);
    }

    /*
     * Output the usage information
     */
    private static void usage() throws Exception {

        System.out.println("Usage: java CreateStatReport -r <statistic to run>");
        System.out.println(
                "Available: <stat-initial> <stat-general> <stat-monthly> <stat-report-initial> <stat-report-general> <stat-report-monthly>");
        return;
    }
}