/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.varia.stats.report; import org.jboss.varia.stats.TxReport; import org.jboss.varia.stats.StatisticalItem; import java.util.Iterator; import java.util.Map; import java.util.HashMap; /** * * @author <a href="mailto:alex@jboss.org">Alexey Loubyansky</a> * @version <tt>$Revision: 81038 $</tt> */ public class TableReportGenerator extends ReportGenerator { // ReportGenerator implementation protected void content(String reportName, StringBuffer content) throws Exception { StringBuffer reportsTable = new StringBuffer(); reportsTable.append("<table><tr><th>Transaction started by</th><th>Total</th></tr>"); Map tables = new HashMap(); Map sqls = new HashMap(); int txTotal = 0; Iterator reports = getReportsIterator(); while(reports.hasNext()) { TxReport report = (TxReport) reports.next(); txTotal += report.getCount(); reportsTable.append("<tr><td>"); boolean selected = report.getName().equals(reportName); if(!selected) { reportsTable.append("<a href='HtmlAdaptor?") .append("action=invokeOpByName&name=") .append(getServiceName()) .append("&methodName=generate&") .append("argType=java.lang.String&arg0=") .append(report.getName()) .append("'>"); } reportsTable.append(report.getName()); if(!selected) { reportsTable.append("</a>"); } reportsTable.append("</td><td>") .append(report.getCount()).append("</td></tr>"); if(selected || reportName == null || reportName.trim().length() == 0) { generateReport(report, sqls, tables); } } reportsTable.append("<tr><td>"); boolean select = reportName != null && reportName.trim().length() > 0; if(select) { reportsTable.append("<a href='HtmlAdaptor?") .append("action=invokeOpByName&name=") .append(getServiceName()) .append("&methodName=generate&") .append("argType=java.lang.String&arg0=") .append("'>"); } reportsTable.append("all transactions"); if(select) { reportsTable.append("</a>"); } reportsTable.append("</td><td>").append(txTotal).append("</td></tr></table>"); StringBuffer tablesBuf = new StringBuffer(); tablesBuf.append( "<table><tr><th>Table</th><th>selects</th><th>updates</th><th>inserts</th><th>deletes</th></tr>"); int totalSelects = 0; int totalUpdates = 0; int totalInserts = 0; int totalDeletes = 0; for(Iterator tableIter = tables.values().iterator(); tableIter.hasNext();) { TableStats table = (TableStats) tableIter.next(); tablesBuf.append("<tr><td>").append(table.name).append("</td><td>") .append(table.selects).append("</td><td>") .append(table.updates).append("</td><td>") .append(table.inserts).append("</td><td>") .append(table.deletes).append("</td></tr>"); totalSelects += table.selects; totalUpdates += table.updates; totalInserts += table.inserts; totalDeletes += table.deletes; } tablesBuf.append("<tr><td><font color='red'>total</font></td><td><font color='red'>") .append(totalSelects).append("</font></td><td><font color='red'>") .append(totalUpdates).append("</font></td><td><font color='red'>") .append(totalInserts).append("</font></td><td><font color='red'>") .append(totalDeletes).append("</font></td></tr>") .append("</table>"); StringBuffer itemsTable = new StringBuffer(); itemsTable.append("<table><tr><th>SQL</th><th>Total</th></tr>"); int totalStmt = 0; for(Iterator itemIter = sqls.values().iterator(); itemIter.hasNext();) { SqlStats sql = (SqlStats)itemIter.next(); itemsTable.append("<tr><td>").append(sql.sql) .append("</td><td>").append(sql.total).append("</td></tr>"); totalStmt += sql.total; } itemsTable.append("<tr><td><font color='red'>total</font></td><td><font color='red'>") .append(totalStmt).append("</font></td></tr></table>"); content.append("<table><tr valign='top'><td>") .append(reportsTable) .append("</td><td>").append(tablesBuf) .append("</td><td>").append(itemsTable) .append("</td></tr></table>"); } // Private private void generateReport(TxReport report, Map sqls, Map tables) { Map itemMap = (Map) report.getStats().get(TxReport.SqlStats.NAME); if(itemMap != null) { for(Iterator items = itemMap.values().iterator(); items.hasNext();) { StatisticalItem item = (StatisticalItem) items.next(); String sql = item.getValue().toLowerCase(); SqlStats sqlStats = (SqlStats)sqls.get(sql); if(sqlStats == null) { sqlStats = new SqlStats(sql); sqls.put(sql, sqlStats); } sqlStats.total += item.getCount(); if(sql.startsWith("select ")) { int fromStart = sql.indexOf("from "); if(fromStart == -1) { throw new IllegalStateException("FROM not found in: " + sql); } String table = sql.substring(fromStart + "from ".length()); int tableEnd = table.indexOf(' '); if(tableEnd != -1) { table = table.substring(0, tableEnd); } TableStats tableStats = (TableStats) tables.get(table); if(tableStats == null) { tableStats = new TableStats(table); tables.put(table, tableStats); } tableStats.selects += item.getCount(); } else if(sql.startsWith("update ")) { String table = sql.substring("update ".length()); int tableEnd = table.indexOf(' '); if(tableEnd == -1) { throw new IllegalStateException("Could not find end of the table name: " + sql); } table = table.substring(0, tableEnd); TableStats tableStats = (TableStats) tables.get(table); if(tableStats == null) { tableStats = new TableStats(table); tables.put(table, tableStats); } tableStats.updates += item.getCount(); } else if(sql.startsWith("insert into ")) { String table = sql.substring("insert into ".length()); int tableEnd = table.indexOf('('); if(tableEnd == -1) { throw new IllegalStateException("Could not find end of the table name: " + sql); } table = table.substring(0, tableEnd).trim(); TableStats tableStats = (TableStats) tables.get(table); if(tableStats == null) { tableStats = new TableStats(table); tables.put(table, tableStats); } tableStats.inserts += item.getCount(); } else if(sql.startsWith("delete from ")) { String table = sql.substring("delete from ".length()); int tableEnd = table.indexOf(' '); if(tableEnd == -1) { throw new IllegalStateException("Could not find end of the table name: " + sql); } table = table.substring(0, tableEnd); TableStats tableStats = (TableStats) tables.get(table); if(tableStats == null) { tableStats = new TableStats(table); tables.put(table, tableStats); } tableStats.deletes += item.getCount(); } else { throw new IllegalStateException("Unrecognized sql statement: " + sql); } } } } // Inner private static class SqlStats { public final String sql; public int total; public SqlStats(String sql) { this.sql = sql; } } private static class TableStats { public final String name; public int selects; public int updates; public int inserts; public int deletes; public TableStats(String name) { this.name = name; } public boolean equals(Object o) { if(this == o) return true; if(!(o instanceof TableStats)) return false; final TableStats tableStats = (TableStats) o; if(!name.equals(tableStats.name)) return false; return true; } public int hashCode() { return name.hashCode(); } } }