/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.gui.legacy.taglib.display; import java.util.Locale; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.util.RequestUtils; import org.apache.taglibs.standard.tag.common.core.NullAttributeException; import org.apache.taglibs.standard.tag.el.core.ExpressionUtil; import org.rhq.core.clientapi.util.units.ScaleConstants; import org.rhq.core.clientapi.util.units.UnitNumber; import org.rhq.core.clientapi.util.units.UnitsConstants; import org.rhq.core.clientapi.util.units.UnitsFormat; import org.rhq.core.domain.measurement.MeasurementUnits; import org.rhq.core.server.MeasurementConverter; /** * This class is a two in one decorator/tag for use within the <code>TableTag</code>; it is a <code> * ColumnDecorator</code> tag that converts and formats metric values for display. */ public class MetricDecorator extends ColumnDecorator implements Tag { //----------------------------------------------------static variables protected String locale = org.apache.struts.Globals.LOCALE_KEY; protected String bundle = org.apache.struts.Globals.MESSAGES_KEY; protected static String MS_KEY = "metric.tag.units.s.arg"; protected static Log log = LogFactory.getLog(MetricDecorator.class.getName()); //----------------------------------------------------instance variables // tag attrs private String defaultKey; private String unit; private PageContext context; private Tag parent; //----------------------------------------------------constructors public MetricDecorator() { super(); } //----------------------------------------------------public methods public String getDefaultKey() { return defaultKey; } public void setDefaultKey(String s) { defaultKey = s; } public String getUnit() { return unit; } public void setUnit(String s) { unit = s; } @Override public String decorate(Object obj) throws Exception { try { // if the metric value is empty, converting to a Double // will give a value of 0.0. this makes it impossible for // us to distinguish further down the line whether the // metric was actually collected with a value of 0.0 or // whether it was not collected at all. therefore, we'll // let m be null if the metric was not collected, and // we'll check for null later when handling the not-avail // case. // PR: 7588 Double m = null; if (obj != null) { String mval = (String) evalAttr("metric", obj.toString(), String.class); if ((mval != null) && !mval.equals("")) { m = new Double(mval); } } Locale l = RequestUtils.retrieveUserLocale(context, locale); StringBuffer buf = new StringBuffer(); if (((m == null) || Double.isNaN(m.doubleValue()) || Double.isInfinite(m.doubleValue())) && (defaultKey != null)) { buf.append(RequestUtils.message(context, bundle, l.toString(), defaultKey)); } else if (unit.equals("ms")) { // we don't care about scaling and such. we just want // to show every metric in seconds with millisecond // resolution String formatted = UnitsFormat.format( new UnitNumber(m.doubleValue(), UnitsConstants.UNIT_DURATION, ScaleConstants.SCALE_MILLI)) .toString(); buf.append(formatted); } else { MeasurementUnits targetUnits = MeasurementUnits.valueOf(unit); Double dataValue = m.doubleValue(); String formatted = MeasurementConverter.format(dataValue, targetUnits, true); buf.append(formatted); } return buf.toString(); } catch (JspException je) { log.error(je); throw je; } catch (Exception e) { log.error(e); throw new JspException(e); } } public int doStartTag() throws JspTagException { ColumnTag ancestorTag = (ColumnTag) TagSupport.findAncestorWithClass(this, ColumnTag.class); if (ancestorTag == null) { throw new JspTagException("A MetricDecorator must be used within a ColumnTag."); } ancestorTag.setDecorator(this); return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } public Tag getParent() { return parent; } public void setParent(Tag t) { this.parent = t; } @Override public void setPageContext(PageContext pc) { this.context = pc; } @Override public void release() { parent = null; context = null; defaultKey = null; unit = null; } private Object evalAttr(String name, String value, Class type) throws JspException, NullAttributeException { return ExpressionUtil.evalNotNull("metricdecorator", name, value, type, this, context); } }