package zeta.handler.statistic;
import java.awt.Color;
import java.awt.Paint;
import java.awt.image.BufferedImage;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import zeta.ZetaServlet;
import zeta.util.CachedQueries;
import zeta.util.Charts;
import zeta.util.DatabaseUtils;
import zeta.util.QueryWithSum;
import zeta.util.Table;
public class WorkLoadTodayHandler extends AbstractHandler {
public WorkLoadTodayHandler(ZetaServlet servlet) {
super(servlet, 1200000, 1200000, 1200000); }
public String createPage(Connection con) throws SQLException, ServletException {
StringBuffer buffer = new StringBuffer(70*1024);
buffer.append("<tr><td colspan=\"6\">");
buffer.append("<p><center><img src=\"workload?image=histogram\"/ width=\"");
buffer.append(imgWidth);
buffer.append("\" height=\"");
buffer.append(imgHeight);
buffer.append("\"></center>");
buffer.append("</td></tr>");
buffer.append("<tr><td colspan=\"6\" height=\"30pt\" class=\"second-head-gray\"><center>Workload today:</center></td></tr>");
buffer.append("<tr><td colspan=\"6\">");
buffer.append("<br><center>");
HtmlTableGenerator generator = new HtmlTableGeneratorWithSum(servlet);
Map workloadSummary = getWorkloadSummary(con);
Table table = new Table(5);
table.setColumnName(0, "time");
table.setType(0, Types.VARCHAR);
table.setAlignment(0, Table.LEFT);
table.setColumnName(1, "work units");
table.setType(1, Types.INTEGER);
table.setAlignment(1, Table.RIGHT);
table.setColumnName(2, "workstations");
table.setType(2, Types.INTEGER);
table.setAlignment(2, Table.RIGHT);
table.setColumnName(3, "users");
table.setType(3, Types.INTEGER);
table.setAlignment(3, Table.RIGHT);
table.setColumnName(4, "zeros");
table.setType(4, Types.INTEGER);
table.setAlignment(4, Table.RIGHT);
int day = 0;
Iterator i = workloadSummary.keySet().iterator();
while (i.hasNext()) {
day = Math.max(day, ((Integer)i.next()).intValue()/24);
}
int hours = 0;
i = workloadSummary.keySet().iterator();
while (i.hasNext()) {
if (((Integer)i.next()).intValue()/24 == day) {
++hours;
}
}
for (int hour = 0; hour < 24; ++hour) {
Object[] values = (Object[])workloadSummary.get(new Integer(day*24+hour));
if (values == null) {
if (hours > 0) {
continue;
}
break;
}
--hours;
int row = table.getRowCount();
table.addRow();
table.setValue(row, 0, ((hour < 10)? "0" : "") + hour + ":00 - " + ((hour < 10)? "0" : "") + hour + ":59");
table.setValue(row, 1, values[0]);
table.setValue(row, 2, values[1]);
table.setValue(row, 3, values[2]);
table.setValue(row, 4, values[3]);
}
QueryWithSum.addSum(table);
buffer.append(generator.generate(table));
buffer.append("</center></td></tr>");
return buffer.toString();
}
public BufferedImage createImage(Connection con, String imageName) throws SQLException, ServletException {
final String[] verticalAxisLabels = { "Workload today (" + (new SimpleDateFormat("MM/dd/yyyy", Locale.GERMANY).format(new Date())) + ')',
"Workload yesterday", "Workload per hour today", "Workload per hour yesterday" };
final Paint[] colors = { Color.blue, Color.cyan, Color.red, Color.orange };
final int[] weight = { 6, 1 };
final int[][] combination = { {0, 1}, {2, 3} };
return Charts.generateChart(getImageWidth(imageName), getImageHeight(imageName), "Workload", "Hour", verticalAxisLabels, colors, weight, combination, Charts.createWorkLoad(con, getWorkloadSummary(con)));
}
private Map getWorkloadSummary(Connection con) throws SQLException {
Map workloadSummary = new HashMap(50);
Statement stmt = null;
try {
stmt = con.createStatement();
long maxDays = CachedQueries.getMaxDays(stmt);
Calendar cal = Calendar.getInstance();
ResultSet rs = stmt.executeQuery("SELECT res.stop,comp.server_id,comp.workstation_id,comp.user_id,comp.range"
+ " FROM zeta.result res, zeta.computation comp"
+ " WHERE res.task_id=comp.task_id AND res.work_unit_id=comp.work_unit_id"
+ " AND (DAYS(stop)=" + (maxDays-1) + " OR DAYS(stop)=" + maxDays + ')');
while (rs.next()) {
Timestamp stop = rs.getTimestamp(1);
Integer serverId = new Integer(rs.getInt(2));
Integer workstationId = new Integer(rs.getInt(3));
Integer userId = new Integer(rs.getInt(4));
int range = rs.getInt(5);
cal.setTime(stop);
Integer key = new Integer(cal.get(Calendar.DAY_OF_YEAR)*24 + cal.get(Calendar.HOUR_OF_DAY));
Object[] value = (Object[])workloadSummary.get(key);
if (value == null) {
value = new Object[] { new Integer(1), new HashMap(), new HashMap(), new Long(range) };
workloadSummary.put(key, value);
} else {
value[0] = new Integer(((Integer)value[0]).intValue() + 1);
value[3] = new Long(((Long)value[3]).longValue() + range);
}
Set set = (Set)((Map)value[1]).get(serverId);
if (set == null) {
set = new HashSet();
((Map)value[1]).put(serverId, set);
}
set.add(workstationId);
set = (Set)((Map)value[2]).get(serverId);
if (set == null) {
set = new HashSet();
((Map)value[2]).put(serverId, set);
}
set.add(userId);
}
rs.close();
Iterator i = workloadSummary.keySet().iterator();
while (i.hasNext()) {
Integer key = (Integer)i.next();
Object[] value = (Object[])workloadSummary.get(key);
for (int k = 1; k <= 2; ++k) {
int count = 0;
Iterator j = ((Map)value[k]).values().iterator();
while (j.hasNext()) {
count += ((Set)j.next()).size();
}
value[k] = new Integer(count);
}
}
} finally {
DatabaseUtils.close(stmt);
}
return workloadSummary;
}
}