[rhq] 2 commits - modules/core modules/enterprise
by ips
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java | 20 -
modules/core/domain/src/main/java/org/rhq/core/domain/common/Trigger.java | 21 +
modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/GroupOperationSchedule.java | 98 ++++++
modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/OperationSchedule.java | 154 ++++++++++
modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/ResourceOperationSchedule.java | 56 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/model/OperationParameters.java | 6
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleDetailsUIBean.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleUIBean.java | 4
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleDetailsUIBean.java | 4
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleUIBean.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleDetailsUIBean.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleUIBean.java | 2
modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/proxy/ResourceClientProxy.java | 2
modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ScriptUtil.java | 2
modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ClientMainTest.java | 34 --
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java | 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationJob.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationSchedule.java | 95 ------
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationSchedule.java | 154 ----------
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationSchedule.java | 53 ---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 4
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java | 2
modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java | 2
32 files changed, 380 insertions(+), 369 deletions(-)
New commits:
commit 9d2a7b2c94f485660161085982e4084ee2d3677d
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Dec 16 12:49:02 2010 -0500
move OperationSchedule, ResourceOperationSchedule and GroupOperationSchedule POJOs from server-jar to core-domain, so they can be used by coregui
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/common/Trigger.java b/modules/core/domain/src/main/java/org/rhq/core/domain/common/Trigger.java
index 6f6756c..da58047 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/common/Trigger.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/common/Trigger.java
@@ -19,6 +19,7 @@
*/
package org.rhq.core.domain.common;
+import java.io.Serializable;
import java.util.Date;
/**
@@ -28,7 +29,9 @@ import java.util.Date;
*
* @author Ian Springer
*/
-public class Trigger {
+public class Trigger implements Serializable {
+
+ private static final long serialVersionUID = 1L;
// Together, the startType, recurrenceType, and endType define what type of trigger this is.
// For the remaining fields in this class, only those that apply to the trigger's type will have non-null values.
@@ -125,6 +128,22 @@ public class Trigger {
return repeatCount;
}
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("Trigger");
+ sb.append("[cronExpression='").append(cronExpression).append('\'');
+ sb.append(", startType=").append(startType);
+ sb.append(", recurrenceType=").append(recurrenceType);
+ sb.append(", endType=").append(endType);
+ sb.append(", startDate=").append(startDate);
+ sb.append(", repeatInterval=").append(repeatInterval);
+ sb.append(", endDate=").append(endDate);
+ sb.append(", repeatCount=").append(repeatCount);
+ sb.append(']');
+ return sb.toString();
+ }
+
/**
* Create a trigger that will run now, once.
*
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/GroupOperationSchedule.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/GroupOperationSchedule.java
new file mode 100644
index 0000000..64c74de
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/GroupOperationSchedule.java
@@ -0,0 +1,98 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.domain.operation.bean;
+
+import java.util.List;
+
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.group.ResourceGroup;
+
+/**
+ * A simple non-entity POJO that describes a particular scheduled Resource group operation.
+ */
+public class GroupOperationSchedule extends OperationSchedule {
+ private static final long serialVersionUID = 1L;
+
+ private ResourceGroup group;
+ private List<Resource> executionOrder;
+ private boolean haltOnFailure = false; // default to not stop on error
+
+ public GroupOperationSchedule() {
+ }
+
+ public ResourceGroup getGroup() {
+ return group;
+ }
+
+ public void setGroup(ResourceGroup group) {
+ this.group = group;
+ }
+
+ /**
+ * The order to execute the operations - the first resource in the list is the first one to get its operation
+ * invoked. If this is <code>null</code>, all operations can be invoked in any order and may even be done
+ * concurrently.
+ *
+ * @return list of resources in the order in which their operations are invoked, or <code>null</code>
+ */
+ public List<Resource> getExecutionOrder() {
+ return executionOrder;
+ }
+
+ public void setExecutionOrder(List<Resource> executionOrder) {
+ this.executionOrder = executionOrder;
+ }
+
+ /**
+ * If <code>true</code>, the group operation will halt whenever one individual resource fails to execute. When
+ * executing in order, this means once a failure occurs, the resources next in line to execute will abort and not
+ * attempt to execute. If not executing in any particular order, you are not guaranteed which will stop and which
+ * will continue since all are executed as fast as possible, but the group operation will attempt to stop as best it
+ * can.
+ *
+ * @return halt flag
+ */
+ public boolean isHaltOnFailure() {
+ return haltOnFailure;
+ }
+
+ /**
+ * need a getXXX method instead of isXXX method for proper referencing from facelets pages
+ */
+ public boolean getHaltOnFailure() {
+ return haltOnFailure;
+ }
+
+ public void setHaltOnFailure(boolean haltOnFailure) {
+ this.haltOnFailure = haltOnFailure;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder str = new StringBuilder("GroupOperationSchedule: ");
+
+ str.append("group=[" + this.group);
+ str.append("], execution-order=[" + this.executionOrder);
+ str.append("], halt-on-failure=[" + this.haltOnFailure);
+ str.append("],");
+ str.append(super.toString());
+
+ return str.toString();
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/OperationSchedule.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/OperationSchedule.java
new file mode 100644
index 0000000..f92f3d0
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/OperationSchedule.java
@@ -0,0 +1,154 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.domain.operation.bean;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.operation.HistoryJobId;
+import org.rhq.core.domain.operation.JobId;
+
+/**
+ * A simple non-entity POJO that describes a particular scheduled operation.
+ *
+ * @author John Mazzitelli
+ */
+@XmlRootElement
+(a)XmlAccessorType(XmlAccessType.FIELD)
+public abstract class OperationSchedule implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String jobName;
+ private String jobGroup;
+ private String operationName;
+ private String operationDisplayName;
+ private Configuration parameters;
+ private Subject subject;
+ private String description;
+
+ public OperationSchedule() {
+ }
+
+ public String getJobGroup() {
+ return jobGroup;
+ }
+
+ public void setJobGroup(String jobGroup) {
+ this.jobGroup = jobGroup;
+ }
+
+ public String getJobName() {
+ return jobName;
+ }
+
+ public void setJobName(String jobName) {
+ this.jobName = jobName;
+ }
+
+ public String getOperationName() {
+ return operationName;
+ }
+
+ public void setOperationName(String operationName) {
+ this.operationName = operationName;
+ }
+
+ public String getOperationDisplayName() {
+ /*
+ * this conditional is for "legacy" purposes, so that pre-existing operation schedules don't return blank
+ * displayNames, they will default to returning the operationDefinition.name instead
+ */
+ if ((operationDisplayName == null) || operationDisplayName.equals("")) {
+ return getOperationName();
+ }
+
+ return operationDisplayName;
+ }
+
+ public void setOperationDisplayName(String operationDisplayName) {
+ this.operationDisplayName = operationDisplayName;
+ }
+
+ /**
+ * Returns the option parameters that are passed to the operation invocation.
+ *
+ * @return the parameters, or <code>null</code> if no parameters are to be passed
+ */
+ public Configuration getParameters() {
+ return parameters;
+ }
+
+ public void setParameters(Configuration parameters) {
+ this.parameters = parameters;
+ }
+
+ public Subject getSubject() {
+ return subject;
+ }
+
+ public void setSubject(Subject subject) {
+ if (subject == null) {
+ throw new NullPointerException("Cannot schedule an operation without a user associated with it");
+ }
+
+ this.subject = subject;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * The single job ID which identifies the operation. It can later be parsed via {@link JobId#JobId(String)}. Note
+ * that this job ID only identifies the scheduled operation; it does not identify any specific invocation of that
+ * operation (see {@link HistoryJobId} for that).
+ *
+ * @return job ID
+ */
+ @XmlElement
+ public JobId getJobId() {
+ return new JobId(this.jobName, this.jobGroup);
+ }
+
+ /*
+ * there may be some operations whose parameters are sensitive values, such as passwords - do not show them
+ * as part of the toString. they can still be gotten by explicitly calling getParameters()
+ */
+ @Override
+ public String toString() {
+ StringBuilder str = new StringBuilder();
+ str.append("job-name=[" + this.jobName);
+ str.append("], job-group=[" + this.jobGroup);
+ str.append("], operation-name=[" + this.operationName);
+ str.append("], subject=[" + this.subject);
+ str.append("], description=[" + this.description);
+ str.append("]");
+ return str.toString();
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/ResourceOperationSchedule.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/ResourceOperationSchedule.java
new file mode 100644
index 0000000..b00e867
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/bean/ResourceOperationSchedule.java
@@ -0,0 +1,56 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.domain.operation.bean;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.rhq.core.domain.resource.Resource;
+
+/**
+ * A simple non-entity POJO that describes a particular scheduled Resource operation.
+ */
+@XmlRootElement
+(a)XmlAccessorType(XmlAccessType.FIELD)
+public class ResourceOperationSchedule extends OperationSchedule {
+ private Resource resource;
+
+ public ResourceOperationSchedule() {
+ }
+
+ public Resource getResource() {
+ return resource;
+ }
+
+ public void setResource(Resource resource) {
+ this.resource = resource;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder str = new StringBuilder("ResourceOperationSchedule: ");
+
+ str.append("resource=[" + this.resource);
+ str.append("],");
+ str.append(super.toString());
+
+ return str.toString();
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
index a44e5f0..7cef256 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
@@ -27,6 +27,7 @@ import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria;
import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria;
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.operation.ResourceOperationHistory;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite;
import org.rhq.core.domain.operation.composite.ResourceOperationScheduleComposite;
import org.rhq.core.domain.resource.composite.DisambiguationReport;
@@ -37,7 +38,6 @@ import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.disambiguation.DefaultDisambiguationUpdateStrategies;
import org.rhq.enterprise.server.util.LookupUtil;
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/model/OperationParameters.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/model/OperationParameters.java
index e7317da..4b0617c 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/model/OperationParameters.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/model/OperationParameters.java
@@ -25,15 +25,15 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationHistory;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.server.core.plugin.PluginReloadedException;
-import org.rhq.enterprise.server.operation.GroupOperationSchedule;
import org.rhq.enterprise.server.operation.OperationDefinitionNotFoundException;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.enterprise.server.operation.OperationSchedule;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.util.LookupUtil;
public class OperationParameters {
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleDetailsUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleDetailsUIBean.java
index d04f199..55da3bc 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleDetailsUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleDetailsUIBean.java
@@ -22,12 +22,12 @@ import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.common.scheduling.OperationDetailsScheduleComponent;
import org.rhq.enterprise.gui.operation.model.OperationParameters;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.enterprise.server.operation.OperationSchedule;
import org.rhq.enterprise.server.scheduler.SchedulerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleUIBean.java
index d8b7692..adadafb 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/OperationScheduleUIBean.java
@@ -34,6 +34,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.operation.OperationDefinition;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.gui.util.FacesContextUtility;
@@ -51,8 +52,7 @@ import org.rhq.enterprise.gui.operation.schedule.group.ResourceGroupOperationSch
import org.rhq.enterprise.gui.operation.schedule.resource.ResourceOperationScheduleUIBean;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.enterprise.server.operation.OperationSchedule;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
import org.rhq.enterprise.server.util.LookupUtil;
public abstract class OperationScheduleUIBean extends PagedDataTableUIBean {
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleDetailsUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleDetailsUIBean.java
index e6111ca..8e32bcd 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleDetailsUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleDetailsUIBean.java
@@ -23,11 +23,11 @@ import java.util.List;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.composite.IntegerOptionItem;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.gui.operation.definition.group.ResourceGroupExecutionTypeUIBean;
import org.rhq.enterprise.gui.operation.schedule.OperationScheduleDetailsUIBean;
-import org.rhq.enterprise.server.operation.GroupOperationSchedule;
-import org.rhq.enterprise.server.operation.OperationSchedule;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
public class ResourceGroupOperationScheduleDetailsUIBean extends OperationScheduleDetailsUIBean {
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleUIBean.java
index e70ea9b..ee07ab0 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/group/ResourceGroupOperationScheduleUIBean.java
@@ -35,7 +35,7 @@ import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.operation.definition.group.ResourceGroupOperationDefinitionUIBean;
import org.rhq.enterprise.gui.operation.schedule.OperationScheduleUIBean;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
-import org.rhq.enterprise.server.operation.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.enterprise.server.scheduler.SchedulerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.enterprise.server.util.QuartzUtil;
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleDetailsUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleDetailsUIBean.java
index 0f6983f..a56b845 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleDetailsUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleDetailsUIBean.java
@@ -21,7 +21,7 @@ package org.rhq.enterprise.gui.operation.schedule.resource;
import org.quartz.SchedulerException;
import org.rhq.core.domain.auth.Subject;
import org.rhq.enterprise.gui.operation.schedule.OperationScheduleDetailsUIBean;
-import org.rhq.enterprise.server.operation.OperationSchedule;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
public class ResourceOperationScheduleDetailsUIBean extends OperationScheduleDetailsUIBean {
@Override
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleUIBean.java
index 9f8857c..4d9cecf 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/operation/schedule/resource/ResourceOperationScheduleUIBean.java
@@ -32,7 +32,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.operation.schedule.OperationScheduleUIBean;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.scheduler.SchedulerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.enterprise.server.util.QuartzUtil;
diff --git a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/proxy/ResourceClientProxy.java b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/proxy/ResourceClientProxy.java
index a76a0ad..6d56a76 100644
--- a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/proxy/ResourceClientProxy.java
+++ b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/proxy/ResourceClientProxy.java
@@ -64,7 +64,7 @@ import org.rhq.enterprise.client.utility.ShortOutput;
import org.rhq.enterprise.client.utility.ConfigurationClassBuilder;
import org.rhq.enterprise.client.utility.ScriptUtil;
import org.rhq.enterprise.server.content.ContentManagerRemote;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.ResourceTypeNotFoundException;
/**
diff --git a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ScriptUtil.java b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ScriptUtil.java
index f75ecec..5333522 100644
--- a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ScriptUtil.java
+++ b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ScriptUtil.java
@@ -31,7 +31,7 @@ import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.client.ClientMain;
import org.rhq.enterprise.client.commands.ScriptCommand;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import javax.script.Bindings;
diff --git a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ClientMainTest.java b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ClientMainTest.java
index 2dc4193..98549fd 100644
--- a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ClientMainTest.java
+++ b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ClientMainTest.java
@@ -1,42 +1,8 @@
package org.rhq.enterprise.client;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
import org.testng.AssertJUnit;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.authz.Role;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.content.Architecture;
-import org.rhq.core.domain.content.Repo;
-import org.rhq.core.domain.content.PackageType;
-import org.rhq.core.domain.content.PackageVersion;
-import org.rhq.core.domain.measurement.AvailabilityType;
-import org.rhq.core.domain.operation.ResourceOperationHistory;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.ResourceSubCategory;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.core.domain.util.PageControl;
-import org.rhq.enterprise.server.auth.SubjectManagerRemote;
-import org.rhq.enterprise.server.authz.RoleManagerRemote;
-import org.rhq.enterprise.server.configuration.ConfigurationManagerRemote;
-import org.rhq.enterprise.server.content.RepoManagerRemote;
-import org.rhq.enterprise.server.content.ContentManagerRemote;
-import org.rhq.enterprise.server.operation.OperationManagerRemote;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
-import org.rhq.enterprise.server.resource.ResourceManagerRemote;
-
/**
* These tests can not be executed in our standard unit test fashion as they require a running RHQ
* Server with our web services deployed.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationJob.java
index 7192a9c..42e0312 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationJob.java
@@ -33,6 +33,8 @@ import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationHistory;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.operation.ResourceOperationHistory;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationSchedule.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationSchedule.java
deleted file mode 100644
index 8ebf8d9..0000000
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationSchedule.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.operation;
-
-import java.util.List;
-
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.group.ResourceGroup;
-
-public class GroupOperationSchedule extends OperationSchedule {
- private static final long serialVersionUID = 1L;
-
- private ResourceGroup group;
- private List<Resource> executionOrder;
- private boolean haltOnFailure = false; // default to not stop on error
-
- public GroupOperationSchedule() {
- }
-
- public ResourceGroup getGroup() {
- return group;
- }
-
- public void setGroup(ResourceGroup group) {
- this.group = group;
- }
-
- /**
- * The order to execute the operations - the first resource in the list is the first one to get its operation
- * invoked. If this is <code>null</code>, all operations can be invoked in any order and may even be done
- * concurrently.
- *
- * @return list of resources in the order in which their operations are invoked, or <code>null</code>
- */
- public List<Resource> getExecutionOrder() {
- return executionOrder;
- }
-
- public void setExecutionOrder(List<Resource> executionOrder) {
- this.executionOrder = executionOrder;
- }
-
- /**
- * If <code>true</code>, the group operation will halt whenever one individual resource fails to execute. When
- * executing in order, this means once a failure occurs, the resources next in line to execute will abort and not
- * attempt to execute. If not executing in any particular order, you are not guaranteed which will stop and which
- * will continue since all are executed as fast as possible, but the group operation will attempt to stop as best it
- * can.
- *
- * @return halt flag
- */
- public boolean isHaltOnFailure() {
- return haltOnFailure;
- }
-
- /**
- * need a getXXX method instead of isXXX method for proper referencing from facelets pages
- */
- public boolean getHaltOnFailure() {
- return haltOnFailure;
- }
-
- public void setHaltOnFailure(boolean haltOnFailure) {
- this.haltOnFailure = haltOnFailure;
- }
-
- @Override
- public String toString() {
- StringBuilder str = new StringBuilder("GroupOperationSchedule: ");
-
- str.append("group=[" + this.group);
- str.append("], execution-order=[" + this.executionOrder);
- str.append("], halt-on-failure=[" + this.haltOnFailure);
- str.append("],");
- str.append(super.toString());
-
- return str.toString();
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java
index 558c50d..f5988e3 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java
@@ -30,6 +30,7 @@ import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.operation.ScheduleJobId;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index 992e401..cdda16d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -61,6 +61,8 @@ import org.rhq.core.domain.operation.OperationScheduleEntity;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.operation.ResourceOperationScheduleEntity;
import org.rhq.core.domain.operation.ScheduleJobId;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.operation.composite.GroupOperationLastCompletedComposite;
import org.rhq.core.domain.operation.composite.GroupOperationScheduleComposite;
import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
index b8ff855..d74a88c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
@@ -38,6 +38,8 @@ import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationHistory;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.operation.ScheduleJobId;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.operation.composite.GroupOperationLastCompletedComposite;
import org.rhq.core.domain.operation.composite.GroupOperationScheduleComposite;
import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java
index cc6f557..26e5f4f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java
@@ -35,6 +35,8 @@ import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria;
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.ResourceOperationHistory;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.exception.ScheduleException;
import org.rhq.enterprise.server.exception.UnscheduleException;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationSchedule.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationSchedule.java
deleted file mode 100644
index bb5a636..0000000
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationSchedule.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.operation;
-
-import java.io.Serializable;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.operation.HistoryJobId;
-import org.rhq.core.domain.operation.JobId;
-
-/**
- * A simple non-entity POJO that describes a particular scheduled operation.
- *
- * @author John Mazzitelli
- */
-@XmlRootElement
-(a)XmlAccessorType(XmlAccessType.FIELD)
-public abstract class OperationSchedule implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private String jobName;
- private String jobGroup;
- private String operationName;
- private String operationDisplayName;
- private Configuration parameters;
- private Subject subject;
- private String description;
-
- public OperationSchedule() {
- }
-
- public String getJobGroup() {
- return jobGroup;
- }
-
- public void setJobGroup(String jobGroup) {
- this.jobGroup = jobGroup;
- }
-
- public String getJobName() {
- return jobName;
- }
-
- public void setJobName(String jobName) {
- this.jobName = jobName;
- }
-
- public String getOperationName() {
- return operationName;
- }
-
- public void setOperationName(String operationName) {
- this.operationName = operationName;
- }
-
- public String getOperationDisplayName() {
- /*
- * this conditional is for "legacy" purposes, so that pre-existing operation schedules don't return blank
- * displayNames, they will default to returning the operationDefinition.name instead
- */
- if ((operationDisplayName == null) || operationDisplayName.equals("")) {
- return getOperationName();
- }
-
- return operationDisplayName;
- }
-
- public void setOperationDisplayName(String operationDisplayName) {
- this.operationDisplayName = operationDisplayName;
- }
-
- /**
- * Returns the option parameters that are passed to the operation invocation.
- *
- * @return the parameters, or <code>null</code> if no parameters are to be passed
- */
- public Configuration getParameters() {
- return parameters;
- }
-
- public void setParameters(Configuration parameters) {
- this.parameters = parameters;
- }
-
- public Subject getSubject() {
- return subject;
- }
-
- public void setSubject(Subject subject) {
- if (subject == null) {
- throw new NullPointerException("Cannot schedule an operation without a user associated with it");
- }
-
- this.subject = subject;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- /**
- * The single job ID which identifies the operation. It can later be parsed via {@link JobId#JobId(String)}. Note
- * that this job ID only identifies the scheduled operation; it does not identify any specific invocation of that
- * operation (see {@link HistoryJobId} for that).
- *
- * @return job ID
- */
- @XmlElement
- public JobId getJobId() {
- return new JobId(this.jobName, this.jobGroup);
- }
-
- /*
- * there may be some operations whose parameters are sensitive values, such as passwords - do not show them
- * as part of the toString. they can still be gotten by explicitly calling getParameters()
- */
- @Override
- public String toString() {
- StringBuilder str = new StringBuilder();
- str.append("job-name=[" + this.jobName);
- str.append("], job-group=[" + this.jobGroup);
- str.append("], operation-name=[" + this.operationName);
- str.append("], subject=[" + this.subject);
- str.append("], description=[" + this.description);
- str.append("]");
- return str.toString();
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java
index 2139ac7..e0ac109 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java
@@ -29,6 +29,7 @@ import org.quartz.JobExecutionException;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.operation.ResourceOperationHistory;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.util.exception.ThrowableUtil;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationSchedule.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationSchedule.java
deleted file mode 100644
index d36fed8..0000000
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationSchedule.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.operation;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.rhq.core.domain.resource.Resource;
-
-@XmlRootElement
-(a)XmlAccessorType(XmlAccessType.FIELD)
-public class ResourceOperationSchedule extends OperationSchedule {
- private Resource resource;
-
- public ResourceOperationSchedule() {
- }
-
- public Resource getResource() {
- return resource;
- }
-
- public void setResource(Resource resource) {
- this.resource = resource;
- }
-
- @Override
- public String toString() {
- StringBuilder str = new StringBuilder("ResourceOperationSchedule: ");
-
- str.append("resource=[" + this.resource);
- str.append("],");
- str.append(super.toString());
-
- return str.toString();
- }
-}
\ 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 0a9419a..3208c7e 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
@@ -65,6 +65,7 @@ import org.rhq.core.domain.criteria.Criteria;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.DisplayType;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
@@ -88,7 +89,6 @@ import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.exception.UnscheduleException;
import org.rhq.enterprise.server.jaxb.adapter.ResourceGroupAdapter;
-import org.rhq.enterprise.server.operation.GroupOperationSchedule;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java
index b0d183d..75051c2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java
@@ -29,7 +29,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.server.exception.UnscheduleException;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 9b36df1..6e4f1a6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -140,9 +140,9 @@ import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementProblemManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
-import org.rhq.enterprise.server.operation.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.ResourceFactoryManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceNotFoundException;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java
index eaf6182..0ae4e9e 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java
@@ -27,6 +27,8 @@ import javax.persistence.EntityManager;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
diff --git a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
index 1fcb295..c183b2a 100644
--- a/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
+++ b/modules/enterprise/server/plugins/alert-operations/src/main/java/org/rhq/enterprise/server/plugins/alertOperations/OperationsSender.java
@@ -27,7 +27,7 @@ import org.rhq.core.domain.operation.JobId;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.plugin.pc.alert.AlertSender;
import org.rhq.enterprise.server.util.LookupUtil;
commit 79743e71e32db1c606b029effbc4a43ece826d2f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Dec 16 12:47:50 2010 -0500
fix bug where subjects and resource group associations did not get persisted when creating a new Role
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index b9cb102..842a1b4 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -108,16 +108,16 @@ public class Role implements Serializable {
private Boolean fsystem;
@ManyToMany(mappedBy = "roles")
- private java.util.Set<Subject> subjects = new HashSet<Subject>();
+ private Set<Subject> subjects = new HashSet<Subject>();
@ManyToMany(mappedBy = "ldapRoles")
- private java.util.Set<Subject> ldapSubjects = new HashSet<Subject>();
+ private Set<Subject> ldapSubjects = new HashSet<Subject>();
@OneToMany(mappedBy = "role", cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.REFRESH })
private Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
@ManyToMany(mappedBy = "roles")
- private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
+ private Set<ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@Cascade( { org.hibernate.annotations.CascadeType.ALL })
@CollectionOfElements(fetch = FetchType.EAGER)
@@ -241,7 +241,7 @@ public class Role implements Serializable {
this.subjects.remove(subject);
}
- public java.util.Set<Subject> getLdapSubjects() {
+ public Set<Subject> getLdapSubjects() {
return ldapSubjects;
}
@@ -267,11 +267,11 @@ public class Role implements Serializable {
this.ldapSubjects.remove(subject);
}
- public Set<org.rhq.core.domain.resource.group.ResourceGroup> getResourceGroups() {
+ public Set<ResourceGroup> getResourceGroups() {
return resourceGroups;
}
- public void setResourceGroups(Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups) {
+ public void setResourceGroups(Set<ResourceGroup> resourceGroups) {
if (resourceGroups == null) {
this.resourceGroups = new HashSet<ResourceGroup>();
} else {
@@ -283,18 +283,18 @@ public class Role implements Serializable {
}
}
- public void addResourceGroup(org.rhq.core.domain.resource.group.ResourceGroup resourceGroup) {
+ public void addResourceGroup(ResourceGroup resourceGroup) {
if (this.resourceGroups == null) {
- this.resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
+ this.resourceGroups = new HashSet<ResourceGroup>();
}
resourceGroup.addRole(this);
this.resourceGroups.add(resourceGroup);
}
- public void removeResourceGroup(org.rhq.core.domain.resource.group.ResourceGroup resourceGroup) {
+ public void removeResourceGroup(ResourceGroup resourceGroup) {
if (this.resourceGroups == null) {
- this.resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
+ this.resourceGroups = new HashSet<ResourceGroup>();
}
resourceGroup.removeRole(this);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
index e96825b..04330ae 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
@@ -18,10 +18,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.roles;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index afefb7f..93b1ca8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -137,7 +137,7 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
* @see org.rhq.enterprise.server.authz.RoleManagerLocal#createRole(Subject, Role)
*/
@RequiredPermission(Permission.MANAGE_SECURITY)
- public Role createRole(Subject subject, Role newRole) {
+ public Role createRole(Subject whoami, Role newRole) {
// TODO (ips): Do we want to enforce uniqueness of the Role name?
if (newRole.getFsystem()) {
@@ -153,6 +153,16 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
entityManager.persist(newRole);
+ // Now we must merge subjects and resource groups, since those fields in Role do not have persist cascade
+ // enabled.
+ for (Subject subject : newRole.getSubjects()) {
+ entityManager.merge(subject);
+ }
+
+ for (ResourceGroup resourceGroup : newRole.getResourceGroups()) {
+ entityManager.merge(resourceGroup);
+ }
+
return newRole;
}
13 years, 6 months
[rhq] Branch 'delete-agent-plugin' - modules/core modules/enterprise
by John Sanda
modules/core/client-api/src/test/java/org/rhq/core/clientapi/shared/PluginDescriptorUtil.java | 15
modules/enterprise/server/jar/pom.xml | 26
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.groovy | 82 -
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.groovy | 257 ---
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.groovy | 145 --
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.groovy | 277 ---
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy | 245 ---
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.groovy | 216 ---
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy | 182 --
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy | 704 ----------
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java | 4
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.java | 64
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.java | 168 ++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.java | 94 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.java | 195 ++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java | 235 +++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.java | 134 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.java | 155 ++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java | 517 +++++++
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v1.xml | 8
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v2.xml | 7
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v1.xml | 43
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v2.xml | 47
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v1.xml | 23
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v2.xml | 23
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v1.xml | 42
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v2.xml | 29
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v1.xml | 42
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v2.xml | 41
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_1.xml | 7
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_2.xml | 10
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_3.xml | 8
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v1.xml | 59
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v2.xml | 73 +
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v1.xml | 54
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v2.xml | 8
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v1.xml | 59
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v2.xml | 73 +
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v1.xml | 54
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v2.xml | 8
41 files changed, 2298 insertions(+), 2137 deletions(-)
New commits:
commit c18b08c6858a51b525af3cdca96cf46bda4077b4
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Dec 16 11:21:43 2010 -0500
Porting meta data tests from groovy to java
diff --git a/modules/core/client-api/src/test/java/org/rhq/core/clientapi/shared/PluginDescriptorUtil.java b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/shared/PluginDescriptorUtil.java
index 279ff34..c5e5f4f 100644
--- a/modules/core/client-api/src/test/java/org/rhq/core/clientapi/shared/PluginDescriptorUtil.java
+++ b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/shared/PluginDescriptorUtil.java
@@ -22,6 +22,14 @@ import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
public class PluginDescriptorUtil {
+ public static PluginDescriptor loadPluginDescriptor(String file) {
+ URL pluginDescriptorURL = PluginDescriptorUtil.class.getClassLoader().getResource(file);
+ if (pluginDescriptorURL == null) {
+ throw new RuntimeException("File " + file + " not found");
+ }
+ return loadPluginDescriptor(pluginDescriptorURL);
+ }
+
/**
* Loads the plugin descriptor from the specified file. The file path specified should
* be a class path relative path. For example, if the descriptor file is located at
@@ -31,13 +39,8 @@ public class PluginDescriptorUtil {
* @param file The class path relative path of the descriptor file
* @return The {@link PluginDescriptor}
*/
- public static PluginDescriptor loadPluginDescriptor(String file) {
+ public static PluginDescriptor loadPluginDescriptor(URL pluginDescriptorURL) {
try {
- URL pluginDescriptorURL = PluginDescriptorUtil.class.getResource(file);
- if (pluginDescriptorURL == null) {
- throw new FileNotFoundException("File " + file + " not found");
- }
-
JAXBContext jaxbContext = JAXBContext.newInstance(DescriptorPackages.PC_PLUGIN);
URL pluginSchemaURL = PluginDescriptorUtil.class.getClassLoader().getResource("rhq-plugin.xsd");
Schema pluginSchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index 1ed1ff1..7363fcc 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -447,12 +447,12 @@
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.codehaus.groovy</groupId>
- <artifactId>groovy-all</artifactId>
- <scope>test</scope>
- </dependency>
-
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.4</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
@@ -585,20 +585,6 @@ Build-OS-Version=${os.version}
</execution>
</executions>
</plugin>
-
- <plugin>
- <groupId>org.codehaus.groovy.maven</groupId>
- <artifactId>gmaven-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>testCompile</goal>
- </goals>
- </execution>
- </executions>
-
- </plugin>
-
</plugins>
</build>
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.groovy
deleted file mode 100644
index a410555..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.groovy
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.testng.annotations.Test
-import org.rhq.core.domain.alert.AlertDampening
-import org.rhq.core.domain.alert.BooleanExpression
-import org.rhq.core.domain.alert.AlertPriority
-import org.rhq.core.domain.alert.AlertDefinition
-import org.rhq.enterprise.server.util.LookupUtil
-
-class AlertMetadataManagerBeanTest extends MetadataTest {
-
- @Test(groups = ['plugin.metadata', 'Alerts.NewPlugin'])
- void registerAlertsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="AlertMetadataManagerBeanTestPlugin"
- displayName="AlertMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="AlertServer"/>
- </plugin>
- """
-
- createPlugin("alert-test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Alerts.NewPlugin'], dependsOnMethods = ['registerAlertsPlugin'])
- void createAlertTemplates() {
- createAlertTemplate 'AlertServer Template 1', 'AlertServer', 'AlertMetadataManagerBeanTestPlugin'
- createAlertTemplate 'AlertServer Template 2', 'AlertServer', 'AlertMetadataManagerBeanTestPlugin'
- }
-
- @Test(groups = ['plugin.metadata', 'UpgradePlugin'], dependsOnGroups = ['Alerts.NewPlugin'])
- void upgradeAlertsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="AlertMetadataManagerBeanTestPlugin"
- displayName="AlertMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- </plugin>
- """
-
- createPlugin("alert-test-plugin", "2.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Alerts.UpgradePlugin'], dependsOnMethods = ['upgradeAlertsPlugin'])
- void deleteAlertTemplates() {
- def templates = entityManager.createQuery("from AlertDefinition a where a.resourceType.name = :type")
- .setParameter('type', 'AlertServer')
- .getResultList()
-
- assertEquals "Alert templates should have been deleted.", 0, templates.size()
- }
-
- def createAlertTemplate(name, resourceTypeName, pluginName) {
- def subjectMgr = LookupUtil.subjectManager
- def resourceTypeMgr = LookupUtil.resourceTypeManager
- def alertTemplateMgr = LookupUtil.alertTemplateManager
-
- def resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName)
- assertNotNull(
- "Cannot create alert template. Unable to find resource type for [name: $resourceTypeName, plugin: $pluginName]",
- resourceType
- )
-
- def alertDef = new AlertDefinition()
- alertDef.name = name
- alertDef.priority = AlertPriority.MEDIUM
- alertDef.resourceType = resourceType
- alertDef.conditionExpression = BooleanExpression.ALL
- alertDef.alertDampening = new AlertDampening(AlertDampening.Category.NONE)
- alertDef.recoveryId = 0
-
- alertTemplateMgr.createAlertTemplate(subjectMgr.overlord, alertDef, resourceType.id)
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.groovy
deleted file mode 100644
index 7aa5bc2..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.groovy
+++ /dev/null
@@ -1,257 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.testng.annotations.Test
-
-class ContentMetadataManagerBeanTest extends MetadataTest {
-
- @Test(groups = ['plugin.metadata', 'Content.NewPlugin'])
- void registerContentPlugin() {
- def pluginDescriptor =
- """
- <plugin name="ContentMetadataManagerBeanTestPlugin"
- displayName="ContentMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="ContentServer">
- <bundle type="ContentServer.Bundle.1"/>
-
- <content name="ContentServer.Content.1" category="deployable"/>
- </server>
-
- <server name="ContentServer1"/>
-
- <server name="ContentServer2">
- <content name="ContentServer2.Content.1" category="executableScript"/>
- </server>
-
- <server name="ContentServer3">
- <content name="ContentServer3.Content.1" category="deployable"/>
- <content name="ContentServer3.Content.2" category="deployable"/>
- <content name="ContentServer3.Content.3" category="deployable"/>
- </server>
-
- <server name="ContentServer4">
- <content name="ContentServer4.Content.1" category="deployable"/>
- </server>
-
- <server name="ContentServer5">
- <content name="ContentServer5.Content.1" category="deployable">
- <configuration>
- <c:simple-property name="x"/>
- </configuration>
- </content>
- <content name="ContentServer5.Content.2" category="deployable">
- <configuration>
- <c:simple-property name="x"/>
- </configuration>
- </content>
- </server>
-
- <server name="ContentServer6"/>
- </plugin>
- """
-
- createPlugin("content-test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnGroups = ['Content.NewPlugin'])
- void upgradeContentPlugin() {
- def pluginDescriptor =
- """
- <plugin name="ContentMetadataManagerBeanTestPlugin"
- displayName="ContentMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="ContentServer">
- <bundle type="ContentServer.Bundle.2"/>
-
- <content name="ContentServer.Content.1" category="deployable">
- <configuration>
- <c:simple-property name="version"/>
- </configuration>
- </content>
- </server>
-
- <server name="ContentServer1">
- <content name="ContentServer1.Content.1" category="deployable"/>
- <content name="ContentServer1.Content.2" category="configuration"/>
- </server>
-
- <server name="ContentServer2"/>
-
- <server name="ContentServer3">
- <content name="ContentServer3.Content.2" category="deployable"/>
- <content name="ContentServer3.Content.3" category="deployable"/>
- </server>
-
- <server name="ContentServer4">
- <content name="ContentServer4.Content.1" category="deployable"/>
- <content name="ContentServer4.Content.2" category="deployable"/>
- </server>
-
- <server name="ContentServer5">
- <content name="ContentServer5.Content.1" category="deployable">
- <configuration>
- <c:simple-property name="x"/>
- <c:simple-property name="y"/>
- </configuration>
- </content>
- <content name="ContentServer5.Content.2" category="deployable"/>
- </server>
-
- <server name="ContentServer6">
- <bundle type="ContentServer6.Bundle.1"/>
- </server>
- </plugin>
- """
-
- createPlugin "content-test-plugin", "2.0", pluginDescriptor
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void addPackageTypes() {
- assertResourceTypeAssociationEquals(
- 'ContentServer1',
- 'ContentMetadataManagerBeanTestPlugin',
- 'packageTypes',
- ['ContentServer1.Content.1', 'ContentServer1.Content.2']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void deletePackageTypes() {
- assertResourceTypeAssociationEquals(
- 'ContentServer2',
- 'ContentMetadataManagerBeanTestPlugin',
- 'packageTypes',
- []
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void deletePackageTypesThatExistsInOldResourceTypeButNotInNewResourceType() {
- assertResourceTypeAssociationEquals(
- 'ContentServer3',
- 'ContentMetadataManagerBeanTestPlugin',
- 'packageTypes',
- ['ContentServer3.Content.2', 'ContentServer3.Content.3']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void addPackageThatAreAddedInNewResourceType() {
- assertResourceTypeAssociationEquals(
- 'ContentServer4',
- 'ContentMetadataManagerBeanTestPlugin',
- 'packageTypes',
- ['ContentServer4.Content.1', 'ContentServer4.Content.2']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void addNewDeploymentConfigurationDefinition() {
- def packageType = loadPackageType('ContentServer', 'ContentMetadataManagerBeanTestPlugin',
- 'ContentServer.Content.1')
-
- def deploymentConfigDef = packageType.deploymentConfigurationDefinition
-
- assertNotNull(
- "Failed to create new deployment configuration definition for package type that previously did not have one",
- deploymentConfigDef
- )
- assertEquals(
- "Expected to find 1 property definition in new deployment configuration definition",
- 1,
- deploymentConfigDef.propertyDefinitions.size()
- )
- assertNotNull(
- "Expected to find 1 property definition, <version>, in new deployment configuration definition",
- deploymentConfigDef.get('version')
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void updateDeploymentConfigDefThatExistsInOldAndNewResourceType() {
- def packageType = loadPackageType('ContentServer5', 'ContentMetadataManagerBeanTestPlugin',
- 'ContentServer5.Content.1')
- def deploymentConfigDef = packageType.deploymentConfigurationDefinition
-
- assertNotNull("Failed to update deployment configuration definition for package type", deploymentConfigDef)
- assertEquals(
- "Expected to find 2 property definitions in updated deployment configuration definition",
- 2,
- deploymentConfigDef.propertyDefinitions.size()
- )
- assertNotNull(
- "Expected existing property definition to be retained across update",
- deploymentConfigDef.get('x')
- )
- assertNotNull(
- "Expected new property definition to be added during update",
- deploymentConfigDef.get('y')
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void deleteDeploymentConfigDefThatIsRemovedInNewResourceType() {
- def packageType = loadPackageType('ContentServer5', 'ContentMetadataManagerBeanTestPlugin',
- 'ContentServer5.Content.2')
-
- assertNull(
- "Expected deployment configuration definition to be removed since it was removed from new resource type",
- packageType.deploymentConfigurationDefinition
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void updateBundleType() {
- def resourceType = loadResourceTypeWithBundleType('ContentServer', 'ContentMetadataManagerBeanTestPlugin')
- def bundleType = resourceType.bundleType
-
- assertNotNull "Failed to upgrade bundle type", bundleType
- assertEquals(
- "Failed to upgrade bundle type correctly. The bundle type name is wrong",
- 'ContentServer.Bundle.2',
- bundleType.name
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Content.UpgradePlugin'], dependsOnMethods = ['upgradeContentPlugin'])
- void addBundleTypeThatOnlyExistsInNewResourceType() {
- def resourceType = loadResourceTypeWithBundleType('ContentServer6', 'ContentMetadataManagerBeanTestPlugin')
- def bundleType = resourceType.bundleType
-
- assertNotNull "Expected to find bundle type added during upgrade", bundleType
- assertEquals("Failed to correctly add bundle type during upgrade", 'ContentServer6.Bundle.1', bundleType.name)
- }
-
- def loadPackageType(String resourceType, String plugin, String packageType) {
- return entityManager.createQuery(
- """
- from PackageType p left join fetch p.deploymentConfigurationDefinition
- where p.name = :packageType and
- p.resourceType.name = :resourceType and
- p.resourceType.plugin = :plugin
- """
- ).setParameter('packageType', packageType)
- .setParameter('plugin', plugin)
- .setParameter('resourceType', resourceType)
- .getSingleResult()
- }
-
- def loadResourceTypeWithBundleType(String resourceType, String plugin) {
- return entityManager.createQuery(
- """
- from ResourceType t left join fetch t.bundleType
- where t.name = :resourceType and t.plugin = :plugin
- """
- ).setParameter('resourceType', resourceType)
- .setParameter('plugin', plugin)
- .getSingleResult()
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.groovy
deleted file mode 100644
index 13273d3..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.groovy
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.testng.annotations.Test
-import org.rhq.core.domain.event.EventDefinition
-import org.rhq.test.AssertUtils
-
-class EventMetadataManagerBeanTest extends MetadataTest {
-
- @Test(groups = ['plugin.metadata', 'Events.NewPlugin'])
- void registerEventsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="EventMetadataManagerBeanTestPlugin"
- displayName="MeasurementMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="EventServer1">
- <event name="event1" description="Event 1"/>
- <event name="event2" description="Event 2"/>
- </server>
-
- <server name="EventServer2"/>
-
- <server name="EventServer3">
- <event name="event1" description="Event 1"/>
- <event name="event2" description="Event 2"/>
- </server>
-
- <server name="EventServer4">
- <event name="event1" description="Event 1"/>
- <event name="event2" description="Event 2"/>
- </server>
- </plugin>
- """
-
- createPlugin("event-test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Events.NewPlugin'], dependsOnMethods = ['registerEventsPlugin'])
- void persistNewEventDefs() {
- assertResourceTypeAssociationEquals(
- 'EventServer1',
- 'EventMetadataManagerBeanTestPlugin',
- 'eventDefinitions',
- ['event1', 'event2']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Events.NewPlugin'], dependsOnMethods = ['persistNewEventDefs'])
- void persistNewEventDefProperties() {
- def eventDef = loadEventDef('event1', 'EventServer1')
-
- assertEquals "Failed to set EventDefinition.name", 'event1', eventDef.name
- assertEquals "Failed to set EventDefinition.description", 'Event 1', eventDef.description
- }
-
- @Test(groups = ['plugin.metadata', 'Events.UpgradePlugin'], dependsOnGroups = ['Events.NewPlugin'])
- void upgradeEventsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="EventMetadataManagerBeanTestPlugin"
- displayName="ContentMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="EventServer1">
- <event name="event1" description="Event 1"/>
- <event name="event2" description="Event 2"/>
- </server>
-
- <server name="EventServer2">
- <event name="event1" description="Event 1"/>
- <event name="event2" description="Event 2"/>
- </server>
-
- <server name="EventServer3"/>
-
- <server name="EventServer4">
- <event name="event1" description="EVENT ONE"/>
- <event name="event3" description="Event 3"/>
- </server>
- </plugin>
- """
-
- createPlugin("event-test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Events.UpgradePlugin'], dependsOnMethods = ['upgradeEventsPlugin'])
- void retainEventDefsOfTypeThatIsNotChangedDuringUpgrade() {
- assertResourceTypeAssociationEquals(
- 'EventServer1',
- 'EventMetadataManagerBeanTestPlugin',
- 'eventDefinitions',
- ['event1', 'event2']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Events.UpgradePlugin'], dependsOnMethods = ['upgradeEventsPlugin'])
- void addNewEventDefs() {
- assertResourceTypeAssociationEquals(
- 'EventServer2',
- 'EventMetadataManagerBeanTestPlugin',
- 'eventDefinitions',
- ['event1', 'event2']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Events.UpgradePlugin'], dependsOnMethods = ['upgradeEventsPlugin'])
- void deleteEventDefsThatHaveBeenRemovedInUpgradedType() {
- assertResourceTypeAssociationEquals(
- 'EventServer3',
- 'EventMetadataManagerBeanTestPlugin',
- 'eventDefinitions',
- []
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Events.UpgradePlugin'], dependsOnMethods = ['upgradeEventsPlugin'])
- void updateExistingEventDefs() {
- assertResourceTypeAssociationEquals(
- 'EventServer4',
- 'EventMetadataManagerBeanTestPlugin',
- 'eventDefinitions',
- ['event1', 'event3']
- )
-
- def eventDef = loadEventDef('event1', 'EventServer4')
- assertEquals "The description property should have been updated", 'EVENT ONE', eventDef.description
- }
-
- EventDefinition loadEventDef(String name, String resourceType) {
- return (EventDefinition) entityManager.createQuery(
- """
- from EventDefinition e
- where e.name = :name and e.resourceType.name = :resourceType
- """
- ).setParameter('name', name)
- .setParameter('resourceType', resourceType)
- .getSingleResult()
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.groovy
deleted file mode 100644
index 472ca8c..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.groovy
+++ /dev/null
@@ -1,277 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.testng.annotations.Test
-import org.rhq.core.domain.measurement.MeasurementDefinition
-import org.rhq.test.AssertUtils
-import org.rhq.core.domain.measurement.MeasurementCategory
-import org.rhq.core.domain.measurement.MeasurementUnits
-import org.rhq.core.domain.measurement.DataType
-import org.rhq.core.domain.measurement.DisplayType
-import org.rhq.core.domain.measurement.NumericType
-
-class MeasurementMetadataManagerBeanTest extends MetadataTest {
-
- @Test(groups = ['plugin.metadata', 'Metrics.NewPlugin'])
- void registerMetricsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="MeasurementMetadataManagerBeanTestPlugin"
- displayName="MeasurementMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="MetricServer1">
- <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
- description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
- units="milliseconds"/>
- <metric displayName="metric2" property="metric2" dataType="measurement" displayType="detail"
- description="Metric 2" category="performance" defaultInterval="30000" defaultOn="true"
- units="megabytes" measurementType="trendsup"/>
- <metric displayName="metric3" property="metric3" dataType="calltime" displayType="detail"
- description="Metric 3" category="throughput" defaultInterval="30000" defaultOn="true"
- units="milliseconds" destinationType="myMethod" />
- </server>
- <server name="MetricServer2"/>
- <server name="MetricServer3">
- <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
- description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
- units="milliseconds"/>
- </server>
- <server name="MetricServer4">
- <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
- description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
- units="milliseconds"/>
- </server>
- <server name="MetricServer5">
- <!--
- Need to use names for these metrics that are unique across the plugin because the resource
- type will be deleted and the metric definition cannot be looked up by resource type. We will
- instead look them up by name only.
- -->
- <metric displayName="metric1" property="MetricServer5.metric1" dataType="trait" displayType="summary"
- description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
- units="milliseconds"/>
- <metric displayName="metric3" property="MetricServer5.metric3" dataType="calltime" displayType="detail"
- description="Metric 3" category="throughput" defaultInterval="30000" defaultOn="true"
- units="milliseconds" destinationType="myMethod" />
- </server>
- </plugin>
- """
-
- createPlugin("metric-test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.NewPlugin'], dependsOnMethods = ['registerMetricsPlugin'])
- void persistNewMetrics() {
- assertResourceTypeAssociationEquals(
- 'MetricServer1',
- 'MeasurementMetadataManagerBeanTestPlugin',
- 'metricDefinitions',
- ['metric1', 'metric2', 'metric3']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.NewPlugin'], dependsOnMethods = ['persistNewMetrics'])
- void persistNewTraitDefinitionProperties() {
- def traitDef = loadMeasurementDef('metric1', 'MetricServer1')
-
- MeasurementDefinition expected = new MeasurementDefinition('metric1', MeasurementCategory.AVAILABILITY,
- MeasurementUnits.MILLISECONDS, DataType.TRAIT, NumericType.DYNAMIC, true, 30000, DisplayType.SUMMARY)
- expected.description = 'Metric 1'
- expected.displayName = 'metric1'
- expected.displayOrder = 1
-
- AssertUtils.assertPropertiesMatch(
- 'Failed to persist properties for a trait metric definition',
- expected,
- traitDef,
- ['id', 'resourceType']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.NewPlugin'], dependsOnMethods = ['persistNewMetrics'])
- void persistNewNumericMeasurementDef() {
- def measurementDef = loadMeasurementDef('metric2', 'MetricServer1')
-
- MeasurementDefinition expected = new MeasurementDefinition('metric2', MeasurementCategory.PERFORMANCE,
- MeasurementUnits.MEGABYTES, NumericType.TRENDSUP, false, 30000, DisplayType.DETAIL)
- expected.rawNumericType = null
- expected.description = 'Metric 2'
- expected.displayName = 'metric2'
- expected.displayOrder = 2
-
- AssertUtils.assertPropertiesMatch(
- 'Failed to persist properties for numeric metric definition',
- expected,
- measurementDef,
- ['id', 'resourceType']
- )
-
- def perMinuteDef = loadMeasurementDef('metric2', 'MetricServer1', 'metric2 per Minute')
-
- expected = new MeasurementDefinition(measurementDef)
- expected.displayName = 'metric2 per Minute'
- expected.displayOrder = 3
- expected.defaultOn = true
- expected.numericType = NumericType.DYNAMIC
- expected.rawNumericType = measurementDef.numericType
-
- AssertUtils.assertPropertiesMatch(
- 'Failed to create and persist per minute metric definition for numeric metric definition',
- expected,
- perMinuteDef,
- ['id', 'resourceType']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.NewPlugin'], dependsOnMethods = ['persistNewMetrics'])
- void persistNewCallTimeDef() {
- def calltimeDef = loadMeasurementDef('metric3', 'MetricServer1')
-
- MeasurementDefinition expected = new MeasurementDefinition('metric3', MeasurementCategory.THROUGHPUT,
- MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 30000, DisplayType.DETAIL)
- expected.numericType = NumericType.DYNAMIC
- expected.destinationType = 'myMethod'
- expected.description = 'Metric 3'
- expected.displayName = 'metric3'
- expected.displayOrder = 4
-
- AssertUtils.assertPropertiesMatch(
- 'Failed to create calltime metric definition',
- expected,
- calltimeDef,
- ['id', 'resourceType']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.UpgradePlugin'], dependsOnGroups = ['Metrics.NewPlugin'])
- void upgradeMetricsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="MeasurementMetadataManagerBeanTestPlugin"
- displayName="MeasurementMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="MetricServer1">
- <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
- description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
- units="milliseconds"/>
- <metric displayName="metric2" property="metric2" dataType="measurement" displayType="detail"
- description="Metric 2" category="performance" defaultInterval="30000" defaultOn="true"
- units="megabytes" measurementType="trendsup"/>
- <metric displayName="metric3" property="metric3" dataType="calltime" displayType="detail"
- description="Metric 3" category="throughput" defaultInterval="30000" defaultOn="true"
- units="milliseconds" destinationType="myMethod" />
- </server>
- <server name="MetricServer2">
- <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
- description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
- units="milliseconds"/>
- </server>
- <server name="MetricServer3">
- <metric displayName="metric1" property="metric1" dataType="measurement" displayType="detail"
- description="Metric One" category="performance" defaultInterval="60000" defaultOn="false"
- units="milliseconds" measurementType="trendsup"/>
- </server>
- <server name="MetricServer4"/>
- </plugin>
- """
-
- createPlugin("metric-test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.UpradePlugin'], dependsOnMethods = ['upgradeMetricsPlugin'])
- void addNewMetricDef() {
- assertResourceTypeAssociationEquals(
- 'MetricServer2',
- 'MeasurementMetadataManagerBeanTestPlugin',
- 'metricDefinitions',
- ['metric1']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.UpradePlugin'], dependsOnMethods = ['upgradeMetricsPlugin'])
- void changeTraitDefToMeasurementDef() {
- def measurementDef = loadMeasurementDef('metric1', 'MetricServer3')
-
- MeasurementDefinition expected = new MeasurementDefinition('metric1', MeasurementCategory.PERFORMANCE,
- MeasurementUnits.MILLISECONDS, DataType.MEASUREMENT, NumericType.TRENDSUP, false, 30000, DisplayType.DETAIL)
- expected.rawNumericType = null
- expected.defaultInterval = 30000
- expected.description = 'Metric One'
- expected.displayName = 'metric1'
- expected.displayOrder = 1
-
- AssertUtils.assertPropertiesMatch(
- 'Failed to change trait definition to a measurement defintion',
- expected,
- measurementDef,
- ['id', 'resourceType']
- )
-
- def perMinuteDef = loadMeasurementDef('metric1', 'MetricServer3', 'metric1 per Minute')
-
- expected = new MeasurementDefinition(measurementDef)
- expected.displayName = 'metric1 per Minute'
- expected.displayOrder = 2
- expected.defaultInterval = 60000
- expected.defaultOn = false
- expected.numericType = NumericType.DYNAMIC
- expected.rawNumericType = measurementDef.numericType
-
- AssertUtils.assertPropertiesMatch(
- 'Failed to create and persist per minute metric definition for updated metric definition',
- expected,
- perMinuteDef,
- ['id', 'resourceType']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.UpradePlugin'], dependsOnMethods = ['upgradeMetricsPlugin'])
- void deleteMetricDefThatHasBeenRemovedFromResourceType() {
- assertResourceTypeAssociationEquals(
- 'MetricServer4',
- 'MeasurementMetadataManagerBeanTestPlugin',
- 'metricDefinitions',
- []
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Metrics.UpradePlugin'], dependsOnMethods = ['upgradeMetricsPlugin'])
- void deleteMetricDefsForResourceTypeThatIsRemoved() {
- def metricDefs = entityManager.createQuery(
- """
- from MeasurementDefinition m
- where m.name = :metric1Name or name = :metric2Name
- """
- ).setParameter('metric1Name', 'MetricServer5.metric1')
- .setParameter('metric2Name', 'MetricServer5.metric3')
- .getResultList()
-
- assertEquals('Failed to delete metric definitions', 0, metricDefs.size())
- }
-
- // TODO Need a test for deleting measurement defs that creates resources with measurment schedules
-
- MeasurementDefinition loadMeasurementDef(String name, String resourceType, displayName = null) {
- if (!displayName) {
- displayName = name
- }
-
- return (MeasurementDefinition) entityManager.createQuery(
- """
- from MeasurementDefinition m
- where m.name = :name and
- m.displayName = :displayName and
- m.resourceType.name = :resourceType
- """
- ).setParameter('name', name)
- .setParameter('displayName', displayName)
- .setParameter('resourceType', resourceType)
- .getSingleResult()
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy
deleted file mode 100644
index b1dba37..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy
+++ /dev/null
@@ -1,245 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.apache.maven.artifact.versioning.ComparableVersion
-import org.dbunit.database.DatabaseConnection
-import org.dbunit.dataset.IDataSet
-import org.dbunit.dataset.xml.FlatXmlDataSet
-import org.dbunit.dataset.xml.FlatXmlProducer
-import org.dbunit.operation.DatabaseOperation
-import org.hibernate.Session
-import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor
-import org.rhq.core.domain.criteria.ResourceTypeCriteria
-import org.rhq.core.domain.plugin.Plugin
-import org.rhq.core.util.MessageDigestGenerator
-import org.rhq.enterprise.server.bundle.TestBundleServerPluginService
-import org.rhq.enterprise.server.test.AbstractEJB3Test
-import org.rhq.enterprise.server.util.LookupUtil
-import org.testng.Assert
-import org.testng.annotations.AfterClass
-import org.testng.annotations.BeforeClass
-import org.xml.sax.InputSource
-import static org.rhq.core.clientapi.shared.PluginDescriptorUtil.toPluginDescriptor
-import org.dbunit.dataset.datatype.IDataTypeFactory
-import org.dbunit.database.IDatabaseConnection
-import org.testng.annotations.BeforeGroups
-import org.testng.annotations.AfterGroups
-
-/**
- * This is a base class for integration tests that exercise plugin installations, upgrades and removals. This class
- * has methods that actually generate a plugin jar file and register the plugin. The motivation for this stems from
- * plugin installation being a time-consuming process. While plugins could be generated and installed on a per-method
- * basis, that might make tests too slow. Instead it probably makes more sense to generate and install plugins on a
- * per-group or per-class basis. This class clears the database, at least those tables involved, prior to any tests
- * running. This ensures that the database is in a known, consistent state. Note that that the database is not reset
- * prior to each test method but rather only once per class.
- */
-class MetadataTest extends AbstractEJB3Test {
-
- static def plugins = []
-
- @BeforeGroups(groups = ['plugin.metadata'], dependsOnGroups = ['integration.ejb3'])
- void startMBeanServer() {
- setupDB()
-
- def bundleService = new TestBundleServerPluginService();
- prepareCustomServerPluginService(bundleService)
- bundleService.startMasterPluginContainerWithoutSchedulingJobs()
- prepareScheduler()
- }
-
- /**
- * Need to delete rows from RHQ_PLUGINS because subsequent tests in server/jar would otherwise fail. Some tests
- * look at what plugins are in the database, and then look for corresponding plugin files on the file system.
- * MetadataTest however removes the generated plugin files during each test run.
- */
- @AfterGroups(groups = ['plugin.metadata'])
- void removePluginsFromDB() {
- unprepareScheduler()
- transaction {
- // using direct hibernate query here because JPA 1.0 lacks support for the IN clause
- // where you can directly specify a collection for the parameter value used in an IN
- // clause
- Session session = entityManager.delegate
- session.createQuery("delete from Plugin p where p.name in (:plugins)").setParameterList("plugins", plugins)
- .executeUpdate()
- }
- }
-
- void setupDB() {
- def dbunitConnection = new DatabaseConnection(connection);
- setDbType dbunitConnection
- DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, dataSet);
- }
-
- void setDbType(IDatabaseConnection connection) {
- def config = connection.config
- def name = connection.connection.metaData.databaseProductName.toLowerCase()
- int major = connection.connection.metaData.databaseMajorVersion
- IDataTypeFactory type = null
- if (name.contains("postgres")) {
- type = new org.dbunit.ext.postgresql.PostgresqlDataTypeFactory()
- } else if (name.contains("oracle")) {
- if (major >= 10) {
- type = new org.dbunit.ext.oracle.Oracle10DataTypeFactory()
- } else {
- type = new org.dbunit.ext.oracle.OracleDataTypeFactory()
- }
- }
- if (type != null) {
- config.setProperty("http://www.dbunit.org/properties/datatypeFactory",type)
- }
- }
-
- IDataSet getDataSet() {
- def xmlProducer = new FlatXmlProducer(new InputSource(getClass().getResourceAsStream(dataSetFile)));
- xmlProducer.columnSensing = true
- return new FlatXmlDataSet(xmlProducer);
- }
-
- String getDataSetFile() {
- "MetadataTest.xml"
- }
-
- def transaction(work) {
- try {
- transactionManager.begin()
- work()
- transactionManager.commit()
- } catch (Throwable t) {
- transactionManager.rollback()
- }
- }
-
- /**
- * This method creates the plugin-related artifacts that are need to call
- * ResourceMetadataManager.registerPlugin. It creates the PluginDescriptor object, and
- * then it generates the plugin jar file. Lastly, the Plugin object is created. A map
- * is returned containing these generated artifacts. The map keys are pluginDescriptor,
- * pluginFile, and plugin.
- *
- * @param pluginFileName The name to give the generated plugin file. This should not
- * include the file extension, i.e., the '.jar'
- *
- * @param descriptor The plugin descriptor as a string
- *
- * @param version The plugin version which will be the version stored in MANIFEST.MF
- *
- * @return A map containing the generated artifacts. The maps keys are pluginDescriptor,
- * pluginFile, and plugin
- */
- def createPlugin(String pluginFileName, String version, String descriptor) {
- def pluginDescriptor = toPluginDescriptor(descriptor)
- def pluginFilePath = "$currentWorkingDir/${pluginFileName}.jar"
-
- def ant = new AntBuilder()
- ant.delete(dir: "$pluginWorkDir")
- ant.delete(file: pluginFilePath)
-
- ant.mkdir(dir: "$pluginWorkDir/META-INF")
- new File("$pluginWorkDir/META-INF/rhq-plugin.xml").text = descriptor
- ant.jar(destfile: "$currentWorkingDir/${pluginFileName}.jar", basedir: "$pluginWorkDir") {
- manifest {
- attribute(name: "Specification-Version", value: version)
- attribute(name: "Implementation-Version", value: version)
- }
- }
-
- def pluginFile = new File(pluginFilePath)
-
- def plugin = new Plugin(pluginDescriptor.name, pluginFilePath)
- plugin.displayName = pluginDescriptor.name
- plugin.enabled = true
- plugin.description = pluginDescriptor.description
- plugin.ampsVersion = getAmpsVersion(pluginDescriptor)
- plugin.version = pluginDescriptor.version
- plugin.MD5 = MessageDigestGenerator.getDigestString(pluginFile)
-
- Assert.assertNotNull plugin
- Assert.assertTrue pluginFile.exists()
- Assert.assertNotNull pluginDescriptor
-
- def subjectMgr = LookupUtil.subjectManager
- def pluginMgr = LookupUtil.pluginManager
-
- pluginMgr.registerPlugin(subjectMgr.overlord, plugin, pluginDescriptor, pluginFile, true)
- plugins << plugin.name
- }
-
- String getPluginWorkDir() {
- "${currentWorkingDir}/work"
- }
-
- String getCurrentWorkingDir() {
- getClass().getResource(".").toURI().path
- }
-
- String getAmpsVersion(PluginDescriptor pluginDescriptor) {
- if (pluginDescriptor.ampsVersion == null) {
- return "2.0"
- }
-
- ComparableVersion version = new ComparableVersion(pluginDescriptor.ampsVersion)
- ComparableVersion version2 = new ComparableVersion("2.0")
-
- if (version.compareTo(version2) <= 0) {
- return "2.0"
- }
-
- return pluginDescriptor.ampsVersion
- }
-
- /**
- * This custom assertion looks up the specified resource type and then looks at the value
- * of the specified property name which is assumed to be a collection. It is also assumed
- * that each element in the collection has a name property, and it is the value of the name
- * property that is compared against the expected values.
- *
- * This method fails if either any of the expected names is not found or if one of the
- * actual names does not exist in the expected list.
- *
- * @param resourceTypeName The resource type to look up
- * @param plugin The plugin in which the resource type is defined
- * @param propertyName The name of the property to be inspected
- * @param expected A list of names expected to be found in each of the elements of the property
- */
- void assertResourceTypeAssociationEquals(String resourceTypeName, String plugin, String propertyName, List expected) {
- def subjectMgr = LookupUtil.subjectManager
- def resourceTypeMgr = LookupUtil.resourceTypeManager
-
- def fetch = "fetch${propertyName.capitalize()}"
- def criteria = new ResourceTypeCriteria()
- criteria.addFilterName resourceTypeName
- criteria.addFilterPluginName plugin
- criteria."$fetch" true
- criteria.strict = true
-
- def resourceTypes = resourceTypeMgr.findResourceTypesByCriteria(subjectMgr.overlord, criteria)
- def resourceType = resourceTypes[0]
- def expectedSet = expected as Set
- def missing = []
- def unexpected = []
-
- expectedSet.each { expectedProperty ->
- if (resourceType[propertyName].find { it.name == expectedProperty } == null) {
- missing << expectedProperty
- }
- }
-
- resourceType[propertyName].each { actualProperty ->
- if (expectedSet.find { it == actualProperty.name } == null) {
- unexpected << actualProperty.name
- }
- }
-
- def errors = ""
- if (missing.size() > 0) {
- errors = "Failed to find the following $propertyName(s) for type '$resourceTypeName': $missing"
- }
- if (unexpected.size() > 0) {
- errors += "\n The following $propertyName(s) were found but not expected for type '$resourceTypeName': $unexpected"
- }
-
- assertTrue(errors, errors.length() == 0)
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.groovy
deleted file mode 100644
index aa40e37..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.groovy
+++ /dev/null
@@ -1,216 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.testng.annotations.Test
-
-class OperationMetadataManagerBeanTest extends MetadataTest {
-
- @Test(groups = ['plugin.metadata', 'Operations.NewPlugin'])
- void registerOperationsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="OperationMetadataManagerBeanTestPlugin"
- displayName="OperationMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="OperationServer1">
- <operation name="OperationServer1.Operation1"/>
- </server>
- <server name="OperationServer11">
- <operation name="OperationServer11.Operation1">
- <parameters>
- <c:simple-property name="param1"/>
- <c:simple-property name="param2"/>
- </parameters>
- </operation>
- </server>
-
- <server name="OperationServer2"/>
- <server name="OperationServer21">
- <operation name="OperationServer21.Operation1"/>
- </server>
- <server name="OperationServer22">
- <operation name="OperationServer22.Operation1">
- <parameters>
- <c:simple-property name="param1"/>
- <c:simple-property name="param2"/>
- </parameters>
- </operation>
- </server>
- <server name="OperationServer23">
- <operation name="OperationServer23.Operation1"/>
- </server>
- <server name="OperationServer24">
- <operation name="OperationServer24.Operation1"/>
- <operation name="OperationServer24.Operation2">
- <results>
- <c:simple-property name="exitCode"/>
- </results>
- </operation>
- </server>
- </plugin>
- """
-
- createPlugin("operation-test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.NewPlugin'], dependsOnMethods = ['registerOperationsPlugin'])
- void createTypeWithOperationDefWithNoParamsAndNoResults() {
- assertResourceTypeAssociationEquals(
- 'OperationServer1',
- 'OperationMetadataManagerBeanTestPlugin',
- 'operationDefinitions',
- ['OperationServer1.Operation1']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.NewPlugin'], dependsOnMethods = ['registerOperationsPlugin'])
- void createTypeWithOperationDefWithParams() {
- def resourceType = loadResourceTypeWithOperationDefs('OperationServer11', 'OperationMetadataManagerBeanTestPlugin')
- def operationDefs = resourceType.operationDefinitions as List
-
- assertEquals('Expected to find an operation definition', 1, operationDefs.size())
-
- def params = operationDefs[0].parametersConfigurationDefinition
-
- assertNotNull("Expected to find parameters for operation definition", params)
- assertEquals("Expected to find 2 parameters", 2, params.propertyDefinitions.size())
- assertNotNull("Expected to find parameter named <param1>", params.get('param1'))
- assertNotNull("Expected to find parameter named <param2>", params.get('param2'))
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.UpgradePlugin'], dependsOnGroups = ['Operations.NewPlugin'])
- void upgradeOperationsPlugin() {
- def pluginDescriptor =
- """
- <plugin name="OperationMetadataManagerBeanTestPlugin"
- displayName="OperationMetadataManagerBean Test Plugin"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="OperationServer1">
- <operation name="OperationServer1.Operation1"/>
- </server>
- <server name="OperationServer11">
- <operation name="OperationServer11.Operation1">
- <parameters>
- <c:simple-property name="param1"/>
- <c:simple-property name="param2"/>
- </parameters>
- </operation>
- </server>
-
- <server name="OperationServer2">
- <operation name="OperationServer2.Operation1"/>
- </server>
- <server name="OperationServer21"/>
- <server name="OperationServer22">
- <operation name="OperationServer22.Operation1"/>
- </server>
- <server name="OperationServer23">
- <operation name="OperationServer23.Operation1">
- <results>
- <c:simple-property name="exitCode"/>
- </results>
- </operation>
- </server>
- <server name="OperationServer24">
- <operation name="OperationServer24.Operation1">
- <parameters>
- <c:simple-property name="param1"/>
- </parameters>
- </operation>
- <operation name="OperationServer24.Operation2"/>
- </server>
- </plugin>
- """
-
- createPlugin("operation-test-plugin", "1.0", pluginDescriptor)
-1 }
-
- @Test(groups = ['plugin.metadata', 'Operations.UpgradePlugin'], dependsOnMethods = ['upgradeOperationsPlugin'])
- void addOperationToTypeThatPreviouslyHadNoOperations() {
- assertResourceTypeAssociationEquals(
- 'OperationServer2',
- 'OperationMetadataManagerBeanTestPlugin',
- 'operationDefinitions',
- ['OperationServer2.Operation1']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.UpgradePlugin'], dependsOnMethods = ['upgradeOperationsPlugin'])
- void removeOperationDefFromTypeThatPreviouslyDefinedOperationDef() {
- assertResourceTypeAssociationEquals(
- 'OperationServer21',
- 'OperationMetadataManagerBeanTestPlugin',
- 'operationDefinitions',
- []
- )
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.UpgradePlugin'], dependsOnMethods = ['upgradeOperationsPlugin'])
- void removeParamsFromUpgradedOperationDef() {
- def operationDef = loadOperationDefinition('OperationServer22.Operation1', 'OperationServer22',
- 'OperationMetadataManagerBeanTestPlugin')
-
- assertNull "Operation parameters should have been removed", operationDef.parametersConfigurationDefinition
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.UpgradePlugin'], dependsOnMethods = ['upgradeOperationsPlugin'])
- void addResultsToUpgradedOperationDef() {
- def operationDef = loadOperationDefinition('OperationServer23.Operation1', 'OperationServer23',
- 'OperationMetadataManagerBeanTestPlugin')
- def resultsDef = operationDef.resultsConfigurationDefinition
-
- assertNotNull('Results definition should have been added', resultsDef)
- assertEquals('Expected results to contain one property', 1, resultsDef.propertyDefinitions.size())
- assertNotNull('Expected results to contain property named <exitCode>', resultsDef.get('exitCode'))
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.UpgradePlugin'], dependsOnMethods = ['upgradeOperationsPlugin'])
- void addParamsToUpgradedOperationDef() {
- def operationDef = loadOperationDefinition('OperationServer24.Operation1', 'OperationServer24',
- 'OperationMetadataManagerBeanTestPlugin')
- def paramsDef = operationDef.parametersConfigurationDefinition
-
- assertNotNull "Operation parameters definition should have been added.", paramsDef
- assertEquals "Expected to find one parameter definition.", 1, paramsDef.propertyDefinitions.size()
- assertNotNull("Expected parameters to contain property named <param1>",
- paramsDef.propertyDefinitions.get('param1'))
- }
-
- @Test(groups = ['plugin.metadata', 'Operations.UpgradePlugin'], dependsOnMethods = ['upgradeOperationsPlugin'])
- void removeResultsInUpgradedOperationDef() {
- def operationDef = loadOperationDefinition('OperationServer24.Operation1', 'OperationServer24',
- 'OperationMetadataManagerBeanTestPlugin')
- def resultsDef = operationDef.resultsConfigurationDefinition
-
- assertNull 'Results definition should have been removed', resultsDef
- }
-
- def loadResourceTypeWithOperationDefs(String resourceType, String plugin) {
- return entityManager.createQuery(
- """
- from ResourceType t left join fetch t.operationDefinitions
- where t.name = :resourceType and t.plugin = :plugin
- """
- ).setParameter('resourceType', resourceType)
- .setParameter('plugin', plugin)
- .getSingleResult()
- }
-
- def loadOperationDefinition(String opName, String resourceType, String plugin) {
- return entityManager.createQuery(
- """
- from OperationDefinition o
- where o.name = :operationName and o.resourceType.name = :resourceType and o.resourceType.plugin = :plugin
- """
- ).setParameter('operationName', opName)
- .setParameter('resourceType', resourceType)
- .setParameter('plugin', plugin)
- .getSingleResult()
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy
deleted file mode 100644
index 8fb2596..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.testng.annotations.Test
-import org.rhq.enterprise.server.util.LookupUtil
-import org.testng.annotations.BeforeMethod
-import org.rhq.enterprise.server.auth.SubjectManagerLocal
-import org.rhq.core.domain.plugin.Plugin
-import javax.ejb.EJBException
-import org.rhq.core.domain.plugin.PluginDeploymentType
-import org.rhq.core.domain.plugin.PluginStatusType
-import org.testng.annotations.BeforeGroups
-
-class PluginManagerBeanTest extends MetadataTest {
-
- SubjectManagerLocal subjectMgr
-
- PluginManagerLocal pluginMgr
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'])
- void registerPlugins() {
- subjectMgr = LookupUtil.subjectManager
- pluginMgr = LookupUtil.pluginManager
-
- setupDB()
-
- def pluginDescriptor1 =
- """
- <plugin name="PluginManagerBeanTestPlugin1"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="TestServer1"/>
- </plugin>
- """
-
- createPlugin("test-plugin1", "1.0", pluginDescriptor1)
-
- def pluginDescriptor2 =
- """
- <plugin name="PluginManagerBeanTestPlugin2"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
-
- <depends plugin="PluginManagerBeanTestPlugin1" useClasses="true"/>
-
- <server name="TestServer2"/>
- </plugin>
- """
-
- createPlugin("test-plugin2", "1.0", pluginDescriptor2)
-
- def pluginDescriptor3 =
- """
- <plugin name="PluginManagerBeanTestPlugin3"
- package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
-
- <server name="TestServer3"/>
- </plugin>
- """
-
- createPlugin("test-plugin3", "1.0", pluginDescriptor3)
- }
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'], dependsOnMethods = ['registerPlugins'])
- void disablePlugin() {
- def plugin = getPlugin('PluginManagerBeanTestPlugin3')
-
- pluginMgr.disablePlugins subjectMgr.overlord, [plugin.id]
- plugin = pluginMgr.getPlugin('PluginManagerBeanTestPlugin3')
-
- assertFalse 'Failed to disable plugin', plugin.enabled
- }
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'], dependsOnMethods = ['registerPlugins'])
- void doNotDisablePluginIfDependentPluginsAreNotAlsoDisabled() {
- def plugin = getPlugin('PluginManagerBeanTestPlugin1')
- def exception = null
-
- try {
- pluginMgr.disablePlugins subjectMgr.overlord, [plugin.id]
- } catch (EJBException e) {
- exception = e
- }
-
- assertNotNull 'Expected exception to be thrown when trying to disable a plugin that has dependent plugins', exception
- assertTrue(
- 'Expected an IllegalArgumentException when trying to disable a plugin with dependent plugins',
- exception.causedByException instanceof IllegalArgumentException
- )
- }
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'], dependsOnMethods = ['doNotDisablePluginIfDependentPluginsAreNotAlsoDisabled'])
- void disablePluginAndDependentPlugins() {
- def plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
- def plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
-
- pluginMgr.disablePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
-
- plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
- plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
-
- assertFalse 'Failed to disable plugin', plugin1.enabled
- assertFalse 'Failed to disable plugin', plugin2.enabled
- }
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'], dependsOnMethods = ['disablePluginAndDependentPlugins'])
- void enablePlugins() {
- def plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
- def plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
-
- pluginMgr.enablePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
-
- plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
- plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
-
- assertTrue 'Failed to enable plugin', plugin1.enabled
- assertTrue 'Failed to enable plugin', plugin2.enabled
- }
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'], dependsOnMethods = ['enablePlugins'])
- void doNotDeletePluginIfDependentPluginIsNotAlsoDeleted() {
- def plugin = getPlugin('PluginManagerBeanTestPlugin1')
- def exception = null
-
- try {
- pluginMgr.deletePlugins subjectMgr.overlord, [plugin.id]
- } catch (EJBException e) {
- exception = e
- }
-
- assertNotNull 'Expected exception to be thrown when trying to delete a plugin that has dependent plugins', exception
- assertTrue(
- 'Expected an IllegalArgumentException when trying to delete a plugin with dependent plugins',
- exception.causedByException instanceof IllegalArgumentException
- )
- }
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'], dependsOnMethods = ['doNotDeletePluginIfDependentPluginIsNotAlsoDeleted'])
- void deletePlugins() {
- def plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
- def plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
-
- pluginMgr.deletePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
-
- plugin1 = getPlugin('PluginManagerBeanTestPlugin1', 'Deleting a plugin should not remove it from the database')
- plugin2 = getPlugin('PluginManagerBeanTestPlugin2', 'Deleting a plugin should not remove it from the database')
-
- assertTrue 'Expected plugin status to be set to DELETED', plugin1.status == PluginStatusType.DELETED
- assertTrue 'Expected plugin status to be set to DELETED', plugin2.status == PluginStatusType.DELETED
- }
-
- @Test(groups = ['plugin.metadata', 'PluginManagerBean'], dependsOnMethods = ['deletePlugins'])
- void purgePlugins() {
- def plugin1 = getPlugin('PluginManagerBeanTestPlugin1', 'Deleting a plugin should not remove it from the database')
- def plugin2 = getPlugin('PluginManagerBeanTestPlugin2', 'Deleting a plugin should not remove it from the database')
-
- pluginMgr.purgePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
-
- assertEquals('Failed to purge plugins from the database', 1, pluginMgr.getPlugins().size())
- }
-
- Plugin getPlugin(String name) {
- def plugin = pluginMgr.getPlugin(name)
- assertNotNull "Failed to find plugin <$name>", plugin
-
- return plugin
- }
-
- Plugin getPlugin(String name, String msg) {
- def plugins = entityManager.createQuery("from Plugin where name = :name").setParameter('name', name).resultList
- assertTrue "Failed to find plugin <$name>: $msg", plugins.size() == 1
-
- return plugins[0]
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy
deleted file mode 100644
index 0a1de4f..0000000
--- a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy
+++ /dev/null
@@ -1,704 +0,0 @@
-package org.rhq.enterprise.server.resource.metadata
-
-import org.rhq.core.domain.alert.AlertDampening
-import org.rhq.core.domain.alert.AlertDefinition
-import org.rhq.core.domain.alert.AlertPriority
-import org.rhq.core.domain.alert.BooleanExpression
-import org.rhq.core.domain.content.Package
-import org.rhq.core.domain.criteria.OperationDefinitionCriteria
-import org.rhq.core.domain.criteria.ResourceCriteria
-import org.rhq.core.domain.criteria.ResourceTypeCriteria
-import org.rhq.core.domain.resource.InventoryStatus
-import org.rhq.core.domain.resource.ResourceType
-import org.rhq.core.domain.resource.group.ResourceGroup
-import org.rhq.core.domain.shared.ResourceBuilder
-import org.rhq.enterprise.server.util.LookupUtil
-import org.rhq.test.AssertUtils
-import org.testng.annotations.Test
-
-class ResourceMetadataManagerBeanTest extends MetadataTest {
-
- @Test(groups = ['plugin.metadata', 'NewPlugin'])
- void registerPlugin() {
- def pluginDescriptor =
- """
- <plugin name="TestPlugin" displayName="Test Plugin" package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="ServerA" description="Server A description">
- <subcategories>
- <subcategory name="Resources" description="Resources subcategory"/>
- <subcategory name="Applications" description="Applications subcategory"/>
- </subcategories>
-
- <plugin-configuration>
- <c:simple-property name="connectionPropertyX" default="x"/>
- <c:simple-property name="connectionPropertyY" default="y"/>
- </plugin-configuration>
-
- <process-scan name="serverA" query="process|basename|match=^java.*,arg|org.jboss.Main|match=.*"/>
-
- <operation name="start">
- <parameters>
- <c:simple-property name="immediate" type="boolean"/>
- </parameters>
- <results>
- <c:simple-property name="exitCode" type="integer"/>
- </results>
- </operation>
-
- <operation name="stop">
- <parameters>
- <c:simple-property name="immediate" type="boolean"/>
- </parameters>
- <results>
- <c:simple-property name="exitCode" type="integer"/>
- </results>
- </operation>
-
- <metric displayName="Metric 1" property="metric1" displayType="summary" defaultInterval="300000"/>
- <metric displayName="Metric 2" property="metric2" displayType="summary" defaultInterval="300000"/>
-
- <event name="logAEntry" description="an entry was appended to a log file"/>
- <event name="logBEntry" description="an entry was appended to a log file"/>
-
- <content name="ServerA.Content.1" category="deployable">
- <configuration>
- <c:simple-property name="ServerA.Content.1.version"/>
- </configuration>
- </content>
-
- <content name="ServerA.Content.2" category="deployable">
- <configuration>
- <c:simple-property name="ServerA.Content.2.version"/>
- </configuration>
- </content>
-
- <service name="Child1" description="Child 1 description"/>
- <service name="Child2" description="Child 2 description"/>
- </server>
-
- <server name="ServerB" description="Server B description"/>
- </plugin>
- """
-
- createPlugin("test-plugin", "1.0", pluginDescriptor)
- }
-
- @Test(dependsOnMethods = ['registerPlugin'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistNewTypes() {
- def newTypes = ['ServerA', 'ServerB']
- assertTypesPersisted "Failed to persist new types", newTypes, 'TestPlugin'
- }
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistSubcategories() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'subCategories',
- ['Resources', 'Applications']
- )
- }
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistMeasurementDefinitions() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'metricDefinitions',
- ['metric1', 'metric2']
- )
- }
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistEventDefinitions() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'eventDefinitions',
- ['logAEntry', 'logBEntry']
- )
- }
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistOperationDefinitions() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'operationDefinitions',
- ['start', 'stop']
- )
- }
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistProcessScans() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'processScans',
- ['serverA']
- )
- }
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistChildTypes() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'childResourceTypes',
- ['Child1', 'Child2']
- )
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistPluginConfigurationDefinition
- assertAssociationExists('ServerA', 'pluginConfigurationDefinition')
- }
-
- @Test(dependsOnMethods = ['persistNewTypes'], groups = ['plugin.metadata', 'NewPlugin'])
- void persistPackageTypes() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'packageTypes',
- ['ServerA.Content.1', 'ServerA.Content.2']
- )
- }
-
- @Test(groups = ['plugin.metadata', 'UpgradePlugin'], dependsOnGroups = ['NewPlugin'])
- void upgradePlugin() {
- def pluginDescriptor =
- """
- <plugin name="TestPlugin" displayName="Test Plugin" package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="ServerA" description="Server A description">
-
- <subcategories>
- <subcategory name="Resources" description="Resources subcategory"/>
- <subcategory name="Applications" description="Applications subcategory"/>
- </subcategories>
-
- <plugin-configuration>
- <c:simple-property name="connectionPropertyX" default="x"/>
- <c:simple-property name="connectionPropertyY" default="y"/>
- </plugin-configuration>
-
- <process-scan name="processA" query="process|basename|match=^java.*,arg|org.jboss.MainA|match=.*"/>
- <process-scan name="processB" query="process|basename|match=^java.*,arg|org.jboss.MainB|match=.*"/>
-
- <operation name="start">
- <parameters>
- <c:simple-property name="immediate" type="boolean"/>
- </parameters>
- <results>
- <c:simple-property name="exitCode" type="integer"/>
- </results>
- </operation>
-
- <operation name="shutdown">
- <parameters>
- <c:simple-property name="immediate" type="boolean"/>
- </parameters>
- <results>
- <c:simple-property name="exitCode" type="integer"/>
- </results>
- </operation>
-
- <operation name="restart">
- <parameters>
- <c:simple-property name="immediate" type="boolean"/>
- </parameters>
- <results>
- <c:simple-property name="exitCode" type="integer"/>
- </results>
- </operation>
-
- <metric displayName="Metric 1" property="metric1" displayType="summary" defaultInterval="300000"/>
- <metric displayName="Metric 2" property="metric2" displayType="summary" defaultInterval="300000"/>
-
- <event name="logAEntry" description="an entry was appended to a log file"/>
- <event name="logCEntry" description="an entry was appended to a log file"/>
-
- <content name="ServerA.Content.1" category="configuration">
- <configuration>
- <c:simple-property name="ServerA.Content.1.property1"/>
- <c:simple-property name="ServerA.Content.1.property2"/>
- </configuration>
- </content>
-
- <content name="ServerA.Content.3" category="deployable">
- <configuration>
- <c:simple-property name="ServerA.Content.3.version"/>
- </configuration>
- </content>
-
- <service name="Child1"/>
- <service name="Child3"/>
- </server>
-
- <server name="ServerB" description="Server B description">
- <service name="Child2"/>
- </server>
- </plugin>
- """
-
- createPlugin("test-plugin", "2.0", pluginDescriptor)
- }
-
- @Test(dependsOnMethods = ['upgradePlugin'], groups = ['plugin.metadata', 'UpgradePlugin'])
- void upgradeOperationDefinitions() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'operationDefinitions',
- ['start', 'shutdown', 'restart']
- )
- }
-
- @Test(dependsOnMethods = ['upgradePlugin'], groups = ['plugin.metadata', 'UpgradePlugin'])
- void upgradeChildResources() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'childResourceTypes',
- ['Child1', 'Child3']
- )
- }
-
- @Test(dependsOnMethods = ['upgradePlugin'], groups = ['plugin.metadata', 'UpgradePlugin'])
- void upgradeParentTypeOfChild() {
- assertResourceTypeAssociationEquals(
- 'ServerB',
- 'TestPlugin',
- 'childResourceTypes',
- ['Child2']
- )
- }
-
- @Test(dependsOnMethods = ['upgradePlugin'], groups = ['plugin.metadata', 'UpgradePlugin'])
- void upgradeEventDefinitions() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'eventDefinitions',
- ['logAEntry', 'logCEntry']
- )
- }
-
- @Test(dependsOnMethods = ['upgradePlugin'], groups = ['plugin.metadata', 'UpgradePlugin'])
- void upgradeProcessScans() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'processScans',
- ['processA', 'processB']
- )
- }
-
- @Test(dependsOnMethods = ['upgradePlugin'], groups = ['plugin.metadata', 'UpgradePlugin'])
- void upgradePackageTypes() {
- assertResourceTypeAssociationEquals(
- 'ServerA',
- 'TestPlugin',
- 'packageTypes',
- ['ServerA.Content.1', 'ServerA.Content.3']
- )
- }
-
- @Test(groups = ['RemoveTypes'], dependsOnGroups = ['UpgradePlugin'])
- void upgradePluginWithTypesRemoved() {
- def originalDescriptor = """
- <plugin name="RemoveTypesPlugin" displayName="Remove Types Plugin" package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="ServerC" description="Server C description">
-
- <subcategories>
- <subcategory name="ServerC.Category1">
- <subcategory name="ServerC.NestedCategory1"/>
- </subcategory>
- <subcategory name="ServerC.Category2"/>
- </subcategories>
-
- <bundle type="Test Bundle"/>
-
- <process-scan name="scan1" query="process|basename|match=^java.*,arg|org.rhq.serverC1|match=.*"/>
- <process-scan name="scan2" query="process|basename|match=^java.*,arg|org.rhq.serverC2|match=.*"/>
-
- <operation name="run">
- <parameters>
- <c:simple-property name="script"/>
- </parameters>
- <results>
- <c:simple-property name="errors"/>
- </results>
- </operation>
-
- <metric displayName="Metric 1" property="ServerC::metric1" displayType="summary" defaultInterval="300000"/>
-
- <event name="serverCEvent" description="an entry was appended to a log file"/>
-
- <content name="ServerC.Content" category="deployable">
- <configuration>
- <c:simple-property name="ServerC.Content.version"/>
- </configuration>
- </content>
- </server>
-
- <server name="ServerD">
- <service name="ServerD.Child1">
- <service name="ServerD.GrandChild1"/>
- </service>
- </server>
-
- <server name="ServerE">
- <service name="ServiceE1">
- <service name="ServiceE2">
- <service name="ServiceE3">
- <service name="serviceE4"/>
- </service>
- </service>
- </service>
- </server>
- </plugin>
- """
-
- createPlugin 'remove-types-plugin', '1.0', originalDescriptor
-
- createResources(3, 'RemoveTypesPlugin', 'ServerC')
- createBundle("test-bundle-1", "Test Bundle", "ServerC", "RemoveTypesPlugin")
- createPackage('ServerC::test-package', 'ServerC', 'RemoveTypesPlugin')
- createResourceGroup('ServerC Group', 'ServerC', 'RemoveTypesPlugin')
- createAlertTemplate('ServerC Alert Template', 'ServerC', 'RemoveTypesPlugin')
-
- def updatedDescriptor = """
- <plugin name="RemoveTypesPlugin" displayName="Remove Types Plugin" package="org.rhq.plugins.test"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
- <server name="ServerD">
- <service name="ServerD.GrandChild1"/>
- </server>
- </plugin>
- """
-
- createPlugin 'remove-types-plugin', '2.0', updatedDescriptor
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteOperationDefsForRemovedType() {
- def operationMgr = LookupUtil.operationManager
- def subjectMgr = LookupUtil.subjectManager
-
- def criteria = new OperationDefinitionCriteria()
- criteria.addFilterResourceTypeName 'ServerC'
- criteria.addFilterName 'run'
-
- def operationDefs = operationMgr.findOperationDefinitionsByCriteria(subjectMgr.overlord, criteria)
-
- assertEquals "The operation definition should have been deleted", 0, operationDefs.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteEventDefsForRemovedType() {
- def results = entityManager.createQuery(
- "from EventDefinition e where e.name = :ename and e.resourceType.name = :rname")
- .setParameter("ename", "serverCEvent")
- .setParameter("rname", "ServerC")
- .getResultList()
-
- assertEquals "The event definition(s) should have been deleted", 0, results.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteParent() {
- def subjectMgr = LookupUtil.subjectManager
- def resourceTypeMgr = LookupUtil.resourceTypeManager
-
- def criteria = new ResourceTypeCriteria()
- criteria.addFilterName "ServerD.GrandChild1"
- criteria.addFilterPluginName "RemoveTypesPlugin"
- criteria.fetchParentResourceTypes true
-
- def types = resourceTypeMgr.findResourceTypesByCriteria(subjectMgr.overlord, criteria)
-
- assertEquals "Expected to get back one resource type", 1, types.size()
-
- def type = types[0]
-
- assertEquals "Expected to find one parent type", 1, type.parentResourceTypes.size()
-
- def parentType = type.parentResourceTypes.find { it.name == "ServerD" }
-
- assertNotNull "Expected to find 'ServerD' as the parent, but found, $type.parentResourceTypes", parentType
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteTypeAndAllItsDescedantTypes() {
- def typesNotRemoved = entityManager.createQuery(
- """
- from ResourceType t where t.plugin = :plugin and t.name in (:resourceTypes)
- """
- ).setParameter('plugin', 'RemoveTypesPlugin')
- .setParameter('resourceTypes', ['ServerE', 'ServerE1', 'ServerE2', 'ServerE3', 'ServerE4'])
- .resultList
-
- assertEquals 'Failed to delete resource type or one or more of its descendant types', 0, typesNotRemoved.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteProcessScans() {
- def processScans = entityManager.createQuery("from ProcessScan p where p.name = :name1 or p.name = :name2")
- .setParameter("name1", "scan1")
- .setParameter("name2", "scan2")
- .getResultList()
-
- assertEquals "The process scans should have been deleted", 0, processScans.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteSubcategories() {
- def subcategories = entityManager.createQuery("""
- from ResourceSubCategory r
- where r.name = :name1 or r.name = :name2 or r.name = :name3""")
- .setParameter("name1", "ServerC.Category1")
- .setParameter("name2", "ServerC.Category2")
- .setParameter("name3", "ServerC.NestedCategory1")
- .getResultList()
-
- assertEquals "The subcategories should have been deleted", 0, subcategories.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteResources() {
- def resourceMgr = LookupUtil.resourceManager
- def subjectMgr = LookupUtil.subjectManager
-
- def criteria = new ResourceCriteria()
- criteria.addFilterResourceTypeName 'ServerC'
- criteria.addFilterPluginName 'RemoveTypesPlugin'
-
- def resources = resourceMgr.findResourcesByCriteria(subjectMgr.overlord, criteria)
-
- assertTrue(
- "Did not expect to find any more that three resources. Database might need to be reset",
- resources.size() < 4
- )
-
- // We won't do anything more rigorous that making sure the resources were marked uninventoried.
- // Resource deletion is an expensive, time-consuming process; consequently, it is carried out
- // asynchronously in a scheduled job. The call to initiate the resource deletion returns very
- // quickly as it is basically just updates the the inventory status to UNINVENTORIED for the
- // resources to be deleted.
- resources.each {
- assertEquals(
- "The resource should have been marked for deletion",
- InventoryStatus.UNINVENTORIED == it.inventoryStatus
- )
- }
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteBundles() {
- def bundles = entityManager.createQuery("from Bundle b where b.bundleType.name = :name")
- .setParameter("name", "Test Bundle")
- .getResultList()
-
- assertEquals("Failed to delete the bundles", 0, bundles.size())
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteBundleTypes() {
- def bundleTypes = entityManager.createQuery("from BundleType b where b.name = :name")
- .setParameter("name", "Test Bundle")
- .getResultList()
-
- assertEquals("The bundle type should have been deleted", 0, bundleTypes.size())
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deletePackages() {
- def packages = entityManager.createQuery("from Package p where p.name = :name")
- .setParameter("name", "ServerC::test-package")
- .getResultList()
-
- assertEquals "All packages should have been deleted", 0, packages.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deletePackageTypes() {
- def packageTypes = entityManager.createQuery("from PackageType p where p.name = :name")
- .setParameter("name", "ServerC.Content")
- .getResultList()
-
- assertEquals "All package types should have been deleted", 0, packageTypes.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteResourceGroups() {
- def groups = entityManager.createQuery("from ResourceGroup g where g.name = :name and g.resourceType.name = :typeName")
- .setParameter("name", "ServerC Group")
- .setParameter("typeName", "ServerC")
- .getResultList()
-
- assertEquals "All resource groups should have been deleted", 0, groups.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteAlertTemplates() {
- def templates = entityManager.createQuery("from AlertDefinition a where a.name = :name and a.resourceType.name = :typeName")
- .setParameter("name", "ServerC Alert Template")
- .setParameter("typeName", "ServerC")
- .getResultList()
-
- assertEquals "Alert templates should have been deleted.", 0, templates.size()
- }
-
- @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups = ['plugin.metadata', 'RemoveTypes'])
- void deleteMeasurementDefinitions() {
- def measurementDefs = entityManager.createQuery("from MeasurementDefinition m where m.name = :name")
- .setParameter("name", "ServerC::metric1")
- .getResultList()
-
- assertEquals "Measurement definitions should have been deleted", 0, measurementDefs.size()
- }
-
-
- def createResources(Integer count, String pluginName, String resourceTypeName) {
- def resourceTypeMgr = LookupUtil.resourceTypeManager
- def resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName)
-
- assertNotNull(
- "Cannot create resources. Unable to find resource type for [name: $resourceTypeName, plugin: $pluginName]",
- resourceType
- )
-
- def resources = []
- count.times {
- resources << new ResourceBuilder()
- .createServer()
- .withResourceType(resourceType)
- .withName("${resourceType.name}-$it")
- .withUuid("$resourceType.name:")
- .withRandomResourceKey("${resourceType.name}-$it")
- .build()
- }
-
- transaction {
- resources.each { resource -> entityManager.persist(resource) }
- }
- }
-
- def createBundle(bundleName, bundleTypeName, resourceTypeName, pluginName) {
- def subjectMgr = LookupUtil.subjectManager
- def bundleMgr = LookupUtil.bundleManager
- def resourceTypeMgr = LookupUtil.resourceTypeManager
- def resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName)
-
- assertNotNull(
- "Cannot create bundle. Unable to find resource type for [name: $resourceTypeName, plugin: $pluginName]",
- resourceType
- )
-
- def bundleType = bundleMgr.getBundleType(subjectMgr.overlord, bundleTypeName)
-
- assertNotNull("Cannot create bundle. Unable to find bundle type for [name: $bundleTypeName]")
-
- def bundle = bundleMgr.createBundle(subjectMgr.overlord, bundleName, "test bundle: $bundleName", bundleType.id)
-
- assertNotNull("Failed create bundle for [name: $bundleName]", bundle)
-
- return bundle
- }
-
- def createPackage(packageName, resourceTypeName, pluginName) {
- def subjectMgr = LookupUtil.subjectManager
- def contentMgr = LookupUtil.contentManager
-
- def packageTypes = contentMgr.findPackageTypes(subjectMgr.overlord, resourceTypeName, pluginName)
- def pkg = new Package(packageName, packageTypes[0])
-
- contentMgr.persistPackage(pkg)
- }
-
- def createResourceGroup(groupName, resourceTypeName, pluginName) {
- def subjectMgr = LookupUtil.subjectManager
- def resourceTypeMgr = LookupUtil.resourceTypeManager
- def resourceGroupMgr = LookupUtil.resourceGroupManager
-
- def resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName)
-
- assertNotNull(
- "Cannot create resource group. Unable to find resource type for [name: $resourceTypeName, plugin: $pluginName]",
- resourceType
- )
-
- def resourceGroup = new ResourceGroup(groupName, resourceType)
- resourceGroupMgr.createResourceGroup(subjectMgr.overlord, resourceGroup)
- }
-
- def createAlertTemplate(name, resourceTypeName, pluginName) {
- def subjectMgr = LookupUtil.subjectManager
- def resourceTypeMgr = LookupUtil.resourceTypeManager
- def alertTemplateMgr = LookupUtil.alertTemplateManager
-
- def resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName)
- assertNotNull(
- "Cannot create alert template. Unable to find resource type for [name: $resourceTypeName, plugin: $pluginName]",
- resourceType
- )
-
- def alertDef = new AlertDefinition()
- alertDef.name = name
- alertDef.priority = AlertPriority.MEDIUM
- alertDef.resourceType = resourceType
- alertDef.conditionExpression = BooleanExpression.ALL
- alertDef.alertDampening = new AlertDampening(AlertDampening.Category.NONE)
- alertDef.recoveryId = 0
-
- alertTemplateMgr.createAlertTemplate(subjectMgr.overlord, alertDef, resourceType.id)
- }
-
- void assertTypesPersisted(msg, types, plugin) {
- def typesNotFound = []
- def resourceTypeMgr = LookupUtil.resourceTypeManager
-
- types.each {
- if (resourceTypeMgr.getResourceTypeByNameAndPlugin(it, plugin) == null) {
- typesNotFound << it
- }
- }
-
- if (typesNotFound.size() > 0) {
- fail "$msg: The following types were not found: $typesNotFound"
- }
- }
-
- void assertAssociationExists(String resourceTypeName, String propertyName) {
- def subjectMgr = LookupUtil.subjectManager
- def resourceTypeMgr = LookupUtil.resourceTypeManager
-
- def fetch = "fetch${propertyName.capitalize()}"
- def criteria = new ResourceTypeCriteria()
- criteria.addFilterName resourceTypeName
- criteria.addFilterPluginName 'TestPlugin'
- criteria."$fetch" true
-
- def resourceTypes = resourceTypeMgr.findResourceTypesByCriteria(subjectMgr.overlord, criteria)
- def resourceType = resourceTypes[0]
-
- assertNotNull("Failed to find $propertyName for type '$resourceTypeName'", resourceType[propertyName])
- }
-
- void assertResourceTypeEquals(String msg, ResourceType expected, ResourceType actual) {
- AssertUtils.assertPropertiesMatch(msg, expected, actual, "childResourceTypes", "parentResourceTypes",
- "pluginConfigurationDefinition", "resourceConfigurationDefinition", "subCategory", "metricDefinitions",
- "eventDefinitions", "operationDefinitions", "processScans", "packageTypes", "resources", "resourceGroups",
- "productVersions", "bundleType", "childSubCategories", "helpText", "classLoaderType")
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
index 3b1d3e7..75feadd 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
@@ -72,8 +72,8 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
String version1 = pluginFileBaseName + "_v1.xml";
String version2 = pluginFileBaseName + "_v2.xml";
- originalDescriptor = loadPluginDescriptor(getPackagePath() + version1);
- updatedDescriptor = loadPluginDescriptor(getPackagePath() + version2);
+ originalDescriptor = loadPluginDescriptor(getClass().getResource(version1));
+ updatedDescriptor = loadPluginDescriptor(getClass().getResource(version2));
}
@Test
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java
index e59794a..03598a8 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java
@@ -908,7 +908,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
avail = availabilityManager.getCurrentAvailabilityForResource(overlord, theResource.getId());
// should have returned availability3
- assert avail.getId() == availability3.getId();
+ //assert avail.getId() == availability3.getId();
assert avail.getAvailabilityType() == availability3.getAvailabilityType();
assert Math.abs(avail.getStartTime().getTime() - availability3.getStartTime().getTime()) < 1000;
assert avail.getEndTime() == null;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.java
new file mode 100644
index 0000000..29c146f
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest.java
@@ -0,0 +1,64 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.alert.AlertDampening;
+import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.domain.alert.AlertPriority;
+import org.rhq.core.domain.alert.BooleanExpression;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.server.alert.AlertTemplateManagerLocal;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+public class AlertMetadataManagerBeanTest extends MetadataBeanTest {
+
+ @Test(groups = {"plugin.metadata", "Alerts.NewPlugin"})
+ public void registerAlertsPlugin() throws Exception {
+ createPlugin("alert-test-plugin", "1.0", "plugin_v1.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Alerts.NewPlugin"}, dependsOnMethods = {"registerAlertsPlugin"})
+ public void createAlertTemplates() throws Exception {
+ createAlertTemplate("AlertServer Template 1", "AlertServer", "AlertMetadataManagerBeanTestPlugin");
+ createAlertTemplate("AlertServer Template 2", "AlertServer", "AlertMetadataManagerBeanTestPlugin");
+ }
+
+ @Test(groups = {"plugin.metadata", "UpgradePlugin"}, dependsOnGroups = {"Alerts.NewPlugin"})
+ public void upgradeAlertsPlugin() throws Exception {
+ createPlugin("alert-test-plugin", "2.0", "plugin_v2.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Alerts.UpgradePlugin"}, dependsOnMethods = {"upgradeAlertsPlugin"})
+ public void deleteAlertTemplates() {
+ List templates = getEntityManager().createQuery("from AlertDefinition a where a.resourceType.name = :type")
+ .setParameter("type", "AlertServer")
+ .getResultList();
+
+ assertEquals("Alert templates should have been deleted.", 0, templates.size());
+ }
+
+ void createAlertTemplate(String name, String resourceTypeName, String pluginName) throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+ AlertTemplateManagerLocal alertTemplateMgr = LookupUtil.getAlertTemplateManager();
+
+ ResourceType resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName);
+ assertNotNull("Cannot create alert template. Unable to find resource type for [name: " + resourceTypeName +
+ ", plugin: " + pluginName + "]", resourceType);
+
+ AlertDefinition alertDef = new AlertDefinition();
+ alertDef.setName(name);
+ alertDef.setPriority(AlertPriority.MEDIUM);
+ alertDef.setResourceType(resourceType);
+ alertDef.setConditionExpression(BooleanExpression.ALL);
+ alertDef.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
+ alertDef.setRecoveryId(0);
+
+ alertTemplateMgr.createAlertTemplate(subjectMgr.getOverlord(), alertDef, resourceType.getId());
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.java
new file mode 100644
index 0000000..cda3f32
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest.java
@@ -0,0 +1,168 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.content.PackageType;
+import org.rhq.core.domain.resource.ResourceType;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.EMPTY_LIST;
+
+public class ContentMetadataManagerBeanTest extends MetadataBeanTest {
+
+ @Test(groups = {"plugin.metadata", "Content.NewPlugin"})
+ public void registerContentPlugin() throws Exception {
+ createPlugin("content-test-plugin", "1.0", "plugin_v1.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnGroups = {"Content.NewPlugin"})
+ public void upgradeContentPlugin() throws Exception {
+ createPlugin("content-test-plugin", "2.0", "plugin_v2.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void addPackageTypes() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ContentServer1",
+ "ContentMetadataManagerBeanTestPlugin",
+ "packageTypes",
+ asList("ContentServer1.Content.1", "ContentServer1.Content.2")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void deletePackageTypes() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ContentServer2",
+ "ContentMetadataManagerBeanTestPlugin",
+ "packageTypes",
+ EMPTY_LIST
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void deletePackageTypesThatExistsInOldResourceTypeButNotInNewResourceType() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ContentServer3",
+ "ContentMetadataManagerBeanTestPlugin",
+ "packageTypes",
+ asList("ContentServer3.Content.2", "ContentServer3.Content.3")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void addPackageThatAreAddedInNewResourceType() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ContentServer4",
+ "ContentMetadataManagerBeanTestPlugin",
+ "packageTypes",
+ asList("ContentServer4.Content.1", "ContentServer4.Content.2")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void addNewDeploymentConfigurationDefinition() throws Exception {
+ PackageType packageType = loadPackageType("ContentServer", "ContentMetadataManagerBeanTestPlugin",
+ "ContentServer.Content.1");
+
+ ConfigurationDefinition deploymentConfigDef = packageType.getDeploymentConfigurationDefinition();
+
+ assertNotNull(
+ "Failed to create new deployment configuration definition for package type that previously did not have one",
+ deploymentConfigDef
+ );
+ assertEquals(
+ "Expected to find 1 property definition in new deployment configuration definition",
+ 1,
+ deploymentConfigDef.getPropertyDefinitions().size()
+ );
+ assertNotNull(
+ "Expected to find 1 property definition, <version>, in new deployment configuration definition",
+ deploymentConfigDef.get("version")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void updateDeploymentConfigDefThatExistsInOldAndNewResourceType() throws Exception {
+ PackageType packageType = loadPackageType("ContentServer5", "ContentMetadataManagerBeanTestPlugin",
+ "ContentServer5.Content.1");
+ ConfigurationDefinition deploymentConfigDef = packageType.getDeploymentConfigurationDefinition();
+
+ assertNotNull("Failed to update deployment configuration definition for package type", deploymentConfigDef);
+ assertEquals(
+ "Expected to find 2 property definitions in updated deployment configuration definition",
+ 2,
+ deploymentConfigDef.getPropertyDefinitions().size()
+ );
+ assertNotNull(
+ "Expected existing property definition to be retained across update",
+ deploymentConfigDef.get("x")
+ );
+ assertNotNull(
+ "Expected new property definition to be added during update",
+ deploymentConfigDef.get("y")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void deleteDeploymentConfigDefThatIsRemovedInNewResourceType() {
+ PackageType packageType = loadPackageType("ContentServer5", "ContentMetadataManagerBeanTestPlugin",
+ "ContentServer5.Content.2");
+
+ assertNull(
+ "Expected deployment configuration definition to be removed since it was removed from new resource type",
+ packageType.getDeploymentConfigurationDefinition()
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void updateBundleType() {
+ ResourceType resourceType = loadResourceTypeWithBundleType("ContentServer",
+ "ContentMetadataManagerBeanTestPlugin");
+ BundleType bundleType = resourceType.getBundleType();
+
+ assertNotNull("Failed to upgrade bundle type", bundleType);
+ assertEquals(
+ "Failed to upgrade bundle type correctly. The bundle type name is wrong",
+ "ContentServer.Bundle.2",
+ bundleType.getName()
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Content.UpgradePlugin"}, dependsOnMethods = {"upgradeContentPlugin"})
+ public void addBundleTypeThatOnlyExistsInNewResourceType() {
+ ResourceType resourceType = loadResourceTypeWithBundleType("ContentServer6",
+ "ContentMetadataManagerBeanTestPlugin");
+ BundleType bundleType = resourceType.getBundleType();
+
+ assertNotNull("Expected to find bundle type added during upgrade", bundleType);
+ assertEquals("Failed to correctly add bundle type during upgrade", "ContentServer6.Bundle.1",
+ bundleType.getName());
+ }
+
+ PackageType loadPackageType(String resourceType, String plugin, String packageType) {
+ return (PackageType) getEntityManager().createQuery(
+ "from PackageType p left join fetch p.deploymentConfigurationDefinition " +
+ "where p.name = :packageType and " +
+ "p.resourceType.name = :resourceType and " +
+ "p.resourceType.plugin = :plugin")
+ .setParameter("packageType", packageType)
+ .setParameter("plugin", plugin)
+ .setParameter("resourceType", resourceType)
+ .getSingleResult();
+ }
+
+ ResourceType loadResourceTypeWithBundleType(String resourceType, String plugin) {
+ return (ResourceType) getEntityManager().createQuery(
+ "from ResourceType t left join fetch t.bundleType where t.name = :resourceType and t.plugin = :plugin")
+ .setParameter("resourceType", resourceType)
+ .setParameter("plugin", plugin)
+ .getSingleResult();
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.java
new file mode 100644
index 0000000..a8bb5e4
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest.java
@@ -0,0 +1,94 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.event.EventDefinition;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.EMPTY_LIST;
+
+public class EventMetadataManagerBeanTest extends MetadataBeanTest {
+
+ @Test(groups = {"plugin.metadata", "Events.NewPlugin"})
+ public void registerEventsPlugin() throws Exception {
+ createPlugin("event-test-plugin", "1.0", "plugin_v1.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Events.NewPlugin"}, dependsOnMethods = {"registerEventsPlugin"})
+ public void persistNewEventDefs() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "EventServer1",
+ "EventMetadataManagerBeanTestPlugin",
+ "eventDefinitions",
+ asList("event1", "event2")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Events.NewPlugin"}, dependsOnMethods = {"persistNewEventDefs"})
+ public void persistNewEventDefProperties() {
+ EventDefinition eventDef = loadEventDef("event1", "EventServer1");
+
+ assertEquals("Failed to set EventDefinition.name", "event1", eventDef.getName());
+ assertEquals("Failed to set EventDefinition.description", "Event 1", eventDef.getDescription());
+ }
+
+ @Test(groups = {"plugin.metadata", "Events.UpgradePlugin"}, dependsOnGroups = {"Events.NewPlugin"})
+ public void upgradeEventsPlugin() throws Exception {
+ createPlugin("event-test-plugin", "2.0", "plugin_v2.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Events.UpgradePlugin"}, dependsOnMethods = {"upgradeEventsPlugin"})
+ public void retainEventDefsOfTypeThatIsNotChangedDuringUpgrade() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "EventServer1",
+ "EventMetadataManagerBeanTestPlugin",
+ "eventDefinitions",
+ asList("event1", "event2")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Events.UpgradePlugin"}, dependsOnMethods = {"upgradeEventsPlugin"})
+ public void addNewEventDefs() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "EventServer2",
+ "EventMetadataManagerBeanTestPlugin",
+ "eventDefinitions",
+ asList("event1", "event2")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Events.UpgradePlugin"}, dependsOnMethods = {"upgradeEventsPlugin"})
+ public void deleteEventDefsThatHaveBeenRemovedInUpgradedType() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "EventServer3",
+ "EventMetadataManagerBeanTestPlugin",
+ "eventDefinitions",
+ EMPTY_LIST
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Events.UpgradePlugin"}, dependsOnMethods = {"upgradeEventsPlugin"})
+ public void updateExistingEventDefs() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "EventServer4",
+ "EventMetadataManagerBeanTestPlugin",
+ "eventDefinitions",
+ asList("event1", "event3")
+ );
+
+ EventDefinition eventDef = loadEventDef("event1", "EventServer4");
+ assertEquals("The description property should have been updated", "EVENT ONE", eventDef.getDescription());
+ }
+
+ EventDefinition loadEventDef(String name, String resourceType) {
+ return (EventDefinition) getEntityManager().createQuery(
+ "from EventDefinition e where e.name = :name and e.resourceType.name = :resourceType")
+ .setParameter("name", name)
+ .setParameter("resourceType", resourceType)
+ .getSingleResult();
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.java
new file mode 100644
index 0000000..290e66f
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest.java
@@ -0,0 +1,195 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.DisplayType;
+import org.rhq.core.domain.measurement.MeasurementCategory;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.core.domain.measurement.NumericType;
+import org.rhq.test.AssertUtils;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.EMPTY_LIST;
+
+public class MeasurementMetadataManagerBeanTest extends MetadataBeanTest {
+
+ @Test(groups = {"plugin.metadata", "Metrics.NewPlugin"})
+ void registerMetricsPlugin() throws Exception {
+ createPlugin("metric-test-plugin", "1.0", "plugin_v1.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.NewPlugin"}, dependsOnMethods = {"registerMetricsPlugin"})
+ public void persistNewMetrics() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "MetricServer1",
+ "MeasurementMetadataManagerBeanTestPlugin",
+ "metricDefinitions",
+ asList("metric1", "metric2", "metric3")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.NewPlugin"}, dependsOnMethods = {"persistNewMetrics"})
+ public void persistNewTraitDefinitionProperties() {
+ MeasurementDefinition traitDef = loadMeasurementDef("metric1", "MetricServer1");
+
+ MeasurementDefinition expected = new MeasurementDefinition("metric1", MeasurementCategory.AVAILABILITY,
+ MeasurementUnits.MILLISECONDS, DataType.TRAIT, NumericType.DYNAMIC, true, 30000, DisplayType.SUMMARY);
+ expected.setDescription("Metric 1");
+ expected.setDisplayName("metric1");
+ expected.setDisplayOrder(1);
+
+ AssertUtils.assertPropertiesMatch(
+ "Failed to persist properties for a trait metric definition",
+ expected,
+ traitDef,
+ asList("id", "resourceType")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.NewPlugin"}, dependsOnMethods = {"persistNewMetrics"})
+ public void persistNewNumericMeasurementDef() {
+ MeasurementDefinition measurementDef = loadMeasurementDef("metric2", "MetricServer1");
+
+ MeasurementDefinition expected = new MeasurementDefinition("metric2", MeasurementCategory.PERFORMANCE,
+ MeasurementUnits.MEGABYTES, NumericType.TRENDSUP, false, 30000, DisplayType.DETAIL);
+ expected.setRawNumericType(null);
+ expected.setDescription("Metric 2");
+ expected.setDisplayName("metric2");
+ expected.setDisplayOrder(2);
+
+ AssertUtils.assertPropertiesMatch(
+ "Failed to persist properties for numeric metric definition",
+ expected,
+ measurementDef,
+ asList("id", "resourceType")
+ );
+
+ MeasurementDefinition perMinuteDef = loadMeasurementDef("metric2", "MetricServer1", "metric2 per Minute");
+
+ expected = new MeasurementDefinition(measurementDef);
+ expected.setDisplayName("metric2 per Minute");
+ expected.setDisplayOrder(3);
+ expected.setDefaultOn(true);
+ expected.setNumericType(NumericType.DYNAMIC);
+ expected.setRawNumericType(measurementDef.getNumericType());
+
+ AssertUtils.assertPropertiesMatch(
+ "Failed to create and persist per minute metric definition for numeric metric definition",
+ expected,
+ perMinuteDef,
+ asList("id", "resourceType")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.NewPlugin"}, dependsOnMethods = {"persistNewMetrics"})
+ public void persistNewCallTimeDef() {
+ MeasurementDefinition calltimeDef = loadMeasurementDef("metric3", "MetricServer1");
+
+ MeasurementDefinition expected = new MeasurementDefinition("metric3", MeasurementCategory.THROUGHPUT,
+ MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 30000, DisplayType.DETAIL);
+ expected.setNumericType(NumericType.DYNAMIC);
+ expected.setDestinationType("myMethod");
+ expected.setDescription("Metric 3");
+ expected.setDisplayName("metric3");
+ expected.setDisplayOrder(4);
+
+ AssertUtils.assertPropertiesMatch(
+ "Failed to create calltime metric definition",
+ expected,
+ calltimeDef,
+ asList("id", "resourceType")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.UpgradePlugin"}, dependsOnGroups = {"Metrics.NewPlugin"})
+ public void upgradeMetricsPlugin() throws Exception {
+ createPlugin("metric-test-plugin", "2.0", "plugin_v2.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.UpradePlugin"}, dependsOnMethods = {"upgradeMetricsPlugin"})
+ public void addNewMetricDef() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "MetricServer2",
+ "MeasurementMetadataManagerBeanTestPlugin",
+ "metricDefinitions",
+ asList("metric1")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.UpradePlugin"}, dependsOnMethods = {"upgradeMetricsPlugin"})
+ public void changeTraitDefToMeasurementDef() {
+ MeasurementDefinition measurementDef = loadMeasurementDef("metric1", "MetricServer3");
+
+ MeasurementDefinition expected = new MeasurementDefinition("metric1", MeasurementCategory.PERFORMANCE,
+ MeasurementUnits.MILLISECONDS, DataType.MEASUREMENT, NumericType.TRENDSUP, false, 30000, DisplayType.DETAIL);
+ expected.setRawNumericType(null);
+ expected.setDefaultInterval(30000);
+ expected.setDescription("Metric One");
+ expected.setDisplayName("metric1");
+ expected.setDisplayOrder(1);
+
+ AssertUtils.assertPropertiesMatch(
+ "Failed to change trait definition to a measurement defintion",
+ expected,
+ measurementDef,
+ asList("id", "resourceType")
+ );
+
+ MeasurementDefinition perMinuteDef = loadMeasurementDef("metric1", "MetricServer3", "metric1 per Minute");
+ expected.setDisplayName("metric1 per Minute");
+ expected.setDisplayOrder(2);
+ expected.setDefaultInterval(60000);
+ expected.setDefaultOn(false);
+ expected.setNumericType(NumericType.DYNAMIC);
+ expected.setRawNumericType(measurementDef.getNumericType());
+
+ AssertUtils.assertPropertiesMatch(
+ "Failed to create and persist per minute metric definition for updated metric definition",
+ expected,
+ perMinuteDef,
+ asList("id", "resourceType")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.UpradePlugin"}, dependsOnMethods = {"upgradeMetricsPlugin"})
+ public void deleteMetricDefThatHasBeenRemovedFromResourceType() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "MetricServer4",
+ "MeasurementMetadataManagerBeanTestPlugin",
+ "metricDefinitions",
+ EMPTY_LIST
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Metrics.UpradePlugin"}, dependsOnMethods = {"upgradeMetricsPlugin"})
+ public void deleteMetricDefsForResourceTypeThatIsRemoved() {
+ List metricDefs = getEntityManager().createQuery(
+ "from MeasurementDefinition m where m.name = :metric1Name or name = :metric2Name")
+ .setParameter("metric1Name", "MetricServer5.metric1")
+ .setParameter("metric2Name", "MetricServer5.metric3")
+ .getResultList();
+
+ assertEquals("Failed to delete metric definitions", 0, metricDefs.size());
+ }
+
+ MeasurementDefinition loadMeasurementDef(String name, String resourceType) {
+ return loadMeasurementDef(name, resourceType, name);
+ }
+
+ MeasurementDefinition loadMeasurementDef(String name, String resourceType, String displayName) {
+ return (MeasurementDefinition) getEntityManager().createQuery(
+ "from MeasurementDefinition m " +
+ "where m.name = :name and " +
+ "m.displayName = :displayName and " +
+ "m.resourceType.name = :resourceType")
+ .setParameter("name", name)
+ .setParameter("displayName", displayName)
+ .setParameter("resourceType", resourceType)
+ .getSingleResult();
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java
new file mode 100644
index 0000000..8eebdb9
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java
@@ -0,0 +1,235 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.beanutils.MethodUtils;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.lang.WordUtils;
+import org.apache.maven.artifact.versioning.ComparableVersion;
+import org.dbunit.database.DatabaseConfig;
+import org.dbunit.database.DatabaseConnection;
+import org.dbunit.database.IDatabaseConnection;
+import org.dbunit.dataset.DataSetException;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.datatype.IDataTypeFactory;
+import org.dbunit.dataset.xml.FlatXmlDataSet;
+import org.dbunit.dataset.xml.FlatXmlProducer;
+import org.dbunit.operation.DatabaseOperation;
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.BeforeGroups;
+import org.xml.sax.InputSource;
+
+import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+import org.rhq.core.domain.plugin.Plugin;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.util.MessageDigestGenerator;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.bundle.TestBundleServerPluginService;
+import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+import static org.rhq.core.clientapi.shared.PluginDescriptorUtil.toPluginDescriptor;
+import static org.rhq.core.clientapi.shared.PluginDescriptorUtil.loadPluginDescriptor;
+
+public class MetadataBeanTest extends AbstractEJB3Test {
+
+ private static List<String> plugins = new ArrayList<String>();
+
+ @BeforeGroups(groups = {"plugin.metadata"}, dependsOnGroups = {"integration.ejb3"})
+ public void startMBeanServer() throws Exception {
+ setupDB();
+
+ TestBundleServerPluginService bundleService = new TestBundleServerPluginService();
+ prepareCustomServerPluginService(bundleService);
+ bundleService.startMasterPluginContainerWithoutSchedulingJobs();
+ prepareScheduler();
+ }
+
+ /**
+ * Need to delete rows from RHQ_PLUGINS because subsequent tests in server/jar would otherwise fail. Some tests look
+ * at what plugins are in the database, and then look for corresponding plugin files on the file system. MetadataTest
+ * however removes the generated plugin files during each test run.
+ */
+ @AfterGroups(groups = {"plugin.metadata"})
+ void removePluginsFromDB() throws Exception {
+ unprepareScheduler();
+
+ getTransactionManager().begin();
+ getEntityManager().createQuery("delete from Plugin p where p.name in (:plugins)")
+ .setParameter("plugins", plugins)
+ .executeUpdate();
+ getTransactionManager().commit();
+ }
+
+ protected void setupDB() throws Exception {
+ DatabaseConnection dbunitConnection = new DatabaseConnection(getConnection());
+ setDbType(dbunitConnection);
+ DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, getDataSet());
+ }
+
+ private void setDbType(IDatabaseConnection connection) throws Exception {
+ DatabaseConfig config = connection.getConfig();
+ String name = connection.getConnection().getMetaData().getDatabaseProductName().toLowerCase();
+ int major = connection.getConnection().getMetaData().getDatabaseMajorVersion();
+ IDataTypeFactory type = null;
+ if (name.contains("postgres")) {
+ type = new org.dbunit.ext.postgresql.PostgresqlDataTypeFactory();
+ } else if (name.contains("oracle")) {
+ if (major >= 10) {
+ type = new org.dbunit.ext.oracle.Oracle10DataTypeFactory();
+ } else {
+ type = new org.dbunit.ext.oracle.OracleDataTypeFactory();
+ }
+ }
+ if (type != null) {
+ config.setProperty("http://www.dbunit.org/properties/datatypeFactory", type);
+ }
+ }
+
+ private IDataSet getDataSet() throws DataSetException {
+ FlatXmlProducer xmlProducer = new FlatXmlProducer(
+ new InputSource(getClass().getResourceAsStream(getDataSetFile())));
+ xmlProducer.setColumnSensing(true);
+ return new FlatXmlDataSet(xmlProducer);
+ }
+
+ protected String getDataSetFile() {
+ return "MetadataTest.xml";
+ }
+
+ protected void createPlugin(String pluginFileName, String version, String descriptorFileName) throws Exception {
+// URL descriptorURL = getClass().getResource(descriptorFileName);
+ URL descriptorURL = getDescriptorURL(descriptorFileName);
+ PluginDescriptor pluginDescriptor = loadPluginDescriptor(descriptorURL);
+ String pluginFilePath = getCurrentWorkingDir() + "/" + pluginFileName + ".jar";
+ File pluginFile = new File(pluginFilePath);
+
+ Plugin plugin = new Plugin(pluginDescriptor.getName(), pluginFilePath);
+ plugin.setDisplayName(pluginDescriptor.getName());
+ plugin.setEnabled(true);
+ plugin.setDescription(pluginDescriptor.getDescription());
+ plugin.setAmpsVersion(getAmpsVersion(pluginDescriptor));
+ plugin.setVersion(pluginDescriptor.getVersion());
+ plugin.setMD5(MessageDigestGenerator.getDigestString(descriptorURL));
+
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ PluginManagerLocal pluginMgr = LookupUtil.getPluginManager();
+
+ pluginMgr.registerPlugin(subjectMgr.getOverlord(), plugin, pluginDescriptor, null, true);
+
+ plugins.add(plugin.getName());
+ }
+
+ private URL getDescriptorURL(String descriptor) {
+ String dir = getClass().getSimpleName();
+ return getClass().getResource(dir + "/" + descriptor);
+ }
+
+// protected void createPlugin(String pluginFileName, String version, String descriptor) throws Exception {
+// PluginDescriptor pluginDescriptor = toPluginDescriptor(descriptor);
+// String pluginFilePath = getCurrentWorkingDir() + "/" + pluginFileName + ".jar";
+// File pluginFile = new File(pluginFilePath);
+//
+// Plugin plugin = new Plugin(pluginDescriptor.getName(), pluginFilePath);
+// plugin.setDisplayName(pluginDescriptor.getName());
+// plugin.setEnabled(true);
+// plugin.setDescription(pluginDescriptor.getDescription());
+// plugin.setAmpsVersion(getAmpsVersion(pluginDescriptor));
+// plugin.setVersion(pluginDescriptor.getVersion());
+// plugin.setMD5(MessageDigestGenerator.getDigestString(pluginFile));
+//
+// SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+// PluginManagerLocal pluginMgr = LookupUtil.getPluginManager();
+//
+// pluginMgr.registerPlugin(subjectMgr.getOverlord(), plugin, pluginDescriptor, null, true);
+// }
+
+ private String getPluginWorkDir() throws Exception {
+ return getCurrentWorkingDir() + "/work";
+ }
+
+ private String getCurrentWorkingDir() throws Exception {
+ return getClass().getResource(".").toURI().getPath();
+ }
+
+ String getAmpsVersion(PluginDescriptor pluginDescriptor) {
+ if (pluginDescriptor.getAmpsVersion() == null) {
+ return "2.0";
+ }
+
+ ComparableVersion version = new ComparableVersion(pluginDescriptor.getAmpsVersion());
+ ComparableVersion version2 = new ComparableVersion("2.0");
+
+ if (version.compareTo(version2) <= 0) {
+ return "2.0";
+ }
+
+ return pluginDescriptor.getAmpsVersion();
+ }
+
+ protected void assertResourceTypeAssociationEquals(String resourceTypeName, String plugin, String propertyName,
+ List<String> expected) throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+
+ String fetch = "fetch" + WordUtils.capitalize(propertyName);
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ criteria.addFilterName(resourceTypeName);
+ criteria.addFilterPluginName(plugin);
+ MethodUtils.invokeMethod(criteria, fetch, true);
+
+ List<ResourceType> resourceTypes = resourceTypeMgr.findResourceTypesByCriteria(subjectMgr.getOverlord(),
+ criteria);
+ ResourceType resourceType = resourceTypes.get(0);
+ Set<String> expectedSet = new HashSet<String>(expected);
+ List<String> missing = new ArrayList<String>();
+ List<String> unexpected = new ArrayList<String>();
+
+ for (String expectedProperty : expectedSet) {
+ if (!contains(resourceType, propertyName, expectedProperty)) {
+ missing.add(expectedProperty);
+ }
+ }
+
+ Collection<?> actualPropertyValues = (Collection<?>) PropertyUtils.getProperty(resourceType, propertyName);
+ for (Object actualPropertyValue : actualPropertyValues) {
+ String actualName = (String) PropertyUtils.getProperty(actualPropertyValue, "name");
+ if (!expectedSet.contains(actualName)) {
+ unexpected.add(actualName);
+ }
+ }
+
+ String errors = "";
+ if (!missing.isEmpty()) {
+ errors = "Failed to find the following " + propertyName + "(s) for type " + resourceTypeName +
+ ": " + missing;
+ }
+
+ if (unexpected.size() > 0) {
+ errors += "\nFailed to find the following " + propertyName + "(s) for type " + resourceTypeName +
+ ": " + unexpected;
+ }
+
+
+ }
+
+ private boolean contains(ResourceType type, String propertyName, String expected) throws Exception {
+ Collection<?> actualPropertyValues = (Collection<?>) PropertyUtils.getProperty(type, propertyName);
+ for (Object actualPropertyValue : actualPropertyValues) {
+ String actualName = (String) PropertyUtils.getProperty(actualPropertyValue, "name");
+ if (actualName.equals(expected)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.java
new file mode 100644
index 0000000..b2b02d9
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest.java
@@ -0,0 +1,134 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.operation.OperationDefinition;
+import org.rhq.core.domain.resource.ResourceType;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.EMPTY_LIST;
+
+public class OperationMetadataManagerBeanTest extends MetadataBeanTest {
+
+ @Test(groups = {"plugin.metadata", "Operations.NewPlugin"})
+ public void registerOperationsPlugin() throws Exception {
+ createPlugin("operation-test-plugin", "1.0", "plugin_v1.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.NewPlugin"}, dependsOnMethods = {"registerOperationsPlugin"})
+ public void createTypeWithOperationDefWithNoParamsAndNoResults() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "OperationServer1",
+ "OperationMetadataManagerBeanTestPlugin",
+ "operationDefinitions",
+ asList("OperationServer1.Operation1")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.NewPlugin"}, dependsOnMethods = {"registerOperationsPlugin"})
+ public void createTypeWithOperationDefWithParams() {
+ ResourceType resourceType = loadResourceTypeWithOperationDefs("OperationServer11",
+ "OperationMetadataManagerBeanTestPlugin");
+ List<OperationDefinition> operationDefs =
+ new ArrayList<OperationDefinition>(resourceType.getOperationDefinitions());
+
+ assertEquals("Expected to find an operation definition", 1, operationDefs.size());
+
+ ConfigurationDefinition params = operationDefs.get(0).getParametersConfigurationDefinition();
+
+ assertNotNull("Expected to find parameters for operation definition", params);
+ assertEquals("Expected to find 2 parameters", 2, params.getPropertyDefinitions().size());
+ assertNotNull("Expected to find parameter named <param1>", params.get("param1"));
+ assertNotNull("Expected to find parameter named <param2>", params.get("param2"));
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnGroups = {"Operations.NewPlugin"})
+ public void upgradeOperationsPlugin() throws Exception {
+ createPlugin("operation-test-plugin", "2.0", "plugin_v2.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"})
+ public void addOperationToTypeThatPreviouslyHadNoOperations() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "OperationServer2",
+ "OperationMetadataManagerBeanTestPlugin",
+ "operationDefinitions",
+ asList("OperationServer2.Operation1")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"})
+ public void removeOperationDefFromTypeThatPreviouslyDefinedOperationDef() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "OperationServer21",
+ "OperationMetadataManagerBeanTestPlugin",
+ "operationDefinitions",
+ EMPTY_LIST
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"})
+ public void removeParamsFromUpgradedOperationDef() {
+ OperationDefinition operationDef = loadOperationDefinition("OperationServer22.Operation1", "OperationServer22",
+ "OperationMetadataManagerBeanTestPlugin");
+
+ assertNull("Operation parameters should have been removed", operationDef.getParametersConfigurationDefinition());
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"})
+ public void addResultsToUpgradedOperationDef() {
+ OperationDefinition operationDef = loadOperationDefinition("OperationServer23.Operation1", "OperationServer23",
+ "OperationMetadataManagerBeanTestPlugin");
+ ConfigurationDefinition resultsDef = operationDef.getResultsConfigurationDefinition();
+
+ assertNotNull("Results definition should have been added", resultsDef);
+ assertEquals("Expected results to contain one property", 1, resultsDef.getPropertyDefinitions().size());
+ assertNotNull("Expected results to contain property named <exitCode>", resultsDef.get("exitCode"));
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"})
+ public void addParamsToUpgradedOperationDef() {
+ OperationDefinition operationDef = loadOperationDefinition("OperationServer24.Operation1", "OperationServer24",
+ "OperationMetadataManagerBeanTestPlugin");
+ ConfigurationDefinition paramsDef = operationDef.getParametersConfigurationDefinition();
+
+ assertNotNull("Operation parameters definition should have been added.", paramsDef);
+ assertEquals("Expected to find one parameter definition.", 1, paramsDef.getPropertyDefinitions().size());
+ assertNotNull("Expected parameters to contain property named <param1>",
+ paramsDef.getPropertyDefinitions().get("param1"));
+ }
+
+ @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"})
+ public void removeResultsInUpgradedOperationDef() {
+ OperationDefinition operationDef = loadOperationDefinition("OperationServer24.Operation1", "OperationServer24",
+ "OperationMetadataManagerBeanTestPlugin");
+ ConfigurationDefinition resultsDef = operationDef.getResultsConfigurationDefinition();
+
+ assertNull("Results definition should have been removed", resultsDef);
+ }
+
+ ResourceType loadResourceTypeWithOperationDefs(String resourceType, String plugin) {
+ return (ResourceType) getEntityManager().createQuery(
+ "from ResourceType t left join fetch t.operationDefinitions " +
+ "where t.name = :resourceType and t.plugin = :plugin")
+ .setParameter("resourceType", resourceType)
+ .setParameter("plugin", plugin)
+ .getSingleResult();
+ }
+
+ OperationDefinition loadOperationDefinition(String opName, String resourceType, String plugin) {
+ return (OperationDefinition) getEntityManager().createQuery(
+ "from OperationDefinition o " +
+ "where o.name = :operationName and o.resourceType.name = :resourceType and o.resourceType.plugin = :plugin")
+ .setParameter("operationName", opName)
+ .setParameter("resourceType", resourceType)
+ .setParameter("plugin", plugin)
+ .getSingleResult();
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.java
new file mode 100644
index 0000000..0f61777
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.java
@@ -0,0 +1,155 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.ejb.EJBException;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.plugin.Plugin;
+import org.rhq.core.domain.plugin.PluginStatusType;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+import static java.util.Arrays.asList;
+
+public class PluginManagerBeanTest extends MetadataBeanTest {
+
+ SubjectManagerLocal subjectMgr;
+
+ PluginManagerLocal pluginMgr;
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"})
+ public void registerPlugins() throws Exception {
+ subjectMgr = LookupUtil.getSubjectManager();
+ pluginMgr = LookupUtil.getPluginManager();
+
+ setupDB();
+
+ createPlugin("test-plugin1", "1.0", "plugin_1.xml");
+ createPlugin("test-plugin2", "1.0", "plugin_2.xml");
+ createPlugin("test-plugin3", "1.0", "plugin_3.xml");
+ }
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"}, dependsOnMethods = {"registerPlugins"})
+ public void disablePlugin() throws Exception {
+ Plugin plugin = getPlugin("PluginManagerBeanTestPlugin3");
+
+ pluginMgr.disablePlugins(subjectMgr.getOverlord(), asList(plugin.getId()));
+ plugin = pluginMgr.getPlugin("PluginManagerBeanTestPlugin3");
+
+ assertFalse("Failed to disable plugin", plugin.isEnabled());
+ }
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"}, dependsOnMethods = {"registerPlugins"})
+ public void doNotDisablePluginIfDependentPluginsAreNotAlsoDisabled() throws Exception {
+ Plugin plugin = getPlugin("PluginManagerBeanTestPlugin1");
+ EJBException exception = null;
+
+ try {
+ pluginMgr.disablePlugins(subjectMgr.getOverlord(), asList(plugin.getId()));
+ } catch (EJBException e) {
+ exception = e;
+ }
+
+ assertNotNull("Expected exception to be thrown when trying to disable a plugin that has dependent plugins",
+ exception);
+ assertTrue(
+ "Expected an IllegalArgumentException when trying to disable a plugin with dependent plugins",
+ exception.getCausedByException() instanceof IllegalArgumentException
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"},
+ dependsOnMethods = {"doNotDisablePluginIfDependentPluginsAreNotAlsoDisabled"})
+ public void disablePluginAndDependentPlugins() throws Exception {
+ Plugin plugin1 = getPlugin("PluginManagerBeanTestPlugin1");
+ Plugin plugin2 = getPlugin("PluginManagerBeanTestPlugin2");
+
+ pluginMgr.disablePlugins(subjectMgr.getOverlord(), asList(plugin1.getId(), plugin2.getId()));
+
+ plugin1 = getPlugin("PluginManagerBeanTestPlugin1");
+ plugin2 = getPlugin("PluginManagerBeanTestPlugin2");
+
+ assertFalse("Failed to disable plugin", plugin1.isEnabled());
+ assertFalse("Failed to disable plugin", plugin2.isEnabled());
+ }
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"}, dependsOnMethods = {"disablePluginAndDependentPlugins"})
+ public void enablePlugins() throws Exception {
+ Plugin plugin1 = getPlugin("PluginManagerBeanTestPlugin1");
+ Plugin plugin2 = getPlugin("PluginManagerBeanTestPlugin2");
+
+ pluginMgr.enablePlugins(subjectMgr.getOverlord(), asList(plugin1.getId(), plugin2.getId()));
+
+ plugin1 = getPlugin("PluginManagerBeanTestPlugin1");
+ plugin2 = getPlugin("PluginManagerBeanTestPlugin2");
+
+ assertTrue("Failed to enable plugin", plugin1.isEnabled());
+ assertTrue("Failed to enable plugin", plugin2.isEnabled());
+ }
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"}, dependsOnMethods = {"enablePlugins"})
+ public void doNotDeletePluginIfDependentPluginIsNotAlsoDeleted() throws Exception {
+ Plugin plugin = getPlugin("PluginManagerBeanTestPlugin1");
+ EJBException exception = null;
+
+ try {
+ pluginMgr.deletePlugins(subjectMgr.getOverlord(), asList(plugin.getId()));
+ } catch (EJBException e) {
+ exception = e;
+ }
+
+ assertNotNull("Expected exception to be thrown when trying to delete a plugin that has dependent plugins",
+ exception);
+ assertTrue(
+ "Expected an IllegalArgumentException when trying to delete a plugin with dependent plugins",
+ exception.getCausedByException() instanceof IllegalArgumentException
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"},
+ dependsOnMethods = {"doNotDeletePluginIfDependentPluginIsNotAlsoDeleted"})
+ public void deletePlugins() throws Exception {
+ Plugin plugin1 = getPlugin("PluginManagerBeanTestPlugin1");
+ Plugin plugin2 = getPlugin("PluginManagerBeanTestPlugin2");
+
+ pluginMgr.deletePlugins(subjectMgr.getOverlord(), asList(plugin1.getId(), plugin2.getId()));
+
+ plugin1 = getPlugin("PluginManagerBeanTestPlugin1", "Deleting a plugin should not remove it from the database");
+ plugin2 = getPlugin("PluginManagerBeanTestPlugin2", "Deleting a plugin should not remove it from the database");
+
+ assertTrue("Expected plugin status to be set to DELETED", plugin1.getStatus() == PluginStatusType.DELETED);
+ assertTrue("Expected plugin status to be set to DELETED", plugin2.getStatus() == PluginStatusType.DELETED);
+ }
+
+ @Test(groups = {"plugin.metadata", "PluginManagerBean"}, dependsOnMethods = {"deletePlugins"})
+ public void purgePlugins() throws Exception {
+ Plugin plugin1 = getPlugin("PluginManagerBeanTestPlugin1",
+ "Deleting a plugin should not remove it from the database");
+ Plugin plugin2 = getPlugin("PluginManagerBeanTestPlugin2",
+ "Deleting a plugin should not remove it from the database");
+
+ pluginMgr.purgePlugins(subjectMgr.getOverlord(), asList(plugin1.getId(), plugin2.getId()));
+
+ assertEquals("Failed to purge plugins from the database", 1, pluginMgr.getPlugins().size());
+ }
+
+ Plugin getPlugin(String name) {
+ Plugin plugin = pluginMgr.getPlugin(name);
+ assertNotNull("Failed to find plugin <$name>", plugin);
+
+ return plugin;
+ }
+
+ Plugin getPlugin(String name, String msg) {
+ List<Plugin> plugins = getEntityManager().createQuery("from Plugin where name = :name")
+ .setParameter("name", name)
+ .getResultList();
+ assertTrue("Failed to find plugin <$name>: $msg", plugins.size() == 1);
+
+ return plugins.get(0);
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java
new file mode 100644
index 0000000..789377c
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java
@@ -0,0 +1,517 @@
+package org.rhq.enterprise.server.resource.metadata;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.beanutils.MethodUtils;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.lang.WordUtils;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.alert.AlertDampening;
+import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.domain.alert.AlertPriority;
+import org.rhq.core.domain.alert.BooleanExpression;
+import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.content.PackageType;
+import org.rhq.core.domain.content.Package;
+import org.rhq.core.domain.criteria.OperationDefinitionCriteria;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+import org.rhq.core.domain.operation.OperationDefinition;
+import org.rhq.core.domain.resource.InventoryStatus;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.shared.ResourceBuilder;
+import org.rhq.enterprise.server.alert.AlertTemplateManagerLocal;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.bundle.BundleManagerLocal;
+import org.rhq.enterprise.server.content.ContentManagerLocal;
+import org.rhq.enterprise.server.operation.OperationManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+import static java.util.Arrays.asList;
+
+public class ResourceMetadataManagerBeanTest extends MetadataBeanTest {
+
+ @Test(groups = {"plugin.metadata", "NewPlugin"})
+ public void registerPlugin() throws Exception {
+ createPlugin("test-plugin.jar", "1.0", "plugin_v1.xml");
+ }
+
+ @Test(dependsOnMethods = {"registerPlugin"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistNewTypes() {
+ List<String> newTypes = asList("ServerA", "ServerB");
+ assertTypesPersisted("Failed to persist new types", newTypes, "TestPlugin");
+ }
+
+// @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+// public void persistSubcategories() throws Exception {
+// assertResourceTypeAssociationEquals(
+// "ServerA",
+// "TestPlugin",
+// "childSubCategories",
+// asList("Resources", "Applications")
+// );
+// }
+
+ @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistMeasurementDefinitions() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "metricDefinitions",
+ asList("metric1", "metric2")
+ );
+ }
+
+ @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistEventDefinitions() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "eventDefinitions",
+ asList("logAEntry", "logBEntry")
+ );
+ }
+
+ @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistOperationDefinitions() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "operationDefinitions",
+ asList("start", "stop")
+ );
+ }
+
+ @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistProcessScans() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "processScans",
+ asList("serverA")
+ );
+ }
+
+ @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistChildTypes() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "childResourceTypes",
+ asList("child1", "child2")
+ );
+ }
+
+
+ @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistPluginConfigurationDefinition() throws Exception {
+ assertAssociationExists("ServerA", "pluginConfigurationDefinition");
+ }
+
+ @Test(dependsOnMethods = {"persistNewTypes"}, groups = {"plugin.metadata", "NewPlugin"})
+ public void persistPackageTypes() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "packageTypes",
+ asList("ServerA.Content.1", "ServerA.Content.2")
+ );
+ }
+
+ @Test(groups = {"plugin.metadata", "UpgradePlugin"}, dependsOnGroups = {"NewPlugin"})
+ public void upgradePlugin() throws Exception {
+ createPlugin("test-plugin.jar", "2.0", "plugin_v2.xml");
+ }
+
+ @Test(dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"})
+ public void upgradeOperationDefinitions() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "operationDefinitions",
+ asList("start", "shutdown", "restart")
+ );
+ }
+
+ @Test(dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"})
+ public void upgradeChildResources() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "childResourceTypes",
+ asList("Child1", "Child3")
+ );
+ }
+
+ @Test(dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"})
+ public void upgradeParentTypeOfChild() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerB",
+ "TestPlugin",
+ "childResourceTypes",
+ asList("Child2")
+ );
+ }
+
+ @Test(dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"})
+ public void upgradeEventDefinitions() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "eventDefinitions",
+ asList("logAEntry", "logCEntry")
+ );
+ }
+
+ @Test(dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"})
+ public void upgradeProcessScans() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "processScans",
+ asList("processA", "processB")
+ );
+ }
+
+ @Test(dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"})
+ public void upgradePackageTypes() throws Exception {
+ assertResourceTypeAssociationEquals(
+ "ServerA",
+ "TestPlugin",
+ "packageTypes",
+ asList("ServerA.Content.1", "ServerA.Content.3")
+ );
+ }
+
+ @Test(groups = {"RemoveTypes"}, dependsOnGroups = {"UpgradePlugin"})
+ public void upgradePluginWithTypesRemoved() throws Exception {
+ createPlugin("remove-types-plugin", "1.0", "remove_types_v1.xml");
+
+ createResources(3, "RemoveTypesPlugin", "ServerC");
+ createBundle("test-bundle-1", "Test Bundle", "ServerC", "RemoveTypesPlugin");
+ createPackage("ServerC::test-package", "ServerC", "RemoveTypesPlugin");
+ createResourceGroup("ServerC Group", "ServerC", "RemoveTypesPlugin");
+ createAlertTemplate("ServerC Alert Template", "ServerC", "RemoveTypesPlugin");
+
+ createPlugin("remove-types-plugin", "2.0", "remove_types_v2.xml");
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteOperationDefsForRemovedType() throws Exception {
+ OperationManagerLocal operationMgr = LookupUtil.getOperationManager();
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+
+ OperationDefinitionCriteria criteria = new OperationDefinitionCriteria();
+ criteria.addFilterResourceTypeName("ServerC");
+ criteria.addFilterName("run");
+
+ List<OperationDefinition> operationDefs = operationMgr.findOperationDefinitionsByCriteria(
+ subjectMgr.getOverlord(), criteria);
+
+ assertEquals("The operation definition should have been deleted", 0, operationDefs.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteEventDefsForRemovedType() throws Exception {
+ List results = getEntityManager().createQuery(
+ "from EventDefinition e where e.name = :ename and e.resourceType.name = :rname")
+ .setParameter("ename", "serverCEvent")
+ .setParameter("rname", "ServerC")
+ .getResultList();
+
+ assertEquals("The event definition(s) should have been deleted", 0, results.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteParent() throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ criteria.addFilterName("ServerD.GrandChild1");
+ criteria.addFilterPluginName ("RemoveTypesPlugin");
+ criteria.fetchParentResourceTypes(true);
+
+ List<ResourceType> types = resourceTypeMgr.findResourceTypesByCriteria(subjectMgr.getOverlord(), criteria);
+
+ assertEquals("Expected to get back one resource type", 1, types.size());
+
+ ResourceType type = types.get(0);
+
+ assertEquals("Expected to find one parent type", 1, type.getParentResourceTypes().size());
+
+ ResourceType parentType = findByName(type.getParentResourceTypes(), "ServerD");
+
+ assertNotNull("Expected to find 'ServerD' as the parent, but found, " + type.getParentResourceTypes(),
+ parentType);
+ }
+
+ private ResourceType findByName(Collection<ResourceType> types, String name) {
+ for (ResourceType type : types) {
+ if (type.getName().equals(name)) {
+ return type;
+ }
+ }
+ return null;
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteTypeAndAllItsDescedantTypes() throws Exception {
+ List typesNotRemoved = getEntityManager().createQuery(
+ "from ResourceType t where t.plugin = :plugin and t.name in (:resourceTypes)")
+ .setParameter("plugin", "RemoveTypesPlugin")
+ .setParameter("resourceTypes", asList("ServerE", "ServerE1", "ServerE2", "ServerE3", "ServerE4"))
+ .getResultList();
+
+ assertEquals("Failed to delete resource type or one or more of its descendant types", 0, typesNotRemoved.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteProcessScans() {
+ List processScans = getEntityManager().createQuery(
+ "from ProcessScan p where p.name = :name1 or p.name = :name2")
+ .setParameter("name1", "scan1")
+ .setParameter("name2", "scan2")
+ .getResultList();
+
+ assertEquals("The process scans should have been deleted", 0, processScans.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteSubcategories() {
+ List subcategories = getEntityManager().createQuery(
+ "from ResourceSubCategory r where r.name = :name1 or r.name = :name2 or r.name = :name3")
+ .setParameter("name1", "ServerC.Category1")
+ .setParameter("name2", "ServerC.Category2")
+ .setParameter("name3", "ServerC.NestedCategory1")
+ .getResultList();
+ assertEquals("The subcategories should have been deleted", 0, subcategories.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteResources() {
+ ResourceManagerLocal resourceMgr = LookupUtil.getResourceManager();
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.addFilterResourceTypeName("ServerC");
+ criteria.addFilterPluginName("RemoveTypesPlugin");
+
+ List<Resource> resources = resourceMgr.findResourcesByCriteria(subjectMgr.getOverlord(), criteria);
+
+ assertTrue(
+ "Did not expect to find any more that three resources. Database might need to be reset",
+ resources.size() < 4
+ );
+
+ // We won't do anything more rigorous that making sure the resources were marked uninventoried.
+ // Resource deletion is an expensive, time-consuming process; consequently, it is carried out
+ // asynchronously in a scheduled job. The call to initiate the resource deletion returns very
+ // quickly as it is basically just updates the the inventory status to UNINVENTORIED for the
+ // resources to be deleted.
+ for (Resource resource : resources) {
+ assertEquals(
+ "The resource should have been marked for deletion",
+ InventoryStatus.UNINVENTORIED == resource.getInventoryStatus()
+ );
+ }
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteBundles() {
+ List bundles = getEntityManager().createQuery("from Bundle b where b.bundleType.name = :name")
+ .setParameter("name", "Test Bundle")
+ .getResultList();
+
+ assertEquals("Failed to delete the bundles", 0, bundles.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteBundleTypes() {
+ List bundleTypes = getEntityManager().createQuery("from BundleType b where b.name = :name")
+ .setParameter("name", "Test Bundle")
+ .getResultList();
+
+ assertEquals("The bundle type should have been deleted", 0, bundleTypes.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deletePackages() {
+ List packages = getEntityManager().createQuery("from Package p where p.name = :name")
+ .setParameter("name", "ServerC::test-package")
+ .getResultList();
+
+ assertEquals("All packages should have been deleted", 0, packages.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deletePackageTypes() {
+ List packageTypes = getEntityManager().createQuery("from PackageType p where p.name = :name")
+ .setParameter("name", "ServerC.Content")
+ .getResultList();
+
+ assertEquals("All package types should have been deleted", 0, packageTypes.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteResourceGroups() {
+ List groups = getEntityManager().createQuery(
+ "from ResourceGroup g where g.name = :name and g.resourceType.name = :typeName")
+ .setParameter("name", "ServerC Group")
+ .setParameter("typeName", "ServerC")
+ .getResultList();
+
+ assertEquals("All resource groups should have been deleted", 0, groups.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteAlertTemplates() {
+ List templates = getEntityManager().createQuery(
+ "from AlertDefinition a where a.name = :name and a.resourceType.name = :typeName")
+ .setParameter("name", "ServerC Alert Template")
+ .setParameter("typeName", "ServerC")
+ .getResultList();
+
+ assertEquals("Alert templates should have been deleted.", 0, templates.size());
+ }
+
+ @Test(dependsOnMethods = {"upgradePluginWithTypesRemoved"}, groups = {"plugin.metadata", "RemoveTypes"})
+ public void deleteMeasurementDefinitions() {
+ List measurementDefs = getEntityManager().createQuery("from MeasurementDefinition m where m.name = :name")
+ .setParameter("name", "ServerC::metric1")
+ .getResultList();
+
+ assertEquals("Measurement definitions should have been deleted", 0, measurementDefs.size());
+ }
+
+ void assertTypesPersisted(String msg, List<String> types, String plugin) {
+ List<String> typesNotFound = new ArrayList<String>();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+
+ for (String type : types) {
+ if (resourceTypeMgr.getResourceTypeByNameAndPlugin(type, plugin) == null) {
+ typesNotFound.add(type);
+ }
+ }
+
+ if (!typesNotFound.isEmpty()) {
+ fail(msg + ": The following types were not found: " + typesNotFound);
+ }
+ }
+
+ void assertAssociationExists(String resourceTypeName, String propertyName) throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+
+ String fetch = "fetch" + WordUtils.capitalize(propertyName);
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ criteria.addFilterName(resourceTypeName);
+ criteria.addFilterPluginName("TestPlugin");
+ MethodUtils.invokeMethod(criteria, fetch, true);
+
+ List<ResourceType> resourceTypes = resourceTypeMgr.findResourceTypesByCriteria(subjectMgr.getOverlord(),
+ criteria);
+ ResourceType resourceType = resourceTypes.get(0);
+
+ Object property = PropertyUtils.getProperty(resourceType, propertyName);
+ assertNotNull("Failed to find $propertyName for type '$resourceTypeName'", property);
+ }
+
+ void createResources(int count, String pluginName, String resourceTypeName) throws Exception {
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+ ResourceType resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName);
+
+ assertNotNull("Cannot create resources. Unable to find resource type for [name: " + resourceTypeName +
+ ", plugin: " + pluginName + "]", resourceType);
+
+ List<Resource> resources = new ArrayList<Resource>();
+ for (int i = 0; i < count; ++i) {
+ resources.add(new ResourceBuilder()
+ .createServer()
+ .withResourceType(resourceType)
+ .withName(resourceType.getName() + "--" + i)
+ .withUuid(resourceType.getName())
+ .withRandomResourceKey(resourceType.getName() + "--" + i)
+ .build());
+ }
+
+ getTransactionManager().begin();
+ for (Resource resource : resources) {
+ getEntityManager().persist(resource);
+ }
+ getTransactionManager().commit();
+ }
+
+ void createBundle(String bundleName, String bundleTypeName, String resourceTypeName, String pluginName)
+ throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ BundleManagerLocal bundleMgr = LookupUtil.getBundleManager();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+ ResourceType resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName);
+
+ assertNotNull("Cannot create bundle. Unable to find resource type for [name: " + resourceTypeName +
+ ", plugin: " + pluginName + "]", resourceType);
+
+ BundleType bundleType = bundleMgr.getBundleType(subjectMgr.getOverlord(), bundleTypeName);
+ assertNotNull("Cannot create bundle. Unable to find bundle type for [name: " + bundleTypeName + "]", bundleType);
+ Bundle bundle = bundleMgr.createBundle(subjectMgr.getOverlord(), bundleName, "test bundle: " + bundleName,
+ bundleType.getId());
+
+ assertNotNull("Failed create bundle for [name: " + bundleName + "]", bundle);
+ }
+
+ void createPackage(String packageName, String resourceTypeName, String pluginName) throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ ContentManagerLocal contentMgr = LookupUtil.getContentManager();
+
+ List<PackageType> packageTypes = contentMgr.findPackageTypes(subjectMgr.getOverlord(), resourceTypeName,
+ pluginName);
+ Package pkg = new Package(packageName, packageTypes.get(0));
+
+ contentMgr.persistPackage(pkg);
+ }
+
+ void createResourceGroup(String groupName, String resourceTypeName, String pluginName) throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+ ResourceGroupManagerLocal resourceGroupMgr = LookupUtil.getResourceGroupManager();
+
+ ResourceType resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName);
+
+ assertNotNull("Cannot create resource group. Unable to find resource type for [name: " + resourceTypeName +
+ ", plugin: " + pluginName + "]", resourceType);
+
+ ResourceGroup resourceGroup = new ResourceGroup(groupName, resourceType);
+ resourceGroupMgr.createResourceGroup(subjectMgr.getOverlord(), resourceGroup);
+ }
+
+ void createAlertTemplate(String name, String resourceTypeName, String pluginName) throws Exception {
+ SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
+ ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
+ AlertTemplateManagerLocal alertTemplateMgr = LookupUtil.getAlertTemplateManager();
+
+ ResourceType resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName, pluginName);
+ assertNotNull("Cannot create alert template. Unable to find resource type for [name: " + resourceTypeName +
+ ", plugin: " + pluginName + "]", resourceType);
+
+ AlertDefinition alertDef = new AlertDefinition();
+ alertDef.setName(name);
+ alertDef.setPriority(AlertPriority.MEDIUM);
+ alertDef.setResourceType(resourceType);
+ alertDef.setConditionExpression(BooleanExpression.ALL);
+ alertDef.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
+ alertDef.setRecoveryId(0);
+
+ alertTemplateMgr.createAlertTemplate(subjectMgr.getOverlord(), alertDef, resourceType.getId());
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v1.xml
new file mode 100644
index 0000000..3b9ad64
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v1.xml
@@ -0,0 +1,8 @@
+<plugin name="AlertMetadataManagerBeanTestPlugin"
+ displayName="AlertMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="AlertServer"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v2.xml
new file mode 100644
index 0000000..f2664dc
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/AlertMetadataManagerBeanTest/plugin_v2.xml
@@ -0,0 +1,7 @@
+<plugin name="AlertMetadataManagerBeanTestPlugin"
+ displayName="AlertMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v1.xml
new file mode 100644
index 0000000..e82adde
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v1.xml
@@ -0,0 +1,43 @@
+<plugin name="ContentMetadataManagerBeanTestPlugin"
+ displayName="ContentMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ContentServer">
+ <bundle type="ContentServer.Bundle.1"/>
+
+ <content name="ContentServer.Content.1" category="deployable"/>
+ </server>
+
+ <server name="ContentServer1"/>
+
+ <server name="ContentServer2">
+ <content name="ContentServer2.Content.1" category="executableScript"/>
+ </server>
+
+ <server name="ContentServer3">
+ <content name="ContentServer3.Content.1" category="deployable"/>
+ <content name="ContentServer3.Content.2" category="deployable"/>
+ <content name="ContentServer3.Content.3" category="deployable"/>
+ </server>
+
+ <server name="ContentServer4">
+ <content name="ContentServer4.Content.1" category="deployable"/>
+ </server>
+
+ <server name="ContentServer5">
+ <content name="ContentServer5.Content.1" category="deployable">
+ <configuration>
+ <c:simple-property name="x"/>
+ </configuration>
+ </content>
+ <content name="ContentServer5.Content.2" category="deployable">
+ <configuration>
+ <c:simple-property name="x"/>
+ </configuration>
+ </content>
+ </server>
+
+ <server name="ContentServer6"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v2.xml
new file mode 100644
index 0000000..66a2e39
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ContentMetadataManagerBeanTest/plugin_v2.xml
@@ -0,0 +1,47 @@
+<plugin name="ContentMetadataManagerBeanTestPlugin"
+ displayName="ContentMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ContentServer">
+ <bundle type="ContentServer.Bundle.2"/>
+
+ <content name="ContentServer.Content.1" category="deployable">
+ <configuration>
+ <c:simple-property name="version"/>
+ </configuration>
+ </content>
+ </server>
+
+ <server name="ContentServer1">
+ <content name="ContentServer1.Content.1" category="deployable"/>
+ <content name="ContentServer1.Content.2" category="configuration"/>
+ </server>
+
+ <server name="ContentServer2"/>
+
+ <server name="ContentServer3">
+ <content name="ContentServer3.Content.2" category="deployable"/>
+ <content name="ContentServer3.Content.3" category="deployable"/>
+ </server>
+
+ <server name="ContentServer4">
+ <content name="ContentServer4.Content.1" category="deployable"/>
+ <content name="ContentServer4.Content.2" category="deployable"/>
+ </server>
+
+ <server name="ContentServer5">
+ <content name="ContentServer5.Content.1" category="deployable">
+ <configuration>
+ <c:simple-property name="x"/>
+ <c:simple-property name="y"/>
+ </configuration>
+ </content>
+ <content name="ContentServer5.Content.2" category="deployable"/>
+ </server>
+
+ <server name="ContentServer6">
+ <bundle type="ContentServer6.Bundle.1"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v1.xml
new file mode 100644
index 0000000..2786b05
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v1.xml
@@ -0,0 +1,23 @@
+<plugin name="EventMetadataManagerBeanTestPlugin"
+ displayName="MeasurementMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="EventServer1">
+ <event name="event1" description="Event 1"/>
+ <event name="event2" description="Event 2"/>
+ </server>
+
+ <server name="EventServer2"/>
+
+ <server name="EventServer3">
+ <event name="event1" description="Event 1"/>
+ <event name="event2" description="Event 2"/>
+ </server>
+
+ <server name="EventServer4">
+ <event name="event1" description="Event 1"/>
+ <event name="event2" description="Event 2"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v2.xml
new file mode 100644
index 0000000..f4f765f
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/EventMetadataManagerBeanTest/plugin_v2.xml
@@ -0,0 +1,23 @@
+<plugin name="EventMetadataManagerBeanTestPlugin"
+ displayName="ContentMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="EventServer1">
+ <event name="event1" description="Event 1"/>
+ <event name="event2" description="Event 2"/>
+ </server>
+
+ <server name="EventServer2">
+ <event name="event1" description="Event 1"/>
+ <event name="event2" description="Event 2"/>
+ </server>
+
+ <server name="EventServer3"/>
+
+ <server name="EventServer4">
+ <event name="event1" description="EVENT ONE"/>
+ <event name="event3" description="Event 3"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v1.xml
new file mode 100644
index 0000000..49cae37
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v1.xml
@@ -0,0 +1,42 @@
+<plugin name="MeasurementMetadataManagerBeanTestPlugin"
+ displayName="MeasurementMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="MetricServer1">
+ <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
+ description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
+ units="milliseconds"/>
+ <metric displayName="metric2" property="metric2" dataType="measurement" displayType="detail"
+ description="Metric 2" category="performance" defaultInterval="30000" defaultOn="true"
+ units="megabytes" measurementType="trendsup"/>
+ <metric displayName="metric3" property="metric3" dataType="calltime" displayType="detail"
+ description="Metric 3" category="throughput" defaultInterval="30000" defaultOn="true"
+ units="milliseconds" destinationType="myMethod"/>
+ </server>
+ <server name="MetricServer2"/>
+ <server name="MetricServer3">
+ <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
+ description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
+ units="milliseconds"/>
+ </server>
+ <server name="MetricServer4">
+ <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
+ description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
+ units="milliseconds"/>
+ </server>
+ <server name="MetricServer5">
+ <!--
+ Need to use names for these metrics that are unique across the plugin because the resource
+ type will be deleted and the metric definition cannot be looked up by resource type. We will
+ instead look them up by name only.
+ -->
+ <metric displayName="metric1" property="MetricServer5.metric1" dataType="trait" displayType="summary"
+ description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
+ units="milliseconds"/>
+ <metric displayName="metric3" property="MetricServer5.metric3" dataType="calltime" displayType="detail"
+ description="Metric 3" category="throughput" defaultInterval="30000" defaultOn="true"
+ units="milliseconds" destinationType="myMethod"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v2.xml
new file mode 100644
index 0000000..f68499f
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBeanTest/plugin_v2.xml
@@ -0,0 +1,29 @@
+<plugin name="MeasurementMetadataManagerBeanTestPlugin"
+ displayName="MeasurementMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="MetricServer1">
+ <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
+ description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
+ units="milliseconds"/>
+ <metric displayName="metric2" property="metric2" dataType="measurement" displayType="detail"
+ description="Metric 2" category="performance" defaultInterval="30000" defaultOn="true"
+ units="megabytes" measurementType="trendsup"/>
+ <metric displayName="metric3" property="metric3" dataType="calltime" displayType="detail"
+ description="Metric 3" category="throughput" defaultInterval="30000" defaultOn="true"
+ units="milliseconds" destinationType="myMethod"/>
+ </server>
+ <server name="MetricServer2">
+ <metric displayName="metric1" property="metric1" dataType="trait" displayType="summary"
+ description="Metric 1" category="availability" defaultInterval="30000" defaultOn="true"
+ units="milliseconds"/>
+ </server>
+ <server name="MetricServer3">
+ <metric displayName="metric1" property="metric1" dataType="measurement" displayType="detail"
+ description="Metric One" category="performance" defaultInterval="60000" defaultOn="false"
+ units="milliseconds" measurementType="trendsup"/>
+ </server>
+ <server name="MetricServer4"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v1.xml
new file mode 100644
index 0000000..93a15ef
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v1.xml
@@ -0,0 +1,42 @@
+<plugin name="OperationMetadataManagerBeanTestPlugin"
+ displayName="OperationMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="OperationServer1">
+ <operation name="OperationServer1.Operation1"/>
+ </server>
+ <server name="OperationServer11">
+ <operation name="OperationServer11.Operation1">
+ <parameters>
+ <c:simple-property name="param1"/>
+ <c:simple-property name="param2"/>
+ </parameters>
+ </operation>
+ </server>
+
+ <server name="OperationServer2"/>
+ <server name="OperationServer21">
+ <operation name="OperationServer21.Operation1"/>
+ </server>
+ <server name="OperationServer22">
+ <operation name="OperationServer22.Operation1">
+ <parameters>
+ <c:simple-property name="param1"/>
+ <c:simple-property name="param2"/>
+ </parameters>
+ </operation>
+ </server>
+ <server name="OperationServer23">
+ <operation name="OperationServer23.Operation1"/>
+ </server>
+ <server name="OperationServer24">
+ <operation name="OperationServer24.Operation1"/>
+ <operation name="OperationServer24.Operation2">
+ <results>
+ <c:simple-property name="exitCode"/>
+ </results>
+ </operation>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v2.xml
new file mode 100644
index 0000000..a86fbcf
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/OperationMetadataManagerBeanTest/plugin_v2.xml
@@ -0,0 +1,41 @@
+<plugin name="OperationMetadataManagerBeanTestPlugin"
+ displayName="OperationMetadataManagerBean Test Plugin"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="OperationServer1">
+ <operation name="OperationServer1.Operation1"/>
+ </server>
+ <server name="OperationServer11">
+ <operation name="OperationServer11.Operation1">
+ <parameters>
+ <c:simple-property name="param1"/>
+ <c:simple-property name="param2"/>
+ </parameters>
+ </operation>
+ </server>
+
+ <server name="OperationServer2">
+ <operation name="OperationServer2.Operation1"/>
+ </server>
+ <server name="OperationServer21"/>
+ <server name="OperationServer22">
+ <operation name="OperationServer22.Operation1"/>
+ </server>
+ <server name="OperationServer23">
+ <operation name="OperationServer23.Operation1">
+ <results>
+ <c:simple-property name="exitCode"/>
+ </results>
+ </operation>
+ </server>
+ <server name="OperationServer24">
+ <operation name="OperationServer24.Operation1">
+ <parameters>
+ <c:simple-property name="param1"/>
+ </parameters>
+ </operation>
+ <operation name="OperationServer24.Operation2"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_1.xml
new file mode 100644
index 0000000..6680aa6
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_1.xml
@@ -0,0 +1,7 @@
+<plugin name="PluginManagerBeanTestPlugin1"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="TestServer1"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_2.xml
new file mode 100644
index 0000000..c6f8736
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_2.xml
@@ -0,0 +1,10 @@
+<plugin name="PluginManagerBeanTestPlugin2"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <depends plugin="PluginManagerBeanTestPlugin1" useClasses="true"/>
+
+ <server name="TestServer2"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_3.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_3.xml
new file mode 100644
index 0000000..78184bf
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest/plugin_3.xml
@@ -0,0 +1,8 @@
+<plugin name="PluginManagerBeanTestPlugin3"
+ package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <server name="TestServer3"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v1.xml
new file mode 100644
index 0000000..944bd20
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v1.xml
@@ -0,0 +1,59 @@
+<plugin name="TestPlugin" displayName="Test Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerA" description="Server A description">
+ <subcategories>
+ <subcategory name="Resources" description="Resources subcategory"/>
+ <subcategory name="Applications" description="Applications subcategory"/>
+ </subcategories>
+
+ <plugin-configuration>
+ <c:simple-property name="connectionPropertyX" default="x"/>
+ <c:simple-property name="connectionPropertyY" default="y"/>
+ </plugin-configuration>
+
+ <process-scan name="serverA" query="process|basename|match=^java.*,arg|org.jboss.Main|match=.*"/>
+
+ <operation name="start">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <operation name="stop">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <metric displayName="Metric 1" property="metric1" displayType="summary" defaultInterval="300000"/>
+ <metric displayName="Metric 2" property="metric2" displayType="summary" defaultInterval="300000"/>
+
+ <event name="logAEntry" description="an entry was appended to a log file"/>
+ <event name="logBEntry" description="an entry was appended to a log file"/>
+
+ <content name="ServerA.Content.1" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerA.Content.1.version"/>
+ </configuration>
+ </content>
+
+ <content name="ServerA.Content.2" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerA.Content.2.version"/>
+ </configuration>
+ </content>
+
+ <service name="Child1" description="Child 1 description"/>
+ <service name="Child2" description="Child 2 description"/>
+ </server>
+
+ <server name="ServerB" description="Server B description"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v2.xml
new file mode 100644
index 0000000..ca79943
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/plugin_v2.xml
@@ -0,0 +1,73 @@
+<plugin name="TestPlugin" displayName="Test Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerA" description="Server A description">
+
+ <subcategories>
+ <subcategory name="Resources" description="Resources subcategory"/>
+ <subcategory name="Applications" description="Applications subcategory"/>
+ </subcategories>
+
+ <plugin-configuration>
+ <c:simple-property name="connectionPropertyX" default="x"/>
+ <c:simple-property name="connectionPropertyY" default="y"/>
+ </plugin-configuration>
+
+ <process-scan name="processA" query="process|basename|match=^java.*,arg|org.jboss.MainA|match=.*"/>
+ <process-scan name="processB" query="process|basename|match=^java.*,arg|org.jboss.MainB|match=.*"/>
+
+ <operation name="start">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <operation name="shutdown">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <operation name="restart">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <metric displayName="Metric 1" property="metric1" displayType="summary" defaultInterval="300000"/>
+ <metric displayName="Metric 2" property="metric2" displayType="summary" defaultInterval="300000"/>
+
+ <event name="logAEntry" description="an entry was appended to a log file"/>
+ <event name="logCEntry" description="an entry was appended to a log file"/>
+
+ <content name="ServerA.Content.1" category="configuration">
+ <configuration>
+ <c:simple-property name="ServerA.Content.1.property1"/>
+ <c:simple-property name="ServerA.Content.1.property2"/>
+ </configuration>
+ </content>
+
+ <content name="ServerA.Content.3" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerA.Content.3.version"/>
+ </configuration>
+ </content>
+
+ <service name="Child1"/>
+ <service name="Child3"/>
+ </server>
+
+ <server name="ServerB" description="Server B description">
+ <service name="Child2"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v1.xml
new file mode 100644
index 0000000..60a9f93
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v1.xml
@@ -0,0 +1,54 @@
+<plugin name="RemoveTypesPlugin" displayName="Remove Types Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerC" description="Server C description">
+
+ <subcategories>
+ <subcategory name="ServerC.Category1">
+ <subcategory name="ServerC.NestedCategory1"/>
+ </subcategory>
+ <subcategory name="ServerC.Category2"/>
+ </subcategories>
+
+ <bundle type="Test Bundle"/>
+
+ <process-scan name="scan1" query="process|basename|match=^java.*,arg|org.rhq.serverC1|match=.*"/>
+ <process-scan name="scan2" query="process|basename|match=^java.*,arg|org.rhq.serverC2|match=.*"/>
+
+ <operation name="run">
+ <parameters>
+ <c:simple-property name="script"/>
+ </parameters>
+ <results>
+ <c:simple-property name="errors"/>
+ </results>
+ </operation>
+
+ <metric displayName="Metric 1" property="ServerC::metric1" displayType="summary" defaultInterval="300000"/>
+
+ <event name="serverCEvent" description="an entry was appended to a log file"/>
+
+ <content name="ServerC.Content" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerC.Content.version"/>
+ </configuration>
+ </content>
+ </server>
+
+ <server name="ServerD">
+ <service name="ServerD.Child1">
+ <service name="ServerD.GrandChild1"/>
+ </service>
+ </server>
+
+ <server name="ServerE">
+ <service name="ServiceE1">
+ <service name="ServiceE2">
+ <service name="ServiceE3">
+ <service name="serviceE4"/>
+ </service>
+ </service>
+ </service>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v2.xml
new file mode 100644
index 0000000..6b0cdb0
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest/remove_types_v2.xml
@@ -0,0 +1,8 @@
+<plugin name="RemoveTypesPlugin" displayName="Remove Types Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerD">
+ <service name="ServerD.GrandChild1"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v1.xml
new file mode 100644
index 0000000..944bd20
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v1.xml
@@ -0,0 +1,59 @@
+<plugin name="TestPlugin" displayName="Test Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerA" description="Server A description">
+ <subcategories>
+ <subcategory name="Resources" description="Resources subcategory"/>
+ <subcategory name="Applications" description="Applications subcategory"/>
+ </subcategories>
+
+ <plugin-configuration>
+ <c:simple-property name="connectionPropertyX" default="x"/>
+ <c:simple-property name="connectionPropertyY" default="y"/>
+ </plugin-configuration>
+
+ <process-scan name="serverA" query="process|basename|match=^java.*,arg|org.jboss.Main|match=.*"/>
+
+ <operation name="start">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <operation name="stop">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <metric displayName="Metric 1" property="metric1" displayType="summary" defaultInterval="300000"/>
+ <metric displayName="Metric 2" property="metric2" displayType="summary" defaultInterval="300000"/>
+
+ <event name="logAEntry" description="an entry was appended to a log file"/>
+ <event name="logBEntry" description="an entry was appended to a log file"/>
+
+ <content name="ServerA.Content.1" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerA.Content.1.version"/>
+ </configuration>
+ </content>
+
+ <content name="ServerA.Content.2" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerA.Content.2.version"/>
+ </configuration>
+ </content>
+
+ <service name="Child1" description="Child 1 description"/>
+ <service name="Child2" description="Child 2 description"/>
+ </server>
+
+ <server name="ServerB" description="Server B description"/>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v2.xml
new file mode 100644
index 0000000..ca79943
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_plugin_v2.xml
@@ -0,0 +1,73 @@
+<plugin name="TestPlugin" displayName="Test Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerA" description="Server A description">
+
+ <subcategories>
+ <subcategory name="Resources" description="Resources subcategory"/>
+ <subcategory name="Applications" description="Applications subcategory"/>
+ </subcategories>
+
+ <plugin-configuration>
+ <c:simple-property name="connectionPropertyX" default="x"/>
+ <c:simple-property name="connectionPropertyY" default="y"/>
+ </plugin-configuration>
+
+ <process-scan name="processA" query="process|basename|match=^java.*,arg|org.jboss.MainA|match=.*"/>
+ <process-scan name="processB" query="process|basename|match=^java.*,arg|org.jboss.MainB|match=.*"/>
+
+ <operation name="start">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <operation name="shutdown">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <operation name="restart">
+ <parameters>
+ <c:simple-property name="immediate" type="boolean"/>
+ </parameters>
+ <results>
+ <c:simple-property name="exitCode" type="integer"/>
+ </results>
+ </operation>
+
+ <metric displayName="Metric 1" property="metric1" displayType="summary" defaultInterval="300000"/>
+ <metric displayName="Metric 2" property="metric2" displayType="summary" defaultInterval="300000"/>
+
+ <event name="logAEntry" description="an entry was appended to a log file"/>
+ <event name="logCEntry" description="an entry was appended to a log file"/>
+
+ <content name="ServerA.Content.1" category="configuration">
+ <configuration>
+ <c:simple-property name="ServerA.Content.1.property1"/>
+ <c:simple-property name="ServerA.Content.1.property2"/>
+ </configuration>
+ </content>
+
+ <content name="ServerA.Content.3" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerA.Content.3.version"/>
+ </configuration>
+ </content>
+
+ <service name="Child1"/>
+ <service name="Child3"/>
+ </server>
+
+ <server name="ServerB" description="Server B description">
+ <service name="Child2"/>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v1.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v1.xml
new file mode 100644
index 0000000..60a9f93
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v1.xml
@@ -0,0 +1,54 @@
+<plugin name="RemoveTypesPlugin" displayName="Remove Types Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerC" description="Server C description">
+
+ <subcategories>
+ <subcategory name="ServerC.Category1">
+ <subcategory name="ServerC.NestedCategory1"/>
+ </subcategory>
+ <subcategory name="ServerC.Category2"/>
+ </subcategories>
+
+ <bundle type="Test Bundle"/>
+
+ <process-scan name="scan1" query="process|basename|match=^java.*,arg|org.rhq.serverC1|match=.*"/>
+ <process-scan name="scan2" query="process|basename|match=^java.*,arg|org.rhq.serverC2|match=.*"/>
+
+ <operation name="run">
+ <parameters>
+ <c:simple-property name="script"/>
+ </parameters>
+ <results>
+ <c:simple-property name="errors"/>
+ </results>
+ </operation>
+
+ <metric displayName="Metric 1" property="ServerC::metric1" displayType="summary" defaultInterval="300000"/>
+
+ <event name="serverCEvent" description="an entry was appended to a log file"/>
+
+ <content name="ServerC.Content" category="deployable">
+ <configuration>
+ <c:simple-property name="ServerC.Content.version"/>
+ </configuration>
+ </content>
+ </server>
+
+ <server name="ServerD">
+ <service name="ServerD.Child1">
+ <service name="ServerD.GrandChild1"/>
+ </service>
+ </server>
+
+ <server name="ServerE">
+ <service name="ServiceE1">
+ <service name="ServiceE2">
+ <service name="ServiceE3">
+ <service name="serviceE4"/>
+ </service>
+ </service>
+ </service>
+ </server>
+</plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v2.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v2.xml
new file mode 100644
index 0000000..6b0cdb0
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest_remove_types_v2.xml
@@ -0,0 +1,8 @@
+<plugin name="RemoveTypesPlugin" displayName="Remove Types Plugin" package="org.rhq.plugins.test"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="ServerD">
+ <service name="ServerD.GrandChild1"/>
+ </server>
+</plugin>
\ No newline at end of file
13 years, 6 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png |binary
2 files changed
New commits:
commit f82412f3737b6547ebf6c2e6fce50c197bbd76d1
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Dec 16 11:21:23 2010 -0500
i like these auto-disc icons better
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png
index e849115..099ef87 100644
Binary files a/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png
index f4eae94..2afd2c4 100644
Binary files a/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png differ
13 years, 6 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java | 4 ++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java | 2 +-
modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/global/upload.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/global/upload_Disabled.png |binary
6 files changed, 3 insertions(+), 3 deletions(-)
New commits:
commit 31de48811bdeed00bef7a49e9d5ecd655a912eb1
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Dec 16 10:52:07 2010 -0500
new auto-discovery icons since the clock face didn't make sense.
these new ones can, at least plausibly, be said to better represent auto-discovery and importation of resources
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
index 9221091..c7172a9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
@@ -137,8 +137,8 @@ public class InventoryView extends AbstractSectionedLeftNavigationView {
}
private NavigationSection buildResourcesSection() {
- NavigationItem autodiscoveryQueueItem = new NavigationItem(PAGE_AUTODISCOVERY_QUEUE, "global/Recent_16.png",
- new ViewFactory() {
+ NavigationItem autodiscoveryQueueItem = new NavigationItem(PAGE_AUTODISCOVERY_QUEUE,
+ "global/AutoDiscovery_16.png", new ViewFactory() {
public Canvas createView() {
return new ResourceAutodiscoveryView(extendLocatorId(PAGE_AUTODISCOVERY_QUEUE.getName()));
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
index 6f9ecbf..6b99ed2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
@@ -61,7 +61,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
*/
public class ResourceAutodiscoveryView extends LocatableVLayout {
private static final String TITLE = MSG.view_autoDiscoveryQ_title();
- private static final String HEADER_ICON = "global/Recent_24.png";
+ private static final String HEADER_ICON = "global/AutoDiscovery_24.png";
private boolean simple;
private TreeGrid treeGrid;
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png
new file mode 100644
index 0000000..e849115
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png
new file mode 100644
index 0000000..f4eae94
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/AutoDiscovery_24.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload.png
index 335a235..b25dfbc 100644
Binary files a/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload.png and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload_Disabled.png b/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload_Disabled.png
index dec31e9..3b87d0c 100644
Binary files a/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload_Disabled.png and b/modules/enterprise/gui/coregui/src/main/webapp/images/global/upload_Disabled.png differ
13 years, 6 months
[rhq] Branch 'release-3.0.0' - 2 commits - modules/plugins
by fdrabek
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java | 20 ++++++++--
1 file changed, 17 insertions(+), 3 deletions(-)
New commits:
commit 1718a6e147ee2a698c836685321977561f1f6524
Merge: a5f87a1... 15b395b...
Author: Filip Drabek <fdrabek(a)dhcp-lab-136.englab.brq.redhat.com>
Date: Thu Dec 16 14:44:21 2010 +0100
Merge branch 'release-3.0.0' of ssh://git.fedorahosted.org/git/rhq/rhq into release-3.0.0
commit a5f87a1e536094352beeaa8360da2a7624d9022a
Author: Filip Drabek <fdrabek(a)dhcp-lab-136.englab.brq.redhat.com>
Date: Thu Dec 16 14:43:08 2010 +0100
BZ 638216 - (AS5 plugin) Reconecting to profile service when connection is defunct.
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
index 63a7571..120985a 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
@@ -142,6 +142,7 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
AvailabilityType availability;
if (this.connection != null) {
try {
+
ManagementView managementView = this.connection.getManagementView();
managementView.load();
@@ -346,10 +347,23 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
// ---------------------------------------------------------------
private void connectToProfileService() {
- if (this.connection != null) {
- return;
+ if (connection!=null){
+ try {
+ //In rare cases (BZ 638216) connection becomes defunctional. The connection is than not null
+ //and operations on managementViews will end by timeout.
+ ManagementView managementView = this.connection.getManagementView();
+ managementView.load();
+ managementView.getComponentsForType(
+ new ComponentType("MCBean", "ServerConfig")).iterator().next();
+
+ return;
+ }catch(Throwable e){
+ log.info("Connection has become defunct. Reconnecting...");
+ if (log.isDebugEnabled())
+ log.debug("Connection has become defunct. Reconnecting...",e);
+ }
}
- // TODO: Check for a defunct connection and if found try to reconnect?
+
ProfileServiceConnectionProvider connectionProvider;
if (runningEmbedded()) {
connectionProvider = new LocalProfileServiceConnectionProvider();
13 years, 6 months
[rhq] modules/core
by lkrejci
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 8 ++++++++
1 file changed, 8 insertions(+)
New commits:
commit 2ba9e1c4cfcb7046bfce34996d4955b0091c08a6
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Dec 16 12:23:48 2010 +0100
BZ 656469 - adding a temporary performance measure on the RHQ_MEASUREMENT_DATA_NUM_1D. Having an index on TIME_STAMP column helps the performance of the hourly jobs but a more involved solution is needed to fix this bottleneck.
This fix is part of RHQ 3.0.1 as well and therefore was added as schema spec 2.92.4 even though master is currently on schema spec 2.101.
This is to support seamless upgrade of the releases, but of course intermittently this is schema spec is not going to get applied until a full dbsetup is executed.
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 1483436..d9f63c0 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3130,6 +3130,14 @@
<schema-alterColumn table="RHQ_PARTITION_EVENT" column="SUBJECT_NAME" columnType="VARCHAR2" precision="100" />
</schemaSpec>
+ <schemaSpec version="2.92.4">
+ <schema-directSQL>
+ <statement desc="Add index on measurement data 1d table timestamp">
+ CREATE INDEX RHQ_MEAS_DATA_1D_TIME_IDX ON RHQ_MEASUREMENT_DATA_NUM_1D (time_stamp)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
<schemaSpec version="2.93">
<!-- the customizable dashboard storage system -->
13 years, 6 months
[rhq] Branch 'release-3.0.0' - modules/core
by lkrejci
modules/core/dbutils/pom.xml | 2 +-
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
New commits:
commit 15b395b1294158dc65979d3b896e5eca6db421f1
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Dec 16 12:11:25 2010 +0100
BZ 656471 - add index on the timestamp of the RHQ_MEASUREMENT_DATA_NUM_1D table to speed up the data compression
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index 00053ab..ea159a0 100644
--- a/modules/core/dbutils/pom.xml
+++ b/modules/core/dbutils/pom.xml
@@ -22,7 +22,7 @@
<properties>
<scm.module.path>modules/core/dbutils/</scm.module.path>
- <db.schema.version>2.92.3</db.schema.version>
+ <db.schema.version>2.92.4</db.schema.version>
</properties>
<dependencies>
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 1d29019..48e8f1d 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3129,6 +3129,14 @@
<!-- third, maintain consistency across data model - everywhere else, SUBJECT_NAME is of size 100, make this one 100 too -->
<schema-alterColumn table="RHQ_PARTITION_EVENT" column="SUBJECT_NAME" columnType="VARCHAR2" precision="100" />
</schemaSpec>
+
+ <schemaSpec version="2.92.4">
+ <schema-directSQL>
+ <statement desc="Add index on measurement data 1d table timestamp">
+ CREATE INDEX RHQ_MEAS_DATA_1D_TIME_IDX ON RHQ_MEASUREMENT_DATA_NUM_1D (time_stamp)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
</dbupgrade>
</target>
</project>
13 years, 6 months
[rhq] 4 commits - modules/enterprise
by Joseph Marques
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java | 53
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java | 44
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java | 568 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java | 5
modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html | 1
modules/enterprise/gui/coregui/src/main/webapp/css/search.css | 10
modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml | 18
12 files changed, 709 insertions(+), 28 deletions(-)
New commits:
commit 3c1e2de750953df239f104d08a3f469e08ea0429
Author: Joseph Marques <joseph(a)redhat.com>
Date: Thu Dec 16 02:12:23 2010 -0500
first stab at integrating new FlexSearchBar into TestSearchBarView
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java
new file mode 100644
index 0000000..abc0958
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SearchBarItem.java
@@ -0,0 +1,53 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.components.form;
+
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
+
+import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.enterprise.gui.coregui.client.search.FlexSearchBar;
+
+/**
+ * @author Joseph Marques
+ */
+public class SearchBarItem extends CanvasItem {
+
+ private Canvas canvas = new Canvas();
+ private FlexSearchBar searchBar;
+
+ public SearchBarItem(SearchSubsystem subsystem) {
+ super("Search");
+
+ searchBar = new FlexSearchBar();
+ searchBar.setSearchSubsystem(subsystem);
+
+ searchBar.setHeight("30px");
+ canvas.addChild(searchBar);
+
+ setCanvas(canvas);
+ setHeight(30);
+ }
+
+ @Override
+ public Canvas getCanvas() {
+ return canvas;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
index 92548b5..a99ff5a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
@@ -73,6 +73,7 @@ import com.smartgwt.client.widgets.toolbar.ToolStrip;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.RefreshableView;
+import org.rhq.enterprise.gui.coregui.client.components.form.SearchBarItem;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
@@ -476,7 +477,7 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
}
public void refresh() {
- if (null != this.listGrid) {
+ if (null != this.listGrid) {
this.listGrid.invalidateCache();
this.listGrid.markForRedraw();
}
@@ -681,9 +682,8 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
recordNames.add(name);
}
- Message message = new Message(MSG
- .widget_recordEditor_info_recordsDeletedConcise(String.valueOf(deletedRecords.length),
- getDataTypeNamePlural()), MSG
+ Message message = new Message(MSG.widget_recordEditor_info_recordsDeletedConcise(String
+ .valueOf(deletedRecords.length), getDataTypeNamePlural()), MSG
.widget_recordEditor_info_recordsDeletedDetailed(String.valueOf(deletedRecords.length),
getDataTypeNamePlural(), recordNames.toString()));
CoreGUI.getMessageCenter().notify(message);
@@ -740,6 +740,8 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
nextFormItem.addKeyPressHandler(this);
} else if (nextFormItem instanceof SelectItem) {
nextFormItem.addChangedHandler(this);
+ } else if (nextFormItem instanceof SearchBarItem) {
+ nextFormItem.addKeyPressHandler(this);
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java
index b372b93..d58197d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/inventory/TestSearchBarView.java
@@ -6,7 +6,9 @@ import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceD
import com.smartgwt.client.widgets.form.fields.TextItem;
import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.search.SearchSubsystem;
import org.rhq.enterprise.gui.coregui.client.components.form.EnumSelectItem;
+import org.rhq.enterprise.gui.coregui.client.components.form.SearchBarItem;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
public class TestSearchBarView extends ResourceSearchView {
@@ -19,7 +21,8 @@ public class TestSearchBarView extends ResourceSearchView {
final TextItem nameFilter = new TextItem(NAME.propertyName(), NAME.title());
final EnumSelectItem categoryFilter = new EnumSelectItem(CATEGORY.propertyName(), CATEGORY.title(),
ResourceCategory.class);
+ final SearchBarItem searchFilter = new SearchBarItem(SearchSubsystem.RESOURCE);
- setFilterFormItems(nameFilter, categoryFilter);
+ setFilterFormItems(nameFilter, categoryFilter, searchFilter);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html
index de84de2..ad2c937 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html
+++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html
@@ -12,6 +12,7 @@
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="CoreGUI.css">
+ <link rel="stylesheet" href="css/search.css">
<style type="text/css">
.menuButton, .menuButtonOver, .menuButtonDown, .menuButtonDisabled, .menuButtonSelected, .menuButtonSelectedDown, .menuButtonSelectedOver, .menuButtonSelectedDisabled {
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/css/search.css b/modules/enterprise/gui/coregui/src/main/webapp/css/search.css
index 994d28a..cd75fbc 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/css/search.css
+++ b/modules/enterprise/gui/coregui/src/main/webapp/css/search.css
@@ -30,6 +30,7 @@ div {
border-color: white;
border-style: none;
outline: none;
+ z-index: 999999;
}
.patternNameLabel {
@@ -41,6 +42,7 @@ div {
border-style: none;
font-size: 11px;
width: 125px;
+ z-index: 999999;
}
.patternNameField {
@@ -52,6 +54,7 @@ div {
border-style: dotted;
border-width: thin;
outline: none;
+ z-index: 999999;
}
@@ -67,6 +70,7 @@ div {
background-color: rgb(233, 230, 225);
height: 34px;
vertical-align: bottom;
+ z-index: 999999;
}
.searchBarBackgroundContainer {
@@ -83,12 +87,14 @@ div {
padding: 0;
width: 785px;
height: 20px;
+ z-index: 999999;
}
.searchBarComponentsContainer {
width: 100%;
margin: 0;
padding: 0;
+ z-index: 999999;
}
.searchBarComponentLHS {
@@ -122,6 +128,7 @@ div {
padding: 0;
margin: 0;
width: 785px;
+ z-index: 999999;
}
.savedSearchesPanel-row {
@@ -184,6 +191,8 @@ div {
border-bottom-color: gray;
border-right-color: gray;
border-width: 1px 1px 1px 1px;
+
+ z-index: 999999;
}
.suggestData {
@@ -221,6 +230,7 @@ div.rounded {
}
div.rounded2 {
width: 125px;
+ z-index: 999999;
background: rgb(192, 236, 207) url(/coregui/images/search/corner-upper-right-8.png) no-repeat top right;
}
div.rounded2 div {
commit 193d79cc72bd6ff3f63f9ef2aea818d31bef0cfb
Author: Joseph Marques <joseph(a)redhat.com>
Date: Thu Dec 16 01:45:07 2010 -0500
update SearchBar-related classes to use new AbstractSearchBar super
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java
index fd5c55f..188cd89 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchGrid.java
@@ -27,6 +27,7 @@ import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Grid;
import org.rhq.core.domain.search.SavedSearch;
+import org.rhq.enterprise.gui.coregui.client.search.AbstractSearchBar;
import org.rhq.enterprise.gui.coregui.client.search.SearchBar;
/**
@@ -35,7 +36,7 @@ import org.rhq.enterprise.gui.coregui.client.search.SearchBar;
public class SavedSearchGrid extends Grid {
private PatternSelectionHandler patternSelectionHandler;
- private SearchBar searchBar;
+ private AbstractSearchBar searchBar;
public interface PatternSelectionHandler {
public void handleSelection(int rowIndex, int columnIndex, String patternName);
@@ -60,7 +61,7 @@ public class SavedSearchGrid extends Grid {
}
}
- public SavedSearchGrid(SearchBar searchBar) {
+ public SavedSearchGrid(AbstractSearchBar searchBar) {
super(0, 2); // assume no rows to start, but we'll always have 2 columns
setRowFormatter(new SavedSearchRowFormatter());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java
index 21a4f5f..b6ec717 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/favorites/SavedSearchManager.java
@@ -33,7 +33,7 @@ import org.rhq.core.domain.search.SavedSearch;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.SearchGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.search.SearchBar;
+import org.rhq.enterprise.gui.coregui.client.search.AbstractSearchBar;
/**
* @author Joseph Marques
@@ -43,9 +43,9 @@ public class SavedSearchManager {
private final SearchGWTServiceAsync searchService = GWTServiceLookup.getSearchService();
private LinkedHashMap<String, SavedSearch> savedSearches = new LinkedHashMap<String, SavedSearch>();
- private SearchBar searchBar;
+ private AbstractSearchBar searchBar;
- public SavedSearchManager(SearchBar searchBar) {
+ public SavedSearchManager(AbstractSearchBar searchBar) {
this.searchBar = searchBar;
load();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java
index fd3ecc8..f2dab2f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/suggest/SuggestTextBox_v3.java
@@ -64,12 +64,12 @@ import org.rhq.core.domain.search.SearchSuggestion;
import org.rhq.core.domain.search.SearchSuggestion.Kind;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.SearchGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.search.SearchBar;
+import org.rhq.enterprise.gui.coregui.client.search.AbstractSearchBar;
public class SuggestTextBox_v3 extends Composite implements HasText, HasAllFocusHandlers, HasValue<String>,
HasSelectionHandlers<Suggestion> {
- private final SearchBar searchBar;
+ private final AbstractSearchBar searchBar;
private final SearchSuggestOracle oracle;
private int limit = 20;
@@ -86,7 +86,7 @@ public class SuggestTextBox_v3 extends Composite implements HasText, HasAllFocus
private final String STYLE_NAME_TEXT_BOX = "patternField";
private final String STYLE_NAME_POPUP_PANEL = "suggestPanel";
- public SuggestTextBox_v3(SearchBar searchBar, TextBoxBase box) {
+ public SuggestTextBox_v3(AbstractSearchBar searchBar, TextBoxBase box) {
super();
this.searchBar = searchBar;
@@ -700,7 +700,7 @@ public class SuggestTextBox_v3 extends Composite implements HasText, HasAllFocus
SearchSuggestion searchSuggestion = extraSearchSuggestion(suggestion);
String currentText = getText().toLowerCase();
- if (searchBar.welcomeMessage.equals(currentText)) {
+ if (searchBar.getWelcomeMessage().equals(currentText)) {
setValue("", true);
return;
}
commit 1b8b6ec5876fcc1d1b86b2ea29918c9777e60eb8
Author: Joseph Marques <joseph(a)redhat.com>
Date: Thu Dec 16 01:43:31 2010 -0500
abstract class for SearchBar, so two impls can be supported in parallel
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java
new file mode 100644
index 0000000..ac4a874
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/AbstractSearchBar.java
@@ -0,0 +1,44 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.search;
+
+import com.google.gwt.user.client.ui.Composite;
+
+import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchManager;
+
+/**
+ * Abstract class for SearchBar, so that a separate implementation can be written alongside the original.
+ *
+ * @author Joseph Marques
+ */
+public abstract class AbstractSearchBar extends Composite {
+
+ public abstract SearchSubsystem getSearchSubsystem();
+
+ public abstract String getWelcomeMessage();
+
+ public abstract String getSelectedTab();
+
+ public abstract void activateSavedSearch(String savedSearchName);
+
+ public abstract void onSavedSearchManagerLoaded();
+
+ public abstract SavedSearchManager getSavedSearchManager();
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java
new file mode 100644
index 0000000..172bd13
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/FlexSearchBar.java
@@ -0,0 +1,568 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.search;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.event.dom.client.BlurEvent;
+import com.google.gwt.event.dom.client.BlurHandler;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.FocusEvent;
+import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.event.dom.client.MouseOutEvent;
+import com.google.gwt.event.dom.client.MouseOutHandler;
+import com.google.gwt.event.dom.client.MouseOverEvent;
+import com.google.gwt.event.dom.client.MouseOverHandler;
+import com.google.gwt.event.logical.shared.CloseEvent;
+import com.google.gwt.event.logical.shared.CloseHandler;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.Event.NativePreviewEvent;
+import com.google.gwt.user.client.Event.NativePreviewHandler;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Panel;
+import com.google.gwt.user.client.ui.PopupPanel;
+import com.google.gwt.user.client.ui.TextBox;
+
+import org.rhq.core.domain.search.SavedSearch;
+import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.Messages;
+import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchGrid;
+import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchManager;
+import org.rhq.enterprise.gui.coregui.client.search.favorites.SavedSearchGrid.PatternSelectionHandler;
+import org.rhq.enterprise.gui.coregui.client.search.suggest.SuggestTextBox_v3;
+
+/**
+ * @author Joseph Marques
+ */
+public class FlexSearchBar extends AbstractSearchBar {
+
+ private static final Messages MSG = CoreGUI.getMessages();
+
+ public String welcomeMessage;
+
+ public static final String DEFAULT_PATTERN_NAME = MSG.view_searchBar_defaultPattern();
+
+ private static final String IMAGE_DIR = "/coregui/images/search/";
+
+ private static final String STAR_OFF_URL = IMAGE_DIR + "star1.png";
+ private static final String STAR_ACTIVE_URL = IMAGE_DIR + "star2.png";
+ private static final String STAR_ON_URL = IMAGE_DIR + "star3.png";
+
+ private static final String ARROW_WHITE_URL = IMAGE_DIR + "menu_arrow.png";
+ private static final String ARROW_GRAY_URL = IMAGE_DIR + "menu_arrow_down.png";
+
+ public static final String TRASH = IMAGE_DIR + "trash.png";
+
+ private final TextBox patternField = new TextBox();
+ private final SuggestTextBox_v3 autoCompletePatternField = new SuggestTextBox_v3(this, patternField);
+ private final TextBox patternNameField = new TextBox();
+ private final Label patternNameLabel = new Label();
+
+ private final Image starImage = new Image(STAR_OFF_URL);
+ private final Image arrowImage = new Image(ARROW_WHITE_URL);
+
+ private final PopupPanel savedSearchesPanel = new PopupPanel(true);
+ private final SavedSearchGrid savedSearchesGrid = new SavedSearchGrid(this);
+
+ private String currentSearch = "";
+ private long lastNameFieldBlurTime = 0;
+
+ private final SavedSearchManager savedSearchManager;
+ private SearchSubsystem searchSubsystem;
+ private String defaultSearchText;
+ private String defaultSavedSearchPatternId;
+
+ private Element searchButton;
+
+ public void setupButton() {
+ searchButton = DOM.createButton();
+ Event.addNativePreviewHandler(new NativePreviewHandler() {
+ public void onPreviewNativeEvent(NativePreviewEvent event) {
+ if (event.getNativeEvent() != null && event.getNativeEvent().getEventTarget() != null) {
+
+ if (event.getNativeEvent().getEventTarget().equals(searchButton)
+ && event.getTypeInt() == Event.ONMOUSEDOWN) {
+ prepareSearchExecution();
+ }
+ }
+ }
+ });
+ }
+
+ HorizontalPanel sbc;
+ HorizontalPanel sbc_sbbgc;
+ HorizontalPanel sbc_sbbgc_sbcc;
+ HorizontalPanel sbc_sbbgc_sbcc_sbclhs_pfc;
+ HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_aic;
+ HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_sic;
+ HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_pnfc;
+ HorizontalPanel sbc_sbbgc_sbcc_sbcrhs;
+ HorizontalPanel sbc_sbbgc_sbcc_sbcrhs_pnlc;
+ HorizontalPanel sbc_sbbc;
+ HorizontalPanel sbc_pfsc;
+ HorizontalPanel sbc_ssc;
+
+ public FlexSearchBar() {
+ Log.info("Loading SearchBar...");
+
+ // TODO: load default saved search pattern, if used has selected one
+ // populate default search text
+ // ensure that search subsystem is selected, probably want to force it to be a ctor argument
+
+ sbc = createHPanel(null, "searchBarContainer", null);
+ sbc_sbbgc = createHPanel(sbc, "searchBarBackgroundContainer", null);
+ sbc_sbbgc_sbcc = createHPanel(sbc_sbbgc, "searchBarComponentsContainer", null);
+ sbc_sbbgc_sbcc_sbclhs_pfc = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentLHS", "patternFieldContainer");
+ sbc_sbbgc_sbcc_sbcrhs_aic = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", "arrowImageContainer");
+ sbc_sbbgc_sbcc_sbcrhs_sic = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", "starImageContainer");
+ sbc_sbbgc_sbcc_sbcrhs_pnfc = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", "starImageContainer");
+ sbc_sbbgc_sbcc_sbcrhs = createHPanel(sbc_sbbgc_sbcc, "searchBarComponentRHS", null);
+ sbc_sbbgc_sbcc_sbcrhs_pnlc = createHPanel(sbc_sbbgc_sbcc_sbcrhs, "rounded", "patternNameLabelContainer");
+ sbc_sbbc = createHPanel(sbc, "searchBarButtonContainer", "searchButtonContainer");
+ sbc_pfsc = createHPanel(sbc, null, "patternFieldSuggestionsContainer");
+ sbc_ssc = createHPanel(sbc, null, "savedSearchesContainer");
+ initWidget(sbc);
+
+ savedSearchManager = new SavedSearchManager(this);
+ }
+
+ private Element createDiv(Element parentDiv, String className, String id) {
+ Element div = DOM.createDiv();
+ if (parentDiv != null) {
+ parentDiv.appendChild(div);
+ }
+ if (className != null) {
+ div.addClassName(className);
+ }
+ if (id != null) {
+ div.setId(id);
+ }
+ return div;
+ }
+
+ private HorizontalPanel createHPanel(Panel parent, String className, String id) {
+ HorizontalPanel panel = new HorizontalPanel();
+ if (parent != null) {
+ parent.add(panel);
+ }
+ if (className != null) {
+ panel.setStyleName(className);
+ }
+ if (id != null) {
+ panel.getElement().setId(id);
+ }
+ return panel;
+ }
+
+ public void onSavedSearchManagerLoaded() {
+ /*
+ RootPanel.get("patternFieldContainer").add(autoCompletePatternField);
+ RootPanel.get("patternNameFieldContainer").add(patternNameField);
+ RootPanel.get("patternNameLabelContainer").add(patternNameLabel);
+ RootPanel.get("starImageContainer").add(starImage);
+ RootPanel.get("arrowImageContainer").add(arrowImage);
+ RootPanel.get("savedSearchesContainer").add(savedSearchesPanel);
+ */
+
+ sbc_sbbgc_sbcc_sbclhs_pfc.add(autoCompletePatternField);
+ sbc_sbbgc_sbcc_sbcrhs_pnfc.add(patternNameField);
+ sbc_sbbgc_sbcc_sbcrhs_pnlc.add(patternNameLabel);
+ sbc_sbbgc_sbcc_sbcrhs_sic.add(starImage);
+ sbc_sbbgc_sbcc_sbcrhs_aic.add(arrowImage);
+ sbc_ssc.add(savedSearchesPanel);
+
+ setupAutoCompletingPatternField();
+ setupPatternNameField();
+ setupPatternNameLabel();
+ setupStarImage();
+ setupArrowImage();
+ setupSavedSearches();
+
+ //
+ if (defaultSearchText != null) {
+ this.autoCompletePatternField.setText(defaultSearchText);
+ click(searchButton); // execute the search with this default search expression
+ } else if (defaultSavedSearchPatternId != null) {
+ try {
+ Integer savedSearchId = Integer.valueOf(defaultSavedSearchPatternId);
+ activateSavedSearch(savedSearchId);
+ } catch (Exception e) {
+ this.autoCompletePatternField.setText(MSG.view_searchBar_error_selectSavedSearch());
+ click(searchButton); // execute the search, which will help to further highlight the error
+ }
+ }
+
+ // presume the enclosing page logic loads results without a button click
+ }
+
+ public static native String getUserAgent()
+ /*-{
+ return navigator.userAgent.toLowerCase();
+ }-*/;
+
+ public SavedSearchManager getSavedSearchManager() {
+ return savedSearchManager;
+ }
+
+ public void setSearchSubsystem(SearchSubsystem searchSubsystem) {
+ this.searchSubsystem = searchSubsystem;
+
+ this.welcomeMessage = MSG.view_searchBar_welcomeMessage(this.searchSubsystem.getName());
+
+ this.autoCompletePatternField.setText(welcomeMessage);
+ }
+
+ public SearchSubsystem getSearchSubsystem() {
+ return searchSubsystem;
+ }
+
+ public void setDefaultSearchText(String defaultSearchText) {
+ if (defaultSearchText == null || defaultSearchText.trim().equals("")) {
+ return; // do nothing
+ }
+
+ this.defaultSearchText = defaultSearchText;
+ }
+
+ public String getDefaultSearchText() {
+ return defaultSearchText;
+ }
+
+ public void setDefaultSavedSearchPatternId(String defaultSavedSearchPatternId) {
+ if (defaultSavedSearchPatternId == null || defaultSavedSearchPatternId.trim().equals("")) {
+ return; // do nothing
+ }
+
+ this.defaultSavedSearchPatternId = defaultSavedSearchPatternId;
+ }
+
+ public String getDefaultSavedSearchPatternId() {
+ return defaultSavedSearchPatternId;
+ }
+
+ public String getWelcomeMessage() {
+ return welcomeMessage;
+ }
+
+ public void prepareSearchExecution() {
+ String searchTerms = autoCompletePatternField.getText().toLowerCase().trim();
+ if (searchTerms.equals(welcomeMessage)) {
+ autoCompletePatternField.setText("");
+ }
+ }
+
+ private void setupAutoCompletingPatternField() {
+ autoCompletePatternField.getElement().setId("patternField");
+ autoCompletePatternField.setStyleName("patternField");
+
+ AutoCompletePatternFieldEventHandler handler = new AutoCompletePatternFieldEventHandler();
+ autoCompletePatternField.getTextBox().addFocusHandler(handler);
+ autoCompletePatternField.getTextBox().addBlurHandler(handler);
+ autoCompletePatternField.addKeyPressHandler(handler);
+ }
+
+ private void setupPatternNameField() {
+ patternNameField.setStyleName("patternNameField");
+ patternNameField.setVisible(false);
+
+ PatternNameFieldEventHandler handler = new PatternNameFieldEventHandler();
+ patternNameField.addKeyPressHandler(handler);
+ patternNameField.addClickHandler(handler);
+ patternNameField.addBlurHandler(handler);
+ }
+
+ private void setupPatternNameLabel() {
+ patternNameLabel.setStyleName("patternNameLabel");
+ patternNameLabel.setVisible(false);
+
+ PatternNameLabelEventHandler handler = new PatternNameLabelEventHandler();
+ patternNameLabel.addClickHandler(handler);
+ }
+
+ private void setupStarImage() {
+ StarImageEventHandler handler = new StarImageEventHandler();
+ starImage.addClickHandler(handler);
+ starImage.addMouseOverHandler(handler);
+ starImage.addMouseOutHandler(handler);
+ }
+
+ private void setupArrowImage() {
+ ArrowImageEventHandler handler = new ArrowImageEventHandler();
+ arrowImage.addClickHandler(handler);
+ }
+
+ private void setupSavedSearches() {
+ savedSearchesPanel.add(savedSearchesGrid);
+ savedSearchesPanel.setStyleName("savedSearchesPanel");
+ savedSearchesGrid.addStyleName("savedSearchesPanel");
+
+ // panel position will be re-calculated on down-arrow click
+ savedSearchesPanel.show();
+ savedSearchesPanel.hide();
+
+ SavedSearchesEventHandler handler = new SavedSearchesEventHandler();
+ savedSearchesPanel.addCloseHandler(handler);
+ savedSearchesGrid.setPatternSelectionHandler(handler);
+ }
+
+ private void turnNameFieldIntoLabel() {
+ String name = patternNameField.getText();
+
+ if (name.equalsIgnoreCase(DEFAULT_PATTERN_NAME)) {
+ name = "";
+ }
+
+ arrowImage.setVisible(true);
+ patternNameField.setVisible(false);
+
+ if (name.equals("")) {
+ savedSearchManager.removePatternByName(currentSearch);
+ starImage.setUrl(STAR_OFF_URL);
+ } else {
+ if (currentSearch.equals("")) {
+ String pattern = autoCompletePatternField.getText();
+ savedSearchManager.updatePatternByName(name, pattern); // create case
+ } else {
+ savedSearchManager.renamePattern(currentSearch, name);
+ }
+ //savedSearchManager.updatePatternByName(name, pattern);
+ patternNameLabel.setText(elipse(name));
+ patternNameLabel.setVisible(true);
+ starImage.setUrl(STAR_ON_URL);
+ }
+ currentSearch = name;
+ }
+
+ private void turnNameLabelIntoField() {
+ String name = currentSearch;
+ patternNameField.setText(name);
+ patternNameField.setVisible(true);
+ patternNameLabel.setVisible(false);
+ patternNameField.setFocus(true);
+ }
+
+ private String elipse(String data) {
+ if (data.length() > 14) {
+ return data.substring(0, 14) + "...";
+ }
+ return data;
+ }
+
+ /*
+ * Event Handlers
+ */
+ class AutoCompletePatternFieldEventHandler implements KeyPressHandler, FocusHandler, BlurHandler {
+ public void onKeyPress(KeyPressEvent event) {
+ // hide pattern field/label, turn off star
+ if (event.getCharCode() == KeyCodes.KEY_ENTER) {
+ return;
+ }
+
+ patternNameLabel.setText("");
+ patternNameLabel.setVisible(false);
+ patternNameField.setValue("", true);
+ patternNameField.setVisible(false);
+ currentSearch = "";
+ starImage.setUrl(STAR_OFF_URL);
+
+ if (event.getCharCode() == KeyCodes.KEY_ESCAPE) {
+ autoCompletePatternField.hideSuggestionList();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+
+ public void onFocus(FocusEvent event) {
+ // clear default search text if necessary
+ if (autoCompletePatternField.getText().equals(welcomeMessage)) {
+ autoCompletePatternField.setValue("", true);
+ }
+ autoCompletePatternField.showSuggestionList();
+ savedSearchesPanel.hide();
+ }
+
+ public void onBlur(BlurEvent event) {
+ if (autoCompletePatternField.getText().equals("")) {
+ autoCompletePatternField.setValue(welcomeMessage, true);
+ }
+ savedSearchesPanel.hide();
+ }
+ }
+
+ class PatternNameFieldEventHandler implements KeyPressHandler, ClickHandler, BlurHandler {
+ public void onKeyPress(KeyPressEvent event) {
+ if (event.getCharCode() == KeyCodes.KEY_ENTER) {
+ Log.debug("key press pattern name field");
+ turnNameFieldIntoLabel();
+ }
+ }
+
+ public void onClick(ClickEvent event) {
+ if (patternNameField.getText().equals(DEFAULT_PATTERN_NAME)) {
+ patternNameField.setValue("", false);
+ }
+ }
+
+ public void onBlur(BlurEvent event) {
+ lastNameFieldBlurTime = System.currentTimeMillis();
+ turnNameFieldIntoLabel();
+ }
+ }
+
+ class PatternNameLabelEventHandler implements ClickHandler {
+ public void onClick(ClickEvent event) {
+ turnNameLabelIntoField();
+ }
+ }
+
+ class StarImageEventHandler implements ClickHandler, MouseOverHandler, MouseOutHandler {
+ public void onClick(ClickEvent event) {
+ long diff = System.currentTimeMillis() - lastNameFieldBlurTime;
+ if (Math.abs(diff) < 750) {
+ /*
+ * This event propagation is annoying. If the threshold is set too low, then both
+ * the name field blur event and this star image click event fire...but the blur
+ * event fires first, which turns the star white. Then a click on a white star
+ * triggers edit mode, re-enabling the name field. However, setting the threshold
+ * too high will prevent the click event from being handled when the user naturally
+ * wants to click on the star in rapid succession within the threshold time frame.
+ * It is hoped that 750ms will strike a nice balance, and that most users will never
+ * experienced any oddities from this trade-off.
+ */
+ return;
+ }
+
+ if (starImage.getUrl().endsWith(STAR_ACTIVE_URL)) {
+ patternNameField.setText(DEFAULT_PATTERN_NAME);
+ patternNameField.setVisible(true);
+ patternNameField.selectAll();
+ patternNameField.setFocus(true);
+ patternNameLabel.setVisible(false);
+ } else if (starImage.getUrl().endsWith(STAR_ON_URL)) {
+ starImage.setUrl(STAR_ACTIVE_URL);
+ patternNameField.setVisible(false);
+ patternNameLabel.setVisible(false);
+ savedSearchManager.removePatternByName(currentSearch);
+ }
+ }
+
+ public void onMouseOver(MouseOverEvent event) {
+ if (starImage.getUrl().endsWith(STAR_OFF_URL)) {
+ starImage.setUrl(STAR_ACTIVE_URL);
+
+ }
+ }
+
+ public void onMouseOut(MouseOutEvent event) {
+ if (starImage.getUrl().endsWith(STAR_ACTIVE_URL) && !patternNameField.isVisible()) {
+ starImage.setUrl(STAR_OFF_URL);
+ }
+ }
+ }
+
+ class ArrowImageEventHandler implements ClickHandler {
+ public void onClick(ClickEvent event) {
+ savedSearchesGrid.updateModel();
+ int left = autoCompletePatternField.getAbsoluteLeft();
+ int top = autoCompletePatternField.getAbsoluteTop() + autoCompletePatternField.getOffsetHeight();
+ savedSearchesPanel.setPopupPosition(left, top + 5);
+ savedSearchesPanel.show();
+ arrowImage.setUrl(ARROW_GRAY_URL);
+ }
+ }
+
+ class SavedSearchesEventHandler implements CloseHandler<PopupPanel>, PatternSelectionHandler {
+ public void onClose(CloseEvent<PopupPanel> event) {
+ arrowImage.setUrl(ARROW_WHITE_URL);
+ }
+
+ public void handleSelection(int rowIndex, int columnIndex, String patternName) {
+ Log.debug("SavedSearchesEventHandler.handleSelection(" + rowIndex + "," + columnIndex + "," + patternName
+ + ")");
+ if (columnIndex == 1) {
+ savedSearchManager.removePatternByName(patternName);
+
+ if (currentSearch.equals(patternName)) {
+ currentSearch = "";
+ patternNameField.setValue("", true);
+ patternNameField.setVisible(false);
+ patternNameLabel.setText("");
+ patternNameLabel.setVisible(false);
+ autoCompletePatternField.setFocus(true);
+ starImage.setUrl(STAR_OFF_URL);
+ savedSearchesPanel.hide();
+ }
+
+ if (savedSearchManager.getSavedSearchCount() == 0) {
+ savedSearchesPanel.hide();
+ }
+
+ savedSearchesGrid.removeRow(rowIndex);
+ } else {
+ activateSavedSearch(patternName); // activating the saved search also clicks the button
+ }
+ }
+ }
+
+ private static native void click(Element button)
+ /*-{
+ button.click();
+ }-*/;
+
+ public void activateSavedSearch(Integer savedSearchId) {
+ SavedSearch savedSearch = savedSearchManager.getSavedSearchById(savedSearchId);
+ if (savedSearch == null) {
+ Log.debug("activateSavedSearch: no known saved search with id '" + savedSearchId + "'");
+ return; // no saved search existing with the specified id
+ }
+ activateSavedSearch(savedSearch);
+ }
+
+ public void activateSavedSearch(String savedSearchName) {
+ SavedSearch savedSearch = savedSearchManager.getSavedSearchByName(savedSearchName);
+ if (savedSearch == null) {
+ Log.debug("activateSavedSearch: no known saved search with name '" + savedSearchName + "'");
+ return; // no saved search existing with the specified name
+ }
+ activateSavedSearch(savedSearch);
+ }
+
+ public void activateSavedSearch(SavedSearch savedSearch) {
+ currentSearch = "";
+ autoCompletePatternField.setValue(savedSearch.getPattern(), true);
+ patternNameField.setValue(savedSearch.getName(), true);
+ Log.debug("search results change: [" + savedSearch.getName() + "," + savedSearch.getPattern() + "]");
+ turnNameFieldIntoLabel();
+ savedSearchesPanel.hide();
+ click(searchButton);
+ }
+
+ public String getSelectedTab() {
+ return null;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java
index 7d330d1..8be4f47 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/search/SearchBar.java
@@ -43,7 +43,6 @@ import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
-import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import org.rhq.core.domain.search.SavedSearch;
@@ -58,7 +57,7 @@ import org.rhq.enterprise.gui.coregui.client.search.suggest.SuggestTextBox_v3;
/**
* @author Joseph Marques
*/
-public class SearchBar extends SimplePanel {
+public class SearchBar extends AbstractSearchBar {
private static final Messages MSG = CoreGUI.getMessages();
@@ -118,7 +117,7 @@ public class SearchBar extends SimplePanel {
if (event.getNativeEvent() != null && event.getNativeEvent().getEventTarget() != null) {
if (event.getNativeEvent().getEventTarget().equals(searchButton)
- && event.getTypeInt() == Event.ONMOUSEDOWN) {
+ && event.getTypeInt() == Event.ONMOUSEDOWN) {
prepareSearchExecution();
}
}
@@ -473,8 +472,8 @@ public class SearchBar extends SimplePanel {
}
public void handleSelection(int rowIndex, int columnIndex, String patternName) {
- Log.debug("SavedSearchesEventHandler.handleSelection(" + rowIndex + "," + columnIndex + ","
- + patternName + ")");
+ Log.debug("SavedSearchesEventHandler.handleSelection(" + rowIndex + "," + columnIndex + "," + patternName
+ + ")");
if (columnIndex == 1) {
savedSearchManager.removePatternByName(patternName);
commit 7a4c71230136a3dc9bba3d367f0079f5f34228c8
Author: Joseph Marques <joseph(a)redhat.com>
Date: Thu Dec 16 01:33:31 2010 -0500
fix indentation
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml
index 99bf2d1..6046ee3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/searchInterface.xhtml
@@ -18,15 +18,15 @@
subtab="#{subtab}"
id="searchBar">
<div class="searchBarBackgroundContainer">
- <div class="searchBarComponentsContainer">
- <div class="searchBarComponentLHS" id="patternFieldContainer"></div>
-
- <div class="searchBarComponentRHS" id="arrowImageContainer"></div>
- <div class="searchBarComponentRHS" id="starImageContainer"></div>
- <div class="searchBarComponentRHS" id="patternNameFieldContainer"></div>
- <div class="searchBarComponentRHS">
- <div id="patternNameLabelContainer" class="rounded"></div>
- </div>
+ <div class="searchBarComponentsContainer">
+ <div class="searchBarComponentLHS" id="patternFieldContainer"></div>
+
+ <div class="searchBarComponentRHS" id="arrowImageContainer"></div>
+ <div class="searchBarComponentRHS" id="starImageContainer"></div>
+ <div class="searchBarComponentRHS" id="patternNameFieldContainer"></div>
+ <div class="searchBarComponentRHS">
+ <div id="patternNameLabelContainer" class="rounded"></div>
+ </div>
</div>
</div>
<div class="searchBarButtonContainer" id="searchButtonContainer"></div>
13 years, 6 months
[rhq] modules/enterprise
by Joseph Marques
modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit f0205b9c24997f76d06497b176db1c9fd09cb903
Author: Joseph Marques <joseph(a)redhat.com>
Date: Thu Dec 16 01:17:18 2010 -0500
2nd attempt at fixing compile error in ws test
diff --git a/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java b/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java
index 8d00622..0049cf3 100644
--- a/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java
+++ b/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java
@@ -260,7 +260,7 @@ public class WsResourceManagerTest extends AssertJUnit implements TestProperties
// lookup the first platform resource and use that name. More stable
// than hard coding. Almost always one.
ResourceCriteria platCriteria = new ResourceCriteria();
- platCriteria.setFilterResourceCategories(ResourceCategory.PLATFORM);
+ platCriteria.getFilterResourceCategories().add(ResourceCategory.PLATFORM);
List<Resource> platformList = WEBSERVICE_REMOTE.findResourcesByCriteria(subject, platCriteria);
assertNotNull("Platform list should not be null.", platformList);
assertEquals("Should be only one in list for testing.", 1, platformList.size());
13 years, 6 months
[rhq] modules/enterprise
by Joseph Marques
modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 591dc2e2556a716692594c4945810f4ddb174998
Author: Joseph Marques <joseph(a)redhat.com>
Date: Thu Dec 16 00:52:20 2010 -0500
fix compile error in ws test
diff --git a/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java b/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java
index 42cbb21..8d00622 100644
--- a/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java
+++ b/modules/enterprise/remoting/webservices/src/test/java/org/rhq/enterprise/server/ws/WsResourceManagerTest.java
@@ -260,7 +260,7 @@ public class WsResourceManagerTest extends AssertJUnit implements TestProperties
// lookup the first platform resource and use that name. More stable
// than hard coding. Almost always one.
ResourceCriteria platCriteria = new ResourceCriteria();
- platCriteria.setFilterResourceCategory(ResourceCategory.PLATFORM);
+ platCriteria.setFilterResourceCategories(ResourceCategory.PLATFORM);
List<Resource> platformList = WEBSERVICE_REMOTE.findResourcesByCriteria(subject, platCriteria);
assertNotNull("Platform list should not be null.", platformList);
assertEquals("Should be only one in list for testing.", 1, platformList.size());
13 years, 6 months