/*
* 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.util;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.util.LabelValueBean;
import org.apache.struts.util.MessageResources;
import org.rhq.core.clientapi.util.units.DateFormatter.DateSpecifics;
import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.measurement.composite.MeasurementNumericValueAndUnits;
import org.rhq.core.domain.measurement.composite.MeasurementValueAndUnits;
import org.rhq.core.domain.measurement.ui.MetricDisplaySummary;
import org.rhq.core.server.MeasurementConverter;
import org.rhq.enterprise.gui.legacy.Constants;
public class MonitorUtils {
private static Log log = LogFactory.getLog(MonitorUtils.class);
public static final String RO = "ro";
public static final String LASTN = "lastN";
public static final String UNIT = "unit";
public static final String BEGIN = "begin";
public static final String END = "end";
public static final int DEFAULT_CURRENTHEALTH_LASTN = 8;
public static final int THRESHOLD_BASELINE_VALUE = 1;
public static final String THRESHOLD_BASELINE_LABEL = "Baseline";
public static final int THRESHOLD_HIGH_RANGE_VALUE = 2;
public static final String THRESHOLD_HIGH_RANGE_LABEL = "HighRange";
public static final int THRESHOLD_LOW_RANGE_VALUE = 3;
public static final String THRESHOLD_LOW_RANGE_LABEL = "LowRange";
public static final int THRESHOLD_UNDER_VALUE = 1;
public static final int THRESHOLD_OVER_VALUE = 2;
public static Integer formatMetrics(List<MetricDisplaySummary> metricDisplaySummaries, Locale userLocale,
MessageResources msgs) {
Integer resourceCount = null;
try {
for (MetricDisplaySummary metricDisplaySummary : metricDisplaySummaries) {
if (Double.isNaN(metricDisplaySummary.getAvgMetric().getValue())) {
continue;
}
if (resourceCount == null)
resourceCount = metricDisplaySummary.getAvailUp();
// the formatting subsystem doesn't interpret
// units set to empty strings as "no units" so
// we'll explicity set it so
if (metricDisplaySummary.getUnits().length() < 1) {
metricDisplaySummary.setUnits(MeasurementUnits.NONE.name());
}
MeasurementValueAndUnits[] formattedValues;
if (msgs.isPresent(userLocale, Constants.UNIT_FORMAT_PREFIX_KEY + metricDisplaySummary.getUnits())) {
// this means that there's a whole song and dance for formatting this type of thing
// a certain way (hopefully in a way that some descendant of java.test.Format will
// help with)
String fmtString = msgs.getMessage(userLocale, Constants.UNIT_FORMAT_PREFIX_KEY
+ metricDisplaySummary.getUnits());
if (metricDisplaySummary.getUnits().equals(MeasurementUnits.EPOCH_MILLISECONDS.name())) {
DateSpecifics dateSpecifics = new DateSpecifics();
dateSpecifics.setDateFormat(new SimpleDateFormat(fmtString, userLocale));
// TODO jmarques - figure out how to add dateSpecifics in here
formattedValues = getMeasurementValueAndUnits(metricDisplaySummary.getMetricValueDoubles(),
metricDisplaySummary.getUnits());
// dateSpecifics);
} else {
formattedValues = getMeasurementValueAndUnits(metricDisplaySummary.getMetricValueDoubles(),
metricDisplaySummary.getUnits());
}
} else {
formattedValues = getMeasurementValueAndUnits(metricDisplaySummary.getMetricValueDoubles(),
metricDisplaySummary.getUnits());
}
String[] keys = metricDisplaySummary.getMetricKeys();
if (keys.length != formattedValues.length) {
throw new IllegalStateException("Formatting metrics failed.");
}
for (int i = 0; i < keys.length; i++) {
MeasurementValueAndUnits valueAndUnits = formattedValues[i];
String formatted = MeasurementConverter.format(((Double) valueAndUnits.getValue()), valueAndUnits
.getUnits(), true);
metricDisplaySummary.getMetric(keys[i]).setValueFmt(formatted);
}
}
} catch (IllegalArgumentException e) { // catch and rethrow for debug/logging only
if (log.isDebugEnabled()) {
log.debug("formatting metrics failed due to IllegalArgumentException: ", e);
}
throw e;
}
return resourceCount;
}
/**
* Formats the passed summary. The userLocale is currently ignored
* @param summary MetricDisplaySummary with some values
* @param userLocale ignored
*/
public static void formatSimpleMetrics(MetricDisplaySummary summary, Locale userLocale) {
// Don't try to format placeholder NaN values.
if (!Double.isNaN(summary.getAvgMetric().getValue())) {
if (summary.getUnits().length() < 1) {
summary.setUnits(MeasurementUnits.NONE.name());
}
String[] formattedValues = MeasurementConverter.formatToSignificantPrecision(summary
.getMetricValueDoubles(), MeasurementUnits.valueOf(summary.getUnits()), true);
String[] metricKeys = summary.getMetricKeys();
for (int i = 0; i < metricKeys.length; i++) {
summary.getMetric(metricKeys[i]).setValueFmt(formattedValues[i]);
}
}
}
public static MeasurementValueAndUnits[] getMeasurementValueAndUnits(double[] metricValueDoubles, String units) {
MeasurementValueAndUnits[] valueAndUnitsList = new MeasurementValueAndUnits[metricValueDoubles.length];
int i = 0;
for (Double metricValue : metricValueDoubles) {
valueAndUnitsList[i] = new MeasurementNumericValueAndUnits(metricValue, MeasurementUnits.valueOf(units));
i++;
}
return valueAndUnitsList;
}
public static List<LabelValueBean> getThresholdMenu() {
List<LabelValueBean> items = new ArrayList<LabelValueBean>();
String label = null, value = null;
label = MonitorUtils.THRESHOLD_BASELINE_LABEL;
value = String.valueOf(MonitorUtils.THRESHOLD_BASELINE_VALUE);
items.add(new LabelValueBean(label, value));
label = MonitorUtils.THRESHOLD_HIGH_RANGE_LABEL;
value = String.valueOf(MonitorUtils.THRESHOLD_HIGH_RANGE_VALUE);
items.add(new LabelValueBean(label, value));
label = MonitorUtils.THRESHOLD_LOW_RANGE_LABEL;
value = String.valueOf(MonitorUtils.THRESHOLD_LOW_RANGE_VALUE);
items.add(new LabelValueBean(label, value));
return items;
}
}