[rhq] Changes to 'bug/783603'
by mazz
New branch 'bug/783603' available with the following commits:
commit a889e82927f5a351c6623c25fadfc74d92edc0c6
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Jun 21 14:12:50 2012 -0400
[BZ 783603] fix compile error, correct some comments/javadoc
commit 7f4750ff1774952c8f44aa8c463bb71179f188be
Author: Elias Ross <elias_ross(a)apple.com>
Date: Fri Jan 20 15:25:05 2012 -0800
Support for asynchronous operations
Change the way availability checking is done; use a scheduled executor
Change the availability pool to be a generic collection pool
11 years, 10 months
[rhq] modules/core
by mazz
modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/FakeServerInventory.java | 76 +++++++
modules/core/plugin-container-itest/src/test/java/org/rhq/core/pc/measurement/ReadOnlyScheduleSetTest.java | 105 ++++++++++
modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058DiscoveryComponent.java | 51 ++++
modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058ResourceComponent.java | 84 ++++++++
modules/core/plugin-container-itest/src/test/resources/arquillian.xml | 9
modules/core/plugin-container-itest/src/test/resources/bz821058-rhq-plugin.xml | 29 ++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementCollectorRunner.java | 3
modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java | 2
8 files changed, 356 insertions(+), 3 deletions(-)
New commits:
commit 2af89d1a98d2a699590be823b3bb2d20d7ad2dea
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Jun 25 15:39:44 2012 -0400
[BZ] protect measurement facet from mucking with the plugin container's metric schedules. the bulk of this commit is adding a unit test to the arquillian test framework
diff --git a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/FakeServerInventory.java b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/FakeServerInventory.java
index 37e4ff2..b1ac175 100644
--- a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/FakeServerInventory.java
+++ b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/FakeServerInventory.java
@@ -32,6 +32,7 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -43,6 +44,12 @@ import org.rhq.core.clientapi.agent.upgrade.ResourceUpgradeResponse;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
import org.rhq.core.domain.discovery.MergeResourceResponse;
import org.rhq.core.domain.discovery.ResourceSyncInfo;
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.DisplayType;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.domain.measurement.NumericType;
+import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceError;
@@ -61,7 +68,6 @@ import org.rhq.core.domain.resource.ResourceType;
*
* @author Lukas Krejci
*/
-// TODO (ips): Why don't we just make this implement DiscoveryServerService and use it as the actual server service?
public class FakeServerInventory {
private static final Log LOG = LogFactory.getLog(FakeServerInventory.class);
@@ -143,6 +149,7 @@ public class FakeServerInventory {
private Resource platform;
private Map<String, Resource> resourceStore = new HashMap<String, Resource>();
private int counter;
+ private AtomicInteger metricScheduleCounter = new AtomicInteger(1); // used when creating measurement schedules
private boolean failing;
private boolean failUpgrade;
@@ -364,6 +371,73 @@ public class FakeServerInventory {
};
}
+ // this expects the mock invocation to have two parameters - Set<Integer> resourceIds, Boolean getChildSchedules
+ public synchronized Answer<Set<ResourceMeasurementScheduleRequest>> getLatestSchedulesForResourceIds() {
+ return new Answer<Set<ResourceMeasurementScheduleRequest>>() {
+ @Override
+ @SuppressWarnings("unchecked")
+ public Set<ResourceMeasurementScheduleRequest> answer(InvocationOnMock invocation) throws Throwable {
+ Object[] args = invocation.getArguments();
+ Set<Integer> resourceIds = (Set<Integer>) args[0];
+ Boolean getChildSchedules = (Boolean) args[1];
+
+ Set<Resource> resources = getResources(resourceIds, getChildSchedules);
+ Set<ResourceMeasurementScheduleRequest> allSchedules = new HashSet<ResourceMeasurementScheduleRequest>();
+ for (Resource resource : resources) {
+ ResourceMeasurementScheduleRequest resourceSchedules = getDefaultMeasurementSchedules(resource);
+ if (resourceSchedules != null) {
+ allSchedules.add(resourceSchedules);
+ }
+ }
+ return allSchedules;
+ }
+ };
+ }
+
+ // this expects the mock invocation to have one parameter - Set<Integer> resourceIds
+ public synchronized Answer<Set<ResourceMeasurementScheduleRequest>> postProcessNewlyCommittedResources() {
+ return new Answer<Set<ResourceMeasurementScheduleRequest>>() {
+ @Override
+ @SuppressWarnings("unchecked")
+ public Set<ResourceMeasurementScheduleRequest> answer(InvocationOnMock invocation) throws Throwable {
+ Object[] args = invocation.getArguments();
+ Set<Integer> resourceIds = (Set<Integer>) args[0];
+
+ Set<Resource> resources = getResources(resourceIds, false);
+ Set<ResourceMeasurementScheduleRequest> allSchedules = new HashSet<ResourceMeasurementScheduleRequest>();
+ for (Resource resource : resources) {
+ ResourceMeasurementScheduleRequest resourceSchedules = getDefaultMeasurementSchedules(resource);
+ if (resourceSchedules != null) {
+ allSchedules.add(resourceSchedules);
+ }
+ }
+ return allSchedules;
+ }
+ };
+ }
+
+ private ResourceMeasurementScheduleRequest getDefaultMeasurementSchedules(Resource resource) {
+ ResourceType rt = resource.getResourceType();
+ Set<MeasurementDefinition> metrics = rt.getMetricDefinitions();
+ if (metrics == null || metrics.isEmpty()) {
+ return null;
+ }
+
+ ResourceMeasurementScheduleRequest resourceSchedules = new ResourceMeasurementScheduleRequest(resource.getId());
+ for (MeasurementDefinition metric : metrics) {
+ int id = this.metricScheduleCounter.getAndIncrement();
+ String name = metric.getName();
+ long interval = metric.getDefaultInterval();
+ boolean enabled = metric.isDefaultOn() || metric.getDisplayType() == DisplayType.SUMMARY;
+ DataType dataType = metric.getDataType();
+ NumericType nDataType = metric.getNumericType();
+ MeasurementScheduleRequest schedule = new MeasurementScheduleRequest(id, name, interval, enabled, dataType,
+ nDataType);
+ resourceSchedules.addMeasurementScheduleRequest(schedule);
+ }
+ return resourceSchedules;
+ }
+
public synchronized boolean isFailing() {
return failing;
}
diff --git a/modules/core/plugin-container-itest/src/test/java/org/rhq/core/pc/measurement/ReadOnlyScheduleSetTest.java b/modules/core/plugin-container-itest/src/test/java/org/rhq/core/pc/measurement/ReadOnlyScheduleSetTest.java
new file mode 100644
index 0000000..8435114
--- /dev/null
+++ b/modules/core/plugin-container-itest/src/test/java/org/rhq/core/pc/measurement/ReadOnlyScheduleSetTest.java
@@ -0,0 +1,105 @@
+package org.rhq.core.pc.measurement;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.TargetsContainer;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.arquillian.testng.Arquillian;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+
+import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.domain.resource.InventoryStatus;
+import org.rhq.core.pc.PluginContainer;
+import org.rhq.core.pc.inventory.ResourceContainer;
+import org.rhq.plugins.test.measurement.BZ821058DiscoveryComponent;
+import org.rhq.plugins.test.measurement.BZ821058ResourceComponent;
+import org.rhq.test.arquillian.AfterDiscovery;
+import org.rhq.test.arquillian.BeforeDiscovery;
+import org.rhq.test.arquillian.FakeServerInventory;
+import org.rhq.test.arquillian.MockingServerServices;
+import org.rhq.test.arquillian.ResourceComponentInstances;
+import org.rhq.test.arquillian.ResourceContainers;
+import org.rhq.test.arquillian.RunDiscovery;
+import org.rhq.test.shrinkwrap.RhqAgentPluginArchive;
+
+/**
+ * Test for BZ 821058
+ */
+@RunDiscovery
+public class ReadOnlyScheduleSetTest extends Arquillian {
+
+ @Deployment(name = "bz821058Plugin")
+ @TargetsContainer("connected-pc-with-metric-collection")
+ public static RhqAgentPluginArchive getTestPlugin() {
+ RhqAgentPluginArchive pluginJar = ShrinkWrap.create(RhqAgentPluginArchive.class, "bz821058-plugin-1.0.jar");
+ return pluginJar.setPluginDescriptor("bz821058-rhq-plugin.xml").addClasses(BZ821058DiscoveryComponent.class,
+ BZ821058ResourceComponent.class);
+ }
+
+ @ArquillianResource
+ private PluginContainer pluginContainer;
+
+ @ArquillianResource
+ public MockingServerServices serverServices;
+
+ private FakeServerInventory fakeServerInventory;
+ private FakeServerInventory.CompleteDiscoveryChecker discoveryCompleteChecker;
+
+ @ResourceContainers(plugin = "bz821058Plugin", resourceType = "BZ821058Server")
+ private Set<ResourceContainer> containers;
+
+ @ResourceComponentInstances(plugin = "bz821058Plugin", resourceType = "BZ821058Server")
+ private Set<BZ821058ResourceComponent> components;
+
+ @BeforeDiscovery(testMethods = "testBZ821058")
+ public void resetServerServices() throws Exception {
+ serverServices.resetMocks();
+ fakeServerInventory = new FakeServerInventory();
+ discoveryCompleteChecker = fakeServerInventory.createAsyncDiscoveryCompletionChecker(1);
+
+ // autoimport everything
+ when(serverServices.getDiscoveryServerService().mergeInventoryReport(any(InventoryReport.class))).then(
+ fakeServerInventory.mergeInventoryReport(InventoryStatus.COMMITTED));
+
+ // set up the metric schedules using the metric metadata to determine default intervals and enablement
+ when(serverServices.getDiscoveryServerService().postProcessNewlyCommittedResources(any(Set.class))).then(
+ fakeServerInventory.postProcessNewlyCommittedResources());
+ }
+
+ @AfterDiscovery
+ public void waitForAsyncDiscoveries() throws Exception {
+ if (discoveryCompleteChecker != null) {
+ discoveryCompleteChecker.waitForDiscoveryComplete(10000);
+ }
+ }
+
+ @Test(groups = "pc.itest.bz821058", priority = 20)
+ public void testBZ821058() throws Exception {
+ Assert.assertNotNull(pluginContainer);
+ Assert.assertTrue(pluginContainer.isStarted());
+
+ // make sure we have the resource container
+ Assert.assertEquals(containers.size(), 1, "missing container");
+
+ // make sure we have the resource component
+ Assert.assertEquals(components.size(), 1, "missing component");
+
+ assert containers.iterator().next().getResource().getInventoryStatus() == InventoryStatus.COMMITTED;
+
+ BZ821058ResourceComponent server = this.components.iterator().next();
+ // collection interval is set to 30s, and our container "connected-pc-with-metric-collection"
+ // is configured to start collecting metrics after an initial delay of 10s (see arquillian.xml).
+ // So let's give the test some time so the measurement facet can be called.
+ server.getValuesLatch.await(45, TimeUnit.SECONDS);
+
+ assert !server.errors.isEmpty() : "there should have been exceptions that occurred in the getValues method";
+ }
+}
diff --git a/modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058DiscoveryComponent.java b/modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058DiscoveryComponent.java
new file mode 100644
index 0000000..b9f49a4
--- /dev/null
+++ b/modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058DiscoveryComponent.java
@@ -0,0 +1,51 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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.plugins.test.measurement;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+public class BZ821058DiscoveryComponent implements ResourceDiscoveryComponent<ResourceComponent<?>> {
+
+ @Override
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ResourceComponent<?>> context)
+ throws InvalidPluginConfigurationException, Exception {
+
+ HashSet<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>(1);
+ ResourceType rt = context.getResourceType();
+ String key = "bz821058";
+ String name = "bz821058";
+ String version = "1";
+ Configuration pc = context.getDefaultPluginConfiguration();
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(rt, key, name, version, null, pc, null);
+ details.add(resource);
+
+ return details;
+ }
+
+}
diff --git a/modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058ResourceComponent.java b/modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058ResourceComponent.java
new file mode 100644
index 0000000..1ccadd6
--- /dev/null
+++ b/modules/core/plugin-container-itest/src/test/java/org/rhq/plugins/test/measurement/BZ821058ResourceComponent.java
@@ -0,0 +1,84 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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.plugins.test.measurement;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.measurement.MeasurementDataNumeric;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+
+public class BZ821058ResourceComponent implements ResourceComponent<ResourceComponent<?>>, MeasurementFacet {
+
+ public List<Throwable> errors = Collections.synchronizedList(new ArrayList<Throwable>());
+ public CountDownLatch getValuesLatch = new CountDownLatch(1);
+
+ @Override
+ public AvailabilityType getAvailability() {
+ return AvailabilityType.UP;
+ }
+
+ @Override
+ public void start(ResourceContext<ResourceComponent<?>> context) throws Exception {
+ }
+
+ @Override
+ public void stop() {
+ }
+
+ /**
+ * To test BZ 821058, we just need to make sure we get exceptions if we try to
+ * manipulate the metrics set when this method is called by the PC.
+ */
+ @Override
+ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+ try {
+ for (Iterator<MeasurementScheduleRequest> i = metrics.iterator(); i.hasNext();) {
+ MeasurementScheduleRequest metric = i.next();
+ report.addData(new MeasurementDataNumeric(metric, new Double(1.0)));
+ System.out.println("===============PRE REMOVE");
+ i.remove(); // this should not be allowed
+ System.out.println("===============POST REMOVE");
+ }
+ } catch (Throwable e) {
+ errors.add(e);
+ }
+
+ try {
+ System.out.println("===============PRE CLEAR");
+ metrics.clear(); // this should not be allowed
+ System.out.println("===============POST CLEAR");
+ } catch (Throwable e) {
+ errors.add(e);
+ }
+
+ getValuesLatch.countDown();
+ return;
+ }
+}
diff --git a/modules/core/plugin-container-itest/src/test/resources/arquillian.xml b/modules/core/plugin-container-itest/src/test/resources/arquillian.xml
index b8b9271..92968b2 100644
--- a/modules/core/plugin-container-itest/src/test/resources/arquillian.xml
+++ b/modules/core/plugin-container-itest/src/test/resources/arquillian.xml
@@ -4,6 +4,15 @@
xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
<group qualifier="pcs">
+ <container qualifier="connected-pc-with-metric-collection">
+ <configuration>
+ <property name="serverServicesImplementationClassName">org.rhq.test.arquillian.MockingServerServices</property>
+ <property name="insideAgent">true</property>
+ <property name="startManagementBean">false</property>
+ <property name="measurementCollectionInitialDelay">10</property> <!-- start collecting metrics after 10s -->
+ </configuration>
+ </container>
+
<container qualifier="connected-pc" default="true">
<configuration>
<property name="serverServicesImplementationClassName">org.rhq.test.arquillian.MockingServerServices</property>
diff --git a/modules/core/plugin-container-itest/src/test/resources/bz821058-rhq-plugin.xml b/modules/core/plugin-container-itest/src/test/resources/bz821058-rhq-plugin.xml
new file mode 100644
index 0000000..730a656
--- /dev/null
+++ b/modules/core/plugin-container-itest/src/test/resources/bz821058-rhq-plugin.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin name="bz821058Plugin"
+ displayName="Plugin to test BZ 821058"
+ description="This will help test that measurement facet is given a read-only schedule set."
+ package="org.rhq.plugins.test.measurement"
+ version="1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <server name="BZ821058Server"
+ discovery="BZ821058DiscoveryComponent"
+ class="BZ821058ResourceComponent">
+
+ <metric property="metric1"
+ dataType="measurement"
+ defaultOn="true"
+ displayType="summary"
+ defaultInterval="30000" />
+
+ <metric property="metric2"
+ dataType="measurement"
+ defaultOn="true"
+ displayType="summary"
+ defaultInterval="30000" />
+ </server>
+</plugin>
+
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementCollectorRunner.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementCollectorRunner.java
index 3714ad9..ac13b06 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementCollectorRunner.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementCollectorRunner.java
@@ -23,6 +23,7 @@
package org.rhq.core.pc.measurement;
import java.util.ArrayDeque;
+import java.util.Collections;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.Callable;
@@ -130,7 +131,7 @@ public class MeasurementCollectorRunner implements Callable<MeasurementReport>,
Set<? extends MeasurementScheduleRequest> requests, Resource resource) {
try {
long start = System.currentTimeMillis();
- measurementComponent.getValues(report, (Set<MeasurementScheduleRequest>) requests);
+ measurementComponent.getValues(report, Collections.unmodifiableSet(requests));
long duration = (System.currentTimeMillis() - start);
if (duration > 2000L) {
String message = "[PERF] Collection of measurements for [" + resource + "] (component=["
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java
index 9ab82cb..dc7d0ca 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementManager.java
@@ -469,7 +469,7 @@ public class MeasurementManager extends AgentService implements MeasurementAgent
}
try {
- measurementFacet.getValues(report, requests);
+ measurementFacet.getValues(report, Collections.unmodifiableSet(requests));
} catch (Throwable t) {
LOG.error("Could not get measurement values", t);
return Collections.emptySet();
11 years, 10 months
[rhq] modules/core
by Jay Shaughnessy
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java | 4 ++--
modules/core/domain/src/main/java/org/rhq/core/domain/drift/Filter.java | 2 +-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java | 6 ++----
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java | 9 +--------
4 files changed, 6 insertions(+), 15 deletions(-)
New commits:
commit 00ea14c228bd08d6572d0f17ef8040e447b9a0dd
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jun 25 12:47:42 2012 -0400
[827647 Relative path for Drift Detections Definition Include/Excludes Path does not handle relative path alias or trailing file separator correctly]
There were two ways to go here. One was to add special case handling for
the various filter paths that equate to ".". The other was to normalize
in the Filter constructor. Since I tried option 1 and missed a spot in my
first try to fix it, I've now opted for option 2. The downside is only that
what the user types may get normalized to ".". But I added some more description
text to state as much. Also, existing Filter paths using "/" or "./" will
need to be updated to "." manually, but I doubt there are any out there
currently since it wasn't working.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
index dee6e01..5eaaeab 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
@@ -519,7 +519,7 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createIncludePath(boolean readOnly) {
String name = PROP_PATH;
- String description = "A file system directory path that is relative to (a sub-directory of) the base directory of the drift definition. The default is '.', the base directory itself.";
+ String description = "A file system directory path that is relative to (a sub-directory of) the base directory of the drift definition. The default is '.', the base directory itself. Note that '/' and './' will be normalized to '.' for consistent handling.";
boolean required = false;
PropertySimpleType type = PropertySimpleType.STRING;
@@ -592,7 +592,7 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createExcludePath(boolean readOnly) {
String name = PROP_PATH;
- String description = "A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift definition.";
+ String description = "A file system directory path that is relative to (a sub-directory of) the base directory of the drift definition. The default is '.', the base directory itself. Note that '/' and './' will be normalized to '.' for consistent handling.";
boolean required = true;
PropertySimpleType type = PropertySimpleType.STRING;
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/Filter.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/Filter.java
index b57eb32..7e7bc43 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/Filter.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/Filter.java
@@ -41,7 +41,7 @@ public class Filter implements Serializable {
}
public void setPath(String path) {
- if (path == null) {
+ if (path == null || "./".equals(path) || "/".equals(path)) {
this.path = ".";
} else {
this.path = path;
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 92042e7..dbc7a1d 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -404,8 +404,7 @@ public class DriftDetector implements Runnable {
}
}
- // package-private for test accessibility
- static Set<File> getScanDirectories(final File basedir, List<Filter> includes) {
+ private static Set<File> getScanDirectories(final File basedir, List<Filter> includes) {
Set<File> directories = new HashSet<File>();
@@ -414,8 +413,7 @@ public class DriftDetector implements Runnable {
} else {
for (Filter filter : includes) {
String path = filter.getPath();
- // support various ways of expressing the base directory with relative paths
- if (".".equals(path) || "./".equals(path) || "/".equals(path)) {
+ if (".".equals(path)) {
directories.add(basedir);
} else {
directories.add(new File(basedir, path));
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java
index d6812ba..eb3678c 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java
@@ -31,10 +31,8 @@ import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
import org.apache.commons.io.FileUtils;
-import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -85,12 +83,7 @@ public class FilterFileVisitorTest {
List<Filter> includes = asList(new Filter(".", "foo*"), new Filter("./", "*.war"), new Filter("/", "goo*"));
List<Filter> excludes = emptyList();
TestVisitor visitor = new TestVisitor();
-
- // This call normalizes the basedir.
- Set<File> dirs = DriftDetector.getScanDirectories(basedir, includes);
- Assert.assertEquals(dirs.size(), 1, "Should just be the basedir");
- File normalizedBaseDir = dirs.iterator().next();
- forEachFile(normalizedBaseDir, new FilterFileVisitor(normalizedBaseDir, includes, excludes, visitor));
+ forEachFile(basedir, new FilterFileVisitor(basedir, includes, excludes, visitor));
assertCollectionEqualsNoOrder(asList(fooJar, gooJar, myapp), visitor.visitedFiles,
"Filtering failed with multiple includes and no excludes");
11 years, 10 months
[rhq] modules/enterprise
by Jiri Kremser
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/ServerPluginControlView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java | 35 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceOperationNotificationSenderForm.java | 11 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleTypeDropDownSelectItem.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SortedSelectItem.java | 96 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupGraphPortlet.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddDefinitionWizardInfoStep.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftPinTemplateWizardInfoStep.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java | 34 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryInfoStep.java | 3
18 files changed, 168 insertions(+), 57 deletions(-)
New commits:
commit 1c7723b1fab7b3e0c16d94804014f70f3976960d
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon Jun 25 18:24:21 2012 +0200
[BZ 675150 - GWT: Alert definition : Conditions : metrics not sorted] Added new a class for serted version of the SelectItem
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/ServerPluginControlView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/ServerPluginControlView.java
index 597d158..df98a0a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/ServerPluginControlView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/ServerPluginControlView.java
@@ -47,6 +47,7 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ErrorMessageWindow;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.PluginGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
@@ -100,7 +101,7 @@ public class ServerPluginControlView extends LocatableVStack {
executeButton.setSrc(ImageManager.getOperationIcon());
executeButton.setPrompt(MSG.common_button_execute());
- final SelectItem controlNamesItem = new SelectItem("controlMenu", MSG.view_admin_plugins_serverControls_name());
+ final SelectItem controlNamesItem = new SortedSelectItem("controlMenu", MSG.view_admin_plugins_serverControls_name());
LinkedHashMap<String, String> controlNames = new LinkedHashMap<String, String>();
for (ServerPluginControlDefinition def : controlDefinitions) {
controlNames.put(def.getName(), def.getDisplayName());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java
index 225c5c5..f63eb55 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java
@@ -59,6 +59,7 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.components.form.RadioGroupWithComponentsItem;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.upload.DynamicFormHandler;
import org.rhq.enterprise.gui.coregui.client.components.upload.DynamicFormSubmitCompleteEvent;
import org.rhq.enterprise.gui.coregui.client.components.upload.PackageVersionFileUploadForm;
@@ -226,7 +227,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
SectionItem userSection = new SectionItem("userSection");
userSection.setDefaultValue(MSG.view_alert_definition_notification_cliScript_editor_whichUser());
- repoSelector = new SelectItem(extendLocatorId("repoSelector"), MSG
+ repoSelector = new SortedSelectItem(extendLocatorId("repoSelector"), MSG
.view_alert_definition_notification_cliScript_editor_selectRepo());
repoSelector.setDefaultToFirstOption(true);
repoSelector.setWrapTitle(false);
@@ -557,7 +558,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
private DynamicForm createExistingPackageForm() {
LocatableDynamicForm form = new LocatableDynamicForm(extendLocatorId("existingPackageForm"));
form.setTitleOrientation(TitleOrientation.TOP);
- existingPackageSelector = new SelectItem(extendLocatorId("existingPackageSelector"), "");
+ existingPackageSelector = new SortedSelectItem(extendLocatorId("existingPackageSelector"), "");
existingPackageSelector.setDefaultToFirstOption(true);
existingPackageSelector.setWrapTitle(false);
existingPackageSelector.setRedrawOnChange(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index c9785b8..2687a87 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -24,14 +24,12 @@
package org.rhq.enterprise.gui.coregui.client.alert.definitions;
import java.util.ArrayList;
-import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
-import java.util.SortedSet;
import java.util.TreeSet;
import com.smartgwt.client.types.Alignment;
@@ -62,6 +60,7 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.form.DurationItem;
import org.rhq.enterprise.gui.coregui.client.components.form.NumberWithUnitsValidator;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.form.TimeUnit;
import org.rhq.enterprise.gui.coregui.client.util.measurement.MeasurementParser;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
@@ -176,7 +175,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
setMargin(20);
- conditionTypeSelectItem = new SelectItem("conditionType",
+ conditionTypeSelectItem = new SortedSelectItem("conditionType",
MSG.view_alert_definition_condition_editor_option_label());
LinkedHashMap<String, String> condTypes = new LinkedHashMap<String, String>(7);
condTypes.put(AlertConditionCategory.AVAILABILITY.name(),
@@ -761,7 +760,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
}
}
- SelectItem traitSelection = new SelectItem(TRAIT_METRIC_ITEMNAME,
+ SelectItem traitSelection = new SortedSelectItem(TRAIT_METRIC_ITEMNAME,
MSG.view_alert_definition_condition_editor_metric_trait_change_value());
traitSelection.setValueMap(traitsMap);
traitSelection.setDefaultValue(traitsMap.keySet().iterator().next()); // just use the first one
@@ -782,7 +781,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
StaticTextItem helpItem = buildHelpTextItem("availabilityHelp", helpStr, ifFunc);
formItems.add(helpItem);
- SelectItem selection = new SelectItem(AVAILABILITY_ITEMNAME,
+ SelectItem selection = new SortedSelectItem(AVAILABILITY_ITEMNAME,
MSG.view_alert_definition_condition_editor_availability_value());
LinkedHashMap<String, String> avails = new LinkedHashMap<String, String>(2);
avails.put(AlertConditionOperator.AVAIL_GOES_DOWN.name(),
@@ -815,7 +814,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
StaticTextItem helpItem = buildHelpTextItem("availabilityDurationHelp", helpStr, ifFunc);
formItems.add(helpItem);
- SelectItem selection = new SelectItem(AVAILABILITY_DURATION_ITEMNAME,
+ SelectItem selection = new SortedSelectItem(AVAILABILITY_DURATION_ITEMNAME,
MSG.view_alert_definition_condition_editor_availabilityDuration());
LinkedHashMap<String, String> avails = new LinkedHashMap<String, String>(2);
avails.put(AlertConditionOperator.AVAIL_DURATION_DOWN.name(),
@@ -856,7 +855,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
ops.put(opDef.getName(), opDef.getDisplayName());
}
- SelectItem opSelection = new SelectItem(OPERATION_NAME_ITEMNAME, MSG.common_title_value());
+ SelectItem opSelection = new SortedSelectItem(OPERATION_NAME_ITEMNAME, MSG.common_title_value());
opSelection.setValueMap(ops);
opSelection.setDefaultValue(ops.keySet().iterator().next()); // just use the first one
opSelection.setWidth("*");
@@ -864,7 +863,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
opSelection.setShowIfCondition(ifFunc);
formItems.add(opSelection);
- SelectItem opResultsSelection = new SelectItem(OPERATION_RESULTS_ITEMNAME, MSG.common_title_status());
+ SelectItem opResultsSelection = new SortedSelectItem(OPERATION_RESULTS_ITEMNAME, MSG.common_title_status());
LinkedHashMap<String, String> operationStatuses = new LinkedHashMap<String, String>(4);
operationStatuses.put(OperationRequestStatus.INPROGRESS.name(), MSG.common_status_inprogress());
operationStatuses.put(OperationRequestStatus.SUCCESS.name(), MSG.common_status_success());
@@ -969,15 +968,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
}
LinkedHashMap<String, String> metricsMap = new LinkedHashMap<String, String>();
- SortedSet<MeasurementDefinition> sortedDefs = new TreeSet<MeasurementDefinition>(
- new Comparator<MeasurementDefinition>() {
-
- @Override
- public int compare(MeasurementDefinition o1, MeasurementDefinition o2) {
- return o1.getDisplayName().compareTo(o2.getDisplayName());
- }
- });
- sortedDefs.addAll(this.resourceType.getMetricDefinitions());
+ Set<MeasurementDefinition> sortedDefs = new HashSet<MeasurementDefinition>(this.resourceType.getMetricDefinitions());
for (MeasurementDefinition def : sortedDefs) {
if (def.getDataType() == DataType.MEASUREMENT) {
@@ -994,7 +985,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
return null; // all metrics should be hidden
}
- SelectItem metricSelection = new SelectItem(itemName,
+ SelectItem metricSelection = new SortedSelectItem(itemName,
MSG.view_alert_definition_condition_editor_metric_threshold_name());
metricSelection.setValueMap(metricsMap);
metricSelection.setDefaultValue(metricsMap.keySet().iterator().next()); // just use the first one
@@ -1013,7 +1004,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
}
}
- SelectItem metricSelection = new SelectItem(itemName,
+ SelectItem metricSelection = new SortedSelectItem(itemName,
MSG.view_alert_definition_condition_editor_metric_calltime_common_name());
metricSelection.setValueMap(metricsMap);
metricSelection.setDefaultValue(metricsMap.keySet().iterator().next()); // just use the first one
@@ -1033,7 +1024,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
comparators.put(">", "> (" + MSG.view_alert_definition_condition_editor_metric_threshold_comparator_greater()
+ ")");
- SelectItem comparatorSelection = new SelectItem(itemName,
+ SelectItem comparatorSelection = new SortedSelectItem(itemName,
MSG.view_alert_definition_condition_editor_metric_threshold_comparator());
comparatorSelection.setValueMap(comparators);
comparatorSelection.setDefaultValue("<");
@@ -1051,7 +1042,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
comparators.put("CH", MSG.view_alert_definition_condition_editor_metric_calltime_common_comparator_changes());
comparators.put("HI", MSG.view_alert_definition_condition_editor_metric_calltime_common_comparator_grows());
- SelectItem comparatorSelection = new SelectItem(itemName,
+ SelectItem comparatorSelection = new SortedSelectItem(itemName,
MSG.view_alert_definition_condition_editor_metric_calltime_common_comparator());
comparatorSelection.setValueMap(comparators);
comparatorSelection.setDefaultValue("CH");
@@ -1070,7 +1061,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
comparators.put("<=", MSG.view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive());
comparators.put(">=", MSG.view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive());
- SelectItem comparatorSelection = new SelectItem(itemName,
+ SelectItem comparatorSelection = new SortedSelectItem(itemName,
MSG.view_alert_definition_condition_editor_metric_range_comparator());
comparatorSelection.setValueMap(comparators);
comparatorSelection.setDefaultValue("<");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java
index 666ecfa..9cf0850 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java
@@ -45,6 +45,7 @@ import org.rhq.core.domain.alert.notification.AlertNotification;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
@@ -84,7 +85,7 @@ public class NewNotificationEditor extends LocatableDynamicForm {
senderCanvasItem.setShowTitle(false);
senderCanvasItem.setColSpan(2);
- notificationSenderSelectItem = new SelectItem("notificationSender", MSG
+ notificationSenderSelectItem = new SortedSelectItem("notificationSender", MSG
.view_alert_definition_notification_editor_sender());
notificationSenderSelectItem.setDefaultToFirstOption(true);
notificationSenderSelectItem.setWrapTitle(false);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
index 0e8f1b2..e34f2eb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/RecoveryAlertDefinitionForm.java
@@ -37,6 +37,7 @@ import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
@@ -171,7 +172,7 @@ public class RecoveryAlertDefinitionForm extends LocatableDynamicForm implements
.view_alert_definition_recovery_editor_disable_when_fired());
disableWhenFiredStatic.setWrapTitle(false);
- recoverAlertSelection = new SelectItem("recoveryAlert", MSG
+ recoverAlertSelection = new SortedSelectItem("recoveryAlert", MSG
.view_alert_definition_recovery_editor_recovery_alert());
recoverAlertSelection.setDefaultValue("0");
recoverAlertSelection.setWrapTitle(false);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceOperationNotificationSenderForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceOperationNotificationSenderForm.java
index 4a565a2..cc4e061 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceOperationNotificationSenderForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ResourceOperationNotificationSenderForm.java
@@ -59,9 +59,10 @@ import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.alert.definitions.ResourceOperationNotificationInfo.ResourceSelectionMode;
import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.SingleResourcePicker;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourcePicker.OkHandler;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.SingleResourcePicker;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
@@ -109,7 +110,7 @@ public class ResourceOperationNotificationSenderForm extends AbstractNotificatio
operationArgumentsCanvasItem.setHeight(400);
operationArgumentsCanvasItem.setWidth(500);
- operationSelectItem = new SelectItem("operationSelectItem", MSG
+ operationSelectItem = new SortedSelectItem("operationSelectItem", MSG
.view_alert_definition_notification_operation_editor_common_operation());
operationSelectItem.setStartRow(true);
operationSelectItem.setEndRow(true);
@@ -160,7 +161,7 @@ public class ResourceOperationNotificationSenderForm extends AbstractNotificatio
// for RELATIVE mode
- ancestorTypeSelectItem = new SelectItem("ancestorTypeSelectItem", MSG
+ ancestorTypeSelectItem = new SortedSelectItem("ancestorTypeSelectItem", MSG
.view_alert_definition_notification_operation_editor_relative_ancestor());
ancestorTypeSelectItem.setStartRow(true);
ancestorTypeSelectItem.setEndRow(true);
@@ -178,7 +179,7 @@ public class ResourceOperationNotificationSenderForm extends AbstractNotificatio
}
});
- descendantTypeSelectItem = new SelectItem("descendantTypeSelectItem", MSG
+ descendantTypeSelectItem = new SortedSelectItem("descendantTypeSelectItem", MSG
.view_alert_definition_notification_operation_editor_relative_descendant());
descendantTypeSelectItem.setStartRow(true);
descendantTypeSelectItem.setEndRow(false);
@@ -208,7 +209,7 @@ public class ResourceOperationNotificationSenderForm extends AbstractNotificatio
// the mode selector menu
- modeSelectItem = new SelectItem("modeSelectItem", MSG
+ modeSelectItem = new SortedSelectItem("modeSelectItem", MSG
.view_alert_definition_notification_operation_editor_mode_title());
modeSelectItem.setStartRow(true);
modeSelectItem.setEndRow(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java
index fd1a659..037bc10 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java
@@ -32,6 +32,7 @@ import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.bundle.list.BundlesDataSource;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.selector.AbstractSelector;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
@@ -54,7 +55,7 @@ public class BundleSelector extends AbstractSelector<Bundle, BundleCriteria> {
availableFilterForm.setNumCols(4);
final TextItem search = new TextItem("search", MSG.common_title_search());
- final SelectItem bundleTypeSelect = new SelectItem("bundleType", MSG.view_bundle_bundleType());
+ final SelectItem bundleTypeSelect = new SortedSelectItem("bundleType", MSG.view_bundle_bundleType());
bundleService.getAllBundleTypes(new AsyncCallback<ArrayList<BundleType>>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.dataSource_bundle_loadFailed(), caught);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleTypeDropDownSelectItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleTypeDropDownSelectItem.java
index 959237b..572ad7e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleTypeDropDownSelectItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleTypeDropDownSelectItem.java
@@ -23,12 +23,12 @@ import java.util.HashMap;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
@@ -37,7 +37,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* Provides a drop down menu that allows one to select a bundle type.
*/
-public class BundleTypeDropDownSelectItem extends SelectItem {
+public class BundleTypeDropDownSelectItem extends SortedSelectItem {
private final HashMap<String, BundleType> knownBundleTypes = new HashMap<String, BundleType>();
private BundleType selected = null;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
index e68d159..154217b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
@@ -34,6 +34,7 @@ import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
@@ -55,7 +56,7 @@ public class SelectBundleVersionStep extends AbstractWizardStep {
private DynamicForm form;
private RadioGroupItem radioGroupItem = new RadioGroupItem("options", "Deploy Options");
- private SelectItem selectVersionItem = new SelectItem("selectVersion", "Deployment Version");
+ private SelectItem selectVersionItem = new SortedSelectItem("selectVersion", "Deployment Version");
private LinkedHashMap<String, String> radioGroupValues = new LinkedHashMap<String, String>();
private LinkedHashMap<String, String> selectVersionValues = new LinkedHashMap<String, String>();
private PageList<BundleVersion> bundleVersions = null;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
index dc32e91..4e3e9df 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
@@ -117,6 +117,7 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.components.form.IsLongValidator;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
@@ -830,7 +831,7 @@ public class ConfigurationEditor extends LocatableVLayout {
LocatableDynamicForm deleteForm = new LocatableDynamicForm(deleteControlsLayout.extendLocatorId("Form"));
deleteForm.setWidth100();
- final SelectItem selectItem = new SelectItem();
+ final SelectItem selectItem = new SortedSelectItem();
selectItem.setMultiple(true);
selectItem.setMultipleAppearance(MultipleAppearance.GRID);
selectItem.setTitle(MSG.common_button_delete());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java
index 6b38965..b12382a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java
@@ -69,6 +69,7 @@ import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.PopupWindow;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
@@ -755,12 +756,12 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
((ComboBoxItem) editorItem).setAddUnknownValues(true);
} else {
if (valueOptions.size() > 5) {
- editorItem = new SelectItem();
+ editorItem = new SortedSelectItem();
} else {
// TODO: we want RadioGroupItem, but smartgwt seems to have a bug and it won't render this when
// our listgrid does not have the "unset" boolean field also present. If its just the value
// field, the radio group editor won't show.
- editorItem = new SelectItem(); // new RadioGroupItem();
+ editorItem = new SortedSelectItem(); // new RadioGroupItem();
}
}
editorItem.setValueMap(valueOptions);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SortedSelectItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SortedSelectItem.java
new file mode 100644
index 0000000..4f483e9
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/SortedSelectItem.java
@@ -0,0 +1,96 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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 java.util.Arrays;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+
+/**
+ * A convenience class for a sorted variant of {@link SelectItem}.
+ *
+ * @author Jirka Kremser
+ */
+public class SortedSelectItem extends SelectItem {
+ public SortedSelectItem() {
+ super();
+ }
+
+ public SortedSelectItem(JavaScriptObject jsObj) {
+ super(jsObj);
+ }
+
+ public SortedSelectItem(String name) {
+ super(name);
+ }
+
+ public SortedSelectItem(String name, String title) {
+ super(name, title);
+ }
+
+ @Override
+ public void setValueMap(@SuppressWarnings("rawtypes")
+ LinkedHashMap valueMap) {
+ if (valueMap == null) {
+ throw new IllegalArgumentException("valueMap cannot be null");
+ }
+ @SuppressWarnings("unchecked")
+ LinkedHashMap<String, String> safeValueMap = (LinkedHashMap<String, String>) valueMap;
+ LinkedHashMap<String, String> sortedValueMap = new LinkedHashMap<String, String>(valueMap.size());
+ SortedSet<Entry<String, String>> sortedEntries = new TreeSet<Entry<String, String>>(
+ new Comparator<Entry<String, String>>() {
+
+ @Override
+ public int compare(Entry<String, String> o1, Entry<String, String> o2) {
+ return o1.getValue().compareTo(o2.getValue());
+ }
+ });
+ sortedEntries.addAll(safeValueMap.entrySet());
+ for (Entry<String, String> entry : sortedEntries) {
+ sortedValueMap.put(entry.getKey(), entry.getValue());
+ }
+
+ super.setValueMap(sortedValueMap);
+ }
+
+ @Override
+ public void setValueMap(String... valueMap) {
+ if (valueMap == null) {
+ throw new IllegalArgumentException("valueMap cannot be null");
+ }
+ String[] sortedValueArray = new String[valueMap.length];
+ System.arraycopy(valueMap, 0, sortedValueArray, 0, valueMap.length);
+ Arrays.sort(sortedValueArray);
+
+ super.setValueMap(sortedValueArray);
+ }
+
+ @Override
+ public void setValues(String... valueMap) {
+ setValueMap(valueMap);
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupGraphPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupGraphPortlet.java
index d91fc3b..7e75fae 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupGraphPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/groups/graph/ResourceGroupGraphPortlet.java
@@ -35,6 +35,7 @@ import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.dashboard.DashboardPortlet;
import org.rhq.core.domain.resource.group.GroupCategory;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.selector.AssignedItemsChangedEvent;
import org.rhq.enterprise.gui.coregui.client.components.selector.AssignedItemsChangedHandler;
import org.rhq.enterprise.gui.coregui.client.dashboard.CustomSettingsPortlet;
@@ -125,7 +126,7 @@ public class ResourceGroupGraphPortlet extends ResourceGroupMetricGraphView impl
//rec.setAttribute("name", "current");
//resourceGroupSelector.setAssigned(new ListGridRecord[] { rec });
- final SelectItem metric = new SelectItem(CFG_DEFINITION_ID, MSG.common_title_metric()) {
+ final SelectItem metric = new SortedSelectItem(CFG_DEFINITION_ID, MSG.common_title_metric()) {
@Override
protected Criteria getPickListFilterCriteria() {
Criteria criteria = new Criteria();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddDefinitionWizardInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddDefinitionWizardInfoStep.java
index c2139c1..63722cc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddDefinitionWizardInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddDefinitionWizardInfoStep.java
@@ -38,6 +38,7 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.drift.DriftConfigurationDefinition;
import org.rhq.core.domain.drift.DriftDefinitionTemplate;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
@@ -76,7 +77,7 @@ public class DriftAddDefinitionWizardInfoStep extends AbstractWizardStep {
SpacerItem spacerItem = new SpacerItem("Spacer");
formItems.add(spacerItem);
- SelectItem templateSelectItem = new SelectItem("Template", MSG.view_drift_wizard_addDef_templatePrompt());
+ SelectItem templateSelectItem = new SortedSelectItem("Template", MSG.view_drift_wizard_addDef_templatePrompt());
templateSelectItem.setTitleOrientation(TitleOrientation.TOP);
templateSelectItem.setAlign(Alignment.LEFT);
templateSelectItem.setWidth(300);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftPinTemplateWizardInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftPinTemplateWizardInfoStep.java
index 742b44d..ee7da2a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftPinTemplateWizardInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftPinTemplateWizardInfoStep.java
@@ -38,8 +38,9 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import org.rhq.core.domain.drift.DriftDefinitionComparator;
-import org.rhq.core.domain.drift.DriftDefinitionTemplate;
import org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode;
+import org.rhq.core.domain.drift.DriftDefinitionTemplate;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
@@ -59,7 +60,7 @@ public class DriftPinTemplateWizardInfoStep extends AbstractWizardStep {
private AbstractDriftPinTemplateWizard wizard;
private LocatableDynamicForm selectTemplateForm;
- SelectItem selectTemplateItem = new SelectItem("Template", MSG.view_drift_wizard_addDef_templatePrompt());
+ SelectItem selectTemplateItem = new SortedSelectItem("Template", MSG.view_drift_wizard_addDef_templatePrompt());
public DriftPinTemplateWizardInfoStep(AbstractDriftPinTemplateWizard wizard) {
this.wizard = wizard;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index 1ac329d..c52eb30 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -60,6 +60,7 @@ import org.rhq.enterprise.gui.coregui.client.components.configuration.Configurat
import org.rhq.enterprise.gui.coregui.client.components.form.AbstractRecordEditor;
import org.rhq.enterprise.gui.coregui.client.components.form.DurationItem;
import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.form.TimeUnit;
import org.rhq.enterprise.gui.coregui.client.components.form.UnitType;
import org.rhq.enterprise.gui.coregui.client.components.trigger.JobTriggerEditor;
@@ -188,7 +189,7 @@ public abstract class AbstractOperationScheduleDetailsView extends
items.add(idItem);
}
- SelectItem operationNameItem = new SelectItem(AbstractOperationScheduleDataSource.Field.OPERATION_NAME);
+ SelectItem operationNameItem = new SortedSelectItem(AbstractOperationScheduleDataSource.Field.OPERATION_NAME);
operationNameItem.setShowTitle(true);
items.add(operationNameItem);
operationNameItem.addChangedHandler(new ChangedHandler() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java
index d108dc4..2f99096 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionExpressionBuilder.java
@@ -23,12 +23,26 @@
package org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.events.CloseClickEvent;
import com.smartgwt.client.widgets.events.CloseClickHandler;
-import com.smartgwt.client.widgets.form.fields.*;
-import com.smartgwt.client.widgets.form.fields.events.*;
+import com.smartgwt.client.widgets.form.fields.ButtonItem;
+import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.TextAreaItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
+import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
+import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
+
import org.rhq.core.domain.criteria.Criteria.Restriction;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.plugin.Plugin;
@@ -36,16 +50,13 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.GroupDefinitionExpressionBuilderGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-
/**
* A dialog window that lets you build custom dynagroup expressions.
*
@@ -121,7 +132,7 @@ public class GroupDefinitionExpressionBuilder extends LocatableWindow {
}
});
- this.compareTypeItem = new SelectItem("compareType", MSG.view_dynagroup_exprBuilder_comparisonType());
+ this.compareTypeItem = new SortedSelectItem("compareType", MSG.view_dynagroup_exprBuilder_comparisonType());
this.compareTypeItem.setTooltip(MSG.view_dynagroup_exprBuilder_comparisonType_tooltip());
this.compareTypeItem.setHoverWidth(250);
this.compareTypeItem.setRedrawOnChange(true);
@@ -166,7 +177,7 @@ public class GroupDefinitionExpressionBuilder extends LocatableWindow {
}
});
- this.resourceTypeItem = new SelectItem("resourceType", MSG.view_dynagroup_exprBuilder_resourceType());
+ this.resourceTypeItem = new SortedSelectItem("resourceType", MSG.view_dynagroup_exprBuilder_resourceType());
this.resourceTypeItem.setTooltip(MSG.view_dynagroup_exprBuilder_resourceType_tooltip());
this.resourceTypeItem.setHoverWidth(250);
this.resourceTypeItem.setRedrawOnChange(true);
@@ -180,7 +191,7 @@ public class GroupDefinitionExpressionBuilder extends LocatableWindow {
}
});
- this.pluginItem = new SelectItem("plugin", MSG.view_dynagroup_exprBuilder_definingPlugin());
+ this.pluginItem = new SortedSelectItem("plugin", MSG.view_dynagroup_exprBuilder_definingPlugin());
this.pluginItem.setTooltip(MSG.view_dynagroup_exprBuilder_definingPlugin_tooltip());
this.pluginItem.setHoverWidth(250);
this.pluginItem.setRedrawOnChange(true);
@@ -223,7 +234,7 @@ public class GroupDefinitionExpressionBuilder extends LocatableWindow {
}
});
- this.expressionTypeItem = new SelectItem("expressionType", MSG.view_dynagroup_exprBuilder_expressionType());
+ this.expressionTypeItem = new SortedSelectItem("expressionType", MSG.view_dynagroup_exprBuilder_expressionType());
this.expressionTypeItem.setTooltip(MSG.view_dynagroup_exprBuilder_expressionType_tooltip());
this.expressionTypeItem.setHoverWidth(250);
this.expressionTypeItem.setRedrawOnChange(true);
@@ -243,7 +254,7 @@ public class GroupDefinitionExpressionBuilder extends LocatableWindow {
}
});
- this.resourceItem = new SelectItem("resource", MSG.view_dynagroup_exprBuilder_resource());
+ this.resourceItem = new SortedSelectItem("resource", MSG.view_dynagroup_exprBuilder_resource());
this.resourceItem.setTooltip(MSG.view_dynagroup_exprBuilder_resource_tooltip());
this.resourceItem.setHoverWidth(250);
this.resourceItem.setRedrawOnChange(true);
@@ -430,7 +441,6 @@ public class GroupDefinitionExpressionBuilder extends LocatableWindow {
typeNames.add(type.getName());
resourceTypeIds.put(type.getName(), Integer.valueOf(type.getId()));
}
- Collections.sort(typeNames);
resourceTypeItem.setValueMap(typeNames.toArray(new String[typeNames.size()]));
} else {
resourceTypeItem.setValueMap(new String[0]);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryInfoStep.java
index 20ebf5f..329c7f9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryInfoStep.java
@@ -37,6 +37,7 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.content.Architecture;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.SortedSelectItem;
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
@@ -147,7 +148,7 @@ public class ResourceFactoryInfoStep extends AbstractWizardStep {
}
if (null != templatePrompt) {
- SelectItem templateSelect = new SelectItem("template", templatePrompt);
+ SelectItem templateSelect = new SortedSelectItem("template", templatePrompt);
templateSelect.setTitleOrientation(TitleOrientation.TOP);
templateSelect.setAlign(Alignment.LEFT);
templateSelect.setWidth(300);
11 years, 10 months
[rhq] modules/plugins
by ips
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java | 17 +++++-
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java | 28 ++++++----
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/serviceBinding/ManagerComponent.java | 10 +--
3 files changed, 40 insertions(+), 15 deletions(-)
New commits:
commit 841e1f0adfabed848b9f841b1856e4abecf1620a
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Jun 25 12:17:46 2012 -0400
[BZ 835113] fix so EJB2 MDB Resources do not erroneously return an avail of DOWN (https://bugzilla.redhat.com/show_bug.cgi?id=835113)
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java
index ebbf9bb..c4ae68f 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java
@@ -1,6 +1,6 @@
/*
* Jopr Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
+ * Copyright (C) 2005-2012 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -27,7 +27,9 @@ import java.util.Set;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ComponentType;
import org.jboss.managed.api.ManagedComponent;
+import org.jboss.managed.api.RunState;
+import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.plugins.jbossas5.util.Ejb2BeanUtils;
/**
@@ -39,6 +41,19 @@ public class Ejb2BeanComponent extends AbstractEjbBeanComponent {
private static final ComponentType MDB_COMPONENT_TYPE = new ComponentType("EJB", "MDB");
@Override
+ protected AvailabilityType getAvailabilityForRunState(RunState runState) {
+ AvailabilityType avail;
+ if (MDB_COMPONENT_TYPE.equals(getComponentType())) {
+ // This is a workaround for if BZ 835113.
+ avail = (runState == RunState.RUNNING || runState == RunState.UNKNOWN) ?
+ AvailabilityType.UP : AvailabilityType.DOWN;
+ } else {
+ avail = super.getAvailabilityForRunState(runState);
+ }
+ return avail;
+ }
+
+ @Override
protected ManagedComponent getManagedComponent() {
if (MDB_COMPONENT_TYPE.equals(getComponentType())) {
try {
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
index 5d28473..a44cfc8 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
@@ -124,22 +124,32 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
// ResourceComponent Implementation --------------------------------------------
public AvailabilityType getAvailability() {
- long timeSinceComponentRefresh = System.currentTimeMillis() - lastComponentRefresh;
- if (timeSinceComponentRefresh > availRefreshInterval) {
- if (log.isDebugEnabled()) {
- log.debug("The availability refresh interval for [resourceKey: "
- + getResourceContext().getResourceKey() + ", type: " + componentType + ", name: " + componentName
- + "] has been exceeded by " + (timeSinceComponentRefresh - availRefreshInterval)
- + " ms. Reloading managed component.");
- }
+ if (lastComponentRefresh == 0) {
+ // The managed component has not been refreshed at all yet.
getManagedComponent();
+ } else {
+ long timeSinceComponentRefresh = System.currentTimeMillis() - lastComponentRefresh;
+ if (timeSinceComponentRefresh > availRefreshInterval) {
+ if (log.isDebugEnabled()) {
+ log.debug("The availability refresh interval for [resourceKey: "
+ + getResourceContext().getResourceKey() + ", type: " + componentType + ", name: " + componentName
+ + "] has been exceeded by " + (timeSinceComponentRefresh - availRefreshInterval)
+ + " ms. Reloading managed component...");
+ }
+ getManagedComponent();
+ }
}
+ return getAvailabilityForRunState(runState);
+ }
+
+ protected AvailabilityType getAvailabilityForRunState(RunState runState) {
if (runState == RunState.RUNNING) {
return AvailabilityType.UP;
} else {
if (log.isDebugEnabled()) {
- log.debug(componentType + " component '" + componentName + "' was not running, state was : " + runState);
+ log.debug(componentType + " component '" + componentName + "' was not running - state was [" + runState
+ + "].");
}
return AvailabilityType.DOWN;
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/serviceBinding/ManagerComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/serviceBinding/ManagerComponent.java
index ba2a4c9..eae8b13 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/serviceBinding/ManagerComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/serviceBinding/ManagerComponent.java
@@ -71,13 +71,13 @@ public class ManagerComponent extends ManagedComponentComponent implements Creat
private static final String RESOURCE_KEY_SEPARATOR = "!)@(#*";
@Override
- public AvailabilityType getAvailability() {
- RunState runState = getManagedComponent().getRunState();
- return (runState == RunState.RUNNING || runState == RunState.UNKNOWN) ? AvailabilityType.UP
- : AvailabilityType.DOWN;
+ protected AvailabilityType getAvailabilityForRunState(RunState runState) {
+ // This is a workaround for a bug where the binding manager MO will return a run state of UNKNOWN even when it's
+ // happily running.
+ return (runState == RunState.RUNNING || runState == RunState.UNKNOWN) ?
+ AvailabilityType.UP : AvailabilityType.DOWN;
}
-
// ConfigurationFacet -----------------------------
@Override
11 years, 10 months
[rhq] modules/enterprise
by Jiri Kremser
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java | 12 ++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
New commits:
commit b352ab20a4e0deb0d9eccf1d492de2917d2098c2
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon Jun 25 15:16:12 2012 +0200
[BZ 815321 - Platform alert conditions for availability (Goes Disabled and Goes Unknown ) should be removed] Options have been reomved when adding alert condition for resource of type platform
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index 61e2f21..c9785b8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -57,6 +57,7 @@ import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.measurement.NumericType;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationRequestStatus;
+import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.form.DurationItem;
@@ -786,10 +787,13 @@ public class NewConditionEditor extends LocatableDynamicForm {
LinkedHashMap<String, String> avails = new LinkedHashMap<String, String>(2);
avails.put(AlertConditionOperator.AVAIL_GOES_DOWN.name(),
MSG.view_alert_definition_condition_editor_operator_availability_goesDown());
- avails.put(AlertConditionOperator.AVAIL_GOES_DISABLED.name(),
- MSG.view_alert_definition_condition_editor_operator_availability_goesDisabled());
- avails.put(AlertConditionOperator.AVAIL_GOES_UNKNOWN.name(),
- MSG.view_alert_definition_condition_editor_operator_availability_goesUnknown());
+ // do not add 'Goes Disabled' and 'Goes Unknown' for platform
+ if (resourceType.getCategory() != ResourceCategory.PLATFORM) {
+ avails.put(AlertConditionOperator.AVAIL_GOES_DISABLED.name(),
+ MSG.view_alert_definition_condition_editor_operator_availability_goesDisabled());
+ avails.put(AlertConditionOperator.AVAIL_GOES_UNKNOWN.name(),
+ MSG.view_alert_definition_condition_editor_operator_availability_goesUnknown());
+ }
avails.put(AlertConditionOperator.AVAIL_GOES_NOT_UP.name(),
MSG.view_alert_definition_condition_editor_operator_availability_goesNotUp());
avails.put(AlertConditionOperator.AVAIL_GOES_UP.name(),
11 years, 10 months
[rhq] modules/plugins
by ips
modules/plugins/jboss-as-7/pom.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
New commits:
commit 1fb0b4a36e7c66607dea51cc539511352702ed3f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Jun 22 17:21:57 2012 -0400
delete the itest AS7 home dir before, as well as after, the itests run
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index 16eb982..a640c0541 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -305,9 +305,9 @@
location="${java.io.tmpdir}/jboss-${as7.product}-${as7.version}.zip"/>
<get src="${as7.url}" dest="${as7.zipfile}" usetimestamp="true" verbose="true"/>
<unzip src="${as7.zipfile}" dest="${java.io.tmpdir}"/>
+ <delete dir="${jboss7.home}" verbose="true"/>
<move file="${java.io.tmpdir}/jboss-eap-6.0"
- tofile="${java.io.tmpdir}/jboss-as-${as7.version}" failonerror="false"
- overwrite="false"/>
+ tofile="${jboss7.home}" failonerror="false"/>
<chmod perm="u+rx">
<fileset dir="${jboss7.home}/bin" includes="*.sh"/>
@@ -332,7 +332,7 @@
</goals>
<configuration>
<target>
- <delete dir="${jboss7.home}"/>
+ <delete dir="${jboss7.home}" verbose="true"/>
</target>
</configuration>
</execution>
11 years, 10 months
[rhq] modules/core
by Jay Shaughnessy
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
New commits:
commit d6eef33569e9285f488f047c30017c03215e85c6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jun 22 17:19:59 2012 -0400
Another attempt at fixing this test failure. It's hard to fix linux failures on win :)
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java
index 8d31a82..d6812ba 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/FilterFileVisitorTest.java
@@ -89,7 +89,8 @@ public class FilterFileVisitorTest {
// This call normalizes the basedir.
Set<File> dirs = DriftDetector.getScanDirectories(basedir, includes);
Assert.assertEquals(dirs.size(), 1, "Should just be the basedir");
- forEachFile(dirs.iterator().next(), new FilterFileVisitor(basedir, includes, excludes, visitor));
+ File normalizedBaseDir = dirs.iterator().next();
+ forEachFile(normalizedBaseDir, new FilterFileVisitor(normalizedBaseDir, includes, excludes, visitor));
assertCollectionEqualsNoOrder(asList(fooJar, gooJar, myapp), visitor.visitedFiles,
"Filtering failed with multiple includes and no excludes");
11 years, 10 months
[rhq] modules/core modules/enterprise
by Jay Shaughnessy
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java | 30 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java | 6
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java | 78 +++++++++-
7 files changed, 109 insertions(+), 21 deletions(-)
New commits:
commit 2c5974fbda6a05ab0d7d233c190740d45df067d5
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jun 22 16:09:36 2012 -0400
[830463 - Re-enabling (actually, updating) an alert definition clears condition logs for existing alerts]
Some follow-on work. Add optimization such that if conditions are not being
updated we don't detach the AlertCondition from the def, since they are
unchanged.
- Add related unit testing
- re-enable the tests in AlertConditionTest, which pass but for some
reason were not enabled.
- Fix a few parameter names that I missed updating last time.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
index 397e254..71ca46c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDefinition.java
@@ -62,7 +62,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
* @author Joseph Marques
*/
@Entity
-@NamedQueries( { //
+@NamedQueries({ //
@NamedQuery(name = AlertDefinition.QUERY_FIND_ALL, query = "" //
+ "SELECT a " //
+ " FROM AlertDefinition a " //
@@ -409,6 +409,16 @@ public class AlertDefinition implements Serializable {
}
public void update(AlertDefinition alertDef) {
+ update(alertDef, true);
+ }
+
+ /**
+ * @param alertDef
+ * @param updateConditions set to true if conditions are being updated. This incurs overhead because the
+ * old AlertConditions get detached and replaced for no good reason, becoming a cleanup burden later on. Only
+ * set to false if you are sure the conditions are not being updated. If false the conditions will not be updated.
+ */
+ public void update(AlertDefinition alertDef, boolean updateConditions) {
/*
* Don't copy the id, ctime, or mtime.
*/
@@ -440,15 +450,17 @@ public class AlertDefinition implements Serializable {
this.recoveryId = alertDef.recoveryId;
- // copy conditions
- List<AlertCondition> copiedConditions = new ArrayList<AlertCondition>();
- for (AlertCondition oldCondition : alertDef.getConditions()) {
- AlertCondition newCondition = new AlertCondition(oldCondition);
- newCondition.setAlertDefinition(this);
- copiedConditions.add(newCondition);
+ // copy conditions if necessary
+ if (updateConditions) {
+ List<AlertCondition> copiedConditions = new ArrayList<AlertCondition>();
+ for (AlertCondition oldCondition : alertDef.getConditions()) {
+ AlertCondition newCondition = new AlertCondition(oldCondition);
+ newCondition.setAlertDefinition(this);
+ copiedConditions.add(newCondition);
+ }
+ this.removeAllConditions();
+ this.getConditions().addAll(copiedConditions);
}
- this.removeAllConditions();
- this.getConditions().addAll(copiedConditions);
// copy notifications
List<AlertNotification> copiedNotifications = new ArrayList<AlertNotification>();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
index 987e62f..0c710b4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java
@@ -206,7 +206,7 @@ public class TemplateAlertDefinitionsView extends AbstractAlertDefinitionsView {
}
@Override
- protected void commitAlertDefinition(final AlertDefinition alertDefinition, boolean purgeInternals) {
+ protected void commitAlertDefinition(final AlertDefinition alertDefinition, boolean resetMatching) {
if (alertDefinition.getId() == 0) {
GWTServiceLookup.getAlertTemplateService().createAlertTemplate(alertDefinition,
Integer.valueOf(this.resourceType.getId()), new AsyncCallback<Integer>() {
@@ -224,7 +224,7 @@ public class TemplateAlertDefinitionsView extends AbstractAlertDefinitionsView {
}
});
} else {
- GWTServiceLookup.getAlertTemplateService().updateAlertTemplate(alertDefinition, purgeInternals,
+ GWTServiceLookup.getAlertTemplateService().updateAlertTemplate(alertDefinition, resetMatching,
new AsyncCallback<AlertDefinition>() {
@Override
public void onSuccess(AlertDefinition result) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java
index e9af2cc..0a7f27b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java
@@ -30,11 +30,11 @@ public interface AlertTemplateGWTService extends RemoteService {
* Updates a alert template definition.
*
* @param alertDefinition
- * @param purgeInternals must be true if you are updating conditions or dampening settings, can be false otherwise
+ * @param resetMatching must be true if you are updating conditions, condition expression, or dampening settings, can be false otherwise
* @return the updated definition
* @throws Exception
*/
- AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean purgeInternals)
+ AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean resetMatching)
throws RuntimeException;
void enableAlertTemplates(Integer[] alertDefinitionIds) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java
index ceddfa7..7e1fd44 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java
@@ -41,11 +41,11 @@ public class AlertTemplateGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
@Override
- public AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean purgeInternals)
+ public AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean resetMatching)
throws RuntimeException {
try {
AlertDefinition results = alertTemplateManager.updateAlertTemplate(getSessionSubject(), alertDefinition,
- purgeInternals);
+ resetMatching);
return SerialUtility.prepare(results, "AlertTemplateService.updateAlertTemplate");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
index 5da131e..c4fdcda 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
@@ -60,8 +60,8 @@ import org.rhq.enterprise.server.cloud.StatusManagerLocal;
import org.rhq.enterprise.server.plugin.pc.alert.AlertSender;
import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderPluginManager;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
-import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator.AuthorizationTokenType;
+import org.rhq.enterprise.server.util.CriteriaQueryRunner;
/**
* @author Joseph Marques
@@ -519,7 +519,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
alertDefinition.setConditionExpression(BooleanExpression.ANY);
}
- oldAlertDefinition.update(alertDefinition);
+ oldAlertDefinition.update(alertDefinition, resetMatching);
if (LOG.isDebugEnabled()) {
LOG.debug("Updating: " + oldAlertDefinition);
for (AlertCondition nextCondition : oldAlertDefinition.getConditions()) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
index 94f1d35..5b4ad77 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
@@ -231,7 +231,7 @@ public class AlertTemplateManagerBean implements AlertTemplateManagerLocal {
@RequiredPermission(Permission.MANAGE_SETTINGS)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
- public AlertDefinition updateAlertTemplate(Subject user, AlertDefinition alertTemplate, boolean purgeInternals)
+ public AlertDefinition updateAlertTemplate(Subject user, AlertDefinition alertTemplate, boolean resetMatching)
throws InvalidAlertDefinitionException, AlertDefinitionUpdateException, AlertNotificationValidationException {
if (LOG.isDebugEnabled()) {
LOG.debug("updateAlertTemplate: " + alertTemplate);
@@ -241,7 +241,7 @@ public class AlertTemplateManagerBean implements AlertTemplateManagerLocal {
AlertDefinition updated = null;
try {
updated = alertDefinitionManager.updateAlertDefinition(user, alertTemplate.getId(), alertTemplate,
- purgeInternals); // do not allow direct undeletes of an alert definition
+ resetMatching); // do not allow direct undeletes of an alert definition
} catch (Throwable t) {
throw new AlertDefinitionUpdateException("Failed to update an AlertTemplate "
+ alertTemplate.toSimpleString(), t);
@@ -260,7 +260,7 @@ public class AlertTemplateManagerBean implements AlertTemplateManagerLocal {
for (Integer alertDefinitionId : alertDefinitions) {
try {
alertDefinitionManager
- .updateAlertDefinition(overlord, alertDefinitionId, alertTemplate, purgeInternals);
+ .updateAlertDefinition(overlord, alertDefinitionId, alertTemplate, resetMatching);
} catch (Throwable t) {
// continue on error, update as many as possible
if (firstThrowable == null) {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 645d049..47ba274 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -20,12 +20,14 @@
package org.rhq.enterprise.server.alert.test;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.transaction.TransactionManager;
+import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
@@ -70,7 +72,7 @@ import org.rhq.test.TransactionCallbackWithContext;
@Test
public class AlertConditionTest extends UpdatePluginMetadataTestBase {
- private static final boolean ENABLED = false;
+ private static final boolean ENABLED = true;
// this must match the constant found in ServerManagerBean
private static final String RHQ_SERVER_NAME_PROPERTY = "rhq.server.high-availability.name";
@@ -343,10 +345,84 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
}
}
+ @Test(enabled = ENABLED)
+ public void testBZ830463_updateDef() throws Exception {
+ // create our resource with alert definition
+ MeasurementDefinition metricDef = createResourceWithMetricSchedule();
+ AlertDefinition alertDef = createAlertDefinitionWithOneInsideRangeCondition(metricDef, resource.getId());
+
+ assert alertDef.getConditions().size() == 1 : "1 alertDef condition should exist";
+ AlertCondition condition = alertDef.getConditions().iterator().next();
+ int conditionId = condition.getId();
+
+ // re-load the resource so we get the measurement schedule
+ Resource resourceWithSchedules = loadResourceWithSchedules(resource.getId());
+ MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
+
+ // simulate a measurement report coming from the agent - one values that fits in our range, so 1 alert is fired
+ MeasurementScheduleRequest request = new MeasurementScheduleRequest(schedule);
+ MeasurementReport report = new MeasurementReport();
+ report.addData(new MeasurementDataNumeric(getTimestamp(15), request, Double.valueOf(50.0))); // 50 < 60 AND 50 > 40
+ MeasurementDataManagerLocal dataManager = LookupUtil.getMeasurementDataManager();
+ dataManager.mergeMeasurementReport(report);
+
+ // wait for our JMS messages to process and see if we get any alerts
+ Thread.sleep(5000);
+
+ // make sure one alert was triggered
+ List<Alert> alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 1 : "1 alert should have fired: " + alerts;
+ Alert alert = alerts.get(0);
+
+ assert alert.getConditionLogs().size() == 1 : "1 condition log should exist";
+ AlertConditionLog conditionLog = alert.getConditionLogs().iterator().next();
+ Assert.assertEquals(conditionLog.getCondition().getId(), conditionId,
+ "original condition should have been associated with the alert");
+
+ // update a non-condition aspect of the def and then update the def
+ String updatedDesc = "Updated Description";
+ alertDef.setDescription(updatedDesc);
+ AlertDefinition updatedAlertDef = LookupUtil.getAlertDefinitionManager().updateAlertDefinition(getOverlord(),
+ alertDef.getId(), alertDef, false); // note that resetMatching is false
+ assert updatedDesc.equals(updatedAlertDef.getDescription()) : "Description should be updated";
+ assert updatedAlertDef.getConditions().size() == 1 : "1 alertDef condition should exist after the update";
+ assert updatedAlertDef.getConditions().iterator().next().getId() == condition.getId() : "condition should not be updated";
+
+ // get the alert again, and make sure it still has a log with the same condition
+ alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 1 : "1 alert should have fired: " + alerts;
+ alert = alerts.get(0);
+
+ assert alert.getConditionLogs().size() == 1 : "1 condition log should exist after the update";
+ conditionLog = alert.getConditionLogs().iterator().next();
+ Assert.assertEquals(conditionLog.getCondition().getId(), conditionId,
+ "original condition should still have been associated with the alert");
+
+ // update the condition on the def and then update the def
+ condition.setThreshold(Double.valueOf(41.0));
+ updatedAlertDef = LookupUtil.getAlertDefinitionManager().updateAlertDefinition(getOverlord(), alertDef.getId(),
+ alertDef, true); // note that resetMatching is true
+ assert updatedAlertDef.getConditions().size() == 1 : "1 alertDef condition should exist after the update";
+ assert updatedAlertDef.getConditions().iterator().next().getId() != condition.getId() : "condition should be updated";
+
+ // get the alert again, and make sure it still has a log with the same condition
+ alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 1 : "1 alert should have fired: " + alerts;
+ alert = alerts.get(0);
+
+ assert alert.getConditionLogs().size() == 1 : "1 condition log should exist after the update";
+ conditionLog = alert.getConditionLogs().iterator().next();
+ Assert.assertEquals(conditionLog.getCondition().getId(), conditionId,
+ "original condition should still have been associated with the alert");
+
+ return;
+ }
+
private PageList<Alert> getAlerts(int resourceId) {
AlertManagerLocal alertManager = LookupUtil.getAlertManager();
AlertCriteria alertCriteria = new AlertCriteria();
alertCriteria.addFilterResourceIds(resourceId);
+ alertCriteria.fetchConditionLogs(true);
PageList<Alert> alerts = alertManager.findAlertsByCriteria(getOverlord(), alertCriteria);
return alerts;
}
11 years, 10 months
[rhq] modules/enterprise
by mike thompson
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
New commits:
commit bcfdd405b76502e63573c0806e821ba900a205dc
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Fri Jun 22 11:31:55 2012 -0700
[BZ 825230] Eliminate some of the space in the layout between the resource measurement sparkline graphs and the resource name link.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java
index 8fb8f80..c27e626 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/resource/ResourceMetricsPortlet.java
@@ -240,16 +240,15 @@ public class ResourceMetricsPortlet extends GroupMetricsPortlet {
LocatableDynamicForm row = new LocatableDynamicForm(
recentMeasurementsContent.extendLocatorId(md.getName()));
row.setNumCols(3);
+ row.setColWidths(65,"*","*");
row.setWidth100();
HTMLFlow graph = new HTMLFlow();
- // String contents = "<span id='sparkline_" + index + "' class='dynamicsparkline' width='0'>"
- // + commaDelimitedList + "</span>";
String contents = "<span id='sparkline_" + index
+ "' class='dynamicsparkline' width='0' " + "values='"
+ commaDelimitedList + "'>...</span>";
graph.setContents(contents);
graph.setContentsType(ContentsType.PAGE);
- //diable scrollbars on span
+ //disable scrollbars on span
graph.setScrollbarSize(0);
CanvasItem graphContainer = new CanvasItem();
11 years, 10 months