/* * 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.action.resource.common.monitor.visibility; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.rhq.core.domain.auth.Subject; 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.calltime.CallTimeDataComposite; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.core.domain.util.PageOrdering; import org.rhq.enterprise.gui.legacy.AttrConstants; import org.rhq.enterprise.gui.legacy.Constants; import org.rhq.enterprise.gui.legacy.WebUser; import org.rhq.enterprise.gui.legacy.util.ChartData; import org.rhq.enterprise.gui.legacy.util.SessionUtils; import org.rhq.enterprise.gui.util.WebUtility; import org.rhq.enterprise.server.measurement.CallTimeDataManagerLocal; import org.rhq.enterprise.server.measurement.MeasurementPreferences; import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal; import org.rhq.enterprise.server.measurement.MeasurementPreferences.MetricRangePreferences; import org.rhq.enterprise.server.util.LookupUtil; /** * An <code>Action</code> that prepares pages containing the performance form. * * @author Ian Springer */ public class PerformanceFormPrepareAction extends MetricsControlFormPrepareAction { protected static Log log = LogFactory.getLog(PerformanceFormPrepareAction.class); // ---------------------------------------------------- Public Methods /** * Retrieve data needed to display a resource's child metrics form. Respond to certain button clicks that alter the * form display. */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { super.execute(mapping, form, request, response); // decide what timeframe we're showing. it may have been shifted on previous views of this page. MetricRange range = (MetricRange) request.getAttribute(Constants.METRIC_RANGE); if (range == null) { // this is the first time out. get the "metric range" user pref. WebUser user = SessionUtils.getWebUser(request.getSession()); MeasurementPreferences preferences = user.getMeasurementPreferences(); MetricRangePreferences rangePreferences = preferences.getMetricRangePreferences(); range = new MetricRange(); range.setBegin(rangePreferences.begin); range.setEnd(rangePreferences.end); } Subject subject = WebUtility.getSubject(request); Resource resource = (Resource) request.getAttribute(AttrConstants.RESOURCE_ATTR); MeasurementScheduleManagerLocal scheduleManager = LookupUtil.getMeasurementScheduleManager(); List<MeasurementSchedule> callTimeSchedules = scheduleManager.findSchedulesForResourceAndType( subject, resource.getId(), DataType.CALLTIME, null, false); PerformanceForm perfForm = (PerformanceForm) form; prepareForm(request, perfForm, callTimeSchedules); MeasurementSchedule selectedSchedule = null; if ((perfForm.getScheduleId() != null) && !perfForm.getScheduleId().equals(PerformanceForm.DEFAULT_SCHEDULE_ID)) { for (MeasurementSchedule callTimeSchedule : callTimeSchedules) { if (callTimeSchedule.getId() == perfForm.getScheduleId()) { selectedSchedule = callTimeSchedule; } } } PageList<CallTimeDataComposite> callTimeDataComposites; if (selectedSchedule != null) { MeasurementDefinition measurementDef = selectedSchedule.getDefinition(); request.setAttribute("MeasurementDef", measurementDef); CallTimeDataManagerLocal callTimeDataManager = LookupUtil.getCallTimeDataManager(); PageControl pageControl = WebUtility.getPageControl(request); callTimeDataComposites = callTimeDataManager.findCallTimeDataForResource(subject, selectedSchedule.getId(), range.getBegin(), range.getEnd(), pageControl); } else { callTimeDataComposites = new PageList<CallTimeDataComposite>(); } if (log.isDebugEnabled()) { for (CallTimeDataComposite datum : callTimeDataComposites) { log.debug("Call-time datum: " + datum); } } request.setAttribute(Constants.PERF_SUMMARIES_ATTR, callTimeDataComposites); if (selectedSchedule != null) { // Save chart data into session, so it can be displayed by the performance chart servlet. ChartData chartData = createChartData(callTimeDataComposites, perfForm, selectedSchedule); request.getSession().setAttribute(Constants.CHART_DATA_SES_ATTR, chartData); } return null; } // ---------------------------------------------------- Protected Methods protected void prepareForm(HttpServletRequest request, PerformanceForm form, List<MeasurementSchedule> schedules) throws IllegalArgumentException { if (!form.isAnythingClicked()) { form.setLow(PerformanceForm.DEFAULT_LOW); form.setAvg(PerformanceForm.DEFAULT_AVG); form.setPeak(PerformanceForm.DEFAULT_PEAK); } PageControl pageControl = WebUtility.getPageControl(request); form.setPn(pageControl.getPageNumber()); form.setPs(pageControl.getPageSize()); form.setSc(pageControl.getPrimarySortColumn()); PageOrdering ordering = pageControl.getPrimarySortOrder(); form.setSo((ordering != null) ? ordering.name() : null); form.setSchedules(schedules.toArray(new MeasurementSchedule[schedules.size()])); form.setMetricCount(schedules.size()); if (schedules.size() == 1) { // If there's only a single schedule, auto-select it. form.setScheduleId(schedules.get(0).getId()); } super.prepareForm(request, form); } protected ChartData createChartData(PageList<CallTimeDataComposite> callTimeDataComposites, PerformanceForm form, MeasurementSchedule schedule) { ChartData chartData = new ChartData(); chartData.setSummaries(callTimeDataComposites); chartData.setShowLow(form.getLow()); chartData.setShowAvg(form.getAvg()); chartData.setShowPeak(form.getPeak()); chartData.setMeasurementDefinition(schedule.getDefinition()); return chartData; } }