/* * RHQ Management Platform * Copyright (C) 2005-2011 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.coregui.client.components.measurement; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.coregui.client.dashboard.portlets.PortletConfigurationEditorComponent.Constant; import org.rhq.coregui.client.util.MeasurementUtility; public class CustomConfigMeasurementRangeEditor extends AbstractMeasurementRangeEditor { public static final String PREF_METRIC_RANGE = Constant.METRIC_RANGE; public static final String PREF_METRIC_RANGE_LASTN = Constant.METRIC_RANGE_LASTN; public static final String PREF_METRIC_RANGE_UNIT = Constant.METRIC_RANGE_UNIT; public static final String PREF_METRIC_RANGE_BEGIN_END_FLAG = Constant.METRIC_RANGE_BEGIN_END_FLAG; public static final String ALERT_METRIC_RANGE_ENABLE = Constant.METRIC_RANGE_ENABLE; public static final String DEFAULT_VALUE_RANGE_RO = Boolean.FALSE.toString(); public static final Integer DEFAULT_VALUE_RANGE_LASTN = Integer.valueOf(Constant.METRIC_RANGE_LASTN_DEFAULT); public static final Integer DEFAULT_VALUE_RANGE_UNIT = Integer.valueOf(Constant.METRIC_RANGE_UNIT_DEFAULT); private ConfigurationMeasurementPreferences measurementPrefs; public CustomConfigMeasurementRangeEditor(Configuration config) { super(); measurementPrefs = new ConfigurationMeasurementPreferences(config); setDisplaySetButton(false); setDisplayEnableButton(true); setDisplayCheckboxLabel(true); setWidth(650); } @Override public List<Long> getBeginEndTimes() { List<Long> beginEndTimes = new ArrayList<Long>(); if (advanced) { beginEndTimes.add(advancedStartItem.getValueAsDate().getTime()); beginEndTimes.add(advancedEndItem.getValueAsDate().getTime()); return beginEndTimes; } else { int lastN = Integer.valueOf(simpleLastValuesItem.getValueAsString()); String unit = simpleLastUnitsItem.getValueAsString(); measurementPrefs.metricRangePreferences.lastN = lastN; measurementPrefs.metricRangePreferences.unit = Integer.valueOf(unit); return MeasurementUtility.calculateTimeFrame(lastN, Integer.valueOf(unit)); } } @Override public MetricRangePreferences getMetricRangePreferences() { return measurementPrefs.getMetricRangePreferences(); } @Override public void setMetricRangeProperties(MetricRangePreferences prefs) { measurementPrefs.setMetricRangePreferences(prefs); } public String getSimpleProperty(String propertyKey) { String propertyValue = ""; if ((propertyKey != null) && (propertyKey.trim().length() > 0)) { if ((measurementPrefs != null) && (measurementPrefs.configuration != null)) { PropertySimple property = measurementPrefs.configuration.getSimple(propertyKey); if (property != null) { propertyValue = property.getStringValue(); } } } return propertyValue; } public void setSimpleProperty(String propertyKey, String value) { if ((propertyKey != null) && (propertyKey.trim().length() > 0) && (value != null) && (!value.trim().isEmpty())) { if ((measurementPrefs != null) && (measurementPrefs.configuration != null)) { measurementPrefs.configuration.put(new PropertySimple(propertyKey, value)); } } } class ConfigurationMeasurementPreferences { private MetricRangePreferences metricRangePreferences; private Configuration configuration; public ConfigurationMeasurementPreferences(Configuration config) { if (metricRangePreferences == null) { metricRangePreferences = new MetricRangePreferences(); } //parse config and lazily init timing elements metricRangePreferences.explicitBeginEnd = Boolean.valueOf( config.getSimple(PREF_METRIC_RANGE_BEGIN_END_FLAG).getStringValue()).booleanValue(); //check to display advanced settings widget components if (metricRangePreferences.explicitBeginEnd == false) { //retrieve lastN metricRangePreferences.lastN = config.getSimple(PREF_METRIC_RANGE_LASTN).getIntegerValue(); //retrieve lastN units metricRangePreferences.unit = config.getSimple(PREF_METRIC_RANGE_UNIT).getIntegerValue(); List<Long> range = MeasurementUtility.calculateTimeFrame(metricRangePreferences.lastN, metricRangePreferences.unit); metricRangePreferences.begin = range.get(0); metricRangePreferences.end = range.get(1); } else {//in advanced view try { String rangeString = config.getSimpleValue(PREF_METRIC_RANGE, ""); if (rangeString != null && rangeString.trim().length() > 0) { if (rangeString.contains(",")) { // legacy support: old prefs used to use commas rangeString = rangeString.replace(",", "|"); //userPrefs.setPreference(PREF_METRIC_RANGE, rangeString); // TODO set only if we don't support JSF anymore } String[] beginEnd = rangeString.split("\\|"); metricRangePreferences.begin = Long.parseLong(beginEnd[0]); metricRangePreferences.end = Long.parseLong(beginEnd[1]); } } catch (IllegalArgumentException iae) { // that's OK, range will remain null and we might use the lastN / unit List<Long> range = MeasurementUtility.calculateTimeFrame(DEFAULT_VALUE_RANGE_LASTN, DEFAULT_VALUE_RANGE_UNIT); metricRangePreferences.begin = range.get(0); metricRangePreferences.end = range.get(1); } } // update configuration this.configuration = config; } public void setMetricRangePreferences(MetricRangePreferences metricRangePreferences) { this.metricRangePreferences = metricRangePreferences; } public MetricRangePreferences getMetricRangePreferences() { return metricRangePreferences; } } @Override protected void onInit() { super.onInit(); //turn on date entry validation enableRangeItem.setWidth(30); // advancedStartItem.setEnforceDate(true); // advancedEndItem.setEnforceDate(true); //disable text field view to prevent bad data entry. Use widget or dropdowns. //TODO: spinder 3/9/11: this should be renabled to allow minute/second tuning here too, but need to handle validation. advancedStartItem.setUseTextField(false); advancedEndItem.setUseTextField(false); advancedStartItem.setType("selection"); simpleLastValuesItem.setWidth(50); simpleLastUnitsItem.setWidth(70); //set fields to previously populated values if (Boolean.valueOf(measurementPrefs.configuration.getSimple(ALERT_METRIC_RANGE_ENABLE).getStringValue())) { enableRangeItem.setValue(true); enableMeasurementRange(false); } else { enableRangeItem.setValue(false); enableMeasurementRange(true); } //is advanced boolean advanced = measurementPrefs.metricRangePreferences.explicitBeginEnd; if (advanced) { ArrayList<Long> beginEnd = measurementPrefs.metricRangePreferences.getBeginEndTimes(); if ((beginEnd != null) && (!beginEnd.isEmpty())) { advancedStartItem.setValue(beginEnd.get(0)); advancedEndItem.setValue(beginEnd.get(1)); } } else {//simple: set LastN and Units if (lastUnits.containsKey(String.valueOf(measurementPrefs.metricRangePreferences.unit))) { simpleLastUnitsItem.setValue(String.valueOf(measurementPrefs.metricRangePreferences.unit)); } if (Arrays.asList(lastValues).contains(String.valueOf(measurementPrefs.metricRangePreferences.lastN))) { simpleLastValuesItem.setValue(String.valueOf(measurementPrefs.metricRangePreferences.lastN)); } } } }