/*
* 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 ... -->");
}
/**
* Closes the innermost XML tag and pops it from the stack.
*
* @param name the tag's name
*/
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();
}
}