/* * Copyright 2015 the original author or authors. * @https://github.com/scouter-project/scouter * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package scouter.client.xlog; import scouter.client.model.TextProxy; import scouter.lang.pack.Pack; import scouter.lang.pack.PackEnum; import scouter.lang.pack.XLogPack; import scouter.lang.step.*; import java.util.HashSet; public class XLogUtil { public static void loadStepText(int serverId, String yyyymmdd, Step[] p) { HashSet<Integer> methodSet = new HashSet<Integer>(); HashSet<Integer> sqlSet = new HashSet<Integer>(); HashSet<Integer> subcallSet = new HashSet<Integer>(); HashSet<Integer> errorSet = new HashSet<Integer>(); HashSet<Integer> hashedMsgSet = new HashSet<Integer>(); HashSet<Integer> stackElementSet = new HashSet<Integer>(); for (int i = 0; i < p.length; i++) { switch (p[i].getStepType()) { case StepEnum.SQL: case StepEnum.SQL2: case StepEnum.SQL3: if (TextProxy.sql.getText(((SqlStep) p[i]).hash) == null) { sqlSet.add(((SqlStep) p[i]).hash); } if (((SqlStep) p[i]).error != 0 && TextProxy.error.getText(((SqlStep) p[i]).error) == null) { errorSet.add(((SqlStep) p[i]).error); } break; case StepEnum.SQL_SUM: if (TextProxy.sql.getText(((SqlSum) p[i]).hash) == null) { sqlSet.add(((SqlStep) p[i]).hash); } break; case StepEnum.HASHED_MESSAGE: if (TextProxy.hashMessage.getText(((HashedMessageStep) p[i]).hash) == null) { hashedMsgSet.add(((HashedMessageStep) p[i]).hash); } break; case StepEnum.PARAMETERIZED_MESSAGE: if (TextProxy.hashMessage.getText(((ParameterizedMessageStep) p[i]).getHash()) == null) { hashedMsgSet.add(((ParameterizedMessageStep) p[i]).getHash()); } break; case StepEnum.DUMP: DumpStep dumpStep = (DumpStep) p[i]; for(int stackElementHash : dumpStep.stacks) { if(TextProxy.stackElement.getText(stackElementHash) == null) { stackElementSet.add(stackElementHash); } } break; case StepEnum.METHOD: case StepEnum.METHOD2: if (TextProxy.method.getText(((MethodStep) p[i]).hash) == null) { methodSet.add(((MethodStep) p[i]).hash); } break; case StepEnum.METHOD_SUM: if (TextProxy.method.getText(((MethodSum) p[i]).hash) == null) { methodSet.add(((MethodSum) p[i]).hash); } break; case StepEnum.SOCKET: if (((SocketStep) p[i]).error != 0 && TextProxy.error.getText(((SocketStep) p[i]).error) == null) { errorSet.add(((SocketStep) p[i]).error); } break; case StepEnum.APICALL: case StepEnum.APICALL2: if (TextProxy.apicall.getText(((ApiCallStep) p[i]).hash) == null) { subcallSet.add(((ApiCallStep) p[i]).hash); } if (((ApiCallStep) p[i]).error != 0 && TextProxy.error.getText(((ApiCallStep) p[i]).error) == null) { errorSet.add(((ApiCallStep) p[i]).error); } break; case StepEnum.DISPATCH: if (TextProxy.apicall.getText(((DispatchStep) p[i]).hash) == null) { subcallSet.add(((DispatchStep) p[i]).hash); } if (((DispatchStep) p[i]).error != 0 && TextProxy.error.getText(((DispatchStep) p[i]).error) == null) { errorSet.add(((DispatchStep) p[i]).error); } break; case StepEnum.THREAD_CALL_POSSIBLE: if (TextProxy.apicall.getText(((ThreadCallPossibleStep) p[i]).hash) == null) { subcallSet.add(((ThreadCallPossibleStep) p[i]).hash); } break; case StepEnum.APICALL_SUM: if (TextProxy.apicall.getText(((ApiCallSum) p[i]).hash) == null) { subcallSet.add(((ApiCallSum) p[i]).hash); } break; case StepEnum.THREAD_SUBMIT: if (TextProxy.apicall.getText(((ThreadSubmitStep) p[i]).hash) == null) { subcallSet.add(((ThreadSubmitStep) p[i]).hash); } if (((ThreadSubmitStep) p[i]).error != 0 && TextProxy.error.getText(((ThreadSubmitStep) p[i]).error) == null) { errorSet.add(((ThreadSubmitStep) p[i]).error); } break; } } TextProxy.method.load(yyyymmdd, methodSet, serverId); TextProxy.sql.load(yyyymmdd, sqlSet, serverId); TextProxy.apicall.load(yyyymmdd, subcallSet, serverId); TextProxy.error.load(yyyymmdd, errorSet, serverId); TextProxy.hashMessage.load(yyyymmdd, hashedMsgSet, serverId); TextProxy.stackElement.load(yyyymmdd, stackElementSet, serverId); } // public static int getStepElaspedTime(Step p) { // switch (p.getStepType()) { // case StepEnum.SQL: // case StepEnum.SQL2: // case StepEnum.SQL3: // SqlStep ss = (SqlStep) p; // return ss.elapsed; // case StepEnum.SOCKET: // SocketStep sk = (SocketStep) p; // return sk.elapsed; // case StepEnum.METHOD: // case StepEnum.METHOD2: // MethodStep ms = (MethodStep) p; // return ms.elapsed; // case StepEnum.APICALL: // case StepEnum.APICALL2: // ApiCallStep acs = (ApiCallStep) p; // return acs.elapsed; // case StepEnum.THREAD_SUBMIT: // ThreadSubmitStep tss = (ThreadSubmitStep) p; // return tss.elapsed; // } // return 0; // } public static int getCpuTime(Step p) { switch (p.getStepType()) { case StepEnum.SQL: case StepEnum.SQL2: case StepEnum.SQL3: SqlStep ss = (SqlStep) p; return ss.cputime; case StepEnum.METHOD: case StepEnum.METHOD2: MethodStep ms = (MethodStep) p; return ms.cputime; case StepEnum.APICALL: case StepEnum.APICALL2: ApiCallStep acs = (ApiCallStep) p; return acs.cputime; case StepEnum.THREAD_SUBMIT: ThreadSubmitStep tss = (ThreadSubmitStep) p; return tss.cputime; } return 0; } // public static String getStepContents(Step p) { // StringBuilder sb = new StringBuilder(); // switch (p.getStepType()) { // case StepEnum.METHOD: // case StepEnum.METHOD2: // MethodStep ms = (MethodStep) p; // sb.append(TextProxy.method.getText(ms.hash)); // break; // case StepEnum.SQL3: // case StepEnum.SQL2: // case StepEnum.SQL: // SqlStep ss = (SqlStep) p; // sb.append(TextProxy.sql.getText(ss.hash)); // break; // case StepEnum.MESSAGE: // MessageStep mms = (MessageStep) p; // sb.append(mms.message); // break; // case StepEnum.HASHED_MESSAGE: // HashedMessageStep hms = (HashedMessageStep) p; // sb.append(TextProxy.hashMessage.getText(hms.hash) + " #" + FormatUtil.print(hms.value, "#,##0")); // break; // case StepEnum.DUMP: // DumpStep dumpStep = (DumpStep) p; // sb.append(dumpStep.threadId).append(" - ").append(dumpStep.threadName).append('\n'); // for(int stackElementHash : dumpStep.stacks) { // sb.append(TextProxy.stackElement.getText(stackElementHash)).append('\n'); // } // break; // case StepEnum.APICALL: // case StepEnum.APICALL2: // ApiCallStep acs = (ApiCallStep) p; // sb.append("call:").append(TextProxy.apicall.getText(acs.hash)); // if (acs.txid != 0) { // sb.append(" <" + Hexa32.toString32(acs.txid) + ">"); // } // break; // case StepEnum.SOCKET: // SocketStep sos = (SocketStep) p; // String ip = IPUtil.toString(sos.ipaddr); // sb.append("socket: ").append(ip == null ? "unknown" : ip).append(":").append(sos.port); // break; // case StepEnum.THREAD_SUBMIT: // ThreadSubmitStep tss = (ThreadSubmitStep) p; // sb.append("thread: ").append(TextProxy.apicall.getText(tss.hash)); // if (tss.txid != 0) { // sb.append(" <" + Hexa32.toString32(tss.txid) + ">"); // } // break; // } // return sb.toString(); // } // // public static String getErrorMessage(Step p) { // switch (p.getStepType()) { // case StepEnum.METHOD2: // MethodStep2 ms2 = (MethodStep2) p; // return TextProxy.error.getText(ms2.error); // case StepEnum.SQL: // case StepEnum.SQL2: // case StepEnum.SQL3: // SqlStep ss = (SqlStep) p; // return TextProxy.error.getText(ss.error); // case StepEnum.APICALL: // case StepEnum.APICALL2: // ApiCallStep acs = (ApiCallStep) p; // return TextProxy.error.getText(acs.error); // case StepEnum.SOCKET: // SocketStep sos = (SocketStep) p; // return TextProxy.error.getText(sos.error); // case StepEnum.THREAD_SUBMIT: // ThreadSubmitStep tss = (ThreadSubmitStep) p; // return TextProxy.error.getText(tss.error); // } // return null; // } // // public static String toStringStepSingleType(StepSingle step) { // switch (step.getStepType()) { // case StepEnum.METHOD: // return "MTD"; // case StepEnum.METHOD2: // return "MTD2"; // case StepEnum.MESSAGE: // return "MSG"; // case StepEnum.HASHED_MESSAGE: // return "HSG"; // case StepEnum.DUMP: // return "DMP"; // case StepEnum.SQL: // return "SQL"; // case StepEnum.SQL2: // return "SQL2"; // case StepEnum.SQL3: // return "SQL3"; // case StepEnum.SOCKET: // return "SCK"; // case StepEnum.APICALL: // return "API"; // case StepEnum.APICALL2: // return "API2"; // case StepEnum.THREAD_SUBMIT: // return "THD"; // } // return null; // } // private final static String HEADER_SET_FONT = "<style>" + "@font-face {font-family:'Malgun Gothic';}" // + "body,td,select,input,div,form,textarea,center,option,pre,blockquote {font-size:9pt; font-family:'Malgun Gothic'; color:#333333;line-height:160%}" // + "table { border-collapse:collapse; }" + "th{ font-size:10pt; border-bottom:1px dotted #C6C6C6; }" // + "td{ border-bottom:1px dotted #EAEAEA; }" + "</style>"; // // private final static String TABLE_ROW_START = "<tr>"; // private final static String TABLE_ROW_END = "</tr>"; // // private final static String TD = "<td>"; // private final static String TDC = "<td align=center>"; // private final static String TDE = "</td>"; // private final static String BR = "<br>"; // public static String xLogToHtml(XLogPack pack, Step[] profiles, final int serverId) { // boolean truncated = false; // if (profiles == null) { // profiles = new Step[0]; // } // profiles = SortUtil.sort(profiles); // final String date = DateUtil.yyyymmdd(pack.endTime); // loadStepText(serverId, date, profiles); // String error = TextProxy.error.getLoadText(date, pack.error, serverId); // String objName = TextProxy.object.getLoadText(date, pack.objHash, serverId); // final StringBuffer sb = new StringBuffer(); // // sb.append(HEADER_SET_FONT); // // sb.append("<table width=\"1000\">"); // // sb.append(TABLE_ROW_START).append("<td width=100>").append("<b>txid</b>").append(TDE).append(TD) // .append(Hexa32.toString32(pack.txid)).append(TDE).append(TABLE_ROW_END); // sb.append(TABLE_ROW_START).append("<td width=100>").append("<b>gxid</b>").append(TDE).append(TD) // .append(Hexa32.toString32(pack.gxid)).append(TDE).append(TABLE_ROW_END); // sb.append(TABLE_ROW_START).append("<td width=100>").append("<b>objName</b>").append(TDE).append(TD) // .append(objName).append(TDE).append(TABLE_ROW_END); // sb.append(TABLE_ROW_START).append("<td width=100>").append("<b>endtime</b>").append(TDE).append(TD) // .append(DateUtil.timestamp(pack.endTime)).append(TDE).append(TABLE_ROW_END); // sb.append(TABLE_ROW_START).append("<td width=100>").append("<b>elapsed</b>").append(TDE).append(TD) // .append(FormatUtil.print(pack.elapsed, "#,##0")).append(TDE).append(TABLE_ROW_END); // sb.append(TABLE_ROW_START).append("<td width=100>").append("<b>service</b>").append(TDE).append(TD) // .append(TextProxy.service.getText(pack.service)).append(TDE).append(TABLE_ROW_END); // if (error != null) { // sb.append(TABLE_ROW_START).append("<td width=100>").append("<font color=red><b>error</b></font>") // .append(TDE).append(TD).append("<font color=red>").append(error).append("</font>").append(TDE) // .append(TABLE_ROW_END); // } // // sb.append("ipaddr=" + IPUtil.toString(pack.ipaddr) + ", "); // sb.append("visitor=" + pack.userid + ", "); // sb.append("cpu=" + FormatUtil.print(pack.cpu, "#,##0") + " ms, "); // sb.append("kbytes=" + pack.kbytes + ", "); // sb.append("status=" + pack.status + ", "); // if (pack.sqlCount > 0) { // sb.append("sqlCount=" + pack.sqlCount + ", "); // sb.append("sqlTime=" + FormatUtil.print(pack.sqlTime, "#,##0") + " ms, "); // } // if (pack.apicallCount > 0) { // sb.append("ApiCallCount=" + pack.apicallCount + ", "); // sb.append("ApiCallTime=" + FormatUtil.print(pack.apicallTime, "#,##0") + " ms, "); // } // // String t = TextProxy.userAgent.getLoadText(date, pack.userAgent, serverId); // if (StringUtil.isNotEmpty(t)) { // sb.append("userAgent=" + t + ", "); // } // // t = TextProxy.referer.getLoadText(date, pack.referer, serverId); // if (StringUtil.isNotEmpty(t)) { // sb.append("referer=" + t + ", "); // } // // t = TextProxy.group.getLoadText(date, pack.group, serverId); // if (StringUtil.isNotEmpty(t)) { // sb.append("group=" + t); // } // sb.append(TDE).append(TABLE_ROW_END); // sb.append("</table>"); // // sb.append(BR); // // sb.append("<table width=\"1500\">"); // // sb.append(TABLE_ROW_START); // sb.append( // "<font size=9px><th width=80px>p#</th><th width=80px>#</th><th width=80px>TIME</th><th width=80px>T-GAP</th><th width=80px>CPU</th><th width=1100px>CONTENTS</th></font>"); // sb.append(TABLE_ROW_END); // if (profiles.length == 0) { // sb.append("<tr colspan=6><th>( No xlog profile collected )</th></tr>"); // return sb.toString(); // } // // long stime = pack.endTime - pack.elapsed; // long prev_tm = stime; // long prev_cpu = 0; // // sb.append(TABLE_ROW_START); // sb.append(TDC).append(TDE); // sb.append(TDC).append(TDE); // sb.append(TDC).append(DateUtil.getLogTime(stime)).append(TDE); // sb.append(TDC).append(TDE); // sb.append(TDC).append(TDE); // sb.append(TD + "<font color='#0000ff'><b>start transaction<b></font>").append(TDE); // sb.append(TABLE_ROW_END); // // long tm = pack.endTime; // long cpu = pack.cpu; // int sumCnt = 0; // HashMap<Integer, Integer> indent = new HashMap<Integer, Integer>(); // for (int i = 0; i < profiles.length; i++) { // // sb.append(TABLE_ROW_START); // // if (truncated) // break; // // if (profiles[i] instanceof StepSummary) { // sb.append(TDC).append((sumCnt++)).append(TDE); // // StepSummary sum = (StepSummary) profiles[i]; // switch (sum.getStepType()) { // case StepEnum.METHOD_SUM: // MethodSum p = (MethodSum) sum; // // String m = TextProxy.method.getText(p.hash); // if (m == null) // m = Hexa32.toString32(p.hash); // sb.append("<td colspan=5>").append(m).append(" "); // // sb.append(" count=").append("<font color=blue><b>").append(FormatUtil.print(p.count, "#,##0")) // .append("</b></font>"); // sb.append(" time="); // if (p.elapsed > 0) { // sb.append("<font color=red><b>").append(FormatUtil.print(p.elapsed, "#,##0")) // .append("</b></font>"); // } else { // sb.append(FormatUtil.print(p.elapsed, "#,##0")); // } // sb.append(" ms"); // sb.append(" cpu=").append("<font color=blue><b>").append(FormatUtil.print(p.cputime, "#,##0")) // .append("</b></font>"); // // sb.append(TDE); // // break; // case StepEnum.SQL_SUM: // SqlSum sql = (SqlSum) sum; // toString(sb, sql, serverId); // sb.append(TDE); // break; // case StepEnum.SOCKET_SUM: // SocketSum socketSum = (SocketSum) sum; // toString(sb, socketSum); // sb.append(TDE); // break; // case StepEnum.CONTROL: // sb.append(TDC).append(TDE); // sb.append(TDC).append(DateUtil.getLogTime(tm)).append(TDE); // sb.append(TDC).append(FormatUtil.print(tm - prev_tm, "#,##0")).append(TDE); // sb.append(TDC).append(FormatUtil.print(cpu - prev_cpu, "#,##0")).append(TDE); // sb.append(TD); // toString(sb, (StepControl) sum); // sb.append(TDE); // // truncated = true; // // break; // } // continue; // } // // StepSingle stepSingle = (StepSingle) profiles[i]; // tm = stepSingle.start_time + stime; // cpu = stepSingle.start_cpu; // if (stepSingle.parent == -1) { // sb.append(TDC).append("-").append(TDE); // } else { // sb.append(TDC).append("<a href=\"#id").append(stepSingle.parent).append("\">").append(stepSingle.parent) // .append("</a>").append(TDE); // } // // sb.append(TDC).append("<a name=\"#id").append(stepSingle.index).append("\">").append(stepSingle.index) // .append("</a>").append(TDE); // sb.append(TDC).append(DateUtil.getLogTime(tm)).append(TDE); // // if (tm - prev_tm > 0) { // sb.append(TDC).append("<font color=red><b>").append(FormatUtil.print(tm - prev_tm, "#,##0")) // .append("</b></font>").append(TDE); // } else { // sb.append(TDC).append(FormatUtil.print(tm - prev_tm, "#,##0")).append(TDE); // } // // if (cpu - prev_cpu > 0) { // sb.append(TDC).append("<font color=red><b>").append(FormatUtil.print(cpu - prev_cpu, "#,##0")) // .append("</b></font>").append(TDE); // } else { // sb.append(TDC).append(FormatUtil.print(cpu - prev_cpu, "#,##0")).append(TDE); // } // // sb.append("<td>"); // // int space = 0; // if (indent.containsKey(stepSingle.parent)) { // space = indent.get(stepSingle.parent) + 1; // } // indent.put(stepSingle.index, space); // while (space > 0) { // sb.append("   "); // space--; // } // // switch (stepSingle.getStepType()) { // case StepEnum.METHOD: // toString(sb, (MethodStep) stepSingle); // break; // case StepEnum.METHOD2: // toString(sb, (MethodStep) stepSingle); // MethodStep2 m2 = (MethodStep2) stepSingle; // if (m2.error != 0) { // sb.append(BR).append(TextProxy.error.getText(m2.error)); // } // break; // case StepEnum.SQL: // case StepEnum.SQL2: // case StepEnum.SQL3: // SqlStep sql = (SqlStep) stepSingle; // toString(sb, sql, serverId); // if (sql.error != 0) { // sb.append(BR).append(TextProxy.error.getText(sql.error)); // } // break; // case StepEnum.MESSAGE: // toString(sb, (MessageStep) stepSingle); // break; // case StepEnum.HASHED_MESSAGE: // toString(sb, (HashedMessageStep) stepSingle); // break; // case StepEnum.DUMP: // toString(sb, (DumpStep) stepSingle); // break; // case StepEnum.SOCKET: // SocketStep socket = (SocketStep) stepSingle; // toString(sb, socket); // if (socket.error != 0) { // sb.append(BR).append(TextProxy.error.getText(socket.error)); // } // break; // } // sb.append(TDE); // prev_cpu = cpu; // prev_tm = tm; // // sb.append(TABLE_ROW_END); // } // // if (!truncated) { // // tm = pack.endTime; // cpu = pack.cpu; // // sb.append(TABLE_ROW_START); // sb.append(TDC).append(TDE); // sb.append(TDC).append(TDE); // sb.append(TDC).append(DateUtil.getLogTime(tm)).append(TDE); // sb.append(TDC).append(FormatUtil.print(tm - prev_tm, "#,##0")).append(TDE); // sb.append(TDC).append(FormatUtil.print(cpu - prev_cpu, "#,##0")).append(TDE); // sb.append(TD + "<font color='#0000ff'><b>end of transaction<b></font>").append(TDE); // sb.append(TABLE_ROW_END); // // } // sb.append("</table>"); // return sb.toString(); // } // private static void toString(StringBuffer sb, SocketStep p) { // String ip = IPUtil.toString(p.ipaddr); // sb.append("socket: ").append(ip == null ? "unknown" : ip).append(":").append(p.port + " "); // if (p.elapsed > 0) { // sb.append("<font color=red><b>").append(FormatUtil.print(p.elapsed, "#,##0")).append("</b></font>"); // } else { // sb.append(FormatUtil.print(p.elapsed, "#,##0")); // } // sb.append(" ms"); // } // // private static void toString(StringBuffer sb, SocketSum p) { // String ip = IPUtil.toString(p.ipaddr); // sb.append("<td colspan=5>").append("socket: ").append(ip == null ? "unknown" : ip).append(":") // .append(p.port + " "); // // sb.append(" count=").append("<font color=blue><b>").append(FormatUtil.print(p.count, "#,##0")) // .append("</b></font>"); // sb.append(" time="); // if (p.elapsed > 0) { // sb.append("<font color=red><b>").append(FormatUtil.print(p.elapsed, "#,##0")).append("</b></font>"); // } else { // sb.append(FormatUtil.print(p.elapsed, "#,##0")); // } // sb.append(" ms"); // if (p.error > 0) { // sb.append(" error=" + p.error); // } // } // // private static void toString(StringBuffer sb, SqlStep p, int serverId) { // String m = TextProxy.sql.getText(p.hash); // if (m == null) // m = Hexa32.toString32(p.hash); // sb.append(m); // if (StringUtil.isEmpty(p.param) == false) { // sb.append(" [").append(p.param).append("]"); // } // sb.append(" "); // if (p.elapsed > 0) { // sb.append("<font color=red><b>").append(FormatUtil.print(p.elapsed, "#,##0")).append("</b></font>"); // } else { // sb.append(FormatUtil.print(p.elapsed, "#,##0")); // } // sb.append(" ms"); // } // // private static void toString(StringBuffer sb, SqlSum p, int serverId) { // String m = TextProxy.sql.getText(p.hash); // if (m == null) // m = Hexa32.toString32(p.hash); // sb.append("<td colspan=5>").append(m); // if (StringUtil.isEmpty(p.param) == false) { // sb.append(" [").append(p.param).append("]"); // } // // sb.append(" count=").append("<font color=blue><b>").append(FormatUtil.print(p.count, "#,##0")) // .append("</b></font>"); // sb.append(" time="); // if (p.elapsed > 0) { // sb.append("<font color=red><b>").append(FormatUtil.print(p.elapsed, "#,##0")).append("</b></font>"); // } else { // sb.append(FormatUtil.print(p.elapsed, "#,##0")); // } // sb.append(" ms"); // sb.append(" cpu=").append("<font color=blue><b>").append(FormatUtil.print(p.cputime, "#,##0")) // .append("</b></font>"); // if (p.error > 0) { // sb.append(" error=" + p.error); // } // } // // private static void toString(StringBuffer sb, MessageStep p) { // sb.append("<font color=green>").append(p.message.replaceAll("\n", BR)).append("</font>"); // } // // private static void toString(StringBuffer sb, HashedMessageStep p) { // String m = TextProxy.hashMessage.getText(p.hash); // if (m == null) // m = Hexa32.toString32(p.hash); // sb.append("<font color=green>").append(m.replaceAll("\n", BR)).append("</font>"); // } // // private static void toString(StringBuffer sb, ParameterizedMessageStep pmStep) { // String messageFormat = TextProxy.hashMessage.getText(pmStep.getHash()); // String message; // if (messageFormat == null) { // message = Hexa32.toString32(pmStep.getHash()); // } else { // message = pmStep.buildMessasge(messageFormat); // } // sb.append("<font color=green>").append(message.replaceAll("\n", BR)).append("</font>"); // } // // private static void toString(StringBuffer sb, DumpStep p) { // sb.append("<font color=green>").append("<Thread dump>").append("</font>"); // } // // private static void toString(StringBuffer sb, StepControl p) { // sb.append("<font color=red>").append(p.message.replaceAll("\n", BR)).append("</font>"); // } // // private static void toString(StringBuffer sb, MethodStep p) { // String m = TextProxy.method.getText(p.hash); // if (m == null) // m = Hexa32.toString32(p.hash); // sb.append(m).append(" "); // if (p.elapsed > 0) { // sb.append("<font color=red><b>").append(FormatUtil.print(p.elapsed, "#,##0")).append("</b></font>"); // } else { // sb.append(FormatUtil.print(p.elapsed, "#,##0")); // } // // sb.append(" ms"); // } public static XLogPack toXLogPack(Pack p) { switch (p.getPackType()) { case PackEnum.XLOG: return (XLogPack) p; default: return null; } } }