/*
* IronJacamar, a Java EE Connector Architecture implementation
* Copyright 2016, Red Hat Inc, 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 Eclipse Public License 1.0 as
* published by the Free Software Foundation.
*
* 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 Eclipse
* Public License for more details.
*
* You should have received a copy of the Eclipse 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.ironjacamar.tracer;
import org.ironjacamar.Version;
import org.ironjacamar.core.tracer.TraceEvent;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**
* HTML report generator for a tracer log
*/
public class HTMLReport
{
private static final String NEW_LINE = System.getProperty("line.separator", "\n");
/**
* Write string
* @param fw The file writer
* @param s The string
* @exception Exception If an error occurs
*/
static void writeString(FileWriter fw, String s) throws Exception
{
for (int i = 0; i < s.length(); i++)
{
fw.write((int)s.charAt(i));
}
}
/**
* Write EOL
* @param fw The file writer
* @exception Exception If an error occurs
*/
static void writeEOL(FileWriter fw) throws Exception
{
writeString(fw, NEW_LINE);
}
/**
* Write top-level index.html
* @param poolNames The pool names
* @param statuses The overall status of each pool
* @param ccmStatus The status of the CCM
* @param ccmPoolStatuses The CCM status of the pools
* @param version The version information
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateTopLevelIndexHTML(Set<String> poolNames,
Map<String, TraceEventStatus> statuses,
TraceEventStatus ccmStatus,
Map<String, TraceEventStatus> ccmPoolStatuses,
TraceEvent version,
FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>IronJacamar tracer report</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>IronJacamar tracer report</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Generated:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + new Date() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Data:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + Version.PROJECT + " " + (version != null ? version.getPool() : "Unknown") + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>By:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + Version.FULL_VERSION + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<h2>Pool</h2>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
for (String name : poolNames)
{
TraceEventStatus status = statuses.get(name);
writeString(fw, "<li>");
writeString(fw, "<a href=\"" + name + "/index.html\"><div style=\"color: ");
if (status != null)
{
writeString(fw, status.getColor());
}
else
{
writeString(fw, TraceEventStatus.GREEN.getColor());
}
writeString(fw, ";\">");
writeString(fw, name);
writeString(fw, "</div></a>");
writeEOL(fw);
writeString(fw, "</li>");
writeEOL(fw);
}
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "<h2>Lifecycle</h2>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
for (String name : poolNames)
{
writeString(fw, "<li>");
writeString(fw, "<a href=\"" + name + "/lifecycle.html\">");
writeString(fw, name);
writeString(fw, "</a>");
writeEOL(fw);
writeString(fw, "</li>");
writeEOL(fw);
}
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "<h2>CachedConnectionManager</h2>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
writeString(fw, "<li><a href=\"CachedConnectionManager/ccm.html\"><div style=\"color: ");
writeString(fw, ccmStatus.getColor());
writeString(fw, ";\">Main report</div></a></li>");
writeEOL(fw);
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
for (String name : poolNames)
{
writeString(fw, "<li>");
writeString(fw, "<a href=\"" + name + "/ccm.html\"><div style=\"color: ");
TraceEventStatus ps = ccmPoolStatuses.get(name);
if (ps != null)
{
writeString(fw, ps.getColor());
}
else
{
writeString(fw, TraceEventStatus.GREEN.getColor());
}
writeString(fw, ";\">");
writeString(fw, name);
writeString(fw, "</div></a>");
writeEOL(fw);
writeString(fw, "</li>");
writeEOL(fw);
}
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "<h2>Reference</h2>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
writeString(fw, "<li><a href=\"toc-c.html\">Connection</a></li>");
writeEOL(fw);
writeString(fw, "<li><a href=\"toc-mc.html\">ManagedConnection</a></li>");
writeEOL(fw);
writeString(fw, "<li><a href=\"toc-cl.html\">ConnectionListener</a></li>");
writeEOL(fw);
writeString(fw, "<li><a href=\"toc-mcp.html\">ManagedConnectionPool</a></li>");
writeEOL(fw);
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "<h2>Other</h2>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
writeString(fw, "<li><a href=\"transaction.html\">Transaction</a></li>");
writeEOL(fw);
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write pool index.html
* @param poolName The name of the pool
* @param overallStatus The overall status of the pool
* @param mcps The managed connection pools
* @param statuses The overall status of each connection listener
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generatePoolIndexHTML(String poolName, TraceEventStatus overallStatus, Set<String> mcps,
Map<String, TraceEventStatus> statuses, FileWriter fw)
throws Exception
{
if (overallStatus == null)
overallStatus = TraceEventStatus.GREEN;
if (mcps == null)
mcps = new HashSet<String>();
if (statuses == null)
statuses = new TreeMap<String, TraceEventStatus>();
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>Pool: " + poolName + "</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>Pool: " + poolName + "</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Status:</b></td>");
writeEOL(fw);
writeString(fw, "<td><div style=\"color: " + overallStatus.getColor() + ";\">");
writeString(fw, overallStatus.getDescription());
writeString(fw, "</div></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool:</b></td>");
writeEOL(fw);
writeString(fw, "<td>");
Iterator<String> mcpIt = mcps.iterator();
while (mcpIt.hasNext())
{
String mcp = mcpIt.next();
writeString(fw, mcp);
if (mcpIt.hasNext())
writeString(fw, "<br/>");
}
writeString(fw, "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<h2>ConnectionListeners</h2>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
Iterator<Map.Entry<String, TraceEventStatus>> it = statuses.entrySet().iterator();
while (it.hasNext())
{
Map.Entry<String, TraceEventStatus> entry = it.next();
String directory = entry.getKey();
writeString(fw, "<li>");
writeString(fw, "<a href=\"" + directory + "/index.html\"><div style=\"color: ");
writeString(fw, entry.getValue().getColor());
writeString(fw, ";\">");
writeString(fw, directory);
writeString(fw, "</div></a>");
writeEOL(fw);
writeString(fw, "</li>");
writeEOL(fw);
}
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<h2>Lifecycle</h2>");
writeEOL(fw);
writeString(fw, "<a href=\"lifecycle.html\">Report</a>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<h2>CachedConnectionManager</h2>");
writeEOL(fw);
writeString(fw, "<a href=\"ccm.html\">Report</a>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"../index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write ConnectionListener index.html
* @param identifier The identifier
* @param data The data
* @param status The overall status
* @param createCallStack The CREATE callstack
* @param destroyCallStack The DESTROY callstack
* @param noSDedit Should SDedit functionality be disabled
* @param root The root directory
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateConnectionListenerIndexHTML(String identifier,
List<Interaction> data,
TraceEventStatus status,
TraceEvent createCallStack, TraceEvent destroyCallStack,
boolean noSDedit,
String root, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>ConnectionListener: " + identifier + "</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>ConnectionListener: " + identifier + "</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Pool:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + createCallStack.getPool() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + createCallStack.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnection:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + createCallStack.getPayload1() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
if (createCallStack != null)
{
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Created:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + createCallStack.getTimestamp() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
if (destroyCallStack != null)
{
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Destroyed:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + destroyCallStack.getTimestamp() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Status:</b></td>");
writeEOL(fw);
writeString(fw, "<td><div style=\"color: " + status.getColor() + ";\">");
writeString(fw, status.getDescription());
writeString(fw, "</div></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<h2>Reports</h2>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
for (Interaction interaction : data)
{
String durationKey = interaction.getStartTime() + "-" + interaction.getEndTime();
writeString(fw, "<li>");
writeString(fw, "<a href=\"" + durationKey + "/index.html\"><div style=\"color: ");
writeString(fw, interaction.getStatus().getColor());
writeString(fw, ";\">");
writeString(fw, durationKey);
writeString(fw, "</div></a>");
writeEOL(fw);
writeString(fw, "</li>");
writeEOL(fw);
FileWriter cl = null;
try
{
File f = new File(root + "/" + durationKey);
f.mkdirs();
cl = new FileWriter(f.getAbsolutePath() + "/" + "index.html");
generateConnectionListenerReportHTML(f.getCanonicalPath(), identifier,
createCallStack.getPayload1(),
interaction, noSDedit, cl);
}
finally
{
if (cl != null)
{
try
{
cl.flush();
cl.close();
}
catch (Exception e)
{
// Ignore
}
}
}
if (status == TraceEventStatus.GREEN && !noSDedit)
{
FileWriter sdedit = null;
try
{
File f = new File(root + "/" + durationKey);
f.mkdirs();
sdedit = new FileWriter(f.getAbsolutePath() + "/" + identifier + ".sdx");
SDeditGenerator.generateSDedit(interaction.getEvents(), sdedit);
}
finally
{
if (sdedit != null)
{
try
{
sdedit.flush();
sdedit.close();
}
catch (Exception e)
{
// Ignore
}
}
}
}
}
writeString(fw, "</ul>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
if (createCallStack != null && !createCallStack.getPayload2().equals(""))
{
writeString(fw, "<h2>CREATE callstack</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
writeString(fw, TraceEventHelper.exceptionDescription(createCallStack.getPayload2()));
writeEOL(fw);
writeString(fw, "</pre>");
writeEOL(fw);
}
if (destroyCallStack != null && !destroyCallStack.getPayload1().equals(""))
{
writeString(fw, "<h2>DESTROY callstack</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
writeString(fw, TraceEventHelper.exceptionDescription(destroyCallStack.getPayload1()));
writeEOL(fw);
writeString(fw, "</pre>");
writeEOL(fw);
}
writeString(fw, "<a href=\"../index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write ConnectionListener report
* @param root The root directory
* @param identifier The identifier
* @param mc The managed connection
* @param interaction The interaction
* @param noSDedit Should SDedit functionality be disabled
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateConnectionListenerReportHTML(String root, String identifier, String mc,
Interaction interaction,
boolean noSDedit,
FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>ConnectionListener: " + identifier + " (" + interaction.getStartTime() +
"-" + interaction.getEndTime() + ")</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>ConnectionListener: " + identifier + "</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Pool:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getPool() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnection:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + mc + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>From:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getStartTime() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>To:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getEndTime() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Thread:</b></td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getThread() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Status:</b></td>");
writeEOL(fw);
writeString(fw, "<td><div style=\"color: " + interaction.getStatus().getColor() + ";\">");
writeString(fw, interaction.getStatus().getDescription());
writeString(fw, "</div></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "</table>");
writeEOL(fw);
if (!noSDedit)
{
writeString(fw, "<h2>Sequence diagram</h2>");
writeEOL(fw);
if (interaction.getStatus() == TraceEventStatus.GREEN)
{
writeString(fw, "<image src=\"");
writeString(fw, identifier);
writeString(fw, ".png\" alt=\"SDedit image\"/>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "Generate the image by: <i>sdedit -t png -o ");
writeString(fw, root);
writeString(fw, "/");
writeString(fw, identifier);
writeString(fw, ".png ");
writeString(fw, root);
writeString(fw, "/");
writeString(fw, identifier);
writeString(fw, ".sdx ");
writeString(fw, "</i>");
writeEOL(fw);
}
else
{
writeString(fw, "See Description or Data for recorded data");
writeEOL(fw);
}
}
writeString(fw, "<h2>Description</h2>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<thead align=\"left\">");
writeEOL(fw);
writeString(fw, "<th>Timestamp</th>");
writeEOL(fw);
writeString(fw, "<th>Description</th>");
writeEOL(fw);
writeString(fw, "</thead>");
writeEOL(fw);
writeString(fw, "<tbody>");
writeEOL(fw);
for (TraceEvent te : interaction.getEvents())
{
writeString(fw, "<tr>");
writeEOL(fw);
// Timestamp
writeString(fw, "<td>");
if (TraceEventHelper.isRed(te))
{
writeString(fw, "<div style=\"color: red;\">");
}
else if (TraceEventHelper.isYellow(te))
{
writeString(fw, "<div style=\"color: yellow;\">");
}
writeString(fw, Long.toString(te.getTimestamp()));
if (TraceEventHelper.isRed(te) || TraceEventHelper.isYellow(te))
writeString(fw, "</div>");
writeString(fw, "</td>");
writeEOL(fw);
// Text
writeString(fw, "<td>");
if (TraceEventHelper.isRed(te))
{
writeString(fw, "<div style=\"color: red;\">");
}
else if (TraceEventHelper.isYellow(te))
{
writeString(fw, "<div style=\"color: yellow;\">");
}
writeString(fw, TraceEvent.asText(te));
if (TraceEventHelper.isRed(te) || TraceEventHelper.isYellow(te))
writeString(fw, "</div>");
writeString(fw, "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</tbody>");
writeEOL(fw);
writeString(fw, "</table>");
writeEOL(fw);
TraceEvent createCallStack =
TraceEventHelper.getType(interaction.getEvents(),
TraceEvent.CREATE_CONNECTION_LISTENER_GET);
if (createCallStack != null && createCallStack.getPayload2() != null && !createCallStack.getPayload2().equals(""))
{
writeString(fw, "<h2>CREATE callstack</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
writeString(fw, TraceEventHelper.exceptionDescription(createCallStack.getPayload2()));
writeEOL(fw);
writeString(fw, "</pre>");
writeEOL(fw);
}
TraceEvent getCallStack =
TraceEventHelper.getType(interaction.getEvents(),
TraceEvent.GET_CONNECTION_LISTENER,
TraceEvent.GET_CONNECTION_LISTENER_NEW,
TraceEvent.GET_INTERLEAVING_CONNECTION_LISTENER,
TraceEvent.GET_INTERLEAVING_CONNECTION_LISTENER_NEW);
if (getCallStack != null && getCallStack.getPayload1() != null && !getCallStack.getPayload1().equals(""))
{
writeString(fw, "<h2>GET callstack</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
writeString(fw, TraceEventHelper.exceptionDescription(getCallStack.getPayload1()));
writeEOL(fw);
writeString(fw, "</pre>");
writeEOL(fw);
}
TraceEvent returnCallStack =
TraceEventHelper.getType(interaction.getEvents(),
TraceEvent.RETURN_CONNECTION_LISTENER,
TraceEvent.RETURN_CONNECTION_LISTENER_WITH_KILL,
TraceEvent.RETURN_INTERLEAVING_CONNECTION_LISTENER,
TraceEvent.RETURN_INTERLEAVING_CONNECTION_LISTENER_WITH_KILL);
if (returnCallStack != null && returnCallStack.getPayload1() != null && !returnCallStack.getPayload1().equals(""))
{
writeString(fw, "<h2>RETURN callstack</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
writeString(fw, TraceEventHelper.exceptionDescription(returnCallStack.getPayload1()));
writeEOL(fw);
writeString(fw, "</pre>");
writeEOL(fw);
}
TraceEvent destroyCallStack =
TraceEventHelper.getType(interaction.getEvents(),
TraceEvent.DESTROY_CONNECTION_LISTENER_RETURN);
if (destroyCallStack != null && destroyCallStack.getPayload1() != null &&
!destroyCallStack.getPayload1().equals(""))
{
writeString(fw, "<h2>DESTROY callstack</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
writeString(fw, TraceEventHelper.exceptionDescription(destroyCallStack.getPayload1()));
writeEOL(fw);
writeString(fw, "</pre>");
writeEOL(fw);
}
if (TraceEventHelper.hasException(interaction.getEvents()))
{
writeString(fw, "<h2>Exception</h2>");
writeEOL(fw);
for (TraceEvent te : interaction.getEvents())
{
if (te.getType() == TraceEvent.EXCEPTION)
{
writeString(fw, "<pre>");
writeEOL(fw);
writeString(fw, TraceEventHelper.exceptionDescription(te.getPayload1()));
writeEOL(fw);
writeString(fw, "</pre>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
}
}
}
writeString(fw, "<h2>Data</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
for (TraceEvent te : interaction.getEvents())
{
writeString(fw, TraceEventHelper.prettyPrint(te));
writeEOL(fw);
}
writeString(fw, "</pre>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"../index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write lifecycle.html
* @param poolName The name of the pool
* @param events The events
* @param activeCLs The active connection listeners
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateLifecycleHTML(String poolName, List<TraceEvent> events,
Set<String> activeCLs, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>Lifecycle: " + poolName + "</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>Lifecycle: " + poolName + "</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Timestamp</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Event</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ConnectionListener</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (TraceEvent te : events)
{
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td>" + te.getTimestamp() + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + te.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + TraceEvent.asText(te) + "</td>");
writeEOL(fw);
if (!"NONE".equals(te.getConnectionListener()))
{
if (activeCLs.contains(te.getConnectionListener()))
{
writeString(fw, "<td><a href=\"" + te.getConnectionListener() + "/index.html\">" +
te.getConnectionListener() + "</a></td>");
}
else
{
writeString(fw, "<td>" + te.getConnectionListener() + "</td>");
}
}
else
{
writeString(fw, "<td></td>");
}
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<h2>Pool</h2>");
writeEOL(fw);
writeString(fw, "<a href=\"index.html\">Report</a>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<h2>CachedConnectionManager</h2>");
writeEOL(fw);
writeString(fw, "<a href=\"ccm.html\">Report</a>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<h2>Data</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
for (TraceEvent te : events)
{
writeString(fw, TraceEventHelper.prettyPrint(te));
writeEOL(fw);
}
writeString(fw, "</pre>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"../index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write ccm.html for the CCM
* @param events The events
* @param status The status
* @param path The root path
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateCCMHTML(List<TraceEvent> events, TraceEventStatus status, String path, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>CachedConnectionManager</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>CachedConnectionManager</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Status:</b></td><td><div style=\"color: ");
writeString(fw, status.getColor());
writeString(fw, ";\">");
writeString(fw, status.getDescription());
writeString(fw, "</div></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Timestamp</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Thread</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Event</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Key</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Call stack</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (TraceEvent te : events)
{
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td>" + te.getTimestamp() + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + te.getThreadId() + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + TraceEvent.asText(te) + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + te.getPayload1() + "</td>");
writeEOL(fw);
String callstack = te.getPayload1();
if (te.getType() == TraceEvent.PUSH_CCM_CONTEXT)
{
callstack += "-push";
}
else
{
callstack += "-pop";
}
callstack += ".txt";
writeString(fw, "<td><a href=\"" + callstack + "\">Link</a></td>");
writeEOL(fw);
FileWriter report = null;
try
{
report = new FileWriter(path + "/" + callstack);
writeString(report, TraceEventHelper.exceptionDescription(te.getPayload2()));
writeEOL(report);
}
finally
{
if (report != null)
{
try
{
report.flush();
report.close();
}
catch (Exception e)
{
// Ignore
}
}
}
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"../index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write ccm.html for pools
* @param poolName The name of the pool
* @param events The events
* @param status The status
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateCCMPoolHTML(String poolName, List<TraceEvent> events,
TraceEventStatus status, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>CCM: " + poolName + "</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>CCM: " + poolName + "</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Status:</b></td><td><div style=\"color: ");
writeString(fw, status.getColor());
writeString(fw, ";\">");
writeString(fw, status.getDescription());
writeString(fw, "</div></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Timestamp</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Thread</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Event</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ConnectionListener</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Connection</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Key</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (TraceEvent te : events)
{
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td>" + te.getTimestamp() + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + te.getThreadId() + "</td>");
writeEOL(fw);
if (!"NONE".equals(te.getManagedConnectionPool()))
{
writeString(fw, "<td>" + te.getManagedConnectionPool() + "</td>");
}
else
{
writeString(fw, "<td></td>");
}
writeEOL(fw);
writeString(fw, "<td>" + TraceEvent.asText(te) + "</td>");
writeEOL(fw);
if (!"NONE".equals(te.getConnectionListener()))
{
writeString(fw, "<td><a href=\"" + te.getConnectionListener() + "/index.html\">" +
te.getConnectionListener() + "</a></td>");
}
else
{
writeString(fw, "<td></td>");
}
writeEOL(fw);
if (!"NONE".equals(te.getPayload1()))
{
writeString(fw, "<td>" + te.getPayload1() + "</td>");
}
else
{
writeString(fw, "<td></td>");
}
writeEOL(fw);
writeString(fw, "<td>" + te.getPayload2() + "</td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<h2>Pool</h2>");
writeEOL(fw);
writeString(fw, "<a href=\"index.html\">Report</a>");
writeEOL(fw);
writeString(fw, "<h2>Lifecycle</h2>");
writeEOL(fw);
writeString(fw, "<a href=\"lifecycle.html\">Report</a>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<h2>Data</h2>");
writeEOL(fw);
writeString(fw, "<pre>");
writeEOL(fw);
for (TraceEvent te : events)
{
writeString(fw, TraceEventHelper.prettyPrint(te));
writeEOL(fw);
}
writeString(fw, "</pre>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"../index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write toc-c.html for connections
* @param events The events
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateToCConnection(Map<String, List<TraceEvent>> events, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>Reference: Connection</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>Reference: Connection</h1>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
for (String id : events.keySet())
{
writeString(fw, "<li><a href=\"#" + id + "\">" + id + "</a></li>");
writeEOL(fw);
}
writeString(fw, "</ul>");
writeEOL(fw);
for (Map.Entry<String, List<TraceEvent>> entry : events.entrySet())
{
writeString(fw, "<a name=\"" + entry.getKey() + "\"><h2>" + entry.getKey() + "</h2></a>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Timestamp</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ConnectionListener</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Pool</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (TraceEvent te : entry.getValue())
{
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td>" + te.getTimestamp() + "</td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/" + te.getConnectionListener() + "/index.html\">" +
te.getConnectionListener() + "</a></td>");
writeEOL(fw);
writeString(fw, "<td>" + te.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/index.html\">" + te.getPool() + "</a></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
}
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write toc-mc.html for managed connections
* @param events The events
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateToCManagedConnection(Map<String, TraceEvent> events, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>Reference: ManagedConnection</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>Reference: ManagedConnection</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnection</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ConnectionListener</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Pool</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (Map.Entry<String, TraceEvent> entry : events.entrySet())
{
TraceEvent te = entry.getValue();
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/" + te.getConnectionListener() + "/index.html\">" +
te.getPayload1() + "</a></td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/" + te.getConnectionListener() + "/index.html\">" +
te.getConnectionListener() + "</a></td>");
writeEOL(fw);
writeString(fw, "<td>" + te.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/index.html\">" + te.getPool() + "</a></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write toc-cl.html for connection listeners
* @param events The events
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateToCConnectionListener(Map<String, List<TraceEvent>> events, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>Reference: ConnectionListener</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>Reference: ConnectionListener</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ConnectionListener</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Pool</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (Map.Entry<String, List<TraceEvent>> entry : events.entrySet())
{
TraceEvent te = entry.getValue().get(0);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/" + te.getConnectionListener() + "/index.html\">" +
te.getConnectionListener() + "</a></td>");
writeEOL(fw);
writeString(fw, "<td>" + te.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/index.html\">" + te.getPool() + "</a></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write toc-mcp.html for managed connection pool
* @param events The events
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateToCManagedConnectionPool(Map<String, List<TraceEvent>> events, FileWriter fw)
throws Exception
{
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>Reference: ManagedConnectionPool</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7;\">");
writeEOL(fw);
writeString(fw, "<h1>Reference: ManagedConnectionPool</h1>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Pool</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (Map.Entry<String, List<TraceEvent>> entry : events.entrySet())
{
TraceEvent te = entry.getValue().get(0);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td>" + te.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + te.getPool() + "/index.html\">" + te.getPool() + "</a></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
writeString(fw, "<a href=\"index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Write transaction.html for transactions
* @param data The data
* @param fw The file writer
* @exception Exception If an error occurs
*/
private static void generateTransaction(Map<String, List<Interaction>> data, FileWriter fw)
throws Exception
{
Map<String, TraceEventStatus> txStatus = new TreeMap<String, TraceEventStatus>();
for (Map.Entry<String, List<Interaction>> entry : data.entrySet())
{
List<TraceEventStatus> statuses = new ArrayList<TraceEventStatus>();
for (Interaction interaction : entry.getValue())
statuses.add(interaction.getStatus());
txStatus.put(entry.getKey(), TraceEventHelper.mergeStatus(statuses));
}
writeString(fw, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
writeEOL(fw);
writeString(fw, " \"http://www.w3.org/TR/html4/loose.dtd\">");
writeEOL(fw);
writeString(fw, "<html>");
writeEOL(fw);
writeString(fw, "<head>");
writeEOL(fw);
writeString(fw, "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
writeEOL(fw);
writeString(fw, "<title>Transaction</title>");
writeEOL(fw);
writeString(fw, "</head>");
writeEOL(fw);
writeString(fw, "<body style=\"background: #D7D7D7; width: 100%;\">");
writeEOL(fw);
writeString(fw, "<h1>Transaction</h1>");
writeEOL(fw);
writeString(fw, "<ul>");
writeEOL(fw);
for (Map.Entry<String, List<Interaction>> entry : data.entrySet())
{
TraceEventStatus status = txStatus.get(entry.getKey());
writeString(fw, "<li><a href=\"#" + entry.getKey() + "\">" +
"<div style=\"color: " + status.getColor() + ";\">" + entry.getKey() + "</div></a> (" +
entry.getValue().size() + ")</li>");
writeEOL(fw);
}
writeString(fw, "</ul>");
writeEOL(fw);
for (Map.Entry<String, List<Interaction>> entry : data.entrySet())
{
TraceEventStatus status = txStatus.get(entry.getKey());
writeString(fw, "<a name=\"" + entry.getKey() + "\"><h2>Transaction: <div style=\"color: " +
status.getColor() + ";\">" + entry.getKey() + "</div></h2></a>");
writeEOL(fw);
writeString(fw, "<table>");
writeEOL(fw);
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td><b>Start</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>End</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Thread</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>Pool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ManagedConnectionPool</b></td>");
writeEOL(fw);
writeString(fw, "<td><b>ConnectionListener</b></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
for (Interaction interaction : entry.getValue())
{
writeString(fw, "<tr>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getStartTime() + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getEndTime() + "</td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getThread() + "</td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + interaction.getPool() + "/index.html\">" +
interaction.getPool() + "</a></td>");
writeEOL(fw);
writeString(fw, "<td>" + interaction.getManagedConnectionPool() + "</td>");
writeEOL(fw);
writeString(fw, "<td><a href=\"" + interaction.getPool() + "/" + interaction.getConnectionListener() + "/" +
interaction.getStartTime() + "-" + interaction.getEndTime() +
"/index.html\">" + interaction.getConnectionListener() + "</a></td>");
writeEOL(fw);
writeString(fw, "</tr>");
writeEOL(fw);
}
writeString(fw, "</table>");
writeEOL(fw);
writeString(fw, "<p>");
writeEOL(fw);
}
writeString(fw, "<a href=\"index.html\">Back</a>");
writeEOL(fw);
writeString(fw, "</body>");
writeEOL(fw);
writeString(fw, "</html>");
writeEOL(fw);
}
/**
* Main
* @param args The arguments
*/
public static void main(String[] args)
{
if (args == null || args.length < 1)
{
System.out.println("Usage: HTMLReport [-ignore-delist] [-ignore-tracking] " +
"[-ignore-incomplete] [-no-sdedit] <file> [<output>]");
return;
}
boolean ignoreDelist = false;
boolean ignoreTracking = false;
boolean ignoreIncomplete = false;
boolean noSDedit = false;
int argCount = 0;
if ("-ignore-delist".equalsIgnoreCase(args[argCount]))
{
ignoreDelist = true;
argCount++;
}
if ("-ignore-tracking".equalsIgnoreCase(args[argCount]))
{
ignoreTracking = true;
argCount++;
}
if ("-ignore-incomplete".equalsIgnoreCase(args[argCount]))
{
ignoreIncomplete = true;
argCount++;
}
if ("-no-sdedit".equalsIgnoreCase(args[argCount]))
{
noSDedit = true;
argCount++;
}
File logFile = new File(args[argCount]);
FileReader logReader = null;
String rootDirectory = "report";
if (args.length > argCount + 1)
rootDirectory = args[argCount + 1];
File root = new File(rootDirectory);
try
{
logReader = new FileReader(logFile);
root.mkdirs();
List<TraceEvent> events = TraceEventHelper.getEvents(logReader, root);
Map<String, List<Interaction>> poolData =
TraceEventHelper.getPoolData(TraceEventHelper.filterPoolEvents(events),
ignoreDelist, ignoreTracking, ignoreIncomplete);
Map<String, List<TraceEvent>> filteredLifecycle = TraceEventHelper.filterLifecycleEvents(events);
List<TraceEvent> filteredCCM = TraceEventHelper.filterCCMEvents(events);
Map<String, List<TraceEvent>> filteredCCMPool = TraceEventHelper.filterCCMPoolEvents(events);
Map<String, Set<String>> poolMCPs = TraceEventHelper.poolManagedConnectionPools(events);
Map<String, List<TraceEvent>> tocConnections = TraceEventHelper.tocConnections(events);
Map<String, TraceEvent> tocManagedConnections = TraceEventHelper.tocManagedConnections(events);
Map<String, List<TraceEvent>> tocConnectionListeners = TraceEventHelper.tocConnectionListeners(events);
Map<String, List<TraceEvent>> tocMCPs = TraceEventHelper.tocManagedConnectionPools(events);
// CCM status calculation
TraceEventStatus ccmStatus = TraceEventHelper.getCCMStatus(filteredCCM, ignoreIncomplete);
Map<String, TraceEventStatus> ccmPoolStatus = new TreeMap<String, TraceEventStatus>();
for (Map.Entry<String, List<TraceEvent>> entry : filteredCCMPool.entrySet())
{
ccmPoolStatus.put(entry.getKey(), TraceEventHelper.getCCMPoolStatus(entry.getValue(), ignoreIncomplete));
}
// Overall pool status
Map<String, TraceEventStatus> overallPoolStatus = new TreeMap<String, TraceEventStatus>();
for (String poolName : filteredLifecycle.keySet())
{
List<Interaction> interactions = poolData.get(poolName);
overallPoolStatus.put(poolName, TraceEventStatus.GREEN);
if (interactions != null)
{
List<TraceEventStatus> statuses = new ArrayList<TraceEventStatus>();
for (Interaction interaction : interactions)
statuses.add(interaction.getStatus());
overallPoolStatus.put(poolName, TraceEventHelper.mergeStatus(statuses));
}
}
FileWriter topLevel = null;
try
{
topLevel = new FileWriter(root.getAbsolutePath() + "/" + "index.html");
generateTopLevelIndexHTML(filteredLifecycle.keySet(), overallPoolStatus,
ccmStatus, ccmPoolStatus,
TraceEventHelper.getVersion(events), topLevel);
}
finally
{
if (topLevel != null)
{
try
{
topLevel.flush();
topLevel.close();
}
catch (Exception e)
{
// Ignore
}
}
}
for (String poolName : filteredLifecycle.keySet())
{
List<Interaction> data = poolData.get(poolName);
FileWriter pool = null;
try
{
String path = root.getAbsolutePath() + "/" + poolName;
File f = new File(path);
f.mkdirs();
Map<String, TraceEventStatus> clStatus = new TreeMap<String, TraceEventStatus>();
if (data != null)
{
Map<String, List<Interaction>> clInteractions = TraceEventHelper.getConnectionListenerData(data);
Iterator<Map.Entry<String, List<Interaction>>> dataIt = clInteractions.entrySet().iterator();
while (dataIt.hasNext())
{
Map.Entry<String, List<Interaction>> dataEntry = dataIt.next();
String identifier = dataEntry.getKey();
// Calculate connection listener status
List<TraceEventStatus> clStatuses = new ArrayList<TraceEventStatus>();
for (Interaction interaction : dataEntry.getValue())
clStatuses.add(interaction.getStatus());
TraceEventStatus currentCLStatus = TraceEventHelper.mergeStatus(clStatuses);
clStatus.put(identifier, currentCLStatus);
FileWriter cl = null;
try
{
String clPath = path + "/" + identifier;
File clF = new File(clPath);
clF.mkdirs();
cl = new FileWriter(clF.getAbsolutePath() + "/" + "index.html");
TraceEvent createCallStack =
TraceEventHelper.getType(events, identifier,
TraceEvent.CREATE_CONNECTION_LISTENER_GET,
TraceEvent.CREATE_CONNECTION_LISTENER_PREFILL,
TraceEvent.CREATE_CONNECTION_LISTENER_INCREMENTER);
TraceEvent destroyCallStack =
TraceEventHelper.getType(events, identifier,
TraceEvent.DESTROY_CONNECTION_LISTENER_RETURN,
TraceEvent.DESTROY_CONNECTION_LISTENER_IDLE,
TraceEvent.DESTROY_CONNECTION_LISTENER_INVALID,
TraceEvent.DESTROY_CONNECTION_LISTENER_FLUSH,
TraceEvent.DESTROY_CONNECTION_LISTENER_ERROR,
TraceEvent.DESTROY_CONNECTION_LISTENER_PREFILL,
TraceEvent.DESTROY_CONNECTION_LISTENER_INCREMENTER);
generateConnectionListenerIndexHTML(identifier, dataEntry.getValue(),
currentCLStatus,
createCallStack, destroyCallStack,
noSDedit, clPath, cl);
}
finally
{
if (cl != null)
{
try
{
cl.flush();
cl.close();
}
catch (Exception e)
{
// Ignore
}
}
}
}
}
pool = new FileWriter(f.getAbsolutePath() + "/" + "index.html");
generatePoolIndexHTML(poolName, overallPoolStatus.get(poolName), poolMCPs.get(poolName), clStatus, pool);
}
finally
{
if (pool != null)
{
try
{
pool.flush();
pool.close();
}
catch (Exception e)
{
// Ignore
}
}
}
}
Set<String> activeCLs = new HashSet<String>();
for (List<Interaction> interactions : poolData.values())
{
for (Interaction interaction : interactions)
activeCLs.add(interaction.getConnectionListener());
}
Iterator<Map.Entry<String, List<TraceEvent>>> lifeIt = filteredLifecycle.entrySet().iterator();
while (lifeIt.hasNext())
{
Map.Entry<String, List<TraceEvent>> entry = lifeIt.next();
FileWriter lifecycle = null;
try
{
String path = root.getAbsolutePath() + "/" + entry.getKey();
File f = new File(path);
f.mkdirs();
lifecycle = new FileWriter(path + "/" + "lifecycle.html");
generateLifecycleHTML(entry.getKey(), entry.getValue(), activeCLs, lifecycle);
}
finally
{
if (lifecycle != null)
{
try
{
lifecycle.flush();
lifecycle.close();
}
catch (Exception e)
{
// Ignore
}
}
}
}
FileWriter ccm = null;
try
{
String path = root.getAbsolutePath() + "/CachedConnectionManager";
File f = new File(path);
f.mkdirs();
if (filteredCCM == null)
filteredCCM = new ArrayList<TraceEvent>();
if (ccmStatus == null)
ccmStatus = TraceEventStatus.GREEN;
ccm = new FileWriter(path + "/" + "ccm.html");
generateCCMHTML(filteredCCM, ccmStatus, path, ccm);
}
finally
{
if (ccm != null)
{
try
{
ccm.flush();
ccm.close();
}
catch (Exception e)
{
// Ignore
}
}
}
Iterator<String> ccmIt = filteredLifecycle.keySet().iterator();
while (ccmIt.hasNext())
{
String ccmPoolKey = ccmIt.next();
List<TraceEvent> ccmPoolEvents = filteredCCMPool.get(ccmPoolKey);
TraceEventStatus ccmPStatus = ccmPoolStatus.get(ccmPoolKey);
ccm = null;
try
{
String path = root.getAbsolutePath() + "/" + ccmPoolKey;
File f = new File(path);
f.mkdirs();
if (ccmPoolEvents == null)
ccmPoolEvents = new ArrayList<TraceEvent>();
if (ccmPStatus == null)
ccmPStatus = TraceEventStatus.GREEN;
ccm = new FileWriter(path + "/" + "ccm.html");
generateCCMPoolHTML(ccmPoolKey, ccmPoolEvents, ccmPStatus, ccm);
}
finally
{
if (ccm != null)
{
try
{
ccm.flush();
ccm.close();
}
catch (Exception e)
{
// Ignore
}
}
}
}
// Reference
FileWriter tocC = null;
try
{
String path = root.getAbsolutePath();
tocC = new FileWriter(path + "/" + "toc-c.html");
generateToCConnection(tocConnections, tocC);
}
finally
{
if (tocC != null)
{
try
{
tocC.flush();
tocC.close();
}
catch (Exception e)
{
// Ignore
}
}
}
FileWriter tocMC = null;
try
{
String path = root.getAbsolutePath();
tocMC = new FileWriter(path + "/" + "toc-mc.html");
generateToCManagedConnection(tocManagedConnections, tocMC);
}
finally
{
if (tocMC != null)
{
try
{
tocMC.flush();
tocMC.close();
}
catch (Exception e)
{
// Ignore
}
}
}
FileWriter tocCL = null;
try
{
String path = root.getAbsolutePath();
tocCL = new FileWriter(path + "/" + "toc-cl.html");
generateToCConnectionListener(tocConnectionListeners, tocCL);
}
finally
{
if (tocCL != null)
{
try
{
tocCL.flush();
tocCL.close();
}
catch (Exception e)
{
// Ignore
}
}
}
FileWriter tocMCP = null;
try
{
String path = root.getAbsolutePath();
tocMCP = new FileWriter(path + "/" + "toc-mcp.html");
generateToCManagedConnectionPool(tocMCPs, tocMCP);
}
finally
{
if (tocMCP != null)
{
try
{
tocMCP.flush();
tocMCP.close();
}
catch (Exception e)
{
// Ignore
}
}
}
// Transaction
FileWriter transaction = null;
try
{
List<Interaction> allInteractions = new ArrayList<Interaction>();
for (List<Interaction> interactions : poolData.values())
allInteractions.addAll(interactions);
Map<String, List<Interaction>> transactionData = TraceEventHelper.getTransactionData(allInteractions);
String path = root.getAbsolutePath();
transaction = new FileWriter(path + "/" + "transaction.html");
generateTransaction(transactionData, transaction);
}
finally
{
if (transaction != null)
{
try
{
transaction.flush();
transaction.close();
}
catch (Exception e)
{
// Ignore
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (logReader != null)
{
try
{
logReader.close();
}
catch (Exception e)
{
// Ignore
}
}
}
}
}