/* * 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.alert; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.model.DataModel; import javax.faces.model.SelectItem; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.alert.Alert; import org.rhq.core.domain.alert.AlertCondition; import org.rhq.core.domain.alert.AlertConditionLog; import org.rhq.core.domain.alert.AlertPriority; import org.rhq.core.domain.alert.composite.AlertWithLatestConditionLog; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.common.EntityContext; import org.rhq.core.domain.common.composite.IntegerOptionItem; import org.rhq.core.domain.criteria.AlertCriteria; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.core.gui.util.FacesContextUtility; import org.rhq.core.gui.util.StringUtility; import org.rhq.core.server.MeasurementConverter; import org.rhq.enterprise.gui.common.converter.SelectItemUtils; import org.rhq.enterprise.gui.common.framework.PagedDataTableUIBean; import org.rhq.enterprise.gui.common.paging.PageControlView; import org.rhq.enterprise.gui.common.paging.PagedListDataModel; import org.rhq.enterprise.gui.legacy.action.resource.common.monitor.alerts.AlertDefUtil; import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility; import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal; import org.rhq.enterprise.server.alert.AlertManagerLocal; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.util.LookupUtil; /** * @author Joseph Marques */ public class ListGroupAlertHistoryUIBean extends PagedDataTableUIBean { private static final Log log = LogFactory.getLog(ListGroupAlertHistoryUIBean.class); public static final String MANAGED_BEAN_NAME = "ListGroupAlertHistoryUIBean"; // filter stuff private String dateFilter; private String dateErrors; private String alertDefinitionFilter; private String alertPriorityFilter; private SelectItem[] alertDefinitionSelectItems; private SelectItem[] alertPrioritySelectItems; private AlertManagerLocal alertManager = LookupUtil.getAlertManager(); private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager(); private AlertDefinitionManagerLocal alertDefinitionManager = LookupUtil.getAlertDefinitionManager(); public ListGroupAlertHistoryUIBean() { } public String getDateFilter() { if (dateFilter == null) { dateFilter = FacesContextUtility.getOptionalRequestParameter("alertHistoryForm:dateFilter"); } return this.dateFilter; } public void setDateFilter(String dateFilter) { this.dateFilter = dateFilter; } public String getDateErrors() { return this.dateErrors; } public void setDateErrors(String dateErrors) { this.dateErrors = dateErrors; } /* * definition filter stuff */ public String getAlertDefinitionFilter() { if (alertDefinitionFilter == null) { alertDefinitionFilter = SelectItemUtils.getSelectItemFilter("alertHistoryForm:alertDefinitionFilter"); } return SelectItemUtils.cleanse(alertDefinitionFilter); } public void setAlertDefinitionFilter(String alertDefinitionFilter) { this.alertDefinitionFilter = alertDefinitionFilter; } public SelectItem[] getAlertDefinitionSelectItems() { if (alertDefinitionSelectItems == null) { List<IntegerOptionItem> optionItems = alertDefinitionManager.findAlertDefinitionOptionItemsForGroup( getSubject(), getResourceGroup().getId()); alertDefinitionSelectItems = SelectItemUtils.convertFromListOptionItem(optionItems, true); } return alertDefinitionSelectItems; } public void setAlertDefinitionSelectItems(SelectItem[] alertDefinitionSelectItems) { this.alertDefinitionSelectItems = alertDefinitionSelectItems; } /* * priority filter stuff */ public String getAlertPriorityFilter() { if (alertPriorityFilter == null) { alertPriorityFilter = SelectItemUtils.getSelectItemFilter("alertHistoryForm:alertPriorityFilter"); } return SelectItemUtils.cleanse(alertPriorityFilter); } public void setAlertPriorityFilter(String alertPriorityFilter) { this.alertPriorityFilter = alertPriorityFilter; } public SelectItem[] getAlertPrioritySelectItems() { if (alertPrioritySelectItems == null) { alertPrioritySelectItems = SelectItemUtils.convertFromEnum(AlertPriority.class, true); } return alertPrioritySelectItems; } public void setAlertPrioritySelectItems(SelectItem[] alertPrioritySelectItems) { this.alertPrioritySelectItems = alertPrioritySelectItems; } public String deleteSelectedAlerts() { Subject subject = EnterpriseFacesContextUtility.getSubject(); String[] selectedAlerts = getSelectedAlerts(); int[] alertIds = StringUtility.getIntArray(selectedAlerts); try { alertManager.deleteAlerts(subject, alertIds); FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Deleted " + alertIds.length + " alerts."); } catch (Exception e) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to delete selected alerts.", e); } return "success"; } public String purgeAllAlerts() { Subject subject = EnterpriseFacesContextUtility.getSubject(); ResourceGroup resourceGroup = EnterpriseFacesContextUtility.getResourceGroup(); try { int numDeleted = alertManager.deleteAlertsByContext(subject, EntityContext.forGroup(resourceGroup.getId())); FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Deleted " + numDeleted + " alerts on this group"); } catch (Exception e) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to delete alerts for group[ " + resourceGroup.getId() + " ]", e); log.error("failed to delete alerts for group[ " + resourceGroup.getId() + " ]", e); } return "success"; } @Override public DataModel getDataModel() { if (dataModel == null) { dataModel = new ListGroupAlertDefinitionsDataModel(PageControlView.GroupAlertHistoryList, MANAGED_BEAN_NAME); } return dataModel; } private class ListGroupAlertDefinitionsDataModel extends PagedListDataModel<AlertWithLatestConditionLog> { public ListGroupAlertDefinitionsDataModel(PageControlView view, String beanName) { super(view, beanName); } @Override public PageList<AlertWithLatestConditionLog> fetchPage(PageControl pc) { String dateStr = getDateFilter(); // get the outer class's JSF-managed property Date date = null; ListGroupAlertHistoryUIBean.this.setDateErrors(null); if ((dateStr != null) && !dateStr.equals("")) { try { DateFormat df = new SimpleDateFormat("MM/dd/yy"); date = df.parse(dateStr); } catch (ParseException pe) { ListGroupAlertHistoryUIBean.this.setDateErrors("Error: Invalid date filter, format is MM/dd/yy"); // do nothing else, things will pass through will a null date and function properly } } Integer alertDefinitionId = getAlertDefinitionId(); AlertPriority alertPriority = getAlertPriority(); Integer resourceGroupId = getResourceGroup().getId(); long MILLIS_IN_DAY = 24 * 60 * 60 * 1000; Long beginTime = null; Long endTime = null; if (date != null) { beginTime = date.getTime(); endTime = new Date(beginTime + MILLIS_IN_DAY).getTime(); } AlertCriteria searchCriteria = new AlertCriteria(); if (alertDefinitionId != null) { searchCriteria.addFilterGroupAlertDefinitionIds(alertDefinitionId); } // show alerts for any resource in the group, not just those attached to the group alert definitions List<Integer> resourceIds = resourceManager.findImplicitResourceIdsByResourceGroup(resourceGroupId); searchCriteria.addFilterResourceIds(resourceIds.toArray(new Integer[resourceIds.size()])); searchCriteria.addFilterPriorities(alertPriority); searchCriteria.addFilterStartTime(beginTime); searchCriteria.addFilterEndTime(endTime); searchCriteria.setPageControl(pc); searchCriteria.fetchAlertDefinition(true); // this is done by default at the object layer // searchCriteria.fetchConditionLogs(true); PageList<Alert> alerts = alertManager.findAlertsByCriteria(getSubject(), searchCriteria); List<AlertWithLatestConditionLog> results = new ArrayList<AlertWithLatestConditionLog>(alerts.size()); HttpServletRequest request = FacesContextUtility.getRequest(); for (Alert alert : alerts) { Resource res = alert.getAlertDefinition().getResource(); String recoveryInfo = AlertDefUtil.getAlertRecoveryInfo(alert, res.getId()); if (alert.getConditionLogs().size() > 1) { results.add(new AlertWithLatestConditionLog(alert, "Multiple Conditions", "--", recoveryInfo)); } else if (alert.getConditionLogs().size() == 1) { AlertConditionLog log = alert.getConditionLogs().iterator().next(); AlertCondition condition = log.getCondition(); String displayText = AlertDefUtil.formatAlertConditionForDisplay(condition, request); String firedValue = log.getValue(); if (condition.getMeasurementDefinition() != null) { firedValue = MeasurementConverter.format(Double.valueOf(log.getValue()), condition .getMeasurementDefinition().getUnits(), true); } results.add(new AlertWithLatestConditionLog(alert, displayText, firedValue, recoveryInfo)); } else { results.add(new AlertWithLatestConditionLog(alert, "No Conditions", "--", recoveryInfo)); } } return new PageList<AlertWithLatestConditionLog>(results, alerts.getTotalSize(), pc); } } private Integer getAlertDefinitionId() { String alertDefinitionString = getAlertDefinitionFilter(); if (alertDefinitionString != null) { return Integer.parseInt(alertDefinitionString); } return null; } private AlertPriority getAlertPriority() { String alertPriorityName = getAlertPriorityFilter(); if (alertPriorityName != null) { return Enum.valueOf(AlertPriority.class, alertPriorityName); } return null; } private String[] getSelectedAlerts() { return FacesContextUtility.getRequest().getParameterValues("selectedAlerts"); } }