package proj.zoie.perf.reports; import org.deepak.performance.PerformanceManager; import org.deepak.util.GenericStatisticsUtil; import java.text.SimpleDateFormat; import java.util.*; import java.io.*; public class ZoieHtmlCreator { private List tableList = new ArrayList(); private static String _dateString = null; static { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); Date date = new Date(System.currentTimeMillis()); _dateString = simpleDateFormat.format(date); } public static String getTimeStamp() { return _dateString; } public static String getSortingHtmlBegin(String pageTitle) { String jsStr = "<script type=\"text/javascript\">//<![CDATA[ \n " + " var sourceTable, destTable; \n " + " onload = function() { \n " + " sourceTable = new SortedTable('s'); \n " + " destTable = new SortedTable('d'); \n " + " mySorted = new SortedTable(); \n " + " mySorted.colorize = function() { \n " + " for (var i=0;i<this.elements.length;i++) { \n " + " if (i%2){ \n " + " this.changeClass(this.elements[i],'even','odd'); \n " + " } else { \n " + " this.changeClass(this.elements[i],'odd','even'); \n " + " } \n " + " } \n " + " } \n " + " mySorted.onsort = mySorted.colorize; \n " + " mySorted.onmove = mySorted.colorize; \n " + " mySorted.colorize(); \n " + " secondTable = SortedTable.getSortedTable(document.getElementById('id')); \n " + " secondTable.allowDeselect = false; \n " + " } \n " + " function moveRows(s,d) { \n " + " var a = new Array(); \n " + " for (var o in s.selectedElements) { \n " + " a.push(s.selectedElements[o]); \n " + " } \n " + " for (var o in a) { \n " + " var elm = a[o]; \n " + " var tds = elm.getElementsByTagName('td'); \n " + " for (var i in tds) { \n " + " if (tds[i].headers) tds[i].headers = d.table.id+''+tds[i].headers.substr(d.table.id.length); \n " + " } \n " + " d.body.appendChild(a[o]); \n " + " d.deselect(a[o]); \n " + " d.init(d.table); \n " + " d.sort(); \n " + " s.deselect(a[o]); \n " + " s.init(s.table); \n " + " } \n " + " } \n " + " //]]></script> \n "; String sortedTableJs = "<script type=\"text/javascript\"> \n " + " \n " + "SortedTable = function(id) { \n " + " this.table = null; \n " + " if (!document.getElementById || !document.getElementsByTagName) return false; \n " + " if (id) this.init(document.getElementById(id)); \n " + " else this.init(this.findTable()); \n " + " this.prep(); \n " + " if (!id && this.findTable()) new SortedTable(); \n " + "} \n " + " \n " + "// static \n " + "SortedTable.tables = new Array(); \n " + "SortedTable.move = function(d,elm) { \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (st) st.move(d,elm); \n " + "} \n " + "SortedTable.moveSelected = function(d,elm) { \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (st) st.move(d); \n " + "} \n " + "SortedTable.findParent = function(elm,tag) { \n " + " while (elm && elm.tagName && elm.tagName.toLowerCase()!=tag) elm = elm.parentNode; \n " + " return elm; \n " + "} \n " + "SortedTable.getEventElement = function(e) { \n " + " if (!e) e = window.event; \n " + " return (e.target)? e.target : e.srcElement; \n " + "} \n " + "SortedTable.getSortedTable = function(elm) { \n " + " elm = SortedTable.findParent(elm,'table'); \n " + " for (var i=0;i<SortedTable.tables.length;i++) { \n " + " var t = SortedTable.tables[i].table; \n " + " if (t==elm) return SortedTable.tables[i]; \n " + " } \n " + " return null; \n " + "} \n " + "SortedTable.gecko = (navigator.product==\"Gecko\"); \n " + "SortedTable.removeBeforeSort = SortedTable.gecko; \n " + " \n " + "// dynamic \n " + "SortedTable.prototype = { \n " + "// before init finished \n " + " init:function(elm) { \n " + " if (!elm) return false; \n " + " // main DOM properties \n " + " this.table = elm; \n " + " this.head = elm.getElementsByTagName('thead')[0]; \n " + " this.body = elm.getElementsByTagName('tbody')[0]; \n " + " this.foot = elm.getElementsByTagName('tfoot')[0]; \n " + " if (this.hasClass(this.table,'regroup')) this.regroup(); \n " + " this.elements = this.body.getElementsByTagName('tr'); \n " + " // other properties \n " + " this.allowMultiple = true; // set this to false to disallow multiple selection \n " + " this.allowDeselect = true; // set this to false to disallow deselection \n " + " // prepare the table \n " + " this.parseCols(); \n " + " this.selectedElements = new Array(); \n " + " }, \n " + " findTable:function() { \n " + " var elms = document.getElementsByTagName('table'); \n " + " for (var i=0;i<elms.length;i++) { \n " + " if (this.hasClass(elms[i],'sorted') && !SortedTable.getSortedTable(elms[i])) return elms[i]; \n " + " } \n " + " return null; \n " + " }, \n " + " parseCols:function() { \n " + " if (!this.table) return; \n " + " this.cols = new Array(); \n " + " var ths = this.head.getElementsByTagName('th'); \n " + " for (var i=0;i<ths.length;i++) { \n " + " this.cols[ths[i].id] = new Array(); \n " + " } \n " + " for (var i=0;i<this.elements.length;i++) { \n " + " var tds = this.elements[i].getElementsByTagName('td'); \n " + " for (var j=0;j<tds.length;j++) { \n " + " var headers = tds[j].headers.split(' '); \n " + " for (var k=0;k<headers.length;k++) { \n " + " if (this.cols[headers[k]]) this.cols[headers[k]].push(tds[j]); \n " + " } \n " + " } \n " + " } \n " + " }, \n " + " prep:function() { \n " + " if (!this.table || SortedTable.getSortedTable(this.table)) return; \n " + " this.register(); \n " + " this.prepBody(); \n " + " this.prepHeader(); \n " + " }, \n " + " register:function() { \n " + " SortedTable.tables.push(this); \n " + " }, \n " + " regroup:function() { \n " + " var tbs = this.table.getElementsByTagName('tbody'); \n " + " for (var i=tbs.length-1;i>0;i--) { \n " + " var trs = tbs[i].getElementsByTagName('tr'); \n " + " for (var j=trs.length-1;j>=0;j--) { \n " + " this.body.appendChild(trs[j]); \n " + " } \n " + " this.table.removeChild(tbs[i]); \n " + " } \n " + " }, \n " + "// helpers \n " + " trim:function(str) { \n " + " while (str.substr(0,1)==' ') str = str.substr(1); \n " + " while (str.substr(str.length-1,1)==' ') str = str.substr(0,str.length-1); \n " + " return str; \n " + " }, \n " + " hasClass:function(elm,findclass) { \n " + " if (!elm) return null; \n " + " return (' '+elm.className+' ').indexOf(' '+findclass+' ')+1; \n " + " }, \n " + " changeClass:function(elm,oldclass,newclass) { \n " + " if (!elm) return null; \n " + " var c = elm.className.split(' '); \n " + " for (var i=0;i<c.length;i++) { \n " + " c[i] = this.trim(c[i]); \n " + " if (c[i]==oldclass || c[i]==newclass || c[i]=='') c.splice(i,1); \n " + " } \n " + " c.push(newclass); \n " + " elm.className = this.trim(c.join(' ')); \n " + " }, \n " + " elementIndex:function(elm) { \n " + " for (var i=0;i<this.elements.length;i++) { \n " + " if (this.elements[i]==elm) return i; \n " + " } \n " + " return -1; \n " + " }, \n " + " findParent:SortedTable.findParent, \n " + "// events \n " + " callBodyHover:function(e) { \n " + " var elm = SortedTable.getEventElement(e); \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (!st) return false; \n " + " if (typeof(st.onbodyhover)=='function') st.onbodyhover(elm,e); \n " + " var elm = st.findParent(elm,'tr'); \n " + " if (e.type=='mouseover') st.changeClass(elm,'','hover'); \n " + " else if (e.type=='mouseout') st.changeClass(elm,'hover',''); \n " + " return false; \n " + " }, \n " + " callBodyClick:function(e) { \n " + " var elm = SortedTable.getEventElement(e); \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (!st) return false; \n " + " if (typeof(st.onbodyclick)=='function') st.onbodyclick(elm,e); \n " + " var elm = st.findParent(elm,'tr'); \n " + " if (e.shiftKey && st.allowMultiple) st.selectRange(elm); \n " + " else { \n " + " if (st.selected(elm)) { \n " + " if (st.allowDeselect) st.deselect(elm); \n " + " } else { \n " + " if (!e.ctrlKey || !st.allowMultiple) st.cleanselect(); \n " + " st.select(elm); \n " + " } \n " + " } \n " + " return false; \n " + " }, \n " + " callBodyDblClick:function(e) { \n " + " var elm = SortedTable.getEventElement(e); \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (!st) return false; \n " + " if (typeof(st.onbodydblclick)=='function') st.onbodydblclick(elm,e); \n " + " return false; \n " + " }, \n " + " callHeadHover:function(e) { \n " + " var elm = SortedTable.getEventElement(e); \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (!st) return false; \n " + " if (typeof(st.onheadhover)=='function') st.onheadhover(elm,e); \n " + " return false; \n " + " }, \n " + " callHeadClick:function(e) { \n " + " var elm = SortedTable.getEventElement(e); \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (!st) return false; \n " + " if (typeof(st.onheadclick)=='function') st.onheadclick(elm,e); \n " + " var elm = st.findParent(elm,'th'); \n " + " st.resort(elm); \n " + " return false; \n " + " }, \n " + " callHeadDblClick:function(e) { \n " + " var elm = SortedTable.getEventElement(e); \n " + " var st = SortedTable.getSortedTable(elm); \n " + " if (!st) return false; \n " + " if (typeof(st.onheaddblclick)=='function') st.onheaddblclick(elm,e); \n " + " return false; \n " + " }, \n " + "// inited \n " + " prepHeader:function() { \n " + " var ths = this.head.getElementsByTagName('th'); \n " + " for (var i=0;i<ths.length;i++) { \n " + " if (this.hasClass(ths[i],'nosort')) continue; \n " + " ths[i].style.cursor = 'pointer'; \n " + " addEvent(ths[i],'click',this.callHeadClick); \n " + " addEvent(ths[i],'dblclick',this.callHeadDblClick); \n " + " addEvent(ths[i],'mouseover',this.callHeadHover); \n " + " addEvent(ths[i],'mouseout',this.callHeadHover); \n " + " if (this.hasClass(ths[i],'sortedplus') || this.hasClass(ths[i],'sortedminus')) this.sort(ths[i]); \n " + " } \n " + " }, \n " + " prepBody:function() { \n " + " var elm = this.body.lastChild; \n " + " var pelm; \n " + " while (elm) { \n " + " pelm = elm.previousSibling; \n " + " if (elm.nodeType!=1) this.body.removeChild(elm); \n " + " elm = pelm; \n " + " } \n " + " var trs = this.body.getElementsByTagName('tr'); \n " + " for (var i=0;i<trs.length;i++) { \n " + " trs[i].style.cursor = 'pointer'; \n " + " addEvent(trs[i],'click',this.callBodyClick); \n " + " addEvent(trs[i],'dblclick',this.callBodyDblClick); \n " + " addEvent(trs[i],'mouseover',this.callBodyHover); \n " + " addEvent(trs[i],'mouseout',this.callBodyHover); \n " + " } \n " + " }, \n " + "// selecting \n " + " selected:function(elm) { \n " + " return this.hasClass(elm,'selrow'); \n " + " }, \n " + " select:function(elm) { \n " + " this.changeClass(elm,'','selrow'); \n " + " this.selectedElements.push(elm); \n " + " if (typeof(this.onselect)=='function') this.onselect(elm); \n " + " }, \n " + " deselect:function(elm) { \n " + " this.changeClass(elm,'selrow',''); \n " + " for (var i=0;i<this.selectedElements.length;i++) { \n " + " if (this.selectedElements[i]==elm) this.selectedElements.splice(i,1); \n " + " } \n " + " if (typeof(this.ondeselect)=='function') this.ondeselect(elm); \n " + " }, \n " + " selectRange:function(elm1) { \n " + " if (this.selectedElements.length==0) { \n " + " this.select(elm1); \n " + " return false; \n " + " } \n " + " var elm0 = this.selectedElements[this.selectedElements.length-1]; \n " + " var d = (this.elementIndex(elm0) < this.elementIndex(elm1)); \n " + " var elm = elm0; \n " + " if (this.selected(elm1)) {if (this.selected(elm0)) this.deselect(elm0);} \n " + " else {if (!this.selected(elm0)) this.select(elm0);} \n " + " do { \n " + " elm = (d)? elm.nextSibling : elm.previousSibling; \n " + " if (this.selected(elm)) this.deselect(elm); \n " + " else this.select(elm); \n " + " } while (elm!=elm1); \n " + " return true; \n " + " }, \n " + " cleanselect:function() { \n " + " for (var i=0;i<this.elements.length;i++) { \n " + " if (this.selected(this.elements[i])) this.deselect(this.elements[i]); \n " + " } \n " + " this.selectedElements = new Array(); \n " + " }, \n " + "// sorting \n " + " compareSmart:function(v1,v2) { \n " + " v1 = (v1)? v1.split(' ') : []; \n " + " v2 = (v2)? v2.split(' ') : []; \n " + " l = Math.max(v1.length,v2.length); \n " + " var r = 0; \n " + " for (var i=0;i<l;i++) { \n " + " if (v1[i]==v2[i]) continue; \n " + " if (!v1[i]) v1[i] = \"\"; \n " + " if (!v2[i]) v2[i] = \"\"; \n " + " if (!isNaN(parseFloat(v1[i]))) v1[i] = parseFloat(v1[i]); \n " + " if (!isNaN(parseFloat(v2[i]))) v2[i] = parseFloat(v2[i]); \n " + " if (isNaN(v1[i])&&!isNaN(v2[i])) return 1; \n " + " else if (!isNaN(v1[i])&&isNaN(v2[i])) return -1; \n " + " else if (v1[i]>v2[i]) return 1; \n " + " else if (v1[i]<v2[i]) return -1; \n " + " } \n " + " return 0; \n " + " }, \n " + " compare:function(v1,v2,st) { \n " + " var st = (!st)? SortedTable.getSortedTable(v1) : st; \n " + " if (v1==null || v2==null) return 0; \n " + " var axis = v1.axis.toLowerCase(); \n " + " var v1s = (v1.title)? v1.title : (v1.innerHTML)? v1.innerHTML : ''; \n " + " var v2s = (v2.title)? v2.title : (v2.innerHTML)? v2.innerHTML : ''; \n " + " if (axis=='string') { \n " + " return st.compareSmart(v1s.toLowerCase(),v2s.toLowerCase()); \n " + " } else if (axis=='sstring') { \n " + " return st.compareSmart(v1s,v2s); \n " + " } else if (axis=='number') { \n " + " v1 = parseFloat(v1s); \n " + " if (isNaN(v1)) v1 = Infinity; \n " + " v2 = parseFloat(v2s); \n " + " if (isNaN(v2)) v2 = Infinity; \n " + " } else { \n " + " v1 = (v1s!='')? v1s : v1; \n " + " v2 = (v2s!='')? v2s : v2; \n " + " } \n " + " if (v1==null || v2==null) return 0; \n " + " else if (v1>v2) return 1 \n " + " else if (v1<v2) return -1; \n " + " return 0; \n " + " }, \n " + " findSort:function() { \n " + " var ths = this.head.getElementsByTagName('th'); \n " + " for (var i=0;i<ths.length;i++) { \n " + " if (this.hasClass(ths[i],'sortedminus') || this.hasClass(ths[i],'sortedplus')) return ths[i]; \n " + " } \n " + " return null; \n " + " }, \n " + " sort:function(elm,reverseonly) { \n " + " var st = this; \n " + " var comparator = function(v1,v2) { \n " + " return st.compare(v1,v2,st); \n " + " } \n " + " if (!elm) elm = this.findSort(); \n " + " if (!elm) return false; \n " + " var col = this.cols[elm.id]; \n " + " if (!reverseonly) col.sort(comparator); \n " + " if (this.hasClass(elm,'sortedminus') || reverseonly) col.reverse(); \n " + " var b_sibling,b_parent; \n " + " if (SortedTable.removeBeforeSort) { \n " + " b_sibling = this.body.nextSibling; \n " + " b_parent = this.body.parentNode; \n " + " b_parent.removeChild(this.body); \n " + " } \n " + " for (var i=0;i<col.length;i++) { \n " + " this.body.appendChild(this.findParent(col[i],'tr')); \n " + " } \n " + " if (SortedTable.removeBeforeSort) { \n " + " b_parent.insertBefore(this.body,b_sibling); \n " + " } \n " + " if (typeof(this.onsort)=='function') this.onsort(elm); \n " + " }, \n " + " resort:function(elm) { \n " + " if (!elm) return false; \n " + " this.cleansort(elm); \n " + " var reverseonly = false; \n " + " if (this.hasClass(elm,'sortedplus')) { \n " + " this.changeClass(elm,'sortedplus','sortedminus'); \n " + " reverseonly = true; \n " + " } else if (this.hasClass(elm,'sortedminus')) { \n " + " this.changeClass(elm,'sortedminus','sortedplus'); \n " + " reverseonly = true; \n " + " } else { \n " + " this.changeClass(elm,'sortedminus','sortedplus'); \n " + " } \n " + " this.sort(elm,reverseonly); \n " + " }, \n " + " cleansort:function(except) { \n " + " var ths = this.head.getElementsByTagName('th'); \n " + " for (var i=0;i<ths.length;i++) { \n " + " if (ths[i]==except) continue; \n " + " if (this.hasClass(ths[i],'sortedminus')) this.changeClass(ths[i],'sortedminus',''); \n " + " else if (this.hasClass(ths[i],'sortedplus')) this.changeClass(ths[i],'sortedplus',''); \n " + " } \n " + " }, \n " + "// movement \n " + " compareindex:function(v1,v2) { \n " + " var st = SortedTable.getSortedTable(v1); \n " + " if (!st) return 0; \n " + " v1 = st.elementIndex(v1); \n " + " v2 = st.elementIndex(v2); \n " + " if (v1==null || v2==null) return 0; \n " + " else if (v1<v2) return 1 \n " + " else if (v2<v1) return -1; \n " + " return 0; \n " + " }, \n " + " move:function(d,elm) { \n " + " if (elm) this.moverow(d,elm); \n " + " else { \n " + " var m = true; \n " + " for (var i=0;i<this.selectedElements.length;i++) { \n " + " if (!this.canMove(d,this.selectedElements[i])) m = false; \n " + " } \n " + " if (m) { \n " + " var moving = this.selectedElements.slice(0,this.selectedElements.length); \n " + " moving.sort(this.compareindex); \n " + " if (d>0) moving.reverse(); \n " + " for (var i=0;i<moving.length;i++) { \n " + " this.moverow(d,moving[i]); \n " + " } \n " + " } \n " + " } \n " + " if (typeof(this.onmove)=='function') this.onmove(d,elm); \n " + " }, \n " + " moverow:function(d,elm) { \n " + " this.cleansort(); \n " + " var parent = elm.parentNode; \n " + " var sibling = this.canMove(d,elm); \n " + " if (!sibling) return false; \n " + " if (d>0) { \n " + " parent.removeChild(elm); \n " + " parent.insertBefore(elm,sibling); \n " + " } else { \n " + " parent.removeChild(elm); \n " + " if (sibling.nextSibling) parent.insertBefore(elm,sibling.nextSibling); \n " + " else parent.appendChild(elm); \n " + " } \n " + " }, \n " + " canMove:function(d,elm) { \n " + " if (d>0) return elm.previousSibling; \n " + " else return elm.nextSibling; \n " + " } \n " + "} \n " + "</script> \n "; String eventJs = "<script type=\"text/javascript\"> \n " + " \n " + "function addEvent(obj,type,fn) { \n " + " if (obj.addEventListener) obj.addEventListener(type,fn,false); \n " + " else if (obj.attachEvent) { \n " + " obj[\"e\"+type+fn] = fn; \n " + " obj[type+fn] = function() {obj[\"e\"+type+fn](window.event);} \n " + " obj.attachEvent(\"on\"+type, obj[type+fn]); \n " + " } \n " + "} \n " + " \n " + "function removeEvent(obj,type,fn) { \n " + " if (obj.removeEventListener) obj.removeEventListener(type,fn,false); \n " + " else if (obj.detachEvent) { \n " + " obj.detachEvent(\"on\"+type, obj[type+fn]); \n " + " obj[type+fn] = null; \n " + " obj[\"e\"+type+fn] = null; \n " + " } \n " + "} \n " + " \n " + "</script> \n "; // eventJs = ""; String beginStr = "<html> \n <head> \n " + "<style type=\"text/css\"> \n" + "TABLE{ \n background-color:#E6E6FA; \n} \n" + "body {background-color:#CCFFFF;} \n" + "h1 { \n padding:10px 10px 0px 10px; \n margin:0px; \n color:#EAEAEA; \n " + "h1.title { \n padding:10px 10px 0px 10px; \n margin:0px; \n color:rgb(255,255,255); \n } \n" + "font-family:Verdana, Tahoma; \n font-size : 20px; \n font-weight:bold; \n text-align:center; \n font-style: oblique; \n } \n" + "TABLE.title{ \n background-color:rgb(0,0,102); \n align:center; \n width:85%; \n} \n" + ".odd td {background-color:#E8ECF1;} \n" + ".even td {background-color:#DDE5EB;} \n" + ".hover td {background-color:#A5B3C9;} \n" + ".sortedminus {background-color:#ecc;} \n" + ".sortedplus {background-color:#cec;} \n" + ".selrow td {background-color:#879AB7;} \n" + "</style> \n" + eventJs + "\n" + sortedTableJs + "\n" + jsStr + "\n" + "<title> " + pageTitle + " </title>" + "</head> \n <body>\n"; // + // "<table class=\"title\" cellpadding=\"2\" cellspacing=\"2\" border=\"0\" align=\"center\">" // + "<tbody>" + "<tr> <th class=\"title\"> <br>" // + "<h1 class=\"title\">PEOPLE SEARCH TEST RESULT ANALYSIS </h1> " // + "<br> </th> </tbody> </table> <br> <br> \n"; return beginStr; } public static String getNonSortingHtmlBegin(String pageTitle) { String htmlBeginPart = "<html>\n" + "<head>\n" + "<META http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\">\n" + "<title> " + pageTitle + " </title>\n" + "<style type=\"text/css\">\n" + "body {\n" + "font:normal 68% verdana,arial,helvetica;\n" + "color:#000000;\n" + "}\n" + "table tr td, table tr th {\n" + "font-size: 68%;\n" + "}\n" + "table.details tr th{\n" + "font-weight: bold;\n" + "text-align:left;\n" + "background:#a6caf0;\n" + "white-space: nowrap;\n" + "}\n" + "table.details tr td{\n" + "background:#eeeee0;\n" + "white-space: nowrap;\n" + "}\n" + "h1 {\n" + "margin: 0px 0px 5px; font: 165% verdana,arial,helvetica\n" + "}\n" + "h2 {\n" + "margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica\n" + "}\n" + "h3 {\n" + "margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica\n" + "}\n" + "h4 {\n" + "font:normal 115% verdana,arial,helvetica\n" + " }\n" + ".Failure {\n" + "font-weight:bold; color:red;\n" + "}\n" + "img\n" + "{\n" + "border-width: 0px;\n" + "}\n" + ".expand_link\n" + "{\n" + "position=absolute;\n" + "right: 0px;\n" + "width: 27px;\n" + "top: 1px;\n" + "height: 27px;\n" + "}\n" + ".page_details\n" + "{\n" + "display: none;\n" + "}\n" + ".page_details_expanded\n" + "{\n" + "display: block;\n" + "}\n" + "</style>\n </head> \n <body> \n "; return htmlBeginPart; } public static String getSimpleComparisonHeadingHtml(String[] expectedHeaders) { String result = "<tr valign=\"top\">\n"; for (int i = 0; i < expectedHeaders.length; i++) { if (i == 0) { result = result + "<th title=\"" + expectedHeaders[i] + "\">" + expectedHeaders[i] + "</th> "; } else { result = result + "<th colspan=\"2\" title=\"" + "DIFFERENCE IN " + expectedHeaders[i] + "\">" + "DIFFERENCE IN " + expectedHeaders[i] + "</th> "; } } result = result + "\n</tr>\n"; return result; } public static String getSimpleNormalHeadingHtml(String key, String[] expectedHeaders) { String result = "<tr valign=\"top\">\n"; result = result + "<th title=\"" + key + "\">" + key + "</th> "; for (int i = 0; i < expectedHeaders.length; i++) { result = result + "<th title=\"" + expectedHeaders[i] + "\">" + expectedHeaders[i] + "</th> "; } result = result + "\n</tr>\n"; return result; } public static String getSimpleNormalRowHtmlString(String key, String[] expectedHeaders, String[] values, String versionOne) { String verString = ""; if ((versionOne != null) && (!"".equals(versionOne.trim()))) { verString = " in version " + versionOne; } String row = "<tr valign=\"top\">\n"; row = row + "<td rowspan=\"1\" valign=\"top\"> <b>" + key + "</b> </td>\n"; for (int i = 0; i < expectedHeaders.length; i++) { row = row + "<td title=\"Value of " + expectedHeaders[i] + verString + "\">" + values[i] + " </td>\n"; } row = row + "</tr>\n"; return row; } public static String getSimpleNormalRowHtmlString(String key, GenericStatisticsUtil su, String versionOne) { String[] expectedHeaders = GenericStatisticsUtil.getHeaders(); String[] values = new String[] { su.getCount() + "", su.getMin() + "", su.getMax() + "", PerformanceManager.truncateNumber(su.getMean(), 3) + "", su.getMedian() + "", PerformanceManager.truncateNumber(su.getStandardDeviation(), 3) + "", su.getNthPercentile(90) + "" }; String verString = ""; if ((versionOne != null) && (!"".equals(versionOne.trim()))) { verString = " in version " + versionOne; } String row = "<tr valign=\"top\">\n"; row = row + "<td rowspan=\"1\" valign=\"top\"> <b>" + key + "</b> </td>\n"; for (int i = 0; i < expectedHeaders.length; i++) { row = row + "<td title=\"Value of " + expectedHeaders[i] + verString + "\">" + values[i] + " </td>\n"; } row = row + "</tr>\n"; return row; } public static String getSimpleTableHtmlStringForGraphs(String[] strs, String alignment, int numOfImagesInRow) { int number = 2; if (numOfImagesInRow > 0) { number = numOfImagesInRow; } String align = "center"; if ((alignment != null) && (!"".equalsIgnoreCase(alignment))) { align = alignment; } boolean isClosed = true; int numToBeFilled = (strs.length) % number; if (strs.length <= numOfImagesInRow) { numToBeFilled = 0; } String table = "<table class=\"details\" border=\"0\" cellpadding=\"5\" cellspacing=\"2\" width=\"95%\">\n"; if (strs != null) { for (int i = 0; i < strs.length; i++) { if (i == 0) { table = table + "<tr valign=\"top\">\n"; table = table + "<td> <" + align + "> <img src=\"" + strs[i] + "\"> </" + align + "> </td>\n"; isClosed = false; } else { if ((i + 1) % number == 0) { table = table + "<td> <" + align + "> <img src=\"" + strs[i] + "\"> </" + align + "> </td>\n"; table = table + "</tr>\n"; isClosed = true; } else { table = table + "<td> <" + align + "> <img src=\"" + strs[i] + "\"> </" + align + "> </td>\n"; isClosed = false; } } } if (!isClosed) { for (int i = 0; i < numToBeFilled; i++) { table = table + "<td> </td>\n"; } table = table + "</tr>\n"; } } table = table + "</table> \n"; return table; } public static String getSimpleTableHtmlString(String key, String[] scenarios, GenericStatisticsUtil[] su, String versionOne) { String table = "<table class=\"details\" border=\"0\" cellpadding=\"5\" cellspacing=\"2\" width=\"95%\">\n"; table = table + getSimpleNormalHeadingHtml(key, GenericStatisticsUtil.getHeaders()) + "\n"; for (int i = 0; i < scenarios.length; i++) { table = table + getSimpleNormalRowHtmlString(scenarios[i], su[i], versionOne); } table = table + "</table> \n"; return table; } public static String getSimpleTableHtmlString(String[] headings, String[] values) { String table = "<table class=\"details\" border=\"0\" cellpadding=\"5\" cellspacing=\"2\" width=\"95%\">\n"; String row = ""; if (headings.length > 0) { row = "<tr valign=\"top\">\n"; String key = headings[0]; String[] tmpHeadings = new String[headings.length - 1]; for (int i = 0; i < tmpHeadings.length; i++) { tmpHeadings[i] = headings[i + 1]; } table = table + getSimpleNormalHeadingHtml(key, tmpHeadings) + "\n"; row = row + "<td rowspan=\"1\" valign=\"top\"> " + values[0] + " </td>\n"; for (int i = 1; i < headings.length; i++) { row = row + "<td>" + values[i] + " </td>\n"; } row = row + "</tr>\n"; } table = table + row + "</table> \n"; return table; } public static String getSimpleTableHtmlString(String[] headings, String tableBody) { String table = "<table class=\"details\" border=\"0\" cellpadding=\"5\" cellspacing=\"2\" width=\"95%\">\n"; String row = ""; if (headings.length > 0) { row = "<tr valign=\"top\">\n"; String key = headings[0]; String[] tmpHeadings = new String[headings.length - 1]; for (int i = 0; i < tmpHeadings.length; i++) { tmpHeadings[i] = headings[i + 1]; } table = table + getSimpleNormalHeadingHtml(key, tmpHeadings) + "\n"; row = tableBody + "\n"; } table = table + row + "</table> \n"; return table; } public static String getHtmlEnd() { String htmlEndPart = " </body> \n </html>\n"; return htmlEndPart; } public void addTable(String heading, String table) { String result = " \n"; if ((heading != null) && (!"".equals(heading.trim()))) { result = result + "<h2> " + heading + "</h2> \n"; } result = result + table + "<hr><br> \n"; tableList.add(result); } public void createSimpleNormalHtmlFile(String outFile, String pageTitle) throws Exception { Writer writer = new FileWriter(new File(outFile), false); writer.write(getNonSortingHtmlBegin(pageTitle)); writer.flush(); Iterator itr = tableList.iterator(); while (itr.hasNext()) { writer.write((String) itr.next()); writer.flush(); } writer.write(getHtmlEnd()); writer.flush(); writer.close(); } }