/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2010-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.reporting.availability;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.ValidationException;
import org.opennms.core.utils.ConfigFileConstants;
import org.opennms.core.utils.LogUtils;
import org.opennms.core.utils.ThreadCategory;
import org.opennms.reporting.availability.render.HTMLReportRenderer;
import org.opennms.reporting.availability.render.PDFReportRenderer;
import org.springframework.util.StringUtils;
/**
* AvailabilityReport generates the Availability report in PDF format
*
* @author <A HREF="mailto:jacinta@oculan.com">Jacinta Remedios </A>
*/
public class AvailabilityReport extends Object {
/**
* The log4j category used to log debug messsages and statements.
*/
private static final String LOG4J_CATEGORY = "OpenNMS.Report";
/*
* classic month format
*/
private static final String MONTH_FORMAT_CLASSIC = "classic";
/**
* Castor object that holds all the information required for the
* generating xml to be translated to the pdf.
*/
private Report m_report = null;
/**
* String of Months
*/
public static String[] months = new String[] { "January", "February",
"March", "April", "May", "June", "July", "August", "September",
"October", "November", "December" };
/**
* Default constructor
*
* @param author a {@link java.lang.String} object.
* @param startMonth a {@link java.lang.String} object.
* @param startDate a {@link java.lang.String} object.
* @param startYear a {@link java.lang.String} object.
*/
public AvailabilityReport(String author, String startMonth,
String startDate, String startYear) {
String oldPrefix = ThreadCategory.getPrefix();
ThreadCategory.setPrefix(LOG4J_CATEGORY);
if (log().isDebugEnabled()) {
log().debug("Inside AvailabilityReport");
}
Calendar today = new GregorianCalendar();
int day = Integer.parseInt(startDate);
int year = Integer.parseInt(startYear);
// int month = Integer.parseInt(startMonth);
// int day = today.get(Calendar.DAY_OF_MONTH);
// int year = today.get(Calendar.YEAR);
// SimpleDateFormat smpMonth = new SimpleDateFormat("MMMMMMMMMMM");
// String month = smpMonth.format(new
// java.util.Date(today.getTime().getTime()));
// int month = today.get(Calendar.MONTH) + 1;
String month = months[Integer.parseInt(startMonth)];
int hour = today.get(Calendar.HOUR);
int minute = today.get(Calendar.MINUTE);
int second = today.get(Calendar.SECOND);
Created created = new Created();
created.setDay(day);
created.setHour(hour);
created.setMin(minute);
created.setMonth(month);
created.setSec(second);
created.setYear(year);
created.setContent(new BigDecimal(today.getTime().getTime()));
m_report = new Report();
m_report.setCreated(created);
m_report.setAuthor(author);
if (log().isDebugEnabled()) {
log().debug("Leaving AvailabilityReport");
}
ThreadCategory.setPrefix(oldPrefix);
}
/**
* This when invoked generates the data into report castor classes.
*
* @param logourl
* location of the logo to be displayed on the report
* @param categoryName
* of the logo to be displayed on the report
* @param reportFormat
* Report Format ("SVG" / all)
* @param monthFormat
* Format for month data ("classic"/"calendar")
* @param startMonth a {@link java.lang.String} object.
* @param startDate a {@link java.lang.String} object.
* @param startYear a {@link java.lang.String} object.
*/
public void getReportData(String logourl, String categoryName,
String reportFormat, String monthFormat, String startMonth,
String startDate, String startYear) {
if (log().isDebugEnabled()) {
log().debug("inside getReportData");
log().debug("Category name " + categoryName);
log().debug("Report format " + reportFormat);
log().debug("logo " + logourl);
log().debug("monthFormat " + monthFormat);
}
populateReport(logourl, categoryName, reportFormat, monthFormat,
startMonth, startDate, startYear);
try {
marshalReport();
} catch (Throwable e) {
log().fatal("Exception: " + e, e);
}
}
/**
* This when invoked populates the castor classes.
*
* @param logourl
* location of the logo to be displayed on the report
* @param categoryName
* of the logo to be displayed on the report
* @param reportFormat
* Report Format ("SVG" / all)
* @param monthFormat
* Format for month data ("classic"/"calendar")
* @param startMonth a {@link java.lang.String} object.
* @param startDate a {@link java.lang.String} object.
* @param startYear a {@link java.lang.String} object.
*/
public void populateReport(String logourl, String categoryName,
String reportFormat, String monthFormat, String startMonth,
String startDate, String startYear) {
m_report.setLogo(logourl);
ViewInfo viewInfo = new ViewInfo();
m_report.setViewInfo(viewInfo);
org.opennms.reporting.availability.Categories categories = new org.opennms.reporting.availability.Categories();
m_report.setCategories(categories);
try {
AvailabilityData reportSource = new AvailabilityData();
reportSource.fillReport(categoryName, m_report, reportFormat,
monthFormat, startMonth,
startDate, startYear);
} catch (Throwable e) {
log().fatal("Exception: " + e, e);
}
}
/**
* This when invoked marshals the report XML from the castor classes.
*
* @throws org.exolab.castor.xml.ValidationException if any.
* @throws org.exolab.castor.xml.MarshalException if any.
* @throws java.io.IOException if any.
* @throws java.lang.Exception if any.
*/
public void marshalReport() throws ValidationException, MarshalException,
IOException, Exception {
File file = new File(ConfigFileConstants.getHome()
+ "/share/reports/AvailReport.xml");
try {
Writer fileWriter = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
Marshaller marshaller = new Marshaller(fileWriter);
marshaller.setSuppressNamespaces(true);
marshaller.marshal(m_report);
if (log().isDebugEnabled()) {
log().debug(
"The xml marshalled from the castor classes is saved in "
+ ConfigFileConstants.getHome()
+ "/share/reports/AvailReport.xml");
}
fileWriter.close();
} catch (Throwable e) {
log().fatal("Exception: " + e, e);
}
}
/**
* Generate PDF from castor classes.
*
* @param xsltFileName a {@link java.lang.String} object.
* @param out a {@link java.io.OutputStream} object.
* @param format a {@link java.lang.String} object.
* @throws java.lang.Exception if any.
*/
public void generatePDF(String xsltFileName, OutputStream out,
String format) throws Exception {
String oldPrefix = ThreadCategory.getPrefix();
ThreadCategory.setPrefix(LOG4J_CATEGORY);
if (log().isDebugEnabled()) {
log().debug("inside generatePDF");
}
File file = new File(ConfigFileConstants.getHome()
+ "/share/reports/AvailReport.xml");
try {
if (log().isDebugEnabled()) {
log().debug(
"The xml marshalled from the castor classes is saved in "
+ ConfigFileConstants.getHome()
+ "/share/reports/AvailReport.xml");
}
Reader fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8");
if (!format.equals("HTML")) {
new PDFReportRenderer().render(fileReader, out, new InputStreamReader(new FileInputStream(xsltFileName), "UTF-8"));
} else {
new HTMLReportRenderer().render(fileReader, out, new InputStreamReader(new FileInputStream(xsltFileName), "UTF-8"));
}
} catch (Throwable e) {
log().fatal("Exception: " + e, e);
}
if (log().isInfoEnabled()) {
log().info("leaving generatePDF");
}
ThreadCategory.setPrefix(oldPrefix);
}
/**
* Main method
*
* @param args an array of {@link java.lang.String} objects.
*/
public static void main(String args[]) {
// Spit warning level and higher messages out to the console
ConsoleAppender consoleAppender = new ConsoleAppender(
new PatternLayout(
"%m%n"),
ConsoleAppender.SYSTEM_ERR);
consoleAppender.setThreshold(Level.WARN);
Logger logger = Logger.getLogger(LOG4J_CATEGORY);
logger.addAppender(consoleAppender);
ThreadCategory.setPrefix(LOG4J_CATEGORY);
log().debug(
"main() called with args: "
+ StringUtils.arrayToDelimitedString(args, ", "));
System.setProperty("java.awt.headless", "true");
String logourl = System.getProperty("image");
String categoryName = System.getProperty("catName");
if (categoryName == null || categoryName.equals("")) {
categoryName = "all";
}
String format = System.getProperty("format");
if (format == null || format.equals("")) {
format = "SVG";
}
String monthFormat = System.getProperty("MonthFormat");
if (monthFormat == null || format.equals("")) {
monthFormat = MONTH_FORMAT_CLASSIC;
}
String startMonth = System.getProperty("startMonth");
String startDate = System.getProperty("startDate");
String startYear = System.getProperty("startYear");
if (startMonth == null || startDate == null || startYear == null) {
throw new NumberFormatException("missing date properties");
}
try {
generateReport(logourl, categoryName, format, monthFormat, startMonth, startDate, startYear);
} catch (final Exception e) {
LogUtils.warnf(AvailabilityReport.class, e, "Error while generating report.");
}
}
/**
* <p>generateReport</p>
*
* @param logourl a {@link java.lang.String} object.
* @param categoryName a {@link java.lang.String} object.
* @param format a {@link java.lang.String} object.
* @param monthFormat a {@link java.lang.String} object.
* @param startMonth a {@link java.lang.String} object.
* @param startDate a {@link java.lang.String} object.
* @param startYear a {@link java.lang.String} object.
* @throws java.lang.Exception if any.
*/
public static void generateReport(String logourl, String categoryName,
String format, String monthFormat, String startMonth,
String startDate, String startYear) throws Exception {
// This report will be invoked by the mailer script.
// Only SVG formatted reports are needed.
//
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
String catFileName = categoryName.replace(' ', '-');
String pdfFileName;
String xslFileName;
if (format.equals("SVG")) {
pdfFileName = ConfigFileConstants.getHome()
+ "/share/reports/AVAIL-SVG-" + catFileName
+ fmt.format(new java.util.Date()) + ".pdf";
xslFileName = ConfigFileConstants.getFilePathString()
+ ConfigFileConstants.getFileName(ConfigFileConstants.REPORT_SVG_XSL);
} else if (format.equals("PDF")) {
pdfFileName = ConfigFileConstants.getHome()
+ "/share/reports/AVAIL-PDF-" + catFileName
+ fmt.format(new java.util.Date()) + ".pdf";
xslFileName = ConfigFileConstants.getFilePathString()
+ ConfigFileConstants.getFileName(ConfigFileConstants.REPORT_PDF_XSL);
} else if (format.equals("HTML")) {
pdfFileName = ConfigFileConstants.getHome()
+ "/share/reports/AVAIL-HTML-" + catFileName
+ fmt.format(new java.util.Date()) + ".html";
xslFileName = ConfigFileConstants.getFilePathString()
+ ConfigFileConstants.getFileName(ConfigFileConstants.REPORT_HTML_XSL);
} else {
log().fatal(
"Format '"
+ format
+ "' is unsupported. Must be one of: SVG, PDF, or HTML.");
return;
}
try {
AvailabilityReport report = new AvailabilityReport("Unknown",
startMonth,
startDate,
startYear);
report.getReportData(logourl, categoryName, format, monthFormat,
startMonth, startDate, startYear);
if (log().isInfoEnabled()) {
log().info("Generated Report Data... ");
}
File file = new File(pdfFileName);
FileOutputStream pdfFileWriter = new FileOutputStream(file);
report.generatePDF(xslFileName, pdfFileWriter, format);
if (log().isInfoEnabled()) {
log().debug(
"xsl -> " + xslFileName + " pdfFileName -> "
+ pdfFileName + " format -> " + format);
log().info("Generated Report ... and saved as " + pdfFileName);
}
} catch (Throwable e) {
log().fatal("Exception " + e, e);
}
}
private static ThreadCategory log() {
return ThreadCategory.getInstance(AvailabilityReport.class);
}
}