/* * 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.common.metric; import javax.faces.component.UIComponentBase; import javax.faces.context.FacesContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.gui.util.FacesComponentUtility; import org.rhq.enterprise.gui.legacy.WebUser; import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility; import org.rhq.enterprise.server.measurement.MeasurementPreferences; import org.rhq.enterprise.server.measurement.MeasurementPreferences.MetricRangePreferences; /** * @author Fady Matar */ public class MetricComponent extends UIComponentBase { protected final Log log = LogFactory.getLog(MetricComponent.class); public final static String VALUE = "metricComponentValue"; public final static String UNIT = "metricComponentUnit"; public final static String OPTION_LIST_ATTRIBUTE = "optionList"; public enum TimeUnit { MINUTES("Minutes", "m", 2), // HOURS("Hours", "h", 3), // DAYS("Days", "d", 4); private String displayName; private String optionListToken; private int metricUnitOrdinal; private TimeUnit(String displayName, String optionListToken, int ordinal) { this.displayName = displayName; this.optionListToken = optionListToken; this.metricUnitOrdinal = ordinal; } public String getDisplayName() { return displayName; } public static TimeUnit getUnitByOptionToken(String optionListToken) { for (TimeUnit unit : TimeUnit.values()) { if (unit.optionListToken.equals(optionListToken)) { return unit; } } throw new IllegalArgumentException("'" + optionListToken + "' is not a recognized Metric option"); } public static TimeUnit getUnitByMetricOrdinal(int ordinal) { for (TimeUnit unit : TimeUnit.values()) { if (unit.metricUnitOrdinal == ordinal) { return unit; } } throw new IllegalArgumentException("'" + ordinal + "' is not a recognized Metric ordinal value"); } public int getMetricUntilOrdinal() { return metricUnitOrdinal; } } private String optionList; private TimeUnit[] unitOptions; private transient MetricRangePreferences rangePreferences; public MetricComponent() { loadPreferences(); } public String getOptionList() { if (optionList == null) { optionList = FacesComponentUtility.getExpressionAttribute(this, OPTION_LIST_ATTRIBUTE, String.class); } return optionList; } public void setOptionList(String optionList) { this.optionList = optionList; } public TimeUnit[] getUnitOptions() { if (unitOptions == null) { String[] options = getOptionList().split(","); unitOptions = new TimeUnit[options.length]; int i = 0; for (String option : options) { unitOptions[i++] = TimeUnit.getUnitByOptionToken(option); } } return unitOptions; } public void setUnitOptions(TimeUnit[] unitOptions) { this.unitOptions = unitOptions; } public static final String COMPONENT_TYPE = "org.jboss.on.Metric"; public static final String COMPONENT_FAMILY = "org.jboss.on.Time"; @Override public String getFamily() { return COMPONENT_FAMILY; } private void loadPreferences() { WebUser user = EnterpriseFacesContextUtility.getWebUser(); MeasurementPreferences preferences = user.getMeasurementPreferences(); this.rangePreferences = preferences.getMetricRangePreferences(); } public MetricRangePreferences getMetricRangePreferences() { return rangePreferences; } @Override public Object saveState(FacesContext facesContext) { Object[] state = new Object[3]; state[0] = super.saveState(facesContext); state[1] = this.optionList; state[2] = this.unitOptions; return state; } @Override public void restoreState(FacesContext context, Object stateValues) { Object[] state = (Object[]) stateValues; super.restoreState(context, state[0]); this.optionList = (String) state[1]; this.unitOptions = (TimeUnit[]) state[2]; /* * need to restore transient data during deserialization because * the AdvancedMetricSettingsUIBean performs it's work in a pop-up, * which means that the JSF component tree in the parent window * does not receive the update when in simple settings mode; as a * workaround, we will always instruct the metric component to get * it's most up-to-date preferences at the time the view needs to * be deserialized for rerendering */ loadPreferences(); // reload transient data log.debug("Restoring state for MetricComponent: " + this.rangePreferences); } }