package org.rrd4j.graph;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.rrd4j.core.Util;
import org.rrd4j.data.DataProcessor;
import org.rrd4j.data.Variable;
import org.rrd4j.data.Variable.Value;
class PrintText extends CommentText {
static final String UNIT_MARKER = "([^%]?)%(s|S)";
static final Pattern UNIT_PATTERN = Pattern.compile(UNIT_MARKER);
private final String srcName;
private final boolean includedInGraph;
private final boolean strftime;
PrintText(String srcName, String text, boolean includedInGraph, boolean strftime) {
super(text);
this.srcName = srcName;
this.includedInGraph = includedInGraph;
this.strftime = strftime;
}
boolean isPrint() {
return !includedInGraph;
}
void resolveText(Locale l, DataProcessor dproc, ValueScaler valueScaler) {
super.resolveText(l, dproc, valueScaler);
Value v = dproc.getVariable(srcName);
if(resolvedText == null) {
return;
}
else if(strftime) {
if(v != Variable.INVALIDVALUE) {
long time = v.timestamp;
try {
Calendar c = new GregorianCalendar(dproc.getTimeZone(), l);
c.setTimeInMillis(time * 1000);
resolvedText = String.format(l, resolvedText, c);
} catch (Exception e) {
throw new RuntimeException("can't format '" + resolvedText + "'", e);
}
}
else {
resolvedText = "-";
}
}
else {
double value = v.value;
Matcher matcher = UNIT_PATTERN.matcher(resolvedText);
if (matcher.find()) {
// unit specified
ValueScaler.Scaled scaled = valueScaler.scale(value, matcher.group(2).equals("s"));
resolvedText = resolvedText.substring(0, matcher.start()) +
matcher.group(1) + scaled.unit + resolvedText.substring(matcher.end());
value = scaled.value;
}
try {
resolvedText = Util.sprintf(l, resolvedText, value);
} catch (Exception e) {
throw new RuntimeException("can't format '" + resolvedText + "'", e);
}
}
trimIfGlue();
}
}