📄 rrdgraphdeftemplate.java
字号:
/* ============================================================
* JRobin : Pure java implementation of RRDTool's functionality
* ============================================================
*
* Project Info: http://www.jrobin.org
* Project Lead: Sasa Markovic (saxon@jrobin.org);
*
* (C) Copyright 2003-2005, by Sasa Markovic.
*
* Developers: Sasa Markovic (saxon@jrobin.org)
*
*
* This library is free software; you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Foundation;
* either version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
package org.jrobin.graph;
import org.jrobin.core.RrdException;
import org.jrobin.core.Util;
import org.jrobin.core.XmlTemplate;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import java.awt.*;
import java.io.File;
import java.io.IOException;
/**
* Class used to create an arbitrary number of RrdGraphDef (graph definition) objects
* from a single XML template. XML template can be supplied as an XML InputSource,
* XML file or XML formatted string.<p>
* <p/>
* Here is an example of a properly formatted XML template with all available options in it
* (unwanted options can be removed/ignored):<p>
* <pre>
* <rrd_graph_def>
* <!-- use '-' to represent in-memory graph -->
* <filename>test.png</filename>
* <!--
* starting and ending timestamps can be specified by
* using at-style time specification, or by specifying
* exact timestamps since epoch (without milliseconds)
* -->
* <span>
* <start>now - 1d</start>
* <end>now</end>
* </span>
* <options>
* <!--
* specify 'true' if you want to use RrdDbPool while
* creating graph
* -->
* <use_pool>false</use_pool>
* <anti_aliasing>true</anti_aliasing>
* <time_grid>
* <show_grid>true</show_grid>
* <!-- allowed units: second, minute, hour, day, week, month, year -->
* <minor_grid_unit>minute</minor_grid_unit>
* <minor_grid_unit_count>60</minor_grid_unit_count>
* <major_grid_unit>hour</major_grid_unit>
* <major_grid_unit_count>2</major_grid_unit_count>
* <label_unit>hour</label_unit>
* <label_unit_count>2</label_unit_count>
* <label_span>1200</label_span>
* <!-- use SimpleDateFormat or strftime-like format to format labels -->
* <label_format>dd-MMM-yy</label_format>
* </time_grid>
* <value_grid>
* <show_grid>true</show_grid>
* <grid_step>100.0</grid_step>
* <label_factor>5</label_factor>
* </value_grid>
* <no_minor_grid>true</no_minor_grid>
* <alt_y_grid>true</alt_y_grid>
* <alt_y_mrtg>true</alt_y_mrtg>
* <alt_autoscale>true</alt_autoscale>
* <alt_autoscale_max>true</alt_autoscale_max>
* <units_exponent>3</units_exponent>
* <units_length>13</units_length>
* <vertical_label>Speed (kbits/sec)</vertical_label>
* <width>444</width>
* <height>222</height>
* <interlaced>true</interlaced>
* <image_info>filename = %s, width=%d, height=%d</image_info>
* <image_format>png</image_format>
* <image_quality>0.8</image_quality>
* <background_image>luka.png</background_image>
* <overlay_image>luka.png</overlay_image>
* <unit>kilos</unit>
* <lazy>false</lazy>
* <min_value>0</min_value>
* <max_value>5000</max_value>
* <rigid>true</rigid>
* <base>1000</base>
* <logarithmic>false</logarithmic>
* <colors>
* <canvas>#FFFFFF</canvas>
* <back>#FFFFFF</back>
* <shadea>#AABBCC</shadea>
* <shadeb>#DDDDDD</shadeb>
* <grid>#FF0000</grid>
* <mgrid>#00FF00</mgrid>
* <font>#FFFFFF</font>
* <frame>#EE00FF</frame>
* <arrow>#FF0000</arrow>
* </colors>
* <no_legend>false</no_legend>
* <only_graph>false</only_graph>
* <force_rules_legend>false</force_rules_legend>
* <title>This is a title</title>
* <step>300</step>
* <fonts>
* <small_font>
* <name>Courier</name>
* <style>bold italic</style>
* <size>12</size>
* </small_font>
* <large_font>
* <name>Courier</name>
* <style>plain</style>
* <size>11</size>
* </large_font>
* </fonts>
* <first_day_of_week>SUNDAY</first_day_of_week>
* </options>
* <datasources>
* <def>
* <name>x</name>
* <rrd>test.rrd</rrd>
* <source>sun</source>
* <cf>AVERAGE</cf>
* <backend>FILE</backend>
* </def>
* <def>
* <name>y</name>
* <rrd>test.rrd</rrd>
* <source>shade</source>
* <cf>AVERAGE</cf>
* </def>
* <cdef>
* <name>x_plus_y</name>
* <rpn>x,y,+</rpn>
* </cdef>
* <cdef>
* <name>x_minus_y</name>
* <rpn>x,y,-</rpn>
* </cdef>
* <sdef>
* <name>x_avg</name>
* <source>x</source>
* <cf>AVERAGE</cf>
* </sdef>
* <sdef>
* <name>y_max</name>
* <source>y</source>
* <cf>MAX</cf>
* </sdef>
* </datasources>
* <graph>
* <area>
* <datasource>x</datasource>
* <color>#FF0000</color>
* <legend>X value\r</legend>
* </area>
* <stack>
* <datasource>y</datasource>
* <color>#00FF00</color>
* <legend>Y value\r</legend>
* </stack>
* <line>
* <datasource>x</datasource>
* <color>#FF0000</color>
* <legend>X value\r</legend>
* <width>2</width>
* </line>
* <print>
* <datasource>x</datasource>
* <cf>AVERAGE</cf>
* <format>Average is %7.3f\c</format>
* </print>
* <gprint>
* <datasource>y</datasource>
* <cf>MAX</cf>
* <format>Max is %7.3f\c</format>
* </gprint>
* <hrule>
* <value>1250</value>
* <color>#0000FF</color>
* <legend>This is a horizontal rule</legend>
* </hrule>
* <vrule>
* <time>now-6h</time>
* <color>#0000FF</color>
* <legend>This is a vertical rule</legend>
* </vrule>
* <comment>Simple comment</comment>
* <comment>One more comment\c</comment>
* </graph>
* </rrd_graph_def>
* </pre>
* Notes on the template syntax:<p>
* <ul>
* <li>There is a strong relation between the XML template syntax and the syntax of
* {@link RrdGraphDef} class methods. If you are not sure what some XML tag means, check javadoc
* for the corresponding class method.
* <li>hard-coded timestamps in templates should be long integeres
* (like: 1000243567) or at-style formatted strings
* <li>whitespaces are not harmful
* <li>use <code>true</code>, <code>on</code>, <code>yes</code>, <code>y</code>,
* or <code>1</code> to specify boolean <code>true</code> value (anything else will
* be treated as <code>false</code>).
* <li>floating point values: anything that cannot be parsed will be treated as Double.NaN
* (like: U, unknown, 12r.23)
* <li>use #RRGGBB or #RRGGBBAA format to specify colors.
* <li>valid font styles are: PLAIN, ITALIC, BOLD, BOLDITALIC
* <li>comments are allowed.
* </ul>
* Any template value (text between <code><some_tag></code> and
* <code></some_tag></code>) can be replaced with
* a variable of the following form: <code>${variable_name}</code>. Use
* {@link XmlTemplate#setVariable(String, String) setVariable()}
* methods from the base class to replace
* template variables with real values at runtime.<p>
* <p/>
* Typical usage scenario:<p>
* <ul>
* <li>Create your XML template and save it to a file (template.xml, for example)
* <li>Replace template values with variables if you want to change them during runtime.
* For example, time span should not be hard-coded in the template - you probably want to create
* many different graphs with different time spans from the same XML template.
* For example, your XML template could start with:
* <pre>
* <rrd_graph_def>
* ...
* <span>
* <start>${start}</start>
* <end>${end}</end>
* </span>
* ...
* </pre>
* <li>In your Java code, create RrdGraphDefTemplate object using your XML template file:
* <pre>
* RrdGraphDefTemplate t = new RrdGraphDefTemplate(new File(template.xml));
* </pre>
* <li>Then, specify real values for template variables:
* <pre>
* t.setVariable("start", new GregorianCalendar(2004, 2, 25));
* t.setVariable("end", new GregorianCalendar(2004, 2, 26));
* </pre>
* <li>Once all template variables are set, just use the template object to create RrdGraphDef
* object. This object is actually used to create JRobin grahps:
* <pre>
* RrdGraphDef gdef = t.getRrdGraphDef();
* RrdGraph g = new RrdGraph(gdef);
* </pre>
* </ul>
* You should create new RrdGraphDefTemplate object only once for each XML template. Single template
* object can be reused to create as many RrdGraphDef objects as needed, with different values
* specified for template variables. XML synatax check is performed only once - the first graph
* definition object gets created relatively slowly, but it will be created much faster next time.
*/
public class RrdGraphDefTemplate extends XmlTemplate implements RrdGraphConstants {
static final Color BLIND_COLOR = new Color(0, 0, 0, 0);
private RrdGraphDef rrdGraphDef;
/**
* Creates template object from any parsable XML source
*
* @param inputSource XML source
* @throws IOException thrown in case of I/O error
* @throws RrdException usually thrown in case of XML related error
*/
public RrdGraphDefTemplate(InputSource inputSource) throws IOException, RrdException {
super(inputSource);
}
/**
* Creates template object from the file containing XML template code
*
* @param xmlFile file containing XML template
* @throws IOException thrown in case of I/O error
* @throws RrdException usually thrown in case of XML related error
*/
public RrdGraphDefTemplate(File xmlFile) throws IOException, RrdException {
super(xmlFile);
}
/**
* Creates template object from the string containing XML template code
*
* @param xmlString string containing XML template
* @throws IOException thrown in case of I/O error
* @throws RrdException usually thrown in case of XML related error
*/
public RrdGraphDefTemplate(String xmlString) throws IOException, RrdException {
super(xmlString);
}
/**
* Creates RrdGraphDef object which can be used to create RrdGraph
* object (actual JRobin graphs). Before this method is called, all template variables (if any)
* must be resolved (replaced with real values).
* See {@link XmlTemplate#setVariable(String, String) setVariable()} method information to
* understand how to supply values for template variables.
*
* @return Graph definition which can be used to create RrdGraph object (actual JRobin graphs)
* @throws RrdException Thrown if parsed XML template contains invalid (unrecognized) tags
*/
public RrdGraphDef getRrdGraphDef() throws RrdException {
// basic check
if (!root.getTagName().equals("rrd_graph_def")) {
throw new RrdException("XML definition must start with <rrd_graph_def>");
}
validateTagsOnlyOnce(root, new String[] {"filename", "span", "options", "datasources", "graph"});
rrdGraphDef = new RrdGraphDef();
// traverse all nodes
Node[] childNodes = getChildNodes(root);
for (Node childNode : childNodes) {
String nodeName = childNode.getNodeName();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -