package smartkv.client.workloads.ReportGenerator;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import org.jfree.chart.JFreeChart;
import smartkv.client.workloads.ReportGenerator.Formats.GenerateGraphics;
import smartkv.client.workloads.ReportGenerator.Formats.PDFExporter;
import smartkv.client.workloads.ReportGenerator.htmlElements.FrequencyGenerator;
import smartkv.client.workloads.ReportGenerator.htmlElements.GroupedElement;
import smartkv.client.workloads.ReportGenerator.htmlElements.Image;
import smartkv.client.workloads.ReportGenerator.htmlElements.ListOperations;
import smartkv.client.workloads.ReportGenerator.htmlElements.SourceElement;
import com.google.common.collect.Lists;
/**
* This class will produce a report for analyzing tests.
* @author fabiim
*
*/
public class ReportGenerator {
protected static String fileInput;
protected static String outputFolder;
protected static Source rootFile;
private static String title;
private static String description;
public static void main(String args []) throws IOException{
//TODO - check is folder .
switch(args.length){
case 2:
//singularCase(args[1]);
//readLogAndCreateReport("./workloads/report/100.known/usedLog.0.1000","./workloads/report/", "Logs", "Hosts have static arp tables", 0, 1000);
//readLogAndCreateReport("./workloads/report/300.known/usedLog.200.265","./workloads/report/", "Logs", "Hosts have static arp tables", 0, 1000);
//readLogAndCreateReport("./workloads/logs","./workloads/report/", "100 No arp - Ping between known hosts", "Hosts have static arp tables", 260,10000);
//readLogAndCreateReport("./workloads/ewsdn.device.man","./workloads/report/", "100 No arp - Ping between known hosts", "Hosts have static arp tables", 310,10000);
//readLogAndCreateReport("./workloads/report/300.known/usedLog.200.265","./workloads/report/", "Logs", "", 220, 265);
readLogAndCreateReport("./workloads/logs.objectsctrlc","./workloads/report/", "Test", "",0, 1000);
break;
default:
System.out.println("Unknown command... See command line arguments");
}
}
public static int BEGIN;
public static int END;
private static void readLogAndCreateReport(String input, String outputFolder, String title, String dsc, int i, int j) throws IOException{
BEGIN = i;
END = j;
if (!outputFolder.endsWith("/")){
outputFolder = outputFolder + "/";
}
initializeState(input, outputFolder, title, dsc);
generateElementsFromInputFile();
rootFile.genDocument();
}
private static void generateElementsFromInputFile() throws IOException{
createReadWriteThroughput();
System.out.println("Created Read/Write Throughput");
//createSize();
System.out.println("Created Sizes");
WorkLoadResults rs = new WorkLoadResults(fileInput);
Stats[] st= {
//StatsCreator.readRequestSize(rs),
StatsCreator.readResponseSize(rs),
//StatsCreator.requestSize(rs),
//StatsCreator.responseSize(rs),
StatsCreator.writeRequestSize(rs),
//StatsCreator.writeResponseSize(rs),
};
int i = 0;
for (Stats s : st){
System.out.println("One more s ");
i++;
GroupedElement gp = new GroupedElement(s.getTitle(), s.getDescription());
gp.addElement(new FrequencyGenerator("Frequency Table", "X -> Tamanho em bytes da mensagem", s.freq, true));
//addFrequencyGraphic(i, s, gp);
/* List<Stats> perMethod = StatsCreator.getPerMethodStats(s);
gp.addElement(new FrequencyGenerator("Frequency of Methods used", "", StatsCreator.getMethodCallStat(s),false));
for (Stats pS : perMethod){
gp.addElement(new FrequencyGenerator("Frequency Table - " + pS.getTitle() , pS.getDescription(), pS.freq, false));
}
for (Stats eventStats : StatsCreator.perEventStats(s)){
gp.addElement(new FrequencyGenerator("Frequency Table for Event Type: " + eventStats.getTitle(), eventStats.getDescription() + " - X -> size of message" , eventStats.freq, true));
}*/
rootFile.addElement(gp);
}
rootFile.addElement(new ListOperations("Operations", "The log of the operations requested to the database", new WorkLoadResults(fileInput)));
}
/**
* @param i
* @param s
* @param gp
* @throws IOException
*/
private static void addFrequencyGraphic(int i, Stats s, GroupedElement gp)
throws IOException {
String imgPath = outputFolder + i + "freq.png";
String imgPathPdf = outputFolder + i + "freq.pdf";
JFreeChart chart = GenerateGraphics.getChartFromFreq(s.freq, s.cdfTitle , s.x, s.y);
GenerateGraphics.saveChart( imgPath , chart, 500, 250);
PDFExporter.writeChartToPDF(chart, 250, 100, imgPathPdf);
gp.addElement(new Image("Frequency Graphic", "...", i + "freq.png"));
}
/**
* @throws IOException
*/
private static void createReadWriteThroughput() throws IOException {
JFreeChart chart = GenerateGraphics.createReadWriteThroughPut(new WorkLoadResults(fileInput), false);
String out = outputFolder + "read.write.throughput.png";
String outPdf = outputFolder + "read.write.throughput.pdf";
GenerateGraphics.saveChart( out, chart, 750, 500);
SourceElement img = new Image("Read/Write Requests per Second ", "The number of write and read requests that have been sent to the datastore on every second.","read.write.throughput.png");
chart = GenerateGraphics.createReadWriteThroughPut(new WorkLoadResults(fileInput), true);
out = outputFolder + "read.write.throughput.requests.png";
outPdf = outputFolder + "read.write.throughput.requests.pdf";
GenerateGraphics.saveChart( out, chart, 750, 500);
SourceElement img2 = new Image("Events over time", "Events (green - link addition ; yellow - new topology ; blue - link removal) -happening over time ","read.write.throughput.requests.png");
rootFile.addElement(new GroupedElement ("ReadWrite Throughput", "Requests sent to the databse", Lists.newArrayList(img, img2)));
}
private static void createSize() throws IOException{
JFreeChart chart = GenerateGraphics.createSize(new WorkLoadResults(fileInput), false);
String out = outputFolder + "read.write.size.png";
GenerateGraphics.saveChart( out, chart, 750, 500);
SourceElement img = new Image("Read/Write total size p/Second", "The total number of bytes received/requested to the datastore on each second","read.write.size.png");
chart = GenerateGraphics.createSizeM(new WorkLoadResults(fileInput), false);
out = outputFolder + "read.write.size2.png";
String outPdf = outputFolder + "read.write.size2.pdf";
GenerateGraphics.saveChart( out, chart, 750, 500);
SourceElement img2 = new Image("Read/Write mean size per Second ", "The mean number of bytes requested/received to the datastore on each second","read.write.size2.png");
PDFExporter.writeChartToPDF(chart, 500, 350, outPdf);
rootFile.addElement(new GroupedElement("Read/Write response/request over time", "", Lists.newArrayList(img,img2)));
}
/**
* @param input
* @param outputFolder
* @param dsc
* @param title2
* @throws IOException
*/
private static void initializeState(String input, String outputFolder, String title2, String dsc)
throws IOException {
fileInput = input;
File in = new File (input);
if (!in.exists()){
System.err.println("File : " + fileInput + " does not exist" );
System.exit(-1);
}
ReportGenerator.outputFolder = outputFolder;
File f = new File(outputFolder);
if (!f.exists()){
f.mkdirs();
}
if (!f.isDirectory()){
throw new IOException("not a directory: " + outputFolder);
}
copyFile(new File(input), new File(outputFolder + "usedLog." + BEGIN + "." + END ));
if (!outputFolder.endsWith("workloads/report/"))
copyFile(new File("./workloads/report/style.css"), new File(outputFolder + "style.css"));
rootFile = new Source(title2, description, outputFolder) ;
}
public static void copyFile(File sourceFile, File destFile) throws IOException {
if(!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
}
finally {
if(source != null) {
source.close();
}
if(destination != null) {
destination.close();
}
}
}
}