/projects/jboss-5.1.0/varia/src/main/org/jboss/varia/stats/report/TableReportGenerator.java
Java | 304 lines | 235 code | 40 blank | 29 comment | 47 complexity | 7b097348675b6eeca60500671227aaa9 MD5 | raw file
- /*
- * 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();
- }
- }
- }