/* * 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.core.domain.alert; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.OneToMany; @Embeddable public class AlertDampening implements java.io.Serializable { public enum Category { NONE, // Each time condition set is true CONSECUTIVE_COUNT, // If condition set is true X times consecutively PARTIAL_COUNT, // If condition set is true X times out of the last Y times it is evaluated INVERSE_COUNT, // If condition set is true, but ignoring it the next X times DURATION_COUNT, // Once every <count> times conditions are exceeded within a time period of <range> minutes... /* * These should perhaps be filters, not categories */ NO_DUPLICATES, // Disregard control actions that are defined for related alerts... ONCE; // Disable alert until re-enabled manually or by recovery alert... } public enum TimeUnits { MINUTES(60), HOURS(MINUTES.getNumberOfSeconds() * 60), DAYS(HOURS.getNumberOfSeconds() * 24), WEEKS(DAYS .getNumberOfSeconds() * 7); private long numberOfSeconds; private TimeUnits(long numberOfSeconds) { this.numberOfSeconds = numberOfSeconds; } public long getNumberOfSeconds() { return numberOfSeconds; } } private static final long serialVersionUID = 1L; @Column(name = "DAMPENING_CATEGORY", nullable = false) @Enumerated(EnumType.ORDINAL) private Category category; @Column(name = "DAMPENING_VALUE") private int value; @Column(name = "DAMPENING_VALUE_UNITS") @Enumerated(EnumType.ORDINAL) private TimeUnits valueUnits; @Column(name = "DAMPENING_PERIOD") private int period; @Column(name = "DAMPENING_PERIOD_UNITS") @Enumerated(EnumType.ORDINAL) private TimeUnits periodUnits; // This is required for cascade behavior. We want to be able to cascade delete the AlertDampeningEvents when an // AlertDefinition is removed from the db, due to deleting a Resource from inventory. @OneToMany(mappedBy = "alertDefinition", cascade = { CascadeType.REFRESH, CascadeType.REMOVE }, orphanRemoval = true) private Set<AlertDampeningEvent> alertDampeningEvents = new HashSet<AlertDampeningEvent>(); protected AlertDampening() { } // JPA public AlertDampening(Category category) { this.category = category; } public AlertDampening(AlertDampening alertDampening) { update(alertDampening); } // must call clear() as well as entityManager.persist() before calling this public void update(AlertDampening alertDampening) { clearAlertDampeningEvents(); // for hibernate's all-delete-orphan this.category = alertDampening.category; this.value = alertDampening.value; this.valueUnits = alertDampening.valueUnits; this.period = alertDampening.period; this.periodUnits = alertDampening.periodUnits; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public TimeUnits getValueUnits() { return valueUnits; } public void setValueUnits(TimeUnits valueUnits) { this.valueUnits = valueUnits; } public int getPeriod() { return period; } public void setPeriod(int period) { this.period = period; } public TimeUnits getPeriodUnits() { return periodUnits; } public void setPeriodUnits(TimeUnits periodUnits) { this.periodUnits = periodUnits; } public Set<AlertDampeningEvent> getAlertDampeningEvents() { return alertDampeningEvents; } public void addAlertDampeningEvent(AlertDampeningEvent alertDampeningEvent) { getAlertDampeningEvents().add(alertDampeningEvent); } public void setAlertDampeningEvents(Set<AlertDampeningEvent> alertDampeningEvents) { this.alertDampeningEvents = alertDampeningEvents; } public void clearAlertDampeningEvents() { this.alertDampeningEvents.clear(); } @Override public String toString() { return "org.rhq.core.domain.alert.AlertDampening" + "[ " + "category=" + category + "[" + toString(category) + "]" + " ]"; } private String toString(Category category) { if (category == Category.NONE) { return ""; } else if (category == Category.PARTIAL_COUNT) { return "count=" + value + ", " + "collections=" + period; } else if (category == Category.DURATION_COUNT) { return "count=" + value + ", " + "period=" + period + " " + periodUnits; } else if (category == Category.CONSECUTIVE_COUNT) { return "count=" + value; } else { return "<unknown details>"; } } }