modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java | 31 +-
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinitionContext.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java | 17 -
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java | 37 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/GroupAlertDefinitionsView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/ResourceAuthorizedTableAction.java | 19 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/AlertDefinitionReportView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertDefinitionGWTServiceImpl.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/AlertDefUtil.java | 4
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/NewDefinitionAction.java | 2
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBeanTest.java | 142 ++++++++--
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java | 8
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java | 10
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java | 2
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/SessionTestHelper.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java | 29 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java | 127 ++++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerLocal.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java | 16 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/AlertDefinitionHandler.java | 4
26 files changed, 363 insertions(+), 132 deletions(-)
New commits:
commit 88d0b566188d558842943f3ce7bd49a749054df9
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Apr 5 16:43:20 2013 -0400
Bug 949082
RFE: Allow alert ack/delete from recent alerts portlet and reporting view
Based on contribution from mark Addy (thanks!)
Change the "Delete" and "Acknowledge" alert buttons in the AlertHistoryView
to use "ResourceAuthorizedTableAction" rather than "AbstractTableAction".
This generates additional calls to the backend to check permissions on
row selections (for non-admins). But, it should likely not be noticeable.
I made one small optimization in ResourceAuthorizedTableAction. If
constructed with a requiredPermission=null it will ignore the authz check.
Using that we can make it perform like a standard table action. So, if in
fact the user is an admin or otherwise has write access then it should
act as before. I took away the isEnabled() overrides in the original
patch in favor of this approach. The overrides had a small issue because
they did not consider "enablement". Meaning the buttons would be active
(for admins) even if nothing was selected.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java
index 9f28987..4c4c41f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java
@@ -21,10 +21,13 @@ package org.rhq.enterprise.gui.coregui.client.alert;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.LinkedHashMap;
+import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.ResultSet;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.SortDirection;
@@ -36,6 +39,7 @@ import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.alert.AlertPriority;
+import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.criteria.AlertCriteria;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
@@ -43,7 +47,8 @@ import org.rhq.enterprise.gui.coregui.client.IconEnum;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.components.form.DateFilterItem;
import org.rhq.enterprise.gui.coregui.client.components.form.EnumSelectItem;
-import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.RecordExtractor;
+import org.rhq.enterprise.gui.coregui.client.components.table.ResourceAuthorizedTableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
import org.rhq.enterprise.gui.coregui.client.components.table.TableSection;
@@ -162,17 +167,35 @@ public class AlertHistoryView extends TableSection<AlertDataSource> implements H
}
protected void setupTableInteractions(final boolean hasWriteAccess) {
- TableActionEnablement singleTargetEnablement = hasWriteAccess ? TableActionEnablement.ANY
- : TableActionEnablement.NEVER;
- addTableAction(MSG.common_button_delete(), MSG.view_alerts_delete_confirm(), new AbstractTableAction(
- singleTargetEnablement) {
+ addTableAction(MSG.common_button_delete(), MSG.view_alerts_delete_confirm(), new ResourceAuthorizedTableAction(
+ AlertHistoryView.this, TableActionEnablement.ANY, (hasWriteAccess ? null : Permission.MANAGE_ALERTS),
+ new RecordExtractor<Integer>() {
+ public Collection<Integer> extract(Record[] records) {
+ List<Integer> result = new ArrayList<Integer>(records.length);
+ for (Record record : records) {
+ result.add(record.getAttributeAsInt("resourceId"));
+ }
+ return result;
+ }
+ }) {
+
public void executeAction(ListGridRecord[] selection, Object actionValue) {
delete(selection);
}
});
- addTableAction(MSG.common_button_ack(), MSG.view_alerts_ack_confirm(), new AbstractTableAction(
- singleTargetEnablement) {
+ addTableAction(MSG.common_button_ack(), MSG.view_alerts_ack_confirm(), new ResourceAuthorizedTableAction(
+ AlertHistoryView.this, TableActionEnablement.ANY, (hasWriteAccess ? null : Permission.MANAGE_ALERTS),
+ new RecordExtractor<Integer>() {
+ public Collection<Integer> extract(Record[] records) {
+ List<Integer> result = new ArrayList<Integer>(records.length);
+ for (Record record : records) {
+ result.add(record.getAttributeAsInt("resourceId"));
+ }
+ return result;
+ }
+ }) {
+
public void executeAction(ListGridRecord[] selection, Object actionValue) {
acknowledge(selection);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/ResourceAuthorizedTableAction.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/ResourceAuthorizedTableAction.java
index 3050ecb..28df326 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/ResourceAuthorizedTableAction.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/ResourceAuthorizedTableAction.java
@@ -48,11 +48,23 @@ public abstract class ResourceAuthorizedTableAction extends AbstractTableAction
private Boolean isAuthorized;
+ /**
+ * @param table
+ * @param enablement
+ * @param requiredPermission if null no check is performed and authorization always passes
+ * @param extractor
+ */
protected ResourceAuthorizedTableAction(Table<?> table, Permission requiredPermission,
RecordExtractor<Integer> extractor) {
this(table, TableActionEnablement.ALWAYS, requiredPermission, extractor);
}
+ /**
+ * @param table
+ * @param enablement
+ * @param requiredPermission if null no check is performed and authorization always passes
+ * @param extractor
+ */
protected ResourceAuthorizedTableAction(Table<?> table, TableActionEnablement enablement,
Permission requiredPermission, RecordExtractor<Integer> extractor) {
super(enablement);
@@ -61,7 +73,7 @@ public abstract class ResourceAuthorizedTableAction extends AbstractTableAction
this.requiredPermission = requiredPermission;
this.extractor = extractor;
- if (Target.RESOURCE != this.requiredPermission.getTarget()) {
+ if (null != this.requiredPermission && Target.RESOURCE != this.requiredPermission.getTarget()) {
throw new IllegalArgumentException("Does not support Global permission");
}
}
@@ -73,6 +85,11 @@ public abstract class ResourceAuthorizedTableAction extends AbstractTableAction
return false;
}
+ // if there is no required permission then no check is performed
+ if (null == requiredPermission) {
+ return true;
+ }
+
final Collection<Integer> selectedResourceIds = extractor.extract(selection);
boolean isNewSelection = !selectedResourceIds.equals(this.authorizedResourceIds);
commit dc97319555c5760bfc97662c2d2108c58e03269f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Apr 5 16:14:33 2013 -0400
Bug 846451, 949048, 949062
* Users with just Resource Group access cannot access alerts on their Groups
* Failure adding member to group with alert definition
* Removing member from group with group alert definition removes all instances of the alert definition
Bug 846451
Change AlertDefinition.resourceGroup to AlertDefinition.group. This brings
the name into the convention we use everywhere else, and that the GriteriaGenerator
expects for group FK relations.
- Update all relevant queries and AlertDefinitionCriteria
- For back compat, keep existing setter/getter and deprecate. Refactor all
internal code to use the new setter/getter.
Bugs 949048, 949062
The handling of group member add/remove was berry berry broken. Various changes:
- Prevent the passing of Hibernate proxies across sessions when adding group
alert defs to new members.
- Fix logic around removing group alert defs when removing group members.
- Add new filterGroupAlertDefinitionGroupId and filterReadOnly to AlertDefinitionCriteria
- Rename alertDefManager.createAlertDefinition to alertDefManager.createAlertDefinitionInNewTransaction to
make it very clear what happens when you make this SLSB call. This is the
convention.
- Add some more integration tests and fix up some stuff in AlertDefinitionManagerBeanTest
- We had two SLSB methods named removeGroupAlertDefinitions. Rename the proper one
to removeGroupMemberAlertDefinitions and completely fix it as it did the
wrong thing (likely due to the wrong name).
- Deprecate a portal-war only Local SLSB method.
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 deeab01..b7d01cd 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
@@ -103,7 +103,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
@NamedQuery(name = AlertDefinition.QUERY_FIND_OPTION_ITEMS_BY_GROUP, query = "" //
+ " SELECT new org.rhq.core.domain.common.composite.IntegerOptionItem(ad.id, ad.name) " //
+ " FROM AlertDefinition ad " //
- + " WHERE ad.resourceGroup.id = :groupId " //
+ + " WHERE ad.group.id = :groupId " //
+ " AND ad.deleted = false"), //
@NamedQuery(name = AlertDefinition.QUERY_FIND_BY_RESOURCE, query = "" //
+ "SELECT a " //
@@ -118,7 +118,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
@NamedQuery(name = AlertDefinition.QUERY_FIND_BY_RESOURCE_GROUP, query = "" //
+ "SELECT a " //
+ " FROM AlertDefinition a " //
- + " WHERE a.resourceGroup.id = :groupId " //
+ + " WHERE a.group.id = :groupId " //
+ " AND a.deleted = false"),
@NamedQuery(name = AlertDefinition.QUERY_DELETE_BY_RESOURCES, query = "" //
+ "DELETE FROM AlertDefinition ad " //
@@ -195,7 +195,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
+ "SELECT ad.id " //
+ " FROM AlertDefinition ad " //
+ " WHERE ad.id = :alertDefinitionId " //
- + " AND ad.resourceGroup IS NOT NULL "), //
+ + " AND ad.group IS NOT NULL "), //
@NamedQuery(name = AlertDefinition.QUERY_IS_RESOURCE_ALERT_DEFINITION, query = "" //
+ "SELECT ad.id " //
+ " FROM AlertDefinition ad " //
@@ -317,7 +317,7 @@ public class AlertDefinition implements Serializable {
@JoinColumn(name = "RESOURCE_GROUP_ID", nullable = true)
@ManyToOne
@XmlTransient
- private ResourceGroup resourceGroup;
+ private ResourceGroup group;
@Column(name = "ENABLED", nullable = false)
private boolean enabled;
@@ -533,17 +533,26 @@ public class AlertDefinition implements Serializable {
}
}
+ /**
+ * @deprecated use getGroup()
+ */
public ResourceGroup getResourceGroup() {
- return resourceGroup;
+ return group;
}
+ /**
+ * @deprecated use setGroup(ResourceGroup)
+ */
public void setResourceGroup(ResourceGroup resourceGroup) {
- this.resourceGroup = resourceGroup;
- /*
- if (this.resourceGroup != null) {
- this.resourceGroup.getAlertDefinitions().add(this);
- }
- */
+ this.group = resourceGroup;
+ }
+
+ public ResourceGroup getGroup() {
+ return group;
+ }
+
+ public void setGroup(ResourceGroup group) {
+ this.group = group;
}
public ResourceType getResourceType() {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinitionContext.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinitionContext.java
index 05e688b..a18f831 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinitionContext.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinitionContext.java
@@ -33,7 +33,7 @@ public enum AlertDefinitionContext {
return Type;
} else if (definition.getResource() != null) {
return Resource;
- } else if (definition.getResourceGroup() != null) {
+ } else if (definition.getGroup() != null) {
return Group;
} else {
throw new IllegalArgumentException("Unknown AlertDefinitionContext: " + definition);
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
index 6ddb395..20d1efa 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
@@ -54,7 +54,9 @@ public class AlertDefinitionCriteria extends Criteria {
private String filterAlertTemplateResourceTypeName; // requires overrides
private List<Integer> filterResourceIds; // requires overrides
private List<Integer> filterResourceGroupIds; // requires overrides
- private Integer filterGroupAlertDefinitionId;
+ private Integer filterGroupAlertDefinitionId; // requires overrides
+ private Integer filterGroupAlertDefinitionGroupId; // requires overrides
+ private Boolean filterReadOnly;
private Boolean filterEnabled;
private Boolean filterDeleted = false; // find enabled definitions by default
private NonBindingOverrideFilter filterResourceOnly; // requires overrides - finds only those associated with a resource
@@ -78,8 +80,9 @@ public class AlertDefinitionCriteria extends Criteria {
filterOverrides.put("alertTemplateResourceTypeId", "resourceType.id = ?");
filterOverrides.put("alertTemplateResourceTypeName", "resourceType.name like ?");
filterOverrides.put("resourceIds", "resource.id IN ( ? )");
- filterOverrides.put("resourceGroupIds", "resourceGroup.id IN ( ? )");
+ filterOverrides.put("resourceGroupIds", "group.id IN ( ? )");
filterOverrides.put("groupAlertDefinitionId", "groupAlertDefinition.id = ?");
+ filterOverrides.put("groupAlertDefinitionGroupId", "groupAlertDefinition.group.id = ?");
filterOverrides.put("resourceOnly", "resource IS NOT NULL");
filterOverrides.put("notificationSenderNames", "id IN ("
+ "SELECT notif.alertDefinition.id FROM AlertNotification notif " + "WHERE notif.senderName IN ( ? ))");
@@ -152,7 +155,15 @@ public class AlertDefinitionCriteria extends Criteria {
public void addFilterGroupAlertDefinitionId(Integer groupAlertDefinitionId) {
this.filterGroupAlertDefinitionId = groupAlertDefinitionId;
}
-
+
+ public void addFilterGroupAlertDefinitionGroupId(Integer groupAlertDefinitionGroupId) {
+ this.filterGroupAlertDefinitionGroupId = groupAlertDefinitionGroupId;
+ }
+
+ public void addFilterReadOnly(Boolean readOnly) {
+ this.filterReadOnly = readOnly;
+ }
+
public void fetchAlerts(boolean fetchAlerts) {
this.fetchAlerts = fetchAlerts;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
index eda9d9f..951975e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
@@ -522,7 +522,7 @@ public class ResourceGroup extends Group {
private boolean visible = true;
// bulk delete @OneToMany(mappedBy = "resource", cascade = { CascadeType.ALL })
- @OneToMany(mappedBy = "resourceGroup", cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
+ @OneToMany(mappedBy = "group", cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
private Set<AlertDefinition> alertDefinitions = new LinkedHashSet<AlertDefinition>();
@ManyToMany(mappedBy = "resourceGroups", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
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 5fc0ea8..534fc74 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
@@ -97,7 +97,7 @@ public class GroupAlertDefinitionsView extends AbstractAlertDefinitionsView {
SingleAlertDefinitionView view = super.getDetailsView(id);
if (id == 0) {
// when creating a new alert def, make sure to set this in the new alert def
- view.getAlertDefinition().setResourceGroup(group);
+ view.getAlertDefinition().setGroup(group);
}
return view;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java
index ef67483..a6d23ec 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java
@@ -252,8 +252,8 @@ public class NewNotificationEditor extends DynamicForm {
Resource res = null;
if (alertDefinition.getResourceType() != null) {
rt = alertDefinition.getResourceType();
- } else if (alertDefinition.getResourceGroup() != null) {
- rt = alertDefinition.getResourceGroup().getResourceType();
+ } else if (alertDefinition.getGroup() != null) {
+ rt = alertDefinition.getGroup().getResourceType();
} else {
res = alertDefinition.getResource();
rt = res.getResourceType();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsDataSource.java
index c6a4d3e..b322d5c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceAlertDefinitionsDataSource.java
@@ -99,7 +99,7 @@ public class ResourceAlertDefinitionsDataSource extends AbstractAlertDefinitions
this.resource.getResourceType().getId()) + "/" + parentId);
record.setLinkText(MSG.view_alert_definition_for_type());
} else {
- record.setAttribute(FIELD_PARENT, "#ResourceGroup/" + groupAlertDefinition.getResourceGroup().getId()
+ record.setAttribute(FIELD_PARENT, "#ResourceGroup/" + groupAlertDefinition.getGroup().getId()
+ "/Alerts/Definitions/" + groupAlertDefinition.getId());
record.setLinkText(MSG.view_alert_definition_for_group());
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/AlertDefinitionReportView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/AlertDefinitionReportView.java
index a812334..84f37ba 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/AlertDefinitionReportView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/AlertDefinitionReportView.java
@@ -247,9 +247,8 @@ public class AlertDefinitionReportView extends Table<AlertDefinitionReportView.D
CoreGUI.goToView(LinkManager.getSubsystemAlertDefinitionLink(resourceId, alertDefId));
} else if (alertDef.getGroupAlertDefinition() != null) {
AlertDefinition groupAlertDef = alertDef.getGroupAlertDefinition();
- CoreGUI.goToView(LinkManager.getEntityTabLink(
- EntityContext.forGroup(groupAlertDef.getResourceGroup()), "Alert", "Definitions")
- + "/" + groupAlertDef.getId());
+ CoreGUI.goToView(LinkManager.getEntityTabLink(EntityContext.forGroup(groupAlertDef.getGroup()),
+ "Alert", "Definitions") + "/" + groupAlertDef.getId());
}
}
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 74c4d60..181eef5 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
@@ -66,7 +66,7 @@ public class AlertDefinitionGWTServiceImpl extends AbstractGWTServiceImpl implem
@Override
public int createAlertDefinition(AlertDefinition alertDefinition, Integer resourceId) throws RuntimeException {
try {
- int results = alertDefManager.createAlertDefinition(getSessionSubject(), alertDefinition, resourceId, true);
+ int results = alertDefManager.createAlertDefinitionInNewTransaction(getSessionSubject(), alertDefinition, resourceId, true);
return results;
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/AlertDefUtil.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/AlertDefUtil.java
index 727577e..944aab3 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/AlertDefUtil.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/AlertDefUtil.java
@@ -98,7 +98,7 @@ public final class AlertDefUtil {
if (alertDefinitionManager.isTemplate(alertDefinitionId)) {
resourceTypeId = cond.getAlertDefinition().getResourceType().getId();
} else if (alertDefinitionManager.isGroupAlertDefinition(alertDefinitionId)) {
- resourceTypeId = cond.getAlertDefinition().getResourceGroup().getResourceType().getId();
+ resourceTypeId = cond.getAlertDefinition().getGroup().getResourceType().getId();
} else {
resourceTypeId = cond.getAlertDefinition().getResource().getResourceType().getId();
}
@@ -265,7 +265,7 @@ public final class AlertDefUtil {
if (context == AlertDefinitionContext.Type) {
RequestUtils.setResourceType(request, alertDefinition.getResourceType());
} else if (context == AlertDefinitionContext.Group) {
- RequestUtils.setResourceGroup(request, alertDefinition.getResourceGroup());
+ RequestUtils.setResourceGroup(request, alertDefinition.getGroup());
} else {
RequestUtils.setResource(request, alertDefinition.getResource());
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/NewDefinitionAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/NewDefinitionAction.java
index 1db7d05..4ade28d 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/NewDefinitionAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/NewDefinitionAction.java
@@ -92,7 +92,7 @@ public class NewDefinitionAction extends BaseAction {
alertDefinitionId = alertTemplateManager.createAlertTemplate(subject, alertDef, defForm.getType());
} else if (context == FormContext.Resource) {
AlertDefinitionManagerLocal alertDefinitionManager = LookupUtil.getAlertDefinitionManager();
- alertDefinitionId = alertDefinitionManager.createAlertDefinition(subject, alertDef, defForm.getId(), true);
+ alertDefinitionId = alertDefinitionManager.createAlertDefinitionInNewTransaction(subject, alertDef, defForm.getId(), true);
} else if (context == FormContext.Group) {
GroupAlertDefinitionManagerLocal groupAlertDefinitionManager = LookupUtil
.getGroupAlertDefinitionManager();
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBeanTest.java
index 588f04b..5e9620a 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBeanTest.java
@@ -22,6 +22,7 @@ package org.rhq.enterprise.server.alert;
import java.util.LinkedList;
import java.util.List;
+import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -34,6 +35,7 @@ import org.rhq.core.domain.alert.BooleanExpression;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
@@ -55,6 +57,12 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
private static final Log LOG = LogFactory.getLog(AlertDefinitionManagerBeanTest.class);
+ final private String prefix = this.getClass().getSimpleName() + "_";
+ final private String subjectName = prefix + "subject";
+ final private String roleName = prefix + "role";
+ final private String groupName = prefix + "group";
+ final private String resourceName = prefix + "resource";
+
private AlertDefinitionManagerLocal alertDefinitionManager;
private ResourceGroupManagerLocal resourceGroupManager;
@@ -79,20 +87,20 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
testData = executeInTransaction(false, new TransactionCallbackReturnable<TestData>() {
@Override
public TestData execute() throws Exception {
+
TestData newTestData = new TestData();
- Subject subject = SessionTestHelper.createNewSubject(em, "fake subject");
+ Subject subject = SessionTestHelper.createNewSubject(em, subjectName);
newTestData.setSubject(subject);
- Role role = SessionTestHelper.createNewRoleForSubject(em, subject, "fake role",
- Permission.MANAGE_ALERTS);
+ Role role = SessionTestHelper.createNewRoleForSubject(em, subject, roleName, Permission.MANAGE_ALERTS);
newTestData.setRole(role);
ResourceType resourceType = SessionTestHelper.createNewResourceType(em);
newTestData.setResourceType(resourceType);
- ResourceGroup resourceGroup = new ResourceGroup("fake group", resourceType);
+ ResourceGroup resourceGroup = new ResourceGroup(groupName, resourceType);
resourceGroup = resourceGroupManager.createPrivateResourceGroup(subject, resourceGroup);
newTestData.setResourceGroup(resourceGroup);
roleManager.setAssignedResourceGroups(subjectManager.getOverlord(), role.getId(),
new int[] { resourceGroup.getId() });
- Resource resource = SessionTestHelper.createNewResourceForGroup(em, resourceGroup, "fake resource");
+ Resource resource = SessionTestHelper.createNewResourceForGroup(em, resourceGroup, resourceName);
newTestData.setResource(resource);
return newTestData;
}
@@ -110,14 +118,19 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
private void deleteTestData() throws Exception {
if (testData != null) {
+ // use the SLSB here, not just EM
+ resourceGroupManager.deleteResourceGroup(subjectManager.getOverlord(), testData.getResourceGroup().getId());
+
for (Integer alertDefinitionId : testData.getAlertDefinitionIds()) {
removeEntity(AlertDefinition.class, alertDefinitionId);
}
- removeEntity(ResourceGroup.class, testData.getResourceGroup().getId());
+
removeEntity(Resource.class, testData.getResource().getId());
removeEntity(ResourceType.class, testData.getResourceType().getId());
- removeEntity(Subject.class, testData.getSubject().getId());
- removeEntity(Role.class, testData.getRole().getId());
+
+ subjectManager.deleteSubjects(subjectManager.getOverlord(), new int[] { testData.getSubject().getId() });
+ roleManager.deleteRoles(subjectManager.getOverlord(), new int[] { testData.getRole().getId() });
+
testData = null;
}
}
@@ -132,6 +145,7 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
ResourceTreeHelper.deleteResource(em, (Resource) object);
} else {
em.remove(object);
+ em.flush();
}
}
});
@@ -147,7 +161,8 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
public void execute() throws Exception {
List<Integer> alertDefinitionIds = new LinkedList<Integer>();
for (int i = 0; i < 50; i++) {
- alertDefinitionIds.add(createAlertDefinitionAndGetId("fake alertdef-" + String.valueOf(i), false));
+ alertDefinitionIds.add(createAlertDefinitionAndGetId(prefix + "alertdef_" + String.valueOf(i),
+ false));
}
List<Integer> alertDefinitionToEnableIds = alertDefinitionIds.subList(12, 37);
int enabledCount = alertDefinitionManager.enableAlertDefinitions(testData.getSubject(),
@@ -164,7 +179,8 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
public void execute() throws Exception {
List<Integer> alertDefinitionIds = new LinkedList<Integer>();
for (int i = 0; i < 50; i++) {
- alertDefinitionIds.add(createAlertDefinitionAndGetId("fake alertdef-" + String.valueOf(i), true));
+ alertDefinitionIds
+ .add(createAlertDefinitionAndGetId(prefix + "alertdef_" + String.valueOf(i), true));
}
List<Integer> alertDefinitionToDisableIds = alertDefinitionIds.subList(17, 48);
int disabledCount = alertDefinitionManager.disableAlertDefinitions(testData.getSubject(),
@@ -179,8 +195,8 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
executeInTransaction(new TransactionCallback() {
@Override
public void execute() throws Exception {
- int resourceAlertDefinitionId = createAlertDefinitionAndGetId("fake resource alertdef", true);
- int groupAlertDefinitionId = createGroupAlertDefinitionAndGetId("fake group alertdef");
+ int resourceAlertDefinitionId = createAlertDefinitionAndGetId(prefix + "resource_Alertdef", true);
+ int groupAlertDefinitionId = createGroupAlertDefinitionAndGetId(prefix + "group_Alertdef");
assertTrue("Failed to detect a group alert definition",
alertDefinitionManager.isGroupAlertDefinition(groupAlertDefinitionId));
assertFalse("Should not have detected a group alert definition",
@@ -193,6 +209,98 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
});
}
+ @Test
+ void testBug846451() {
+ executeInTransaction(new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ String name = prefix + "group_Alertdef";
+ int groupAlertDefinitionId = createGroupAlertDefinitionAndGetId(name);
+
+ AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
+ criteria.addFilterResourceGroupIds(testData.getResourceGroup().getId());
+
+ // tests the reported bug
+ List<AlertDefinition> result = alertDefinitionManager.findAlertDefinitionsByCriteria(
+ testData.getSubject(), criteria);
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertEquals(name, result.get(0).getName());
+ }
+ });
+ }
+
+ @Test
+ void testAddRemoveGroupMembers() throws Exception {
+
+ Resource resource2 = null;
+ Resource resource3 = null;
+
+ try {
+
+ // creating alert definitions is performed in a new transaction. So, any involved entities must already be
+ // committed. Commit the additional test entities here. This stuff will get cleaned up in afterMethod
+ startTransaction();
+
+ String name = prefix + "group_Alertdef";
+ int groupAlertDefinitionId = createGroupAlertDefinitionAndGetId(name);
+
+ String resource2Name = resourceName + "_2";
+ String resource3Name = resourceName + "_3";
+ resource2 = SessionTestHelper.createNewResource(em, resource2Name, testData.getResourceType());
+ resource3 = SessionTestHelper.createNewResource(em, resource3Name, testData.getResourceType());
+
+ commitTransaction();
+
+ // add new members and ensure the resource-level alert defs gets applied. Make sure to use the SLSB to add it
+ LookupUtil.getResourceGroupManager().addResourcesToGroup(subjectManager.getOverlord(),
+ testData.getResourceGroup().getId(), new int[] { resource2.getId() });
+ LookupUtil.getResourceGroupManager().addResourcesToGroup(subjectManager.getOverlord(),
+ testData.getResourceGroup().getId(), new int[] { resource3.getId() });
+
+ int[] ids = new int[] { resource2.getId(), resource3.getId() };
+ AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
+ criteria.addFilterResourceIds(ids[0], ids[1]);
+
+ List<AlertDefinition> result = alertDefinitionManager.findAlertDefinitionsByCriteria(testData.getSubject(),
+ criteria);
+ assertNotNull(result);
+ assertEquals(2, result.size());
+ assertEquals(name, result.get(0).getName());
+ assertEquals(name, result.get(1).getName());
+ assertTrue(result.get(0).getId() != result.get(1).getId());
+
+ // remove member and ensure the alert def gets removed
+ LookupUtil.getResourceGroupManager().removeResourcesFromGroup(subjectManager.getOverlord(),
+ testData.getResourceGroup().getId(), ids);
+
+ result = alertDefinitionManager.findAlertDefinitionsByCriteria(testData.getSubject(), criteria);
+ assertNotNull(result);
+ assertEquals(0, result.size());
+
+ } finally {
+ Resource[] resources = new Resource[] { resource2, resource3 };
+ try {
+ startTransaction();
+ for (Resource r : resources) {
+ if (null != r) {
+
+ r = em.find(Resource.class, r.getId());
+ Set<AlertDefinition> ads = r.getAlertDefinitions();
+ for (AlertDefinition ad : ads) {
+ em.remove(ad);
+ }
+ ResourceTreeHelper.deleteResource(em, r);
+ }
+ }
+ commitTransaction();
+
+ } catch (Exception e) {
+ rollbackTransaction();
+ }
+ }
+ }
+
private int createAlertDefinitionAndGetId(String name, boolean enabled) {
AlertDefinition alertDefinition = new AlertDefinition();
alertDefinition.setName(name);
@@ -201,8 +309,8 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
alertDefinition.setConditionExpression(BooleanExpression.ANY);
alertDefinition.setRecoveryId(0);
alertDefinition.setEnabled(enabled);
- int alertDefinitionId = alertDefinitionManager.createAlertDefinition(testData.getSubject(), alertDefinition,
- testData.getResource().getId(), true);
+ int alertDefinitionId = alertDefinitionManager.createAlertDefinitionInNewTransaction(testData.getSubject(),
+ alertDefinition, testData.getResource().getId(), true);
testData.getAlertDefinitionIds().add(alertDefinitionId);
return alertDefinitionId;
}
@@ -214,10 +322,10 @@ public class AlertDefinitionManagerBeanTest extends AbstractEJB3Test {
alertDefinition.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
alertDefinition.setConditionExpression(BooleanExpression.ANY);
alertDefinition.setRecoveryId(0);
- alertDefinition.setResourceGroup(testData.getResourceGroup());
+ alertDefinition.setGroup(testData.getResourceGroup());
alertDefinition.setEnabled(true);
- int alertDefinitionId = alertDefinitionManager.createAlertDefinition(testData.getSubject(), alertDefinition,
- null, true);
+ int alertDefinitionId = alertDefinitionManager.createAlertDefinitionInNewTransaction(testData.getSubject(),
+ alertDefinition, null, true);
testData.getAlertDefinitionIds().add(alertDefinitionId);
return alertDefinitionId;
}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java
index 69ffc44..fbbc86a 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java
@@ -205,7 +205,7 @@ public class AlertDefinitionWithComplexNotificationsTest extends AbstractEJB3Tes
templateAlertDefinition.setResourceType(resourceType);
groupAlertDefinition = createDefinitionForTest(universalName + " group", true);
- groupAlertDefinition.setResourceGroup(resourceGroup);
+ groupAlertDefinition.setGroup(resourceGroup);
resourceAlertDefinition = createDefinitionForTest(universalName + " resource", true);
resourceAlertDefinition.setResource(resources.iterator().next());
@@ -413,7 +413,7 @@ public class AlertDefinitionWithComplexNotificationsTest extends AbstractEJB3Tes
false);
def.setResource(resources.iterator().next());
- int id = adm.createAlertDefinition(subject, def, res.getId(), true);
+ int id = adm.createAlertDefinitionInNewTransaction(subject, def, res.getId(), true);
def.setId(id);
resourceLevelAlertDefinitionId = id;
@@ -432,7 +432,7 @@ public class AlertDefinitionWithComplexNotificationsTest extends AbstractEJB3Tes
AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation",
false);
- def.setResourceGroup(resourceGroup);
+ def.setGroup(resourceGroup);
int id = gadm.createGroupAlertDefinitions(subject, def, resourceGroup.getId());
def.setId(id);
@@ -456,7 +456,7 @@ public class AlertDefinitionWithComplexNotificationsTest extends AbstractEJB3Tes
AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation",
false);
- def.setResourceGroup(resourceGroup);
+ def.setGroup(resourceGroup);
int id = atm.createAlertTemplate(subject, def, resourceType.getId());
def.setId(id);
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 1eaea93..232171e 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -470,7 +470,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
alertDefinition.setConditions(conditions);
AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
- int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId, true);
+ int defId = alertDefManager.createAlertDefinitionInNewTransaction(getOverlord(), alertDefinition, resourceId, true);
alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ alertDefinition;
@@ -504,7 +504,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
alertDefinition.setConditions(conditions);
AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
- int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId, true);
+ int defId = alertDefManager.createAlertDefinitionInNewTransaction(getOverlord(), alertDefinition, resourceId, true);
alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ alertDefinition;
@@ -537,7 +537,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
alertDefinition.setConditions(conditions);
AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
- int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId, true);
+ int defId = alertDefManager.createAlertDefinitionInNewTransaction(getOverlord(), alertDefinition, resourceId, true);
alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ alertDefinition;
@@ -570,7 +570,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
alertDefinition.setConditions(conditions);
AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
- int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId, true);
+ int defId = alertDefManager.createAlertDefinitionInNewTransaction(getOverlord(), alertDefinition, resourceId, true);
alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ alertDefinition;
@@ -604,7 +604,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
alertDefinition.setConditions(conditions);
AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
- int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId, true);
+ int defId = alertDefManager.createAlertDefinitionInNewTransaction(getOverlord(), alertDefinition, resourceId, true);
alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ alertDefinition;
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
index 34f93f9..ebda2ef 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
@@ -342,7 +342,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
def.setPriority(AlertPriority.MEDIUM);
def.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
def.setRecoveryId(0);
- alertDefinitionManager.createAlertDefinition(overlord, def, res.getId(), true);
+ alertDefinitionManager.createAlertDefinitionInNewTransaction(overlord, def, res.getId(), true);
for (int MULTI : ROUNDS) {
String round = String.format(ROUND__FORMAT, MULTI);
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/SessionTestHelper.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/SessionTestHelper.java
index 4b51224..10b5dbc 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/SessionTestHelper.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/SessionTestHelper.java
@@ -192,16 +192,19 @@ public class SessionTestHelper {
return newGroup;
}
+ /** This uses only EM, it does not call the SLSB for adding resources to a group! */
public static Resource createNewResourceForGroup(EntityManager em, ResourceGroup group, String resourceName) {
ResourceType type = group.getResourceType();
return createNewResourceForGroup(em, group, resourceName, type, true);
}
+ /** This uses only EM, it does not call the SLSB for adding resources to a group! */
public static Resource createNewResourceForGroup(EntityManager em, ResourceGroup group, String resourceName,
ResourceType type, boolean doFlush) {
return createNewResourceForGroup(em, group, resourceName, type, AvailabilityType.UP, doFlush);
}
+ /** This uses only EM, it does not call the SLSB for adding resources to a group! */
public static Resource createNewResourceForGroup(EntityManager em, ResourceGroup group, String resourceName,
ResourceType type, AvailabilityType avail, boolean doFlush) {
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 7105d7f..d00a969 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
@@ -94,8 +94,8 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
private boolean checkViewPermission(Subject subject, AlertDefinition alertDefinition) {
if (alertDefinition.getResourceType() != null) { // an alert template
return authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_SETTINGS);
- } else if (alertDefinition.getResourceGroup() != null) { // a groupAlertDefinition
- return authorizationManager.canViewGroup(subject, alertDefinition.getResourceGroup().getId());
+ } else if (alertDefinition.getGroup() != null) { // a groupAlertDefinition
+ return authorizationManager.canViewGroup(subject, alertDefinition.getGroup().getId());
} else { // an alert definition
return authorizationManager.canViewResource(subject, alertDefinition.getResource().getId());
}
@@ -112,9 +112,9 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
if (alertDefinition.getResourceType() != null) { // an alert template
return authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_SETTINGS);
- } else if (alertDefinition.getResourceGroup() != null) { // a groupAlertDefinition
+ } else if (alertDefinition.getGroup() != null) { // a groupAlertDefinition
return authorizationManager.hasGroupPermission(subject, Permission.MANAGE_ALERTS, alertDefinition
- .getResourceGroup().getId());
+ .getGroup().getId());
} else { // an alert definition
return authorizationManager.hasResourcePermission(subject, Permission.MANAGE_ALERTS, alertDefinition
.getResource().getId());
@@ -207,7 +207,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
- public int createAlertDefinition(Subject subject, AlertDefinition alertDefinition, Integer resourceId, boolean validateNotificationConfiguration)
+ public int createAlertDefinitionInNewTransaction(Subject subject, AlertDefinition alertDefinition, Integer resourceId, boolean validateNotificationConfiguration)
throws InvalidAlertDefinitionException {
return createAlertDefinitionInternal(subject, alertDefinition, resourceId, true, validateNotificationConfiguration);
@@ -216,13 +216,13 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
private int createAlertDefinitionInternal(Subject subject, AlertDefinition alertDefinition, Integer resourceId, boolean checkPerms, boolean validateNotificationConfiguration) throws InvalidAlertDefinitionException {
checkAlertDefinition(subject, null, alertDefinition, resourceId, validateNotificationConfiguration);
- // if this is an alert definition, set up the link to a resource
+ // if this is an resource alert definition, set up the link to a resource
if (resourceId != null) {
// don't attach an alertTemplate or groupAlertDefinition to any particular resource
// they should have already been attached to the resourceType or resourceGroup by the caller
- //Resource resource = LookupUtil.getResourceManager().getResourceById(user, resourceId);
// use proxy trick to subvert having to load the entire resource into memory
+ // Resource resource = LookupUtil.getResourceManager().getResourceById(user, resourceId);
alertDefinition.setResource(new Resource(resourceId));
}
@@ -232,10 +232,11 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
throw new PermissionException("User [" + subject.getName()
+ "] does not have permission to create alert templates for type ["
+ alertDefinition.getResourceType() + "]");
- } else if (alertDefinition.getResourceGroup() != null) {
+ } else if (alertDefinition.getGroup() != null) {
throw new PermissionException("User [" + subject.getName()
+ "] does not have permission to create alert definitions for group ["
- + alertDefinition.getResourceGroup() + "]");
+ + alertDefinition.getGroup()
+ + "]");
} else {
throw new PermissionException("User [" + subject.getName()
+ "] does not have permission to create alert definitions for resource ["
@@ -333,8 +334,8 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
notifyAlertConditionCacheManager(subject, "removeAlertDefinitions", alertDefinition,
AlertDefinitionEvent.DELETED);
}
- if (alertDefinition.getResourceGroup() != null) {
- alertDefinition.setResourceGroup(null); // break bonds so corresponding ResourceGroup can be purged
+ if (alertDefinition.getGroup() != null) {
+ alertDefinition.setGroup(null); // break bonds so corresponding ResourceGroup can be purged
}
}
}
@@ -439,7 +440,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
newAlertDefinition.setParentId(alertDefinition.getParentId());
newAlertDefinition.setResource(alertDefinition.getResource());
newAlertDefinition.setResourceType(alertDefinition.getResourceType());
- newAlertDefinition.setResourceGroup(alertDefinition.getResourceGroup());
+ newAlertDefinition.setGroup(alertDefinition.getGroup());
newAlertDefinition.setGroupAlertDefinition(alertDefinition.getGroupAlertDefinition());
entityManager.persist(newAlertDefinition);
@@ -498,10 +499,10 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
throw new PermissionException("User [" + subject.getName()
+ "] does not have permission to modify alert templates for type ["
+ oldAlertDefinition.getResourceType() + "]");
- } else if (oldAlertDefinition.getResourceGroup() != null) {
+ } else if (oldAlertDefinition.getGroup() != null) {
throw new PermissionException("User [" + subject.getName()
+ "] does not have permission to modify alert definitions for group ["
- + oldAlertDefinition.getResourceGroup() + "]");
+ + oldAlertDefinition.getGroup() + "]");
} else {
throw new PermissionException("User [" + subject.getName()
+ "] does not have permission to modify alert definitions for resource ["
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 94b877c..5afa1f9 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
@@ -63,11 +63,11 @@ public interface AlertDefinitionManagerLocal {
* @return the id of the newly persisted alert definition
* @throws InvalidAlertDefinitionException
*/
- int createAlertDefinition(Subject subject, AlertDefinition alertDefinition, Integer resourceId, boolean finalizeNotificationConfiguration)
+ int createAlertDefinitionInNewTransaction(Subject subject, AlertDefinition alertDefinition, Integer resourceId, boolean finalizeNotificationConfiguration)
throws InvalidAlertDefinitionException;
/**
- * This is exactly the same as {@link #createAlertDefinition(Subject, AlertDefinition, Integer, boolean)} but
+ * This is exactly the same as {@link #createAlertDefinitionInNewTransaction(Subject, AlertDefinition, Integer, boolean)} but
* assumes the resource is part of a group (or has given resource type for templates) for which
* a group or template alert definition is being created.
* <p>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
index 5b5c2ef..ee7bbf0 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
@@ -123,7 +123,7 @@ public class AlertTemplateManagerBean implements AlertTemplateManagerLocal {
int alertTemplateId = 0;
try {
- alertTemplateId = alertDefinitionManager.createAlertDefinition(user, alertTemplate, null, true);
+ alertTemplateId = alertDefinitionManager.createAlertDefinitionInNewTransaction(user, alertTemplate, null, true);
} catch (Throwable t) {
throw new AlertDefinitionCreationException("Could not create alertTemplate for " + type + " with data "
+ alertTemplate.toSimpleString(), t);
@@ -191,7 +191,7 @@ public class AlertTemplateManagerBean implements AlertTemplateManagerLocal {
// persist the child, user is known to be overlord at this point for this system side-effect
try {
- alertDefinitionManager.createAlertDefinition(user, childAlertDefinition, resourceId, false);
+ alertDefinitionManager.createAlertDefinitionInNewTransaction(user, childAlertDefinition, resourceId, false);
} catch (Throwable t) {
throw new AlertDefinitionCreationException("Failed to create child AlertDefinition for Resource[id="
+ resourceId + "] with template " + template.toSimpleString());
@@ -287,7 +287,7 @@ public class AlertTemplateManagerBean implements AlertTemplateManagerLocal {
childAlertDefinition.setParentId(alertTemplate.getId());
// persist the child
- alertDefinitionManager.createAlertDefinition(overlord, childAlertDefinition, resourceId, false);
+ alertDefinitionManager.createAlertDefinitionInNewTransaction(overlord, childAlertDefinition, resourceId, false);
} 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/GroupAlertDefinitionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
index fb079f8..ef6770e 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
@@ -45,7 +45,10 @@ import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
+import org.rhq.enterprise.server.util.CriteriaQueryRunner;
/**
* @author Joseph Marques
@@ -67,6 +70,8 @@ public class GroupAlertDefinitionManagerBean implements GroupAlertDefinitionMana
private SubjectManagerLocal subjectManager;
@SuppressWarnings("unchecked")
+ @Deprecated
+ // remove along with portal war
public PageList<AlertDefinition> findGroupAlertDefinitions(Subject subject, int resourceGroupId,
PageControl pageControl) {
pageControl.initDefaultOrderingField("ctime", PageOrdering.DESC);
@@ -139,19 +144,21 @@ public class GroupAlertDefinitionManagerBean implements GroupAlertDefinitionMana
public int createGroupAlertDefinitions(Subject subject, AlertDefinition groupAlertDefinition,
Integer resourceGroupId) throws InvalidAlertDefinitionException, AlertDefinitionCreationException {
ResourceGroup group = resourceGroupManager.getResourceGroupById(subject, resourceGroupId, null);
- groupAlertDefinition.setResourceGroup(group);
+ groupAlertDefinition.setGroup(group);
int groupAlertDefinitionId = 0;
try {
- groupAlertDefinitionId = alertDefinitionManager.createAlertDefinition(subject, groupAlertDefinition, null, true);
+ groupAlertDefinitionId = alertDefinitionManager.createAlertDefinitionInNewTransaction(subject,
+ groupAlertDefinition, null, true);
} catch (Throwable t) {
throw new AlertDefinitionCreationException("Could not create groupAlertDefinitions for " + group
+ " with data " + groupAlertDefinition.toSimpleString(), t);
}
//get the alert definition we just created.. this is so that we can create copies of it
- AlertDefinition persistedDefinition = alertDefinitionManager.getAlertDefinition(subject, groupAlertDefinitionId);
-
+ AlertDefinition persistedDefinition = alertDefinitionManager
+ .getAlertDefinition(subject, groupAlertDefinitionId);
+
Throwable firstThrowable = null;
List<Integer> resourceIdsForGroup = getCommittedResourceIdsNeedingGroupAlertDefinitionApplication(subject,
@@ -241,7 +248,7 @@ public class GroupAlertDefinitionManagerBean implements GroupAlertDefinitionMana
LOG.debug("Need to update the following children alert definition ids: " + alertDefinitions);
}
List<Integer> alertDefinitionIdsInError = new ArrayList<Integer>();
-
+
for (Integer alertDefinitionId : alertDefinitions) {
try {
alertDefinitionManager.updateDependentAlertDefinition(subject, alertDefinitionId, updated,
@@ -266,7 +273,8 @@ public class GroupAlertDefinitionManagerBean implements GroupAlertDefinitionMana
childAlertDefinition.setGroupAlertDefinition(groupAlertDefinition);
// persist the child
- alertDefinitionManager.createAlertDefinition(subject, childAlertDefinition, resourceId, false);
+ alertDefinitionManager.createAlertDefinitionInNewTransaction(subject, childAlertDefinition, resourceId,
+ false);
} catch (Throwable t) {
// continue on error, update as many as possible
if (firstThrowable == null) {
@@ -289,27 +297,50 @@ public class GroupAlertDefinitionManagerBean implements GroupAlertDefinitionMana
return updated;
}
- public void addGroupAlertDefinitions(Subject subject, int resourceGroupId, int[] resourcesIdsToAdd)
+ public void addGroupMemberAlertDefinitions(Subject subject, int resourceGroupId, int[] addedResourceIds)
throws AlertDefinitionCreationException {
- if (resourcesIdsToAdd == null || resourcesIdsToAdd.length == 0) {
+ if (addedResourceIds == null || addedResourceIds.length == 0) {
return;
}
- Subject overlord = subjectManager.getOverlord();
+ List<Integer> resourceIdsInError = new ArrayList<Integer>();
Throwable firstThrowable = null;
- List<AlertDefinition> groupAlertDefinitions = findGroupAlertDefinitions(subject, resourceGroupId,
- PageControl.getUnlimitedInstance());
- List<Integer> resourceIdsInError = new ArrayList<Integer>();
+ // We want to copy the group level AlertDefinitions, so fetch them with the relevant lazy fields, so we
+ // have everything we need when calling the copy constructor, minimizing
+ AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
+ criteria.addFilterResourceGroupIds(resourceGroupId);
+ criteria.fetchGroupAlertDefinition(false);
+ criteria.fetchConditions(true);
+ criteria.fetchAlertNotifications(true);
+ // Apply paging when optionally fetching collections, to avoid duplicates. Hibernate seems to apply DISTINCT,
+ // which is what we want. Use a huge # because we want them all.
+ criteria.setPaging(0, Integer.MAX_VALUE);
+
+ List<AlertDefinition> groupAlertDefinitions = alertDefinitionManager.findAlertDefinitionsByCriteria(subject,
+ criteria);
+
for (AlertDefinition groupAlertDefinition : groupAlertDefinitions) {
- for (Integer resourceId : resourcesIdsToAdd) {
+ for (Integer resourceId : addedResourceIds) {
try {
- // construct the child
+ // Construct the resource-level AlertDefinition by using the copy constructor.
AlertDefinition childAlertDefinition = new AlertDefinition(groupAlertDefinition);
- childAlertDefinition.setGroupAlertDefinition(groupAlertDefinition);
- // persist the child
- alertDefinitionManager.createAlertDefinition(overlord, childAlertDefinition, resourceId, false);
+ // groupAlertDefinition is an attached entity. It is dangerous to pass attached entities (with
+ // Hibernate proxies for the current session) across sessions. Since the call to create the new
+ // AlertDefinition is performed in a new transaction, make sure not to pass the attached entity.
+ // Just use a simple stand-in to create the link to the group alert definition.
+ AlertDefinition groupAlertDefinitionPojo = new AlertDefinition();
+ groupAlertDefinitionPojo.setId(groupAlertDefinition.getId());
+ childAlertDefinition.setGroupAlertDefinition(groupAlertDefinitionPojo);
+
+ // Persist the resource-level (child) alert definition, cleanse any further proxies left
+ // over from the copy constructor.
+ HibernateDetachUtility.nullOutUninitializedFields(childAlertDefinition,
+ SerializationType.SERIALIZATION);
+
+ alertDefinitionManager.createAlertDefinitionInNewTransaction(subjectManager.getOverlord(),
+ childAlertDefinition, resourceId, false);
} catch (Throwable t) {
// continue on error, create as many as possible
if (firstThrowable == null) {
@@ -347,35 +378,61 @@ public class GroupAlertDefinitionManagerBean implements GroupAlertDefinitionMana
return results;
}
- public void removeGroupAlertDefinitions(Subject subject, int resourceGroupId, int[] resourceIdsToRemove) {
- if (resourceIdsToRemove == null || resourceIdsToRemove.length == 0) {
+ public void removeGroupMemberAlertDefinitions(Subject subject, int resourceGroupId, Integer[] removedResourceIds) {
+ if (removedResourceIds == null || removedResourceIds.length == 0) {
return;
}
- Integer[] groupAlertDefinitionIdsForResourceGroup = findGroupAlertDefinitionIds(resourceGroupId);
+ // fetch the resource-level AlertDefs tied to the Group from which resources are being removed
+ AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
+ criteria.addFilterResourceIds(removedResourceIds);
+ criteria.addFilterGroupAlertDefinitionGroupId(resourceGroupId);
+ criteria.addFilterDeleted(false);
+ criteria.clearPaging();
+
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
+ CriteriaQueryRunner<AlertDefinition> queryRunner = new CriteriaQueryRunner<AlertDefinition>(criteria,
+ generator, entityManager);
+ List<AlertDefinition> alertDefinitions = queryRunner.execute();
+
+ // No group alert defs, just return
+ if (alertDefinitions.isEmpty()) {
+ return;
+ }
- List<Integer> allChildrenDefinitionIds = new ArrayList<Integer>();
- Subject overlord = subjectManager.getOverlord();
- for (Integer nextGroupAlertDefinitionId : groupAlertDefinitionIdsForResourceGroup) {
- List<Integer> childDefinitions = getChildrenAlertDefinitionIds(subject, nextGroupAlertDefinitionId);
- allChildrenDefinitionIds.addAll(childDefinitions);
- alertDefinitionManager.removeAlertDefinitions(overlord, ArrayUtils.unwrapCollection(childDefinitions));
+ // 1) remove only the attached (i.e. non-protected) alert defs.
+ // 2) break all of the FK references to the group
+ List<Integer> allMemberAlertDefinitionIds = new ArrayList<Integer>(alertDefinitions.size());
+ List<Integer> attachedMemberAlertDefinitionIds = new ArrayList<Integer>(alertDefinitions.size());
+ for (AlertDefinition ad : alertDefinitions) {
+ Integer id = ad.getId();
+ allMemberAlertDefinitionIds.add(id);
+ if (!ad.isReadOnly()) {
+ attachedMemberAlertDefinitionIds.add(id);
+ }
}
- /*
- * break the Hibernate relationships used for navigating between the groupAlertDefinition and the
- * children alertDefinitions so that the async deletion mechanism can delete without FK violations
- */
- if (allChildrenDefinitionIds.size() > 0) {
- Query breakLinksQuery = entityManager.createNamedQuery(AlertDefinition.QUERY_UPDATE_SET_PARENTS_NULL);
- breakLinksQuery.setParameter("childrenDefinitionIds", allChildrenDefinitionIds);
- breakLinksQuery.executeUpdate();
+ // 1) remove only the attached (i.e. non-protected) alert defs.
+ if (!attachedMemberAlertDefinitionIds.isEmpty()) {
+ int[] groupMemberAlertDefinitionIdsArray = ArrayUtils.unwrapCollection(attachedMemberAlertDefinitionIds);
+
+ alertDefinitionManager.removeAlertDefinitions(subjectManager.getOverlord(),
+ groupMemberAlertDefinitionIdsArray);
}
+
+ // 2) break all of the references to the group
+ Query breakLinksQuery = entityManager.createNamedQuery(AlertDefinition.QUERY_UPDATE_SET_PARENTS_NULL);
+ breakLinksQuery.setParameter("childrenDefinitionIds", allMemberAlertDefinitionIds);
+ breakLinksQuery.executeUpdate();
+
+ alertDefinitions.clear();
+ allMemberAlertDefinitionIds.clear();
+ attachedMemberAlertDefinitionIds.clear();
}
private int getResourceGroupIdForAlertDefinitionId(int groupAlertDefinitionId) {
Query query = entityManager.createQuery("" //
- + "SELECT groupAlertDefinition.resourceGroup.id " //
+ + "SELECT groupAlertDefinition.group.id " //
+ " FROM AlertDefinition groupAlertDefinition " //
+ " WHERE groupAlertDefinition.id = :groupAlertDefinitionId");
query.setParameter("groupAlertDefinitionId", groupAlertDefinitionId);
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 13faf1d..1834c78 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
@@ -30,6 +30,8 @@ import org.rhq.core.domain.util.PageList;
*/
@Local
public interface GroupAlertDefinitionManagerLocal {
+ @Deprecated
+ // remove along with portal war
PageList<AlertDefinition> findGroupAlertDefinitions(Subject subject, int resourceGroupId, PageControl pageControl);
int createGroupAlertDefinitions(Subject subject, AlertDefinition alertDefinition, Integer resourceGroupId)
@@ -55,10 +57,10 @@ public interface GroupAlertDefinitionManagerLocal {
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)
+ void addGroupMemberAlertDefinitions(Subject subject, int groupId, int[] resourcesIdsToAdd)
throws AlertDefinitionCreationException;
- void removeGroupAlertDefinitions(Subject subject, int groupId, int[] resourceIdsToRemove);
+ void removeGroupMemberAlertDefinitions(Subject subject, int groupId, Integer[] resourceIdsToRemove);
void purgeAllGroupAlertDefinitions(Subject subject, int groupId);
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
index 7fdff89..1dc0f03 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
@@ -482,7 +482,7 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
return;
}
int[] resourceIdsToAdd = ArrayUtils.unwrapCollection(nonMemberResources);
- groupAlertDefinitionManager.addGroupAlertDefinitions(subject, groupId, resourceIdsToAdd);
+ groupAlertDefinitionManager.addGroupMemberAlertDefinitions(subject, groupId, resourceIdsToAdd);
Connection conn = null;
PreparedStatement insertExplicitStatement = null;
@@ -627,14 +627,14 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
+ "] which are not part of the group[id=" + groupId + "]");
}
- int[] resourceIdsToRemove = ArrayUtils.unwrapArray(resourceIds);
- groupAlertDefinitionManager.removeGroupAlertDefinitions(subject, groupId, resourceIdsToRemove);
+ groupAlertDefinitionManager.removeGroupMemberAlertDefinitions(subject, groupId, resourceIds);
Connection conn = null;
PreparedStatement deleteExplicitStatement = null;
PreparedStatement deleteImplicitStatement = null;
try {
conn = rhqDs.getConnection();
+ int[] resourceIdsArray = ArrayUtils.unwrapArray(resourceIds);
// insert implicit resources, must occur before deleting explicit
if (isRecursive) {
@@ -642,7 +642,7 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
.prepareStatement(ResourceGroup.QUERY_NATIVE_REMOVE_RESOURCES_FROM_GROUP_IMPLICIT_RECURSIVE);
deleteImplicitStatement.setInt(1, groupId);
deleteImplicitStatement.setInt(9, groupId);
- for (int resourceId : resourceIdsToRemove) {
+ for (Integer resourceId : resourceIds) {
// no-op if this resource's ancestor is also in the explicit list
List<Integer> lineage = resourceManager.getResourceIdLineage(resourceId);
List<Integer> nonMembers = getNonMemberExplicitResources(groupId, lineage);
@@ -663,20 +663,20 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
} else {
String deleteImplicitQueryString = JDBCUtil.transformQueryForMultipleInParameters(
ResourceGroup.QUERY_NATIVE_REMOVE_RESOURCES_FROM_GROUP_IMPLICIT, "@@RESOURCE_IDS@@",
- resourceIdsToRemove.length);
+ resourceIds.length);
deleteImplicitStatement = conn.prepareStatement(deleteImplicitQueryString);
deleteImplicitStatement.setInt(1, groupId);
- JDBCUtil.bindNTimes(deleteImplicitStatement, resourceIdsToRemove, 2);
+ JDBCUtil.bindNTimes(deleteImplicitStatement, resourceIdsArray, 2);
deleteImplicitStatement.executeUpdate();
}
// delete explicit resources
String deleteExplicitQueryString = JDBCUtil.transformQueryForMultipleInParameters(
ResourceGroup.QUERY_NATIVE_REMOVE_RESOURCES_FROM_GROUP_EXPLICIT, "@@RESOURCE_IDS@@",
- resourceIdsToRemove.length);
+ resourceIds.length);
deleteExplicitStatement = conn.prepareStatement(deleteExplicitQueryString);
deleteExplicitStatement.setInt(1, groupId);
- JDBCUtil.bindNTimes(deleteExplicitStatement, resourceIdsToRemove, 2);
+ JDBCUtil.bindNTimes(deleteExplicitStatement, resourceIdsArray, 2);
deleteExplicitStatement.executeUpdate();
} catch (SQLException sqle) {
log.error("Error removing resources from group[id=" + groupId + "]: ", sqle);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
index 23c43e5..06bc8ae 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java
@@ -218,7 +218,7 @@ public class AlertDefinitionHandlerBean extends AbstractRestBean {
if (groupId!=null) {
ResourceGroup group = resourceGroupMgr.getResourceGroup(caller,groupId);
- alertDefinition.setResourceGroup(group);
+ alertDefinition.setGroup(group);
}
if (resourceTypeId!=null) {
ResourceType type = resourceTypeMgr.getResourceTypeById(caller,resourceTypeId);
@@ -258,7 +258,7 @@ public class AlertDefinitionHandlerBean extends AbstractRestBean {
throw new StuffNotFoundException("Recovery alert with id " + adr.getRecoveryId());
}
- int definitionId = alertDefinitionManager.createAlertDefinition(caller, alertDefinition, resourceId, false);
+ int definitionId = alertDefinitionManager.createAlertDefinitionInNewTransaction(caller, alertDefinition, resourceId, false);
AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId);
AlertDefinitionRest uadr = definitionToDomain(updatedDefinition,true, uriInfo) ; // TODO param 'full' ?
@@ -823,8 +823,9 @@ public class AlertDefinitionHandlerBean extends AbstractRestBean {
if (def.getResource()!=null) {
adr.getLinks().add(createUILink(uriInfo,UILinkTemplate.RESOURCE_ALERT_DEF,def.getResource().getId(),adr.getId()));
- } else if (def.getResourceGroup()!=null) {
- adr.getLinks().add(createUILink(uriInfo,UILinkTemplate.GROUP_ALERT_DEF,def.getResourceGroup().getId(),adr.getId()));
+ } else if (def.getGroup() != null) {
+ adr.getLinks().add(
+ createUILink(uriInfo, UILinkTemplate.GROUP_ALERT_DEF, def.getGroup().getId(), adr.getId()));
} else {
adr.getLinks().add(createUILink(uriInfo,UILinkTemplate.TEMPLATE_ALERT_DEF,def.getResourceType().getId(),adr.getId()));
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/AlertDefinitionHandler.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/AlertDefinitionHandler.java
index 1fadcc6..7c6ec8f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/AlertDefinitionHandler.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/AlertDefinitionHandler.java
@@ -112,8 +112,8 @@ public class AlertDefinitionHandler extends AbstractRestBean implements AlertDef
return getBaseURL() + "/#Administration/Configuration/AlertDefTemplates/" +
alertDef.getResource().getResourceType().getId() + "/" + templateId;
} else if (alertDef.getGroupAlertDefinition() != null) {
- return getBaseURL() + "/#ResourceGroup/" +
- alertDef.getGroupAlertDefinition().getResourceGroup().getId() + "/Alerts/Definitions/" +
+ return getBaseURL() + "/#ResourceGroup/" + alertDef.getGroupAlertDefinition().getGroup().getId()
+ + "/Alerts/Definitions/" +
alertDef.getGroupAlertDefinition().getId();
} else {
return "";