001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.mmtk.utility.statistics; 014 015 import org.mmtk.utility.Log; 016 import org.vmmagic.pragma.Uninterruptible; 017 import org.vmmagic.unboxed.Word; 018 019 /** 020 * Utility class for writing statistics out in XML format. 021 */ 022 @Uninterruptible 023 public class Xml { 024 /** 025 * Mark the start of XML output 026 */ 027 public static void begin() { 028 Log.writeln("<xml-begin/> <!-- Everything until xml-end is now valid xml -->"); 029 } 030 031 /** 032 * Mark the end of XML output 033 */ 034 public static void end() { 035 Log.writeln("<xml-end/> <!-- Non-xml data follows ... -->"); 036 } 037 038 /** 039 * Close the innermost XML tag and pop it from the stack. 040 */ 041 public static void closeTag(String name) { 042 Log.write("</"); Log.write(name); Log.writeln(">"); 043 } 044 045 /** 046 * Open an XML tag. 047 * 048 * @param name Tag name 049 * @param endTag Should the tag be closed, or left open for 050 * adding additional attributes 051 */ 052 static void openTag(String name, boolean endTag) { 053 openMinorTag(name); 054 if (endTag) 055 closeTag(false); 056 } 057 058 /** 059 * Open a simple XML entity. 060 * 061 * @param name Name of the entity 062 */ 063 static void openTag(String name) { openTag(name,true); } 064 065 /** 066 * Output a "stat" entity, with a given name, <code>double</code>value and optionally, units. 067 * 068 * @param name Name of the entity 069 * @param value The value of the entity 070 * @param units The units, or null for no units. 071 */ 072 public static void singleValue(String name, double value, String units) { 073 openMinorTag("stat"); 074 attribute("name",name); 075 attribute("value",value); 076 if (units != null) attribute("units",units); 077 closeMinorTag(); 078 } 079 080 /** 081 * Convenience version of singleValue where units are not specified. 082 * 083 * @param name Name of the entity 084 * @param value The value of the entity 085 */ 086 public static void singleValue(String name, double value) { 087 singleValue(name,value,null); 088 } 089 090 /** 091 * Output a "config" entity, with a given name and <code>boolean</code>value. 092 * 093 * @param name Name of the entity 094 * @param value The value of the entity 095 */ 096 public static void configItem(String name, boolean value) { 097 openMinorTag("conf"); 098 attribute("name",name); 099 attribute("value",value); 100 closeMinorTag(); 101 } 102 103 /** 104 * Output a "config" entity, with a given name and <code>String</code>value. 105 * 106 * @param name Name of the entity 107 * @param value The value of the entity 108 */ 109 public static void configItem(String name, String value) { 110 openMinorTag("conf"); 111 attribute("name",name); 112 attribute("value",value); 113 closeMinorTag(); 114 } 115 116 /** 117 * Output a "stat" entity, with a given name, <code>long</code> value and 118 * optionally, units. 119 * 120 * @param name Name of the entity 121 * @param value The value of the entity 122 * @param units The units, or null for no units. 123 */ 124 public static void singleValue(String name, long value, String units) { 125 openMinorTag("stat"); 126 attribute("name",name); 127 attribute("value",value); 128 if (units != null) attribute("units",units); 129 closeMinorTag(); 130 } 131 132 /** 133 * Convenience version of singleValue where units are not specified. 134 * 135 * @param name Name of the entity 136 * @param value The value of the entity 137 */ 138 public static void singleValue(String name, long value) { 139 singleValue(name,value,null); 140 } 141 142 /** 143 * Add a word-valued attribute to an open XML tag. 144 * 145 * @param name Name of the entity 146 * @param value The value of the entity 147 */ 148 public static void attribute(String name, Word value) { 149 openAttribute(name); Log.write(value); closeAttribute(); 150 } 151 152 /** 153 * Add a byte[]-valued attribute to an open XML tag. 154 * 155 * @param name Name of the entity 156 * @param value The value of the entity 157 */ 158 public static void attribute(String name, byte[] value) { 159 openAttribute(name); Log.write(value); closeAttribute(); 160 } 161 162 /** 163 * Add a String-valued attribute to an open XML tag. 164 * 165 * @param name Name of the entity 166 * @param value The value of the entity 167 */ 168 public static void attribute(String name, String value) { 169 openAttribute(name); Log.write(value); closeAttribute(); 170 } 171 172 /** 173 * Add a boolean-valued attribute to an open XML tag. 174 * 175 * @param name Name of the entity 176 * @param value The value of the entity 177 */ 178 public static void attribute(String name, boolean value) { 179 openAttribute(name); Log.write(value); closeAttribute(); 180 } 181 182 /** 183 * Add a double-valued attribute to an open XML tag. 184 * 185 * @param name Name of the entity 186 * @param value The value of the entity 187 */ 188 public static void attribute(String name, double value) { 189 openAttribute(name); Log.write(value); closeAttribute(); 190 } 191 192 /** 193 * Add a long-valued attribute to an open XML tag. 194 * 195 * @param name Name of the entity 196 * @param value The value of the entity 197 */ 198 public static void attribute(String name, long value) { 199 openAttribute(name); Log.write(value); closeAttribute(); 200 } 201 202 /** 203 * Add an int-valued attribute to an open XML tag. 204 * 205 * @param name Name of the entity 206 * @param value The value of the entity 207 */ 208 public static void attribute(String name, int value) { 209 openAttribute(name); Log.write(value); closeAttribute(); 210 } 211 212 /** 213 * Close an attribute (actually a simple close-quote) 214 */ 215 public static void closeAttribute() { 216 Log.write("\""); 217 } 218 219 /** 220 * Open an attribute (write "{name}=\") 221 * 222 * @param name Name of the entity 223 */ 224 public static void openAttribute(String name) { 225 Log.write(" "); Log.write(name); Log.write("=\""); 226 } 227 228 /** 229 * Start a tag 230 */ 231 public static void startTag() { 232 Log.write("<"); 233 } 234 235 /** 236 * End a tag, optionally closing it (if it is a simple entity) 237 * 238 * @param close If true, close the tag with "/>" rather than ">" 239 */ 240 public static void closeTag(boolean close) { 241 closeTag(close,true); 242 } 243 244 /** 245 * End a tag, optionally closing it (if it is a simple entity), 246 * and optionally printing end-of-line 247 * 248 * @param close If true, close the tag with "/>" rather than ">" 249 * @param endLine If true end the current line. 250 */ 251 public static void closeTag(boolean close, boolean endLine) { 252 if (close) Log.write("/"); 253 Log.write(">"); 254 if (endLine) Log.writeln(); 255 } 256 257 /** 258 * Close a tag with a "/>" 259 */ 260 public static void closeMinorTag() { 261 closeTag(true,true); 262 } 263 264 /** 265 * Open a tag without pushing it on the tag stack - must end this 266 * with a call to closeMinorTag() 267 * 268 * @param name Name of the entity 269 */ 270 public static void openMinorTag(String name) { 271 Log.write("<"); Log.write(name); 272 } 273 274 /** 275 * Open an XML comment 276 */ 277 public static void openComment() { 278 Log.write("<!-- "); 279 } 280 281 /** 282 * Close an XML comment 283 */ 284 public static void closeComment() { 285 Log.write(" -->"); 286 } 287 288 /** 289 * Add a comment, bracketing it with open- and close-comment tags. 290 * 291 * @param comment The comment. 292 */ 293 public static void comment(String comment) { 294 openComment(); 295 Log.write(comment); 296 closeComment(); 297 Log.writeln(); 298 } 299 300 }