| /* |
| * This file is part of the Jikes RVM project (http://jikesrvm.org). |
| * |
| * This file is licensed to You under the Eclipse Public License (EPL); |
| * You may not use this file except in compliance with the License. You |
| * may obtain a copy of the License at |
| * |
| * http://www.opensource.org/licenses/eclipse-1.0.php |
| * |
| * See the COPYRIGHT.txt file distributed with this work for information |
| * regarding copyright ownership. |
| */ |
| package org.mmtk.utility.statistics; |
| |
| import org.mmtk.utility.Log; |
| import org.vmmagic.pragma.Uninterruptible; |
| import org.vmmagic.unboxed.Word; |
| |
| /** |
| * Utility class for writing statistics out in XML format. |
| */ |
| @Uninterruptible |
| public class Xml { |
| /** |
| * Mark the start of XML output |
| */ |
| public static void begin() { |
| Log.writeln("<xml-begin/> <!-- Everything until xml-end is now valid xml -->"); |
| } |
| |
| /** |
| * Mark the end of XML output |
| */ |
| public static void end() { |
| Log.writeln("<xml-end/> <!-- Non-xml data follows ... -->"); |
| } |
| |
| /** |
| * Close the innermost XML tag and pop it from the stack. |
| */ |
| public static void closeTag(String name) { |
| Log.write("</"); Log.write(name); Log.writeln(">"); |
| } |
| |
| /** |
| * Open an XML tag. |
| * |
| * @param name Tag name |
| * @param endTag Should the tag be closed, or left open for |
| * adding additional attributes |
| */ |
| static void openTag(String name, boolean endTag) { |
| openMinorTag(name); |
| if (endTag) |
| closeTag(false); |
| } |
| |
| /** |
| * Open a simple XML entity. |
| * |
| * @param name Name of the entity |
| */ |
| static void openTag(String name) { openTag(name,true); } |
| |
| /** |
| * Output a "stat" entity, with a given name, <code>double</code>value and optionally, units. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| * @param units The units, or null for no units. |
| */ |
| public static void singleValue(String name, double value, String units) { |
| openMinorTag("stat"); |
| attribute("name",name); |
| attribute("value",value); |
| if (units != null) attribute("units",units); |
| closeMinorTag(); |
| } |
| |
| /** |
| * Convenience version of singleValue where units are not specified. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void singleValue(String name, double value) { |
| singleValue(name,value,null); |
| } |
| |
| /** |
| * Output a "config" entity, with a given name and <code>boolean</code>value. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void configItem(String name, boolean value) { |
| openMinorTag("conf"); |
| attribute("name",name); |
| attribute("value",value); |
| closeMinorTag(); |
| } |
| |
| /** |
| * Output a "config" entity, with a given name and <code>String</code>value. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void configItem(String name, String value) { |
| openMinorTag("conf"); |
| attribute("name",name); |
| attribute("value",value); |
| closeMinorTag(); |
| } |
| |
| /** |
| * Output a "stat" entity, with a given name, <code>long</code> value and |
| * optionally, units. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| * @param units The units, or null for no units. |
| */ |
| public static void singleValue(String name, long value, String units) { |
| openMinorTag("stat"); |
| attribute("name",name); |
| attribute("value",value); |
| if (units != null) attribute("units",units); |
| closeMinorTag(); |
| } |
| |
| /** |
| * Convenience version of singleValue where units are not specified. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void singleValue(String name, long value) { |
| singleValue(name,value,null); |
| } |
| |
| /** |
| * Add a word-valued attribute to an open XML tag. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void attribute(String name, Word value) { |
| openAttribute(name); Log.write(value); closeAttribute(); |
| } |
| |
| /** |
| * Add a byte[]-valued attribute to an open XML tag. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void attribute(String name, byte[] value) { |
| openAttribute(name); Log.write(value); closeAttribute(); |
| } |
| |
| /** |
| * Add a String-valued attribute to an open XML tag. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void attribute(String name, String value) { |
| openAttribute(name); Log.write(value); closeAttribute(); |
| } |
| |
| /** |
| * Add a boolean-valued attribute to an open XML tag. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void attribute(String name, boolean value) { |
| openAttribute(name); Log.write(value); closeAttribute(); |
| } |
| |
| /** |
| * Add a double-valued attribute to an open XML tag. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void attribute(String name, double value) { |
| openAttribute(name); Log.write(value); closeAttribute(); |
| } |
| |
| /** |
| * Add a long-valued attribute to an open XML tag. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void attribute(String name, long value) { |
| openAttribute(name); Log.write(value); closeAttribute(); |
| } |
| |
| /** |
| * Add an int-valued attribute to an open XML tag. |
| * |
| * @param name Name of the entity |
| * @param value The value of the entity |
| */ |
| public static void attribute(String name, int value) { |
| openAttribute(name); Log.write(value); closeAttribute(); |
| } |
| |
| /** |
| * Close an attribute (actually a simple close-quote) |
| */ |
| public static void closeAttribute() { |
| Log.write("\""); |
| } |
| |
| /** |
| * Open an attribute (write "{name}=\") |
| * |
| * @param name Name of the entity |
| */ |
| public static void openAttribute(String name) { |
| Log.write(" "); Log.write(name); Log.write("=\""); |
| } |
| |
| /** |
| * Start a tag |
| */ |
| public static void startTag() { |
| Log.write("<"); |
| } |
| |
| /** |
| * End a tag, optionally closing it (if it is a simple entity) |
| * |
| * @param close If true, close the tag with "/>" rather than ">" |
| */ |
| public static void closeTag(boolean close) { |
| closeTag(close,true); |
| } |
| |
| /** |
| * End a tag, optionally closing it (if it is a simple entity), |
| * and optionally printing end-of-line |
| * |
| * @param close If true, close the tag with "/>" rather than ">" |
| * @param endLine If true end the current line. |
| */ |
| public static void closeTag(boolean close, boolean endLine) { |
| if (close) Log.write("/"); |
| Log.write(">"); |
| if (endLine) Log.writeln(); |
| } |
| |
| /** |
| * Close a tag with a "/>" |
| */ |
| public static void closeMinorTag() { |
| closeTag(true,true); |
| } |
| |
| /** |
| * Open a tag without pushing it on the tag stack - must end this |
| * with a call to closeMinorTag() |
| * |
| * @param name Name of the entity |
| */ |
| public static void openMinorTag(String name) { |
| Log.write("<"); Log.write(name); |
| } |
| |
| /** |
| * Open an XML comment |
| */ |
| public static void openComment() { |
| Log.write("<!-- "); |
| } |
| |
| /** |
| * Close an XML comment |
| */ |
| public static void closeComment() { |
| Log.write(" -->"); |
| } |
| |
| /** |
| * Add a comment, bracketing it with open- and close-comment tags. |
| * |
| * @param comment The comment. |
| */ |
| public static void comment(String comment) { |
| openComment(); |
| Log.write(comment); |
| closeComment(); |
| Log.writeln(); |
| } |
| |
| } |