StatusTransformerpublic class StatusTransformer extends Object This is a refactoring of the servlet to externalize
the output into a simple class. Although we could
use XSLT, that is unnecessarily complex. |
Methods Summary |
---|
public static java.lang.String | filter(java.lang.Object obj)Filter the specified message string for characters that are sensitive
in HTML. This avoids potential attacks caused by including JavaScript
codes in the request URL that is often reported in error messages.
if (obj == null)
return ("?");
String message = obj.toString();
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuffer result = new StringBuffer(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<":
result.append("<");
break;
case '>":
result.append(">");
break;
case '&":
result.append("&");
break;
case '"":
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
| public static java.lang.String | formatSeconds(java.lang.Object obj)Formats the given time (given in seconds) as a string.
long time = -1L;
if (obj instanceof Long) {
time = ((Long) obj).longValue();
} else if (obj instanceof Integer) {
time = ((Integer) obj).intValue();
}
return (time + " s");
| public static java.lang.String | formatSize(java.lang.Object obj, boolean mb)Display the given size in bytes, either as KB or MB.
long bytes = -1L;
if (obj instanceof Long) {
bytes = ((Long) obj).longValue();
} else if (obj instanceof Integer) {
bytes = ((Integer) obj).intValue();
}
if (mb) {
long mbytes = bytes / (1024 * 1024);
long rest =
((bytes - (mbytes * (1024 * 1024))) * 100) / (1024 * 1024);
return (mbytes + "." + ((rest < 10) ? "0" : "") + rest + " MB");
} else {
return ((bytes / 1024) + " KB");
}
| public static java.lang.String | formatTime(java.lang.Object obj, boolean seconds)Display the given time in ms, either as ms or s.
long time = -1L;
if (obj instanceof Long) {
time = ((Long) obj).longValue();
} else if (obj instanceof Integer) {
time = ((Integer) obj).intValue();
}
if (seconds) {
return ((((float) time ) / 1000) + " s");
} else {
return (time + " ms");
}
| public static void | setContentType(javax.servlet.http.HttpServletResponse response, int mode)
if (mode == 0){
response.setContentType("text/html;charset="+Constants.CHARSET);
} else if (mode == 1){
response.setContentType("text/xml;charset="+Constants.CHARSET);
}
| public static void | writeBody(java.io.PrintWriter writer, java.lang.Object[] args, int mode)Write the header body. XML output doesn't bother
to output this stuff, since it's just title.
if (mode == 0){
writer.print(MessageFormat.format
(Constants.BODY_HEADER_SECTION, args));
}
| public static void | writeConnectorState(java.io.PrintWriter writer, javax.management.ObjectName tpName, java.lang.String name, javax.management.MBeanServer mBeanServer, java.util.Vector globalRequestProcessors, java.util.Vector requestProcessors, int mode)Write connector state.
if (mode == 0) {
writer.print("<h1>");
writer.print(name);
writer.print("</h1>");
writer.print("<p>");
writer.print(" Max threads: ");
writer.print(mBeanServer.getAttribute(tpName, "maxThreads"));
writer.print(" Current thread count: ");
writer.print(mBeanServer.getAttribute(tpName, "currentThreadCount"));
writer.print(" Current thread busy: ");
writer.print(mBeanServer.getAttribute(tpName, "currentThreadsBusy"));
try {
Object value = mBeanServer.getAttribute(tpName, "keepAliveCount");
writer.print(" Keeped alive sockets count: ");
writer.print(value);
} catch (Exception e) {
// Ignore
}
writer.print("<br>");
ObjectName grpName = null;
Enumeration enumeration = globalRequestProcessors.elements();
while (enumeration.hasMoreElements()) {
ObjectName objectName = (ObjectName) enumeration.nextElement();
if (name.equals(objectName.getKeyProperty("name"))) {
grpName = objectName;
}
}
if (grpName == null) {
return;
}
writer.print(" Max processing time: ");
writer.print(formatTime(mBeanServer.getAttribute
(grpName, "maxTime"), false));
writer.print(" Processing time: ");
writer.print(formatTime(mBeanServer.getAttribute
(grpName, "processingTime"), true));
writer.print(" Request count: ");
writer.print(mBeanServer.getAttribute(grpName, "requestCount"));
writer.print(" Error count: ");
writer.print(mBeanServer.getAttribute(grpName, "errorCount"));
writer.print(" Bytes received: ");
writer.print(formatSize(mBeanServer.getAttribute
(grpName, "bytesReceived"), true));
writer.print(" Bytes sent: ");
writer.print(formatSize(mBeanServer.getAttribute
(grpName, "bytesSent"), true));
writer.print("</p>");
writer.print("<table border=\"0\"><tr><th>Stage</th><th>Time</th><th>B Sent</th><th>B Recv</th><th>Client</th><th>VHost</th><th>Request</th></tr>");
enumeration = requestProcessors.elements();
while (enumeration.hasMoreElements()) {
ObjectName objectName = (ObjectName) enumeration.nextElement();
if (name.equals(objectName.getKeyProperty("worker"))) {
writer.print("<tr>");
writeProcessorState(writer, objectName, mBeanServer, mode);
writer.print("</tr>");
}
}
writer.print("</table>");
writer.print("<p>");
writer.print("P: Parse and prepare request S: Service F: Finishing R: Ready K: Keepalive");
writer.print("</p>");
} else if (mode == 1){
writer.write("<connector name='" + name + "'>");
writer.write("<threadInfo ");
writer.write(" maxThreads=\"" + mBeanServer.getAttribute(tpName, "maxThreads") + "\"");
writer.write(" currentThreadCount=\"" + mBeanServer.getAttribute(tpName, "currentThreadCount") + "\"");
writer.write(" currentThreadsBusy=\"" + mBeanServer.getAttribute(tpName, "currentThreadsBusy") + "\"");
writer.write(" />");
ObjectName grpName = null;
Enumeration enumeration = globalRequestProcessors.elements();
while (enumeration.hasMoreElements()) {
ObjectName objectName = (ObjectName) enumeration.nextElement();
if (name.equals(objectName.getKeyProperty("name"))) {
grpName = objectName;
}
}
if (grpName != null) {
writer.write("<requestInfo ");
writer.write(" maxTime=\"" + mBeanServer.getAttribute(grpName, "maxTime") + "\"");
writer.write(" processingTime=\"" + mBeanServer.getAttribute(grpName, "processingTime") + "\"");
writer.write(" requestCount=\"" + mBeanServer.getAttribute(grpName, "requestCount") + "\"");
writer.write(" errorCount=\"" + mBeanServer.getAttribute(grpName, "errorCount") + "\"");
writer.write(" bytesReceived=\"" + mBeanServer.getAttribute(grpName, "bytesReceived") + "\"");
writer.write(" bytesSent=\"" + mBeanServer.getAttribute(grpName, "bytesSent") + "\"");
writer.write(" />");
writer.write("<workers>");
enumeration = requestProcessors.elements();
while (enumeration.hasMoreElements()) {
ObjectName objectName = (ObjectName) enumeration.nextElement();
if (name.equals(objectName.getKeyProperty("worker"))) {
writeProcessorState(writer, objectName, mBeanServer, mode);
}
}
writer.write("</workers>");
}
writer.write("</connector>");
}
| protected static void | writeContext(java.io.PrintWriter writer, javax.management.ObjectName objectName, javax.management.MBeanServer mBeanServer, int mode)Write context state.
if (mode == 0){
String webModuleName = objectName.getKeyProperty("name");
String name = webModuleName;
if (name == null) {
return;
}
String hostName = null;
String contextName = null;
if (name.startsWith("//")) {
name = name.substring(2);
}
int slash = name.indexOf("/");
if (slash != -1) {
hostName = name.substring(0, slash);
contextName = name.substring(slash);
} else {
return;
}
ObjectName queryManager = new ObjectName
(objectName.getDomain() + ":type=Manager,path=" + contextName
+ ",host=" + hostName + ",*");
Set managersON = mBeanServer.queryNames(queryManager, null);
ObjectName managerON = null;
Iterator iterator2 = managersON.iterator();
while (iterator2.hasNext()) {
managerON = (ObjectName) iterator2.next();
}
ObjectName queryJspMonitor = new ObjectName
(objectName.getDomain() + ":type=JspMonitor,WebModule=" +
webModuleName + ",*");
Set jspMonitorONs = mBeanServer.queryNames(queryJspMonitor, null);
// Special case for the root context
if (contextName.equals("/")) {
contextName = "";
}
writer.print("<h1>");
writer.print(name);
writer.print("</h1>");
writer.print("</a>");
writer.print("<p>");
Object startTime = mBeanServer.getAttribute(objectName,
"startTime");
writer.print(" Start time: " +
new Date(((Long) startTime).longValue()));
writer.print(" Startup time: ");
writer.print(formatTime(mBeanServer.getAttribute
(objectName, "startupTime"), false));
writer.print(" TLD scan time: ");
writer.print(formatTime(mBeanServer.getAttribute
(objectName, "tldScanTime"), false));
if (managerON != null) {
writeManager(writer, managerON, mBeanServer, mode);
}
if (jspMonitorONs != null) {
writeJspMonitor(writer, jspMonitorONs, mBeanServer, mode);
}
writer.print("</p>");
String onStr = objectName.getDomain()
+ ":j2eeType=Servlet,WebModule=" + webModuleName + ",*";
ObjectName servletObjectName = new ObjectName(onStr);
Set set = mBeanServer.queryMBeans(servletObjectName, null);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
ObjectInstance oi = (ObjectInstance) iterator.next();
writeWrapper(writer, oi.getObjectName(), mBeanServer, mode);
}
} else if (mode == 1){
// for now we don't write out the context in XML
}
| public static void | writeDetailedState(java.io.PrintWriter writer, javax.management.MBeanServer mBeanServer, int mode)Write applications state.
if (mode == 0){
ObjectName queryHosts = new ObjectName("*:j2eeType=WebModule,*");
Set hostsON = mBeanServer.queryNames(queryHosts, null);
// Navigation menu
writer.print("<h1>");
writer.print("Application list");
writer.print("</h1>");
writer.print("<p>");
int count = 0;
Iterator iterator = hostsON.iterator();
while (iterator.hasNext()) {
ObjectName contextON = (ObjectName) iterator.next();
String webModuleName = contextON.getKeyProperty("name");
if (webModuleName.startsWith("//")) {
webModuleName = webModuleName.substring(2);
}
int slash = webModuleName.indexOf("/");
if (slash == -1) {
count++;
continue;
}
writer.print("<a href=\"#" + (count++) + ".0\">");
writer.print(webModuleName);
writer.print("</a>");
if (iterator.hasNext()) {
writer.print("<br>");
}
}
writer.print("</p>");
// Webapp list
count = 0;
iterator = hostsON.iterator();
while (iterator.hasNext()) {
ObjectName contextON = (ObjectName) iterator.next();
writer.print("<a class=\"A.name\" name=\""
+ (count++) + ".0\">");
writeContext(writer, contextON, mBeanServer, mode);
}
} else if (mode == 1){
// for now we don't write out the Detailed state in XML
}
| public static void | writeFooter(java.io.PrintWriter writer, int mode)
if (mode == 0){
// HTML Tail Section
writer.print(Constants.HTML_TAIL_SECTION);
} else if (mode == 1){
writer.write("</status>");
}
| public static void | writeHeader(java.io.PrintWriter writer, int mode)Process a GET request for the specified resource.
if (mode == 0){
// HTML Header Section
writer.print(Constants.HTML_HEADER_SECTION);
} else if (mode == 1){
writer.write(Constants.XML_DECLARATION);
writer.write
(Constants.XML_STYLE);
writer.write("<status>");
}
| public static void | writeJspMonitor(java.io.PrintWriter writer, java.util.Set jspMonitorONs, javax.management.MBeanServer mBeanServer, int mode)Write JSP monitoring information.
int jspCount = 0;
int jspReloadCount = 0;
Iterator iter = jspMonitorONs.iterator();
while (iter.hasNext()) {
ObjectName jspMonitorON = (ObjectName) iter.next();
Object obj = mBeanServer.getAttribute(jspMonitorON, "jspCount");
jspCount += ((Integer) obj).intValue();
obj = mBeanServer.getAttribute(jspMonitorON, "jspReloadCount");
jspReloadCount += ((Integer) obj).intValue();
}
if (mode == 0) {
writer.print("<br>");
writer.print(" JSPs loaded: ");
writer.print(jspCount);
writer.print(" JSPs reloaded: ");
writer.print(jspReloadCount);
} else if (mode == 1) {
// for now we don't write out anything
}
| public static void | writeManager(java.io.PrintWriter writer, javax.management.ObjectName objectName, javax.management.MBeanServer mBeanServer, int mode)Write detailed information about a manager.
if (mode == 0) {
writer.print("<br>");
writer.print(" Active sessions: ");
writer.print(mBeanServer.getAttribute
(objectName, "activeSessions"));
writer.print(" Session count: ");
writer.print(mBeanServer.getAttribute
(objectName, "sessionCounter"));
writer.print(" Max active sessions: ");
writer.print(mBeanServer.getAttribute(objectName, "maxActive"));
writer.print(" Rejected session creations: ");
writer.print(mBeanServer.getAttribute
(objectName, "rejectedSessions"));
writer.print(" Expired sessions: ");
writer.print(mBeanServer.getAttribute
(objectName, "expiredSessions"));
writer.print(" Longest session alive time: ");
writer.print(formatSeconds(mBeanServer.getAttribute(
objectName,
"sessionMaxAliveTime")));
writer.print(" Average session alive time: ");
writer.print(formatSeconds(mBeanServer.getAttribute(
objectName,
"sessionAverageAliveTime")));
writer.print(" Processing time: ");
writer.print(formatTime(mBeanServer.getAttribute
(objectName, "processingTime"), false));
} else if (mode == 1) {
// for now we don't write out the wrapper details
}
| public static void | writeManager(java.io.PrintWriter writer, java.lang.Object[] args, int mode)Write the manager webapp information.
if (mode == 0){
writer.print(MessageFormat.format(Constants.MANAGER_SECTION, args));
}
| public static void | writeOSState(java.io.PrintWriter writer, int mode)Write the OS state. Mode 0 will generate HTML.
Mode 1 will generate XML.
long[] result = new long[16];
boolean ok = false;
try {
String methodName = "info";
Class paramTypes[] = new Class[1];
paramTypes[0] = result.getClass();
Object paramValues[] = new Object[1];
paramValues[0] = result;
Method method = Class.forName("org.apache.tomcat.jni.OS")
.getMethod(methodName, paramTypes);
method.invoke(null, paramValues);
ok = true;
} catch (Throwable t) {
// Ignore
}
if (ok) {
if (mode == 0){
writer.print("<h1>OS</h1>");
writer.print("<p>");
writer.print(" Physical memory: ");
writer.print(formatSize(new Long(result[0]), true));
writer.print(" Available memory: ");
writer.print(formatSize(new Long(result[1]), true));
writer.print(" Total page file: ");
writer.print(formatSize(new Long(result[2]), true));
writer.print(" Free page file: ");
writer.print(formatSize(new Long(result[3]), true));
writer.print(" Memory load: ");
writer.print(new Long(result[6]));
writer.print("<br>");
writer.print(" Process kernel time: ");
writer.print(formatTime(new Long(result[11] / 1000), true));
writer.print(" Process user time: ");
writer.print(formatTime(new Long(result[12] / 1000), true));
writer.print("</p>");
} else if (mode == 1){
}
}
| public static void | writePageHeading(java.io.PrintWriter writer, java.lang.Object[] args, int mode)
if (mode == 0){
writer.print(MessageFormat.format
(Constants.SERVER_HEADER_SECTION, args));
}
| protected static void | writeProcessorState(java.io.PrintWriter writer, javax.management.ObjectName pName, javax.management.MBeanServer mBeanServer, int mode)Write processor state.
Integer stageValue =
(Integer) mBeanServer.getAttribute(pName, "stage");
int stage = stageValue.intValue();
boolean fullStatus = true;
boolean showRequest = true;
String stageStr = null;
switch (stage) {
case (1/*org.apache.coyote.Constants.STAGE_PARSE*/):
stageStr = "P";
fullStatus = false;
break;
case (2/*org.apache.coyote.Constants.STAGE_PREPARE*/):
stageStr = "P";
fullStatus = false;
break;
case (3/*org.apache.coyote.Constants.STAGE_SERVICE*/):
stageStr = "S";
break;
case (4/*org.apache.coyote.Constants.STAGE_ENDINPUT*/):
stageStr = "F";
break;
case (5/*org.apache.coyote.Constants.STAGE_ENDOUTPUT*/):
stageStr = "F";
break;
case (7/*org.apache.coyote.Constants.STAGE_ENDED*/):
stageStr = "R";
fullStatus = false;
break;
case (6/*org.apache.coyote.Constants.STAGE_KEEPALIVE*/):
stageStr = "K";
fullStatus = true;
showRequest = false;
break;
case (0/*org.apache.coyote.Constants.STAGE_NEW*/):
stageStr = "R";
fullStatus = false;
break;
default:
// Unknown stage
stageStr = "?";
fullStatus = false;
}
if (mode == 0) {
writer.write("<td><strong>");
writer.write(stageStr);
writer.write("</strong></td>");
if (fullStatus) {
writer.write("<td>");
writer.print(formatTime(mBeanServer.getAttribute
(pName, "requestProcessingTime"), false));
writer.write("</td>");
writer.write("<td>");
if (showRequest) {
writer.print(formatSize(mBeanServer.getAttribute
(pName, "requestBytesSent"), false));
} else {
writer.write("?");
}
writer.write("</td>");
writer.write("<td>");
if (showRequest) {
writer.print(formatSize(mBeanServer.getAttribute
(pName, "requestBytesReceived"),
false));
} else {
writer.write("?");
}
writer.write("</td>");
writer.write("<td>");
writer.print(filter(mBeanServer.getAttribute
(pName, "remoteAddr")));
writer.write("</td>");
writer.write("<td nowrap>");
writer.write(filter(mBeanServer.getAttribute
(pName, "virtualHost")));
writer.write("</td>");
writer.write("<td nowrap>");
if (showRequest) {
writer.write(filter(mBeanServer.getAttribute
(pName, "method")));
writer.write(" ");
writer.write(filter(mBeanServer.getAttribute
(pName, "currentUri")));
String queryString = (String) mBeanServer.getAttribute
(pName, "currentQueryString");
if ((queryString != null) && (!queryString.equals(""))) {
writer.write("?");
writer.print(RequestUtil.filter(queryString));
}
writer.write(" ");
writer.write(filter(mBeanServer.getAttribute
(pName, "protocol")));
} else {
writer.write("?");
}
writer.write("</td>");
} else {
writer.write("<td>?</td><td>?</td><td>?</td><td>?</td><td>?</td><td>?</td>");
}
} else if (mode == 1){
writer.write("<worker ");
writer.write(" stage=\"" + stageStr + "\"");
if (fullStatus) {
writer.write(" requestProcessingTime=\""
+ mBeanServer.getAttribute
(pName, "requestProcessingTime") + "\"");
writer.write(" requestBytesSent=\"");
if (showRequest) {
writer.write("" + mBeanServer.getAttribute
(pName, "requestBytesSent"));
} else {
writer.write("0");
}
writer.write("\"");
writer.write(" requestBytesReceived=\"");
if (showRequest) {
writer.write("" + mBeanServer.getAttribute
(pName, "requestBytesReceived"));
} else {
writer.write("0");
}
writer.write("\"");
writer.write(" remoteAddr=\""
+ filter(mBeanServer.getAttribute
(pName, "remoteAddr")) + "\"");
writer.write(" virtualHost=\""
+ filter(mBeanServer.getAttribute
(pName, "virtualHost")) + "\"");
if (showRequest) {
writer.write(" method=\""
+ filter(mBeanServer.getAttribute
(pName, "method")) + "\"");
writer.write(" currentUri=\""
+ filter(mBeanServer.getAttribute
(pName, "currentUri")) + "\"");
String queryString = (String) mBeanServer.getAttribute
(pName, "currentQueryString");
if ((queryString != null) && (!queryString.equals(""))) {
writer.write(" currentQueryString=\""
+ RequestUtil.filter(queryString) + "\"");
} else {
writer.write(" currentQueryString=\"?\"");
}
writer.write(" protocol=\""
+ filter(mBeanServer.getAttribute
(pName, "protocol")) + "\"");
} else {
writer.write(" method=\"?\"");
writer.write(" currentUri=\"?\"");
writer.write(" currentQueryString=\"?\"");
writer.write(" protocol=\"?\"");
}
} else {
writer.write(" requestProcessingTime=\"0\"");
writer.write(" requestBytesSent=\"0\"");
writer.write(" requestBytesRecieved=\"0\"");
writer.write(" remoteAddr=\"?\"");
writer.write(" virtualHost=\"?\"");
writer.write(" method=\"?\"");
writer.write(" currentUri=\"?\"");
writer.write(" currentQueryString=\"?\"");
writer.write(" protocol=\"?\"");
}
writer.write(" />");
}
| public static void | writeServerInfo(java.io.PrintWriter writer, java.lang.Object[] args, int mode)
if (mode == 0){
writer.print(MessageFormat.format(Constants.SERVER_ROW_SECTION, args));
}
| public static void | writeVMState(java.io.PrintWriter writer, int mode)Write the VM state. Mode 0 will generate HTML.
Mode 1 will generate XML.
if (mode == 0){
writer.print("<h1>JVM</h1>");
writer.print("<p>");
writer.print(" Free memory: ");
writer.print(formatSize
(new Long(Runtime.getRuntime().freeMemory()), true));
writer.print(" Total memory: ");
writer.print(formatSize
(new Long(Runtime.getRuntime().totalMemory()), true));
writer.print(" Max memory: ");
writer.print(formatSize
(new Long(Runtime.getRuntime().maxMemory()), true));
writer.print("</p>");
} else if (mode == 1){
writer.write("<jvm>");
writer.write("<memory");
writer.write(" free='" + Runtime.getRuntime().freeMemory() + "'");
writer.write(" total='" + Runtime.getRuntime().totalMemory() + "'");
writer.write(" max='" + Runtime.getRuntime().maxMemory() + "'/>");
writer.write("</jvm>");
}
| public static void | writeWrapper(java.io.PrintWriter writer, javax.management.ObjectName objectName, javax.management.MBeanServer mBeanServer, int mode)Write detailed information about a wrapper.
if (mode == 0) {
String servletName = objectName.getKeyProperty("name");
String[] mappings = (String[])
mBeanServer.invoke(objectName, "findMappings", null, null);
writer.print("<h2>");
writer.print(servletName);
if ((mappings != null) && (mappings.length > 0)) {
writer.print(" [ ");
for (int i = 0; i < mappings.length; i++) {
writer.print(mappings[i]);
if (i < mappings.length - 1) {
writer.print(" , ");
}
}
writer.print(" ] ");
}
writer.print("</h2>");
writer.print("<p>");
writer.print(" Processing time: ");
writer.print(formatTime(mBeanServer.getAttribute
(objectName, "processingTime"), true));
writer.print(" Max time: ");
writer.print(formatTime(mBeanServer.getAttribute
(objectName, "maxTime"), false));
writer.print(" Request count: ");
writer.print(mBeanServer.getAttribute(objectName, "requestCount"));
writer.print(" Error count: ");
writer.print(mBeanServer.getAttribute(objectName, "errorCount"));
writer.print(" Load time: ");
writer.print(formatTime(mBeanServer.getAttribute
(objectName, "loadTime"), false));
writer.print(" Classloading time: ");
writer.print(formatTime(mBeanServer.getAttribute
(objectName, "classLoadTime"), false));
writer.print("</p>");
} else if (mode == 1){
// for now we don't write out the wrapper details
}
|
|