// Path: src/main/java/org/graylog/plugins/aggregates/history/HistoryAggregateItem.java
// public interface HistoryAggregateItem {
// 	public String getMoment();
// 	
//     public long getNumberOfHits();
//         
// }
// 
// Path: src/main/java/org/graylog/plugins/aggregates/report/schedule/ReportSchedule.java
// public interface ReportSchedule {
// 	
// 	public String getId();
// 	
// 	public String getName();
// 
// 	public String getExpression();
// 
// 	public String getTimespan();
// 	
// 	public boolean isDefaultSchedule();
// 	
// 	public Long getNextFireTime();
// 
// 	public List<String> getReportReceivers();
// }
// 
// Path: src/main/java/org/graylog/plugins/aggregates/rule/Rule.java
// public interface Rule {
// 	
// 	public String getQuery();
// 
// 	public String getField();
// 
// 	public long getNumberOfMatches();
// 
// 	public boolean isMatchMoreOrEqual();
// 
// 	public int getInterval();
// 	
// 	public String getName();
// 	
// 	public boolean isEnabled();
// 	
// 	public String getStreamId();
// 
// 	public boolean isInReport();
// 
// 	public List<String> getReportSchedules();
// 
// 	public String getAlertConditionId();
// 
// 	public boolean shouldRepeatNotifications();
// 
// 	public long getBacklog();
// }


import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.io.OutputStream;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.graylog.plugins.aggregates.history.HistoryAggregateItem;
import org.graylog.plugins.aggregates.report.schedule.ReportSchedule;
import org.graylog.plugins.aggregates.rule.Rule;
import org.jfree.chart.JFreeChart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.itextpdf.awt.DefaultFontMapper;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
			
			
			
			document.open();
			document.setPageSize(PageSize.A4);
			document.add(new Paragraph("Aggregates Report generated by " + hostname + " on " + date.toString()));
			document.newPage();
			writer.newPage();
			
			PdfContentByte contentByte = writer.getDirectContent();
			
			PdfTemplate template;
			Graphics2D graphics2d;
			
			
			int position = 0;
			Rectangle2D rectangle2d;
			
			
			for (JFreeChart chart : charts){
				LOG.debug("Writing chart to PDF");
				if (writer.getVerticalPosition(true)-height+(height*position) < 0){
					position = 0;
					document.newPage();
					writer.newPage();					
					
				}
				template = contentByte.createTemplate(width, height);
				graphics2d = template.createGraphics(width, height, new DefaultFontMapper());
				rectangle2d = new Rectangle2D.Double(0, 0, width, height);
// Path: src/main/java/org/graylog/plugins/aggregates/history/HistoryAggregateItem.java
// public interface HistoryAggregateItem {
// 	public String getMoment();
// 	
//     public long getNumberOfHits();
//         
// }
// 
// Path: src/main/java/org/graylog/plugins/aggregates/report/schedule/ReportSchedule.java
// public interface ReportSchedule {
// 	
// 	public String getId();
// 	
// 	public String getName();
// 
// 	public String getExpression();
// 
// 	public String getTimespan();
// 	
// 	public boolean isDefaultSchedule();
// 	
// 	public Long getNextFireTime();
// 
// 	public List<String> getReportReceivers();
// }
// 
// Path: src/main/java/org/graylog/plugins/aggregates/rule/Rule.java
// public interface Rule {
// 	
// 	public String getQuery();
// 
// 	public String getField();
// 
// 	public long getNumberOfMatches();
// 
// 	public boolean isMatchMoreOrEqual();
// 
// 	public int getInterval();
// 	
// 	public String getName();
// 	
// 	public boolean isEnabled();
// 	
// 	public String getStreamId();
// 
// 	public boolean isInReport();
// 
// 	public List<String> getReportSchedules();
// 
// 	public String getAlertConditionId();
// 
// 	public boolean shouldRepeatNotifications();
// 
// 	public long getBacklog();
// }


// Path: src/main/java/org/graylog/plugins/aggregates/report/ReportFactory.java
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.io.OutputStream;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.graylog.plugins.aggregates.history.HistoryAggregateItem;
import org.graylog.plugins.aggregates.report.schedule.ReportSchedule;
import org.graylog.plugins.aggregates.rule.Rule;
import org.jfree.chart.JFreeChart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.itextpdf.awt.DefaultFontMapper;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;

			
			
			
			document.open();
			document.setPageSize(PageSize.A4);
			document.add(new Paragraph("Aggregates Report generated by " + hostname + " on " + date.toString()));
			document.newPage();
			writer.newPage();
			
			PdfContentByte contentByte = writer.getDirectContent();
			
			PdfTemplate template;
			Graphics2D graphics2d;
			
			
			int position = 0;
			Rectangle2D rectangle2d;
			
			
			for (JFreeChart chart : charts){
				LOG.debug("Writing chart to PDF");
				if (writer.getVerticalPosition(true)-height+(height*position) < 0){
					position = 0;
					document.newPage();
					writer.newPage();					
					
				}
				template = contentByte.createTemplate(width, height);
				graphics2d = template.createGraphics(width, height, new DefaultFontMapper());
				rectangle2d = new Rectangle2D.Double(0, 0, width, height);
				chart.draw(graphics2d, rectangle2d);