modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
| 8
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
| 22 +-
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
| 10 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractAlertDefinitionsView.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
| 17 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
| 28 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
| 96 +++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/EditAlertDefinitionForm.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GeneralPropertiesAlertDefinitionForm.java
| 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GroupAlertDefinitionsView.java
| 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
| 12 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
| 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsView.java
| 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SingleAlertDefinitionView.java
| 19 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
| 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertDefinitionGWTService.java
| 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertDefinitionGWTServiceImpl.java
| 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionLogManagerBean.java
| 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
| 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerLocal.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
| 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java
| 13 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
| 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerLocal.java
| 12 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
| 15 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/DataPurgeJob.java
| 18 +
26 files changed, 252 insertions(+), 78 deletions(-)
New commits:
commit 3bbec0bbb45429d1f0769753466faa3e26e5623f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jun 20 15:40:39 2012 -0400
[830463 - Re-enabling (actually, updating) an alert definition clears condition logs
for existing alerts]
This is sort of complex. The underlying issue is that
AlertDefinitionManagerBean.updateAlertDefinition(updatedDef) replaces
existing AlertConditions with updatedDef.conditions. The detached
conditions were deleted (via Hibernate and DELETE_ORPHAN) regardless of the
fact that they very possibly linked to AlertConditionLog records for existing
Alerts. These log records are what you need to display the actual condition
evaluations that explain why the alert was fired.
The fix was to allow the detached AlertCondition records to stay around and
to deal with the fallout of doing that:
- clean up orphaned AlertConditions (no def and no logs) in the data purge job
- update queries backing AlertManager.deleteAlertsByContext()
- update queries backing resource uninventory bulk delete
Additionally, there was a lot of confusion around the 'purgeInternals'
parameter
for updateAlertDefinition(). It was initially thought that setting this true
was responsible for the loss of AlertConditions backing the Alerts. Actually,
what this flag does, when set to true, is to erase any partial condition
matching that has taken place. It must be set true if conditions, dampening rules,
or the condition expression (All vs Any matching) are being updated. Otherwise
it can be false.
I renamed this flag to be 'resetMatching' to hopefully be more clear, and
added some jdoc for the relevant methods.
I had already refactored CoreGUI's editor to correctly set this flag before
realizing it was not the root cause. So that logic is in place and
will optimize the update to some degree.
I think the backend logic can be further optimized using this setting more
intelligently. I plan a subsequent check-in for that before setting to ON_QA.
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
index 064400c..8a72244 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
@@ -290,7 +290,11 @@ import org.rhq.core.domain.operation.OperationRequestStatus;
+ " FROM AlertCondition AS ac " //
+ " JOIN ac.alertDefinition ad " //
+ " JOIN ad.resource res " //
- + " WHERE ac.id = :alertConditionId ") })
+ + " WHERE ac.id = :alertConditionId "),
+ @NamedQuery(name = AlertCondition.QUERY_DELETE_ORPHANED, query = "" //
+ + " DELETE FROM AlertCondition ac " //
+ + " WHERE ac.alertDefinition IS NULL " //
+ + " AND NOT EXISTS ( SELECT acl FROM AlertConditionLog acl WHERE
acl.condition.id = ac.id ) ") })
@SequenceGenerator(name = "RHQ_ALERT_CONDITION_ID_SEQ", sequenceName =
"RHQ_ALERT_CONDITION_ID_SEQ")
@Table(name = "RHQ_ALERT_CONDITION")
@XmlAccessorType(XmlAccessType.FIELD)
@@ -314,6 +318,8 @@ public class AlertCondition implements Serializable {
public static final String QUERY_FIND_RESOURCE_STATUS_BY_CONDITION_ID =
"AlertCondition.findResourceStatus";
+ public static final String QUERY_DELETE_ORPHANED =
"AlertCondition.deleteOrphaned";
+
public static final String RECOVERY_CONDITIONAL_EXPRESSION = "" //
+ " ( ad.recoveryId = 0 " //
+ " OR ( ad.recoveryId <> 0 " //
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
index d43bb7f..28355be 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
@@ -42,7 +42,7 @@ import javax.persistence.Table;
* @author Joseph Marques
*/
@Entity
-@NamedQueries( {
+@NamedQueries({
@NamedQuery(name = AlertConditionLog.QUERY_FIND_UNMATCHED_LOG_BY_ALERT_CONDITION_ID,
//
query = "SELECT acl " //
+ " FROM AlertConditionLog AS acl " //
@@ -63,16 +63,27 @@ import javax.persistence.Table;
+ " FROM Alert a " //
+ " JOIN a.conditionLogs ac" //
+ " WHERE a.id IN ( :alertIds ) )"),
- // deletes condition logs via the alert def, not alerts, because not every condition
log may not
- // yet be associated with an alert. Also, avoids joining with the potentially large
alert table
- @NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCES, //
+ // This query removes condition logs via the alert def, not alerts, because not every
condition log may
+ // yet be associated with an alert. This is required by Resource bulk delete to pick
up the condition logs missed
+ // by QUERY_DELETE_BY_RESOURCES. It will not get the logs for AlertConditions
detached from the AlertDefinition.
+ @NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCES_BULK_DELETE, //
query = "DELETE AlertConditionLog acl " //
+ " WHERE acl.condition.id IN ( SELECT ac.id " //
+ " FROM AlertCondition ac " //
+ " JOIN ac.alertDefinition ad " //
+ " WHERE ad.resource.id IN ( :resourceIds )
))"),
+ // This query will remove condition logs for conditions that are associated with
alerts, regardless of whether
+ // the AlertCondition has been detached from the AlertDef. This is what you want if
you are deleting alerts for
+ // a resource. It does not fully satisfy Resource bulk delete.
+ @NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCES, //
+ query = "DELETE AlertConditionLog acl " //
+ + " WHERE acl.alert.id IN ( SELECT alert.id " //
+ + " FROM AlertDefinition alertDef " //
+ + " JOIN alertDef.alerts alert " //
+ + " WHERE alertDef.resource.id IN ( :resourceIds
) ))"),
@NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCE_TEMPLATE, //
- query = "DELETE AlertConditionLog log " + " WHERE log.alert.id IN
(SELECT alert.id "
+ query = "DELETE AlertConditionLog acl " //
+ + " WHERE acl.alert.id IN (SELECT alert.id "
+ " FROM AlertDefinition alertDef "
+ " JOIN alertDef.alerts alert "
+ " WHERE alertDef.resourceType.id =
:resourceTypeId)"),
@@ -104,6 +115,7 @@ public class AlertConditionLog implements Serializable {
public static final String QUERY_DELETE_ALL =
"AlertConditionLog.deleteByAll";
public static final String QUERY_DELETE_BY_ALERT_IDS =
"AlertConditionLog.deleteByAlertIds";
public static final String QUERY_DELETE_BY_RESOURCES =
"AlertConditionLog.deleteByResources";
+ public static final String QUERY_DELETE_BY_RESOURCES_BULK_DELETE =
"AlertConditionLog.deleteByResourcesBulkDelete";
public static final String QUERY_DELETE_BY_RESOURCE_TEMPLATE =
"AlertConditionLog.deleteByResourceType";
public static final String QUERY_DELETE_BY_RESOURCE_GROUPS =
"AlertConditionLog.deleteByResourceGroups";
public static final String QUERY_DELETE_BY_ALERT_CTIME =
"AlertConditionLog.deleteByAlertCTime";
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
index 7d5e3e8..397e254 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
@@ -354,11 +354,17 @@ public class AlertDefinition implements Serializable {
@OneToMany(mappedBy = "alertDefinition", cascade = CascadeType.ALL)
@OrderBy
-
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
- // primary key
+ // We used to use DELETE_ORPHAN here. But the problem is that the the AlertCondition
record is needed by the
+ // associated AlertConditionLog for presentation purposes. So, keep the
AlertCondition records even if they
+ // are detached from the AlertDefinition (e.g. when the def is updated, see update()
below). They will be
+ // cleaned up in the DataPurge job after all relevant alerts have been removed and
there are no longer any
+ // referencing AlertConditionLog records.
private Set<AlertCondition> conditions = new
LinkedHashSet<AlertCondition>(1); // Most alerts will only have one condition.
@OneToMany(mappedBy = "alertDefinition", cascade = CascadeType.ALL)
+ // Although similar to AlertCondition, we do use DELETE_ORPHAN here. The reason is
because AlertNotificationLog
+ // does not refer back to the AlertNotification record and therefore the notification
logs are not affected
+ // by the loss of the AlertNotification that spawned the notification.
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<AlertNotification> alertNotifications = new
ArrayList<AlertNotification>();
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractAlertDefinitionsView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractAlertDefinitionsView.java
index 7f2cce0..6a2fbf5 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractAlertDefinitionsView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractAlertDefinitionsView.java
@@ -199,5 +199,5 @@ public abstract class AbstractAlertDefinitionsView extends
TableSection<Abstract
protected abstract void disableButtonPressed(ListGridRecord[] selection);
- protected abstract void commitAlertDefinition(AlertDefinition alertDefinition);
+ protected abstract void commitAlertDefinition(AlertDefinition alertDefinition,
boolean isPurgeInternals);
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
index d762b23..3b564d4 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
@@ -58,6 +58,7 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout
implements E
private StaticTextItem conditionExpressionStatic;
private boolean formBuilt = false;
+ private boolean updated;
public ConditionsAlertDefinitionForm(String locatorId, ResourceType resourceType) {
this(locatorId, resourceType, null);
@@ -67,6 +68,7 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout
implements E
super(locatorId);
this.resourceType = resourceType;
this.alertDefinition = alertDefinition;
+ this.updated = false;
}
@Override
@@ -86,6 +88,11 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout
implements E
}
@Override
+ public boolean isResetMatching() {
+ return updated || conditionsEditor.isUpdated();
+ }
+
+ @Override
public void setAlertDefinition(AlertDefinition alertDef) {
alertDefinition = alertDef;
@@ -113,8 +120,12 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout
implements E
@Override
public void makeViewOnly() {
+ updated = false;
+
conditionExpression.hide();
conditionsEditor.setEditable(false);
+ conditionsEditor.setUpdated(false);
+
conditionExpressionStatic.show();
markForRedraw();
@@ -122,11 +133,15 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout
implements E
@Override
public void saveAlertDefinition() {
+ updated = false;
+
String condExpr = conditionExpression.getValue().toString();
alertDefinition.setConditionExpression(BooleanExpression.valueOf(condExpr));
HashSet<AlertCondition> conditions = conditionsEditor.getConditions();
alertDefinition.setConditions(conditions);
+
+ conditionsEditor.setUpdated(false);
}
@Override
@@ -167,6 +182,8 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout
implements E
conditionExpression.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
+ updated = true;
+
// Find out if this is using the ALL conjunction - if it is, we
can't have more than one conditional use the same metric.
// If we do, immediately abort and warn the user. See BZ 737565
if
((BooleanExpression.ALL.name().equals(event.getValue().toString()))
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
index 18b9beb..f3317ed 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
@@ -22,6 +22,11 @@
*/
package org.rhq.enterprise.gui.coregui.client.alert.definitions;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSourceField;
@@ -33,6 +38,7 @@ import com.smartgwt.client.widgets.events.CloseClickEvent;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+
import org.rhq.core.domain.alert.AlertCondition;
import org.rhq.core.domain.criteria.Criteria;
import org.rhq.core.domain.drift.DriftDefinitionTemplate;
@@ -48,11 +54,6 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
/**
* @author John Mazzitelli
*/
@@ -62,12 +63,14 @@ public class ConditionsEditor extends LocatableVLayout {
private HashSet<AlertCondition> conditions;
private Table<ConditionDataSource> table;
private final SelectItem conditionExpression;
+ private boolean updated;
public ConditionsEditor(String locatorId, SelectItem conditionExpression,
ResourceType resourceType,
HashSet<AlertCondition> conditions) {
super(locatorId);
this.conditionExpression = conditionExpression;
this.resourceType = resourceType;
+ this.updated = false;
setConditions(conditions);
}
@@ -133,6 +136,14 @@ public class ConditionsEditor extends LocatableVLayout {
table.setTableActionDisableOverride(!editable);
}
+ public boolean isUpdated() {
+ return updated;
+ }
+
+ public void setUpdated(boolean updated) {
+ this.updated = updated;
+ }
+
private class ConditionsTable extends Table<ConditionDataSource> {
private ConditionsTable(String locatorId) {
super(locatorId);
@@ -191,12 +202,14 @@ public class ConditionsEditor extends LocatableVLayout {
}
});
+ final int numConditions = conditions.size();
NewConditionEditor newConditionEditor = new
NewConditionEditor(
extendLocatorId("newConditionEditor"),
conditions,
ConditionsEditor.this.conditionExpression,
ConditionsEditor.this.resourceType,
new Runnable() {
@Override
public void run() {
+ updated = updated || numConditions !=
conditions.size();
winModal.markForDestroy();
refresh();
}
@@ -215,6 +228,7 @@ public class ConditionsEditor extends LocatableVLayout {
for (ListGridRecord record : selection) {
AlertCondition cond = getDataSource().copyValues(record);
conditions.remove(cond);
+ updated = true;
}
refresh();
}
@@ -237,8 +251,8 @@ public class ConditionsEditor extends LocatableVLayout {
protected List<DataSourceField> addDataSourceFields() {
List<DataSourceField> fields = super.addDataSourceFields();
- DataSourceTextField conditionField = new DataSourceTextField(FIELD_CONDITION,
MSG
- .view_alert_common_tab_conditions_text());
+ DataSourceTextField conditionField = new
DataSourceTextField(FIELD_CONDITION,
+ MSG.view_alert_common_tab_conditions_text());
fields.add(conditionField);
return fields;
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
index 3ba2182..c5ccfe3 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
@@ -34,9 +34,9 @@ import com.smartgwt.client.widgets.form.fields.events.ItemHoverEvent;
import com.smartgwt.client.widgets.form.fields.events.ItemHoverHandler;
import org.rhq.core.domain.alert.AlertDampening;
-import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.alert.AlertDampening.Category;
import org.rhq.core.domain.alert.AlertDampening.TimeUnits;
+import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/**
@@ -69,6 +69,8 @@ public class DampeningAlertDefinitionForm extends LocatableDynamicForm
implement
private SelectItem durationTimeUnitsSelection;
private StaticTextItem durationTimeUnitsStatic;
+ private boolean updated;
+
public DampeningAlertDefinitionForm(String locatorId) {
this(locatorId, null);
}
@@ -76,6 +78,7 @@ public class DampeningAlertDefinitionForm extends LocatableDynamicForm
implement
public DampeningAlertDefinitionForm(String locatorId, AlertDefinition
alertDefinition) {
super(locatorId);
this.alertDefinition = alertDefinition;
+ this.updated = false;
}
@Override
@@ -237,6 +240,8 @@ public class DampeningAlertDefinitionForm extends LocatableDynamicForm
implement
@Override
public void makeViewOnly() {
+ updated = false;
+
dampeningRuleSelection.hide();
dampeningRuleStatic.show();
@@ -318,6 +323,8 @@ public class DampeningAlertDefinitionForm extends LocatableDynamicForm
implement
@Override
public void saveAlertDefinition() {
+ updated = false;
+
AlertDampening.Category cat =
AlertDampening.Category.valueOf(dampeningRuleSelection.getValue().toString());
AlertDampening alertDampening = new AlertDampening(cat);
switch (cat) {
@@ -381,6 +388,11 @@ public class DampeningAlertDefinitionForm extends
LocatableDynamicForm implement
markForRedraw();
}
+ @Override
+ public boolean isResetMatching() {
+ return updated;
+ }
+
private void buildForm() {
if (!formBuilt) {
dampeningRuleSelection = new SelectItem("dampeningRule",
MSG.view_alert_common_tab_dampening());
@@ -413,8 +425,8 @@ public class DampeningAlertDefinitionForm extends LocatableDynamicForm
implement
// nothing to do - the none category has no ui components to render
// CONSECUTIVE_COUNT
- consecutiveOccurrencesSpinner = new
SpinnerItem("consecutiveOccurrencesSpinner", MSG
- .view_alert_common_tab_dampening_consecutive_occurrences_label());
+ consecutiveOccurrencesSpinner = new
SpinnerItem("consecutiveOccurrencesSpinner",
+ MSG.view_alert_common_tab_dampening_consecutive_occurrences_label());
consecutiveOccurrencesSpinner.setWrapTitle(false);
consecutiveOccurrencesSpinner.setMin(1);
consecutiveOccurrencesSpinner.setMax(999999);
@@ -423,13 +435,19 @@ public class DampeningAlertDefinitionForm extends
LocatableDynamicForm implement
consecutiveOccurrencesSpinner.setHoverWidth(300);
consecutiveOccurrencesSpinner.setTooltip(MSG
.view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip());
- consecutiveOccurrencesStatic = new
StaticTextItem("consecutiveOccurrencesStatic", MSG
- .view_alert_common_tab_dampening_consecutive_occurrences_label());
+ consecutiveOccurrencesStatic = new
StaticTextItem("consecutiveOccurrencesStatic",
+ MSG.view_alert_common_tab_dampening_consecutive_occurrences_label());
consecutiveOccurrencesStatic.setWrapTitle(false);
+ consecutiveOccurrencesSpinner.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updated = true;
+ }
+ });
+
// PARTIAL_COUNT
- partialOccurrencesSpinner = new
SpinnerItem("partialOccurrencesSpinner", MSG
- .view_alert_common_tab_dampening_partial_occurrences_label());
+ partialOccurrencesSpinner = new
SpinnerItem("partialOccurrencesSpinner",
+ MSG.view_alert_common_tab_dampening_partial_occurrences_label());
partialOccurrencesSpinner.setWrapTitle(false);
partialOccurrencesSpinner.setMin(1);
partialOccurrencesSpinner.setMax(999999);
@@ -438,12 +456,18 @@ public class DampeningAlertDefinitionForm extends
LocatableDynamicForm implement
partialOccurrencesSpinner.setHoverWidth(300);
partialOccurrencesSpinner.setTooltip(MSG
.view_alert_common_tab_dampening_partial_occurrences_label_tooltip());
- partialOccurrencesStatic = new
StaticTextItem("partialOccurrencesStatic", MSG
- .view_alert_common_tab_dampening_partial_occurrences_label());
+ partialOccurrencesStatic = new
StaticTextItem("partialOccurrencesStatic",
+ MSG.view_alert_common_tab_dampening_partial_occurrences_label());
partialOccurrencesStatic.setWrapTitle(false);
- partialEvaluationsSpinner = new
SpinnerItem("partialEvaluationsSpinner", MSG
- .view_alert_common_tab_dampening_partial_evalatuions_label());
+ partialOccurrencesSpinner.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updated = true;
+ }
+ });
+
+ partialEvaluationsSpinner = new
SpinnerItem("partialEvaluationsSpinner",
+ MSG.view_alert_common_tab_dampening_partial_evalatuions_label());
partialEvaluationsSpinner.setWrapTitle(false);
partialEvaluationsSpinner.setMin(1);
partialEvaluationsSpinner.setMax(999999);
@@ -452,13 +476,19 @@ public class DampeningAlertDefinitionForm extends
LocatableDynamicForm implement
partialEvaluationsSpinner.setHoverWidth(300);
partialEvaluationsSpinner.setTooltip(MSG
.view_alert_common_tab_dampening_partial_evalatuions_label_tooltip());
- partialEvaluationsStatic = new
StaticTextItem("partialEvaluationStatic", MSG
- .view_alert_common_tab_dampening_partial_evalatuions_label());
+ partialEvaluationsStatic = new
StaticTextItem("partialEvaluationStatic",
+ MSG.view_alert_common_tab_dampening_partial_evalatuions_label());
partialEvaluationsStatic.setWrapTitle(false);
+ partialEvaluationsSpinner.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updated = true;
+ }
+ });
+
// DURATION_COUNT
- durationOccurrencesSpinner = new
SpinnerItem("durationOccurrencesSpinner", MSG
- .view_alert_common_tab_dampening_duration_occurrences_label());
+ durationOccurrencesSpinner = new
SpinnerItem("durationOccurrencesSpinner",
+ MSG.view_alert_common_tab_dampening_duration_occurrences_label());
durationOccurrencesSpinner.setWrapTitle(false);
durationOccurrencesSpinner.setMin(1);
durationOccurrencesSpinner.setMax(999999);
@@ -467,12 +497,18 @@ public class DampeningAlertDefinitionForm extends
LocatableDynamicForm implement
durationOccurrencesSpinner.setHoverWidth(300);
durationOccurrencesSpinner.setTooltip(MSG
.view_alert_common_tab_dampening_duration_occurrences_label_tooltip());
- durationOccurrencesStatic = new
StaticTextItem("durationOccurrencesStatic", MSG
- .view_alert_common_tab_dampening_duration_occurrences_label());
+ durationOccurrencesStatic = new
StaticTextItem("durationOccurrencesStatic",
+ MSG.view_alert_common_tab_dampening_duration_occurrences_label());
durationOccurrencesStatic.setWrapTitle(false);
- durationTimePeriodSpinner = new
SpinnerItem("durationTimePeriodSpinner", MSG
- .view_alert_common_tab_dampening_duration_period_label());
+ durationOccurrencesSpinner.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updated = true;
+ }
+ });
+
+ durationTimePeriodSpinner = new
SpinnerItem("durationTimePeriodSpinner",
+ MSG.view_alert_common_tab_dampening_duration_period_label());
durationTimePeriodSpinner.setWrapTitle(false);
durationTimePeriodSpinner.setMin(1);
durationTimePeriodSpinner.setMax(999999);
@@ -480,10 +516,16 @@ public class DampeningAlertDefinitionForm extends
LocatableDynamicForm implement
durationTimePeriodSpinner.setDefaultValue(1);
durationTimePeriodSpinner.setHoverWidth(300);
durationTimePeriodSpinner.setTooltip(MSG.view_alert_common_tab_dampening_duration_period_label_tooltip());
- durationTimePeriodStatic = new
StaticTextItem("durationTimePeriodStatic", MSG
- .view_alert_common_tab_dampening_duration_period_label());
+ durationTimePeriodStatic = new
StaticTextItem("durationTimePeriodStatic",
+ MSG.view_alert_common_tab_dampening_duration_period_label());
durationTimePeriodStatic.setWrapTitle(false);
+ durationTimePeriodSpinner.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updated = true;
+ }
+ });
+
durationTimeUnitsSelection = new SelectItem("durationTimeUnits",
"");
LinkedHashMap<String, String> units = new LinkedHashMap<String,
String>(4);
units.put(AlertDampening.TimeUnits.MINUTES.name(),
getTimeUnitsTitle(AlertDampening.TimeUnits.MINUTES));
@@ -494,9 +536,17 @@ public class DampeningAlertDefinitionForm extends
LocatableDynamicForm implement
durationTimeUnitsSelection.setDefaultValue(AlertDampening.TimeUnits.MINUTES.name());
durationTimeUnitsStatic = new
StaticTextItem("durationTimeUnitsStatic", "");
+ durationTimeUnitsSelection.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updated = true;
+ }
+ });
+
dampeningRuleSelection.addChangedHandler(new ChangedHandler() {
@Override
public void onChanged(ChangedEvent event) {
+ updated = true;
+
Category cat =
AlertDampening.Category.valueOf(event.getValue().toString());
switch (cat) {
case NONE: {
@@ -536,8 +586,8 @@ public class DampeningAlertDefinitionForm extends LocatableDynamicForm
implement
break;
}
default: {
- throw new IllegalStateException(MSG
-
.view_alert_common_tab_invalid_dampening_category(cat.name())); // should never happen
+ throw new IllegalStateException(
+
MSG.view_alert_common_tab_invalid_dampening_category(cat.name())); // should never happen
}
}
markForRedraw();
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/EditAlertDefinitionForm.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/EditAlertDefinitionForm.java
index 439ed3e..da4dfd3 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/EditAlertDefinitionForm.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/EditAlertDefinitionForm.java
@@ -9,6 +9,8 @@ public interface EditAlertDefinitionForm {
AlertDefinition getAlertDefinition();
+ boolean isResetMatching();
+
void setAlertDefinition(AlertDefinition alertDef);
void makeEditable();
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GeneralPropertiesAlertDefinitionForm.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GeneralPropertiesAlertDefinitionForm.java
index f154b26..fd07a64 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GeneralPropertiesAlertDefinitionForm.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GeneralPropertiesAlertDefinitionForm.java
@@ -32,8 +32,8 @@ import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.alert.AlertPriority;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import
org.rhq.enterprise.gui.coregui.client.components.form.SimpleEditableTextAreaFormItem;
import org.rhq.enterprise.gui.coregui.client.components.form.SimpleEditableFormItem;
+import
org.rhq.enterprise.gui.coregui.client.components.form.SimpleEditableTextAreaFormItem;
import org.rhq.enterprise.gui.coregui.client.components.form.StringLengthValidator;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
@@ -197,6 +197,10 @@ public class GeneralPropertiesAlertDefinitionForm extends
LocatableDynamicForm i
markForRedraw();
}
+ @Override
+ public boolean isResetMatching() {
+ return false;
+ }
private void buildForm() {
if (!formBuilt) {
nameField = new SimpleEditableFormItem("name",
MSG.common_title_name());
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GroupAlertDefinitionsView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GroupAlertDefinitionsView.java
index fc0dbb1..b277077 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GroupAlertDefinitionsView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GroupAlertDefinitionsView.java
@@ -198,7 +198,7 @@ public class GroupAlertDefinitionsView extends
AbstractAlertDefinitionsView {
}
@Override
- protected void commitAlertDefinition(final AlertDefinition alertDefinition) {
+ protected void commitAlertDefinition(final AlertDefinition alertDefinition, boolean
purgeInternals) {
if (alertDefinition.getId() == 0) {
GWTServiceLookup.getGroupAlertDefinitionService().createGroupAlertDefinitions(alertDefinition,
Integer.valueOf(this.group.getId()), new AsyncCallback<Integer>()
{
@@ -216,7 +216,8 @@ public class GroupAlertDefinitionsView extends
AbstractAlertDefinitionsView {
}
});
} else {
-
GWTServiceLookup.getGroupAlertDefinitionService().updateGroupAlertDefinitions(alertDefinition,
true,
+
GWTServiceLookup.getGroupAlertDefinitionService().updateGroupAlertDefinitions(alertDefinition,
+ purgeInternals,
new AsyncCallback<AlertDefinition>() {
@Override
public void onSuccess(AlertDefinition result) {
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
index 26dbae8..8a428df 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
@@ -23,6 +23,9 @@
package org.rhq.enterprise.gui.coregui.client.alert.definitions;
+import java.util.ArrayList;
+import java.util.List;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -38,6 +41,7 @@ import com.smartgwt.client.widgets.events.DoubleClickHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.alert.notification.AlertNotification;
import org.rhq.core.domain.criteria.Criteria;
@@ -50,9 +54,6 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* @author John Mazzitelli
*/
@@ -142,6 +143,11 @@ public class NotificationsAlertDefinitionForm extends
LocatableVLayout implement
markForRedraw();
}
+ @Override
+ public boolean isResetMatching() {
+ return false;
+ }
+
private void buildForm() {
if (!formBuilt) {
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
index a3cfea1..0e8f1b2 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
@@ -148,6 +148,11 @@ public class RecoveryAlertDefinitionForm extends LocatableDynamicForm
implements
markForRedraw();
}
+ @Override
+ public boolean isResetMatching() {
+ return false;
+ }
+
private void buildForm() {
if (!formBuilt) {
disableWhenFiredSelection = new RadioGroupItem("disableWhenFired",
MSG
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsView.java
index e31e554..00aa951 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsView.java
@@ -194,7 +194,7 @@ public class ResourceAlertDefinitionsView extends
AbstractAlertDefinitionsView {
}
@Override
- protected void commitAlertDefinition(final AlertDefinition alertDefinition) {
+ protected void commitAlertDefinition(final AlertDefinition alertDefinition, boolean
purgeInternals) {
if (alertDefinition.getId() == 0) {
GWTServiceLookup.getAlertDefinitionService().createAlertDefinition(alertDefinition,
Integer.valueOf(resource.getId()), new AsyncCallback<Integer>() {
@@ -213,7 +213,7 @@ public class ResourceAlertDefinitionsView extends
AbstractAlertDefinitionsView {
});
} else {
GWTServiceLookup.getAlertDefinitionService().updateAlertDefinition(alertDefinition.getId(),
- alertDefinition, true, new AsyncCallback<AlertDefinition>() {
+ alertDefinition, purgeInternals, new
AsyncCallback<AlertDefinition>() {
@Override
public void onSuccess(AlertDefinition result) {
CoreGUI.getMessageCenter().notify(
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SingleAlertDefinitionView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SingleAlertDefinitionView.java
index f276937..f2007ce 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SingleAlertDefinitionView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SingleAlertDefinitionView.java
@@ -70,8 +70,8 @@ public class SingleAlertDefinitionView extends LocatableVLayout {
final LocatableTabSet tabSet = new LocatableTabSet(this.getLocatorId());
tabSet.setHeight100();
- final Tab generalPropertiesTab = new
LocatableTab(tabSet.extendLocatorId("General"), MSG
- .view_alert_common_tab_general());
+ final Tab generalPropertiesTab = new
LocatableTab(tabSet.extendLocatorId("General"),
+ MSG.view_alert_common_tab_general());
generalProperties = new GeneralPropertiesAlertDefinitionForm(this.getLocatorId(),
alertDefinition);
generalPropertiesTab.setPane(generalProperties);
generalPropertiesTab.addTabDeselectedHandler(new TabDeselectedHandler() {
@@ -84,14 +84,14 @@ public class SingleAlertDefinitionView extends LocatableVLayout {
}
});
- Tab conditionsTab = new
LocatableTab(tabSet.extendLocatorId("Conditions"), MSG
- .view_alert_common_tab_conditions());
+ Tab conditionsTab = new
LocatableTab(tabSet.extendLocatorId("Conditions"),
+ MSG.view_alert_common_tab_conditions());
conditions = new ConditionsAlertDefinitionForm(this.getLocatorId(),
alertDefView.getResourceType(),
alertDefinition);
conditionsTab.setPane(conditions);
- Tab notificationsTab = new
LocatableTab(tabSet.extendLocatorId("Notifications"), MSG
- .view_alert_common_tab_notifications());
+ Tab notificationsTab = new
LocatableTab(tabSet.extendLocatorId("Notifications"),
+ MSG.view_alert_common_tab_notifications());
notifications = new NotificationsAlertDefinitionForm(this.getLocatorId(),
alertDefinition);
notificationsTab.setPane(notifications);
@@ -134,11 +134,12 @@ public class SingleAlertDefinitionView extends LocatableVLayout {
@Override
public void onClick(ClickEvent event) {
if (generalProperties.validate()) {
+ boolean resetMatching = isResetMatching();
saveAlertDefinition();
setAlertDefinition(getAlertDefinition()); // loads data into static
fields
makeViewOnly();
- alertDefView.commitAlertDefinition(getAlertDefinition());
+ alertDefView.commitAlertDefinition(getAlertDefinition(),
resetMatching);
} else {
tabSet.selectTab(generalPropertiesTab);
}
@@ -162,6 +163,10 @@ public class SingleAlertDefinitionView extends LocatableVLayout {
return alertDefinition;
}
+ public boolean isResetMatching() {
+ return conditions.isResetMatching() || dampening.isResetMatching();
+ }
+
public void setAlertDefinition(AlertDefinition alertDef) {
alertDefinition = alertDef;
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
index 93b3a91..987e62f 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
@@ -206,7 +206,7 @@ public class TemplateAlertDefinitionsView extends
AbstractAlertDefinitionsView {
}
@Override
- protected void commitAlertDefinition(final AlertDefinition alertDefinition) {
+ protected void commitAlertDefinition(final AlertDefinition alertDefinition, boolean
purgeInternals) {
if (alertDefinition.getId() == 0) {
GWTServiceLookup.getAlertTemplateService().createAlertTemplate(alertDefinition,
Integer.valueOf(this.resourceType.getId()), new
AsyncCallback<Integer>() {
@@ -224,7 +224,7 @@ public class TemplateAlertDefinitionsView extends
AbstractAlertDefinitionsView {
}
});
} else {
-
GWTServiceLookup.getAlertTemplateService().updateAlertTemplate(alertDefinition, true,
+
GWTServiceLookup.getAlertTemplateService().updateAlertTemplate(alertDefinition,
purgeInternals,
new AsyncCallback<AlertDefinition>() {
@Override
public void onSuccess(AlertDefinition result) {
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertDefinitionGWTService.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertDefinitionGWTService.java
index ce73f0e..a356ff8 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertDefinitionGWTService.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertDefinitionGWTService.java
@@ -32,8 +32,8 @@ public interface AlertDefinitionGWTService extends RemoteService {
int createAlertDefinition(AlertDefinition alertDefinition, Integer resourceId) throws
RuntimeException;
- AlertDefinition updateAlertDefinition(int alertDefinitionId, AlertDefinition
alertDefinition,
- boolean updateInternals) throws RuntimeException;
+ AlertDefinition updateAlertDefinition(int alertDefinitionId, AlertDefinition
alertDefinition, boolean purgeInternals)
+ throws RuntimeException;
int enableAlertDefinitions(int[] alertDefinitionIds) throws RuntimeException;
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertDefinitionGWTServiceImpl.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertDefinitionGWTServiceImpl.java
index 88a134a..01ba237 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertDefinitionGWTServiceImpl.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertDefinitionGWTServiceImpl.java
@@ -74,10 +74,10 @@ public class AlertDefinitionGWTServiceImpl extends
AbstractGWTServiceImpl implem
@Override
public AlertDefinition updateAlertDefinition(int alertDefinitionId, AlertDefinition
alertDefinition,
- boolean updateInternals) throws RuntimeException {
+ boolean resetMatching) throws RuntimeException {
try {
AlertDefinition results =
alertDefManager.updateAlertDefinition(getSessionSubject(), alertDefinitionId,
- alertDefinition, updateInternals);
+ alertDefinition, resetMatching);
return SerialUtility.prepare(results, "updateAlertDefinition");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionLogManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionLogManagerBean.java
index a26472e..bf87585 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionLogManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionLogManagerBean.java
@@ -102,9 +102,6 @@ public class AlertConditionLogManagerBean implements
AlertConditionLogManagerLoc
} catch (NoResultException nre) { // this is the expected case 90% of the
time
// lookup the condition entity
AlertCondition condition = entityManager.find(AlertCondition.class,
alertConditionId);
- if (condition == null) {
- // the associated AlertDefinition must have been updated, which
removes all previous AlertConditions
- }
// persist the log entry
AlertConditionLog conditionLog = new AlertConditionLog(condition,
ctime);
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
index fa03aaf..6953bfc 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
@@ -60,6 +60,7 @@ public class AlertConditionManagerBean implements
AlertConditionManagerLocal {
private AuthorizationManagerLocal authorizationManager;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ @Override
public Integer getAlertDefinitionByConditionIdInNewTransaction(int alertConditionId)
{
try {
Query query =
entityManager.createNamedQuery(AlertDefinition.QUERY_FIND_DEFINITION_ID_BY_CONDITION_ID);
@@ -77,6 +78,7 @@ public class AlertConditionManagerBean implements
AlertConditionManagerLocal {
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ @Override
public PageList<? extends AbstractAlertConditionCategoryComposite>
getAlertConditionComposites(Subject user,
Integer agentId, AlertConditionCategory category, PageControl pageControl) {
if (authorizationManager.isOverlord(user) == false) {
@@ -151,6 +153,7 @@ public class AlertConditionManagerBean implements
AlertConditionManagerLocal {
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ @Override
public InventoryStatus getResourceStatusByConditionId(int alertConditionId) {
try {
Query query =
entityManager.createNamedQuery(AlertCondition.QUERY_FIND_RESOURCE_STATUS_BY_CONDITION_ID);
@@ -165,4 +168,10 @@ public class AlertConditionManagerBean implements
AlertConditionManagerLocal {
}
}
+ @Override
+ public int purgeOrphanedAlertConditions() {
+ Query purgeQuery =
entityManager.createNamedQuery(AlertCondition.QUERY_DELETE_ORPHANED);
+ return purgeQuery.executeUpdate();
+ }
+
}
\ No newline at end of file
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerLocal.java
index f659716..4c27c75 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerLocal.java
@@ -44,4 +44,6 @@ public interface AlertConditionManagerLocal {
InventoryStatus getResourceStatusByConditionId(int alertConditionId);
+ int purgeOrphanedAlertConditions();
+
}
\ No newline at end of file
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
index c1c9d93..5da131e 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
@@ -451,9 +451,9 @@ public class AlertDefinitionManagerBean implements
AlertDefinitionManagerLocal,
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public AlertDefinition updateAlertDefinition(Subject subject, int alertDefinitionId,
- AlertDefinition alertDefinition, boolean purgeInternals) throws
InvalidAlertDefinitionException,
+ AlertDefinition alertDefinition, boolean resetMatching) throws
InvalidAlertDefinitionException,
AlertDefinitionUpdateException {
- if (purgeInternals) {
+ if (resetMatching) {
alertDefinitionManager.purgeInternals(alertDefinitionId);
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java
index 03c8945..d663198 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java
@@ -60,8 +60,19 @@ public interface AlertDefinitionManagerLocal {
void copyAlertDefinitions(Subject subject, Integer[] alertDefinitionIds);
+ /**
+ * @param subject
+ * @param alertDefinitionId
+ * @param alertDefinition
+ * @param resetMatching Incur the overhead of resetting any partial alert matching
that has taken place. This *must*
+ * be set true if updating conditions, dampening rules or the conditionExpressin (ANY
vs ALL). If in doubt, set to true
+ * as the loss of partial matching is better than corrupted matching.
+ * @return
+ * @throws InvalidAlertDefinitionException
+ * @throws AlertDefinitionUpdateException
+ */
AlertDefinition updateAlertDefinition(Subject subject, int alertDefinitionId,
AlertDefinition alertDefinition,
- boolean updateInternals) throws InvalidAlertDefinitionException,
AlertDefinitionUpdateException;
+ boolean resetMatching) throws InvalidAlertDefinitionException,
AlertDefinitionUpdateException;
int purgeUnusedAlertDefinitions();
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
index 8974c30..cde2f04 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
@@ -216,7 +216,7 @@ public class GroupAlertDefinitionManagerBean implements
GroupAlertDefinitionMana
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public AlertDefinition updateGroupAlertDefinitions(Subject subject, AlertDefinition
groupAlertDefinition,
- boolean purgeInternals) throws InvalidAlertDefinitionException,
AlertDefinitionUpdateException {
+ boolean resetMatching) throws InvalidAlertDefinitionException,
AlertDefinitionUpdateException {
if (LOG.isDebugEnabled()) {
LOG.debug("updateGroupAlertDefinition: " + groupAlertDefinition);
}
@@ -225,7 +225,7 @@ public class GroupAlertDefinitionManagerBean implements
GroupAlertDefinitionMana
AlertDefinition updated = null;
try {
updated = alertDefinitionManager.updateAlertDefinition(subject,
groupAlertDefinition.getId(),
- groupAlertDefinition, purgeInternals); // do not allow direct undeletes
of an alert definition
+ groupAlertDefinition, resetMatching); // do not allow direct undeletes of
an alert definition
} catch (Throwable t) {
throw new AlertDefinitionUpdateException("Failed to update a
GroupAlertDefinition: "
+ groupAlertDefinition.toSimpleString(), t);
@@ -244,7 +244,7 @@ public class GroupAlertDefinitionManagerBean implements
GroupAlertDefinitionMana
for (Integer alertDefinitionId : alertDefinitions) {
try {
alertDefinitionManager.updateAlertDefinition(overlord, alertDefinitionId,
groupAlertDefinition,
- purgeInternals);
+ resetMatching);
} catch (Throwable t) {
// continue on error, update as many as possible
if (firstThrowable == null) {
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerLocal.java
index 3db4ea9..13faf1d 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerLocal.java
@@ -41,8 +41,18 @@ public interface GroupAlertDefinitionManagerLocal {
int disableGroupAlertDefinitions(Subject subject, Integer[]
groupAlertDefinitionIds);
+ /**
+ * @param subject
+ * @param groupAlertDefinition
+ * @param resetMatching Incur the overhead of resetting any partial alert matching
that has taken place. This *must*
+ * be set true if updating conditions, dampening rules or the conditionExpressin (ANY
vs ALL). If in doubt, set to true
+ * as the loss of partial matching is better than corrupted matching.
+ * @return
+ * @throws InvalidAlertDefinitionException
+ * @throws AlertDefinitionUpdateException
+ */
AlertDefinition updateGroupAlertDefinitions(Subject subject, AlertDefinition
groupAlertDefinition,
- boolean purgeInternals) throws InvalidAlertDefinitionException,
AlertDefinitionUpdateException;
+ boolean resetMatching) throws InvalidAlertDefinitionException,
AlertDefinitionUpdateException;
// required to implement system side-effects as a result of modifying group
membership or deleting groups
void addGroupAlertDefinitions(Subject subject, int groupId, int[] resourcesIdsToAdd)
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 79c7935..f7ae643 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -511,13 +511,14 @@ public class ResourceManagerBean implements ResourceManagerLocal,
ResourceManage
PluginConfigurationUpdate.QUERY_DELETE_BY_RESOURCES_1, // first, delete the
raw configs for the config
PluginConfigurationUpdate.QUERY_DELETE_BY_RESOURCES_2, // then delete the
config objects
PluginConfigurationUpdate.QUERY_DELETE_BY_RESOURCES_3, // then the history
objects wrapping those configs
- AlertConditionLog.QUERY_DELETE_BY_RESOURCES, // Don't
- AlertNotificationLog.QUERY_DELETE_BY_RESOURCES, // alter
- Alert.QUERY_DELETE_BY_RESOURCES, // order
- AlertCondition.QUERY_DELETE_BY_RESOURCES, // of
- AlertDampeningEvent.QUERY_DELETE_BY_RESOURCES, // alert-
- AlertNotification.QUERY_DELETE_BY_RESOURCES, // related
- AlertDefinition.QUERY_DELETE_BY_RESOURCES, // deletes
+ AlertConditionLog.QUERY_DELETE_BY_RESOURCES, // Don't
+ AlertConditionLog.QUERY_DELETE_BY_RESOURCES_BULK_DELETE, // alter
+ AlertNotificationLog.QUERY_DELETE_BY_RESOURCES, // the
+ Alert.QUERY_DELETE_BY_RESOURCES, // order
+ AlertCondition.QUERY_DELETE_BY_RESOURCES, // of
+ AlertDampeningEvent.QUERY_DELETE_BY_RESOURCES, // alert-
+ AlertNotification.QUERY_DELETE_BY_RESOURCES, // related
+ AlertDefinition.QUERY_DELETE_BY_RESOURCES, // deletes
JPADrift.QUERY_DELETE_BY_RESOURCES, // drift before changeset
JPADriftChangeSet.QUERY_DELETE_BY_RESOURCES };
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/DataPurgeJob.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/DataPurgeJob.java
index 0cc04f4..dc8275c 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/DataPurgeJob.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/DataPurgeJob.java
@@ -32,6 +32,7 @@ import org.quartz.StatefulJob;
import org.rhq.core.domain.auth.Subject;
import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.alert.AlertConditionManagerLocal;
import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal;
import org.rhq.enterprise.server.alert.AlertManagerLocal;
import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal;
@@ -56,7 +57,6 @@ public class DataPurgeJob extends AbstractStatefulJob {
private static final Log LOG = LogFactory.getLog(DataPurgeJob.class);
private static long HOUR = 60 * 60 * 1000L;
- private static long DAY = 24L * HOUR;
/**
* Schedules a purge job to trigger right now. This will not block - it schedules the
job to trigger but immediately
@@ -118,6 +118,7 @@ public class DataPurgeJob extends AbstractStatefulJob {
purgeEventData(LookupUtil.getEventManager(), systemConfig);
purgeAlertData(LookupUtil.getAlertManager(), systemConfig);
purgeUnusedAlertDefinitions(LookupUtil.getAlertDefinitionManager());
+ purgeOrphanedAlertConditions(LookupUtil.getAlertConditionManager());
purgeOrphanedAlertNotifications(LookupUtil.getAlertNotificationManager());
purgeMeasurementTraitData(LookupUtil.getMeasurementDataManager(), systemConfig);
purgeAvailabilityData(LookupUtil.getAvailabilityManager(), systemConfig);
@@ -239,6 +240,21 @@ public class DataPurgeJob extends AbstractStatefulJob {
}
}
+ private void purgeOrphanedAlertConditions(AlertConditionManagerLocal
alertConditionManager) {
+ long timeStart = System.currentTimeMillis();
+ LOG.info("Alert condition orphan purge starting at " + new
Date(timeStart));
+ int orphansPurged = 0;
+
+ try {
+ orphansPurged = alertConditionManager.purgeOrphanedAlertConditions();
+ } catch (Exception e) {
+ LOG.error("Failed to purge alert condition data. Cause: " + e, e);
+ } finally {
+ long duration = System.currentTimeMillis() - timeStart;
+ LOG.info("Purged [" + orphansPurged + "] orphan alert
conditions - completed in [" + duration + "]ms");
+ }
+ }
+
private void purgeOrphanedAlertNotifications(AlertNotificationManagerLocal
alertNotificationManager) {
long timeStart = System.currentTimeMillis();
LOG.info("Alert notification orphan purge starting at " + new
Date(timeStart));