/*
* Copyright (c) 2010-2012 Thiago T. Sá
*
* This file is part of CloudReports.
*
* CloudReports 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.
*
* CloudReports 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.
*
* For more information about your rights as a user of CloudReports,
* refer to the LICENSE file or see <http://www.gnu.org/licenses/>.
*/
package cloudreports.reports;
import cloudreports.extensions.PowerDatacenter;
import cloudreports.utils.FileIO;
import cloudreports.utils.LogIO;
import java.io.IOException;
import java.net.URISyntaxException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import org.cloudbus.cloudsim.Cloudlet;
import org.cloudbus.cloudsim.DatacenterBroker;
import org.cloudbus.cloudsim.Log;
/**
* Provides methods to generate a log with general information
* about the simulation process.
*
* @author Thiago T. Sá
* @since 1.0
*/
class LogReport {
/** The HTML version of the log. */
private String html;
/**
* Generates a log.
*
* @param datacentersList a list of all datacenters.
* @param brokersList a list of all brokers.
* @see LogIO
* @since 1.0
*/
LogReport(List<PowerDatacenter> datacentersList, List<DatacenterBroker> brokersList) throws IOException, URISyntaxException {
html = FileIO.readStringFromResource("cloudreports/gui/reports/resources/log.html");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy");
String timeAndDate = sdf.format(Calendar.getInstance().getTime());
html = html.replace("<!--INSERT_TIME-->", timeAndDate.split(" ")[0]);
html = html.replace("<!--INSERT_DATE-->", timeAndDate.split(" ")[1]);
Log.printLine();
for(DatacenterBroker broker : brokersList) {
List<Cloudlet> list = broker.getCloudletSubmittedList();
printCloudletList(list, broker.getName());
Log.printLine("\n");
}
printDebts(datacentersList);
String log = LogIO.getLogStringFromFile();
log = log.replace("\n", "<br />");
html = html.replace("<!--INSERT_LOG-->", log);
}
/**
* Gets the HTML version of the log.
*
* @return a string that contains the HTML version of the log.
*/
public String getHtml() {
return html;
}
/**
* Prints a HTML table containing information about cloudlets execution.
*
* @param list the list of cloudlets whose information will be
* included in the table.
* @param brokerName the name of the broker.
*/
private void printCloudletList(List<Cloudlet> list, String brokerName) {
int size = list.size();
Cloudlet cloudlet;
String startColumn = "<td><center>";
String endColumn = "</center></td>";
Log.printLine("========== OUTPUT of " + brokerName + " ==========");
Log.print("<table border=\"0\" style=\"color: #C2BEAD\"");
Log.print("<tr>" + startColumn + "Cloudlet ID" + endColumn
+ startColumn + "STATUS" + endColumn
+ startColumn + "Resource ID" + endColumn
+ startColumn + "VM ID" + endColumn
+ startColumn + "Time" + endColumn
+ startColumn + "Start Time" + endColumn
+ startColumn + "Finish Time" + endColumn + "</tr>");
DecimalFormat dft = new DecimalFormat("###.##");
for (int i = 0; i < size; i++) {
cloudlet = list.get(i);
Log.print("<tr>" + startColumn + cloudlet.getCloudletId() + endColumn
+ startColumn + cloudlet.getCloudletStatusString() + endColumn
+ startColumn + cloudlet.getResourceId() + endColumn
+ startColumn + cloudlet.getVmId() + endColumn
+ startColumn + dft.format(cloudlet.getActualCPUTime()) + endColumn
+ startColumn + dft.format(cloudlet.getExecStartTime()) + endColumn
+ startColumn + dft.format(cloudlet.getFinishTime()) + endColumn + "</tr>");
}
Log.print("</table>");
}
/**
* Prints a list of debts generated on each of the simulated datacenters.
*
* @param datacentersList a list of datacenters.
*/
private void printDebts(List<PowerDatacenter> datacentersList) {
Log.printLine();
Log.print("========== Datacenters' Debts ==========\n");
for(PowerDatacenter datacenter : datacentersList) {
datacenter.printDebts();
Log.print("\n");
}
}
}