package org.rhq.enterprise.gui.measurement.tables;
/*
* 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.
*/
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.ui.MetricDisplaySummary;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.util.MonitorUtils;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.gui.util.WebUtility;
import org.rhq.enterprise.server.measurement.MeasurementChartsManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementPreferences;
import org.rhq.enterprise.server.measurement.MeasurementPreferences.MetricRangePreferences;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* This class supports the UI needs of Resource metrics. Depending on the context various metric summary processing takes place
* returning the appropriate metric summaries. This class can be extended to provide context-specific UI Bean classes, or
* encapsulated in UI beans that must extend other classes, such as PagedDataTableUIBean.
*
* @author jay shaughnessy
*/
public class MetricsTableUIBean {
private final Log log = LogFactory.getLog(MetricsTableUIBean.class);
protected MeasurementChartsManagerLocal chartManager = LookupUtil.getMeasurementChartsManager();
protected MeasurementDefinitionManagerLocal definitionManager = LookupUtil.getMeasurementDefinitionManager();
protected MeasurementScheduleManagerLocal scheduleManager = LookupUtil.getMeasurementScheduleManager();
protected ResourceGroupManagerLocal resourceGroupManager = LookupUtil.getResourceGroupManager();
public static final String MANAGED_BEAN_NAME = "MetricsTableUIBean";
protected EntityContext context;
protected ResourceGroup resourceGroup;
private List<MetricDisplaySummary> metricSummaries = null;
private boolean valuesPresent = false;
public MetricsTableUIBean() {
context = WebUtility.getEntityContext();
}
public EntityContext getContext() {
return this.context;
}
public List<MetricDisplaySummary> getMetricSummaries() {
if (null != metricSummaries) {
return metricSummaries;
}
WebUser user = EnterpriseFacesContextUtility.getWebUser();
MeasurementPreferences preferences = user.getMeasurementPreferences();
MetricRangePreferences range = preferences.getMetricRangePreferences();
if (context.type == EntityContext.Type.Resource) {
//null -> don't filter, we want everything, false -> not only enabled
List<MeasurementSchedule> measurementSchedules = scheduleManager.findSchedulesForResourceAndType(
user.getSubject(), context.resourceId, DataType.MEASUREMENT, null, true);
int[] scheduleIds = new int[measurementSchedules.size()];
int i = 0;
for (MeasurementSchedule sched : measurementSchedules) {
scheduleIds[i++] = sched.getId();
}
metricSummaries = chartManager.getMetricDisplaySummariesForResource(user.getSubject(), context.resourceId,
scheduleIds, range.begin, range.end);
} else if (context.type == EntityContext.Type.ResourceGroup) {
List<MeasurementDefinition> measurementDefinitions = definitionManager
.findMeasurementDefinitionsByResourceType(user.getSubject(), getResourceGroup(user).getResourceType()
.getId(), DataType.MEASUREMENT, null);
int[] defIds = new int[measurementDefinitions.size()];
int i = 0;
for (MeasurementDefinition def : measurementDefinitions) {
defIds[i++] = def.getId();
}
metricSummaries = chartManager.getMetricDisplaySummariesForCompatibleGroup(user.getSubject(), context,
defIds, range.begin, range.end, true);
} else if (context.type == EntityContext.Type.AutoGroup) {
List<MeasurementDefinition> measurementDefinitions = definitionManager
.findMeasurementDefinitionsByResourceType(user.getSubject(), context.getResourceTypeId(),
DataType.MEASUREMENT, null);
int[] defIds = new int[measurementDefinitions.size()];
int i = 0;
for (MeasurementDefinition def : measurementDefinitions) {
defIds[i++] = def.getId();
}
metricSummaries = chartManager.getMetricDisplaySummariesForAutoGroup(user.getSubject(),
context.getParentResourceId(), context.getResourceTypeId(), defIds, range.begin, range.end, true);
} else {
log.error(context.getUnknownContextMessage());
// return an empty list in this unlikely scenario
return new ArrayList<MetricDisplaySummary>();
}
for (MetricDisplaySummary summary : metricSummaries) {
MonitorUtils.formatSimpleMetrics(summary, FacesContext.getCurrentInstance().getExternalContext()
.getRequestLocale());
if (summary.getValuesPresent())
valuesPresent = true;
}
return metricSummaries;
}
/**
* Return it the summaries have values present.
* Value is only valid *after* a call to #getMetricSummaries()
* @return
*/
public boolean isValuesPresent() {
return valuesPresent;
}
public ResourceGroup getResourceGroup(WebUser user) {
if (null == resourceGroup) {
resourceGroup = resourceGroupManager.getResourceGroupById(user.getSubject(), context.groupId,
GroupCategory.COMPATIBLE);
}
return resourceGroup;
}
public int[] getResourceGroupMemberIds(WebUser user) {
List<Resource> resources = resourceGroupManager.findResourcesForResourceGroup(user.getSubject(),
context.groupId, GroupCategory.COMPATIBLE);
int[] resourceIds = new int[resources.size()];
int i = 0;
for (Resource res : resources) {
resourceIds[i] = res.getId();
i++;
}
return resourceIds;
}
}