package org.rhq.enterprise.server.measurement; import java.util.Arrays; import java.util.List; import org.rhq.core.domain.auth.Subject; import org.rhq.core.util.StringUtil; import org.rhq.enterprise.server.auth.prefs.SubjectPreferencesBase; import org.rhq.enterprise.server.measurement.util.MeasurementUtils; public class MeasurementPreferences extends SubjectPreferencesBase { public static final String PREF_FAV_RESOURCE_METRICS_PREFIX = ".resource.common.monitor.visibility.favoriteMetrics"; public static final String PREF_METRIC_RANGE = ".resource.common.monitor.visibility.metricRange"; public static final String PREF_METRIC_RANGE_LASTN = ".resource.common.monitor.visibility.metricRange.lastN"; public static final String PREF_METRIC_RANGE_UNIT = ".resource.common.monitor.visibility.metricRange.unit"; public static final String PREF_METRIC_RANGE_RO = ".resource.common.monitor.visibility.metricRange.ro"; public static final String PREF_METRIC_THRESHOLD = ".resource.common.monitor.visibility.metricThreshold"; public static final Boolean DEFAULT_VALUE_RANGE_RO = Boolean.FALSE; public static final Integer DEFAULT_VALUE_RANGE_LASTN = 8; public static final Integer DEFAULT_VALUE_RANGE_UNIT = 3; /** * key values for indicator views */ public static final String PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX = "monitor.visibility.indicator.views."; public static final String PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT = "resource.common.monitor.visibility.defaultview"; public static final String PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT_NAME = "Default"; public MeasurementPreferences(Subject subject) { super(subject); } public static class MetricRangePreferences { /* * if readOnly is set to true, the beginning and ending range * dates are specified with explicit dates. if readOnly is * false, then the time is relative to NOW and is specified as * <lastN> units of <unit> time */ public boolean readOnly; // simple, when readOnly is false public int lastN; public int unit; // advanced, when readOnly is true public Long begin; public Long end; public String toString() { if (readOnly) { return getClass().getSimpleName() + "[begin=" + begin + end + ",end=" + end + "]"; } else { return getClass().getSimpleName() + "[lastN=" + lastN + ",unit=" + unit + "]"; } } } public MetricRangePreferences getMetricRangePreferences() { MetricRangePreferences prefs = new MetricRangePreferences(); prefs.readOnly = getPreference(PREF_METRIC_RANGE_RO, DEFAULT_VALUE_RANGE_RO); if (prefs.readOnly == false) { // relative time range prefs.lastN = getPreference(PREF_METRIC_RANGE_LASTN, DEFAULT_VALUE_RANGE_LASTN); prefs.unit = getPreference(PREF_METRIC_RANGE_UNIT, DEFAULT_VALUE_RANGE_UNIT); List<Long> range = MeasurementUtils.calculateTimeFrame(prefs.lastN, prefs.unit); prefs.begin = range.get(0); prefs.end = range.get(1); } else { // explicit dates try { List<String> range = getPreferenceAsList(PREF_METRIC_RANGE); if (range.size() != 2) { // our gwt ui now uses |, let's be sure we can support it too range = getPreferenceAsList(PREF_METRIC_RANGE, "|"); } if (range.size() == 2) { prefs.begin = new Long(range.get(0)); prefs.end = new Long(range.get(1)); } else { // we still could not find a valid range BZ 743221 useDefaultAsFallback(prefs); } } catch (IllegalArgumentException iae) { // that's OK, range will remain null and we might use the lastN / unit useDefaultAsFallback(prefs); } } //log.debug("Getting Metric Range Preferences:" + prefs); return prefs; } /** * Set the prefs begin/end to a default as last resort. * @param prefs */ private void useDefaultAsFallback(MetricRangePreferences prefs) { List<Long> range = MeasurementUtils.calculateTimeFrame(DEFAULT_VALUE_RANGE_LASTN, DEFAULT_VALUE_RANGE_UNIT); prefs.begin = range.get(0); prefs.end = range.get(1); } public void setMetricRangePreferences(MetricRangePreferences prefs) { setPreference(PREF_METRIC_RANGE_RO, prefs.readOnly); if (prefs.readOnly) { // persist advanced mode setPreference(PREF_METRIC_RANGE, Arrays.asList(prefs.begin, prefs.end)); //unsetPreference(PREF_METRIC_RANGE_LASTN); //unsetPreference(PREF_METRIC_RANGE_UNIT); } else { setPreference(PREF_METRIC_RANGE_LASTN, prefs.lastN); setPreference(PREF_METRIC_RANGE_UNIT, prefs.unit); //unsetPreference(PREF_METRIC_RANGE); } //log.debug("Setting Metric Range Preferences:" + prefs); } /** * Returns a list of metric ids saved as favorites for a particular appdef type */ public Integer getMetricThresholdPreference() throws IllegalArgumentException { return new Integer(getPreference(PREF_METRIC_THRESHOLD)); } /** * Set a list of metric ids saved as favorites for a particular appdef type */ public void setMetricThresholdPreference(Integer value) throws IllegalArgumentException { setPreference(PREF_METRIC_THRESHOLD, value); } public static class MetricViewsPreferences { public List<String> views; } public MetricViewsPreferences getMetricViews(String key) { MetricViewsPreferences prefs = new MetricViewsPreferences(); //TODO: jmarques - externalize default view name // instead of PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT_NAME // lookup PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT from the bundle String value = getPreference(PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX + key, PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT_NAME); prefs.views = StringUtil.explode(value, PREF_ITEM_DELIM); return prefs; } public void setMetricViews(MetricViewsPreferences prefs, String key) { StringBuilder builder = new StringBuilder(); int index = 0; for (String viewName : prefs.views) { if (index != 0) { builder.append(PREF_ITEM_DELIM); } builder.append(viewName); index++; } setPreference(PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX + key, builder.toString()); } public String getSelectedView(String key) { String value = getPreference(PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX + "selected." + key, PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT_NAME); return value; } public void setSelectedView(String key, String viewName) { setPreference(PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX + "selected." + key, viewName); } public static class MetricViewData { public List<String> charts; } public MetricViewData getMetricViewData(String context, String viewName) { //TODO: jmarques - externalize default view name // instead of PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT_NAME // lookup PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT from the bundle if (viewName == null || "".equals(viewName)) { viewName = "default"; } MetricViewData chartPreferences = new MetricViewData(); // important to let IllegalArgumentException bubble out of here, so the caller can persist the default set String data = getPreference(PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX + context + "." + viewName); chartPreferences.charts = StringUtil.explode(data, PREF_ITEM_DELIM); return chartPreferences; } public void setMetricViewData(String context, String viewName, MetricViewData prefs) { //TODO: jmarques - externalize default view name // instead of PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT_NAME // lookup PREF_MEASUREMENT_INDICATOR_VIEW_DEFAULT from the bundle if (viewName == null || "".equals(viewName)) { viewName = "default"; } StringBuilder builder = new StringBuilder(); int index = 0; for (String chart : prefs.charts) { if (index != 0) { builder.append(PREF_ITEM_DELIM); } builder.append(chart); index++; } setPreference(PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX + context + "." + viewName, builder.toString()); } public void deleteMetricViewData(String context, String viewName) { unsetPreference(PREF_MEASUREMENT_INDICATOR_VIEW_PREFIX + context + "." + viewName); } }