[rhq] Branch 'delete-agent-plugin' - modules/enterprise
by John Sanda
modules/enterprise/remoting/pom.xml | 2 ++
1 file changed, 2 insertions(+)
New commits:
commit 025c2ad7d4f3503e69dffda309224c5f2aa335e6
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Oct 27 09:51:55 2010 -0400
Temporarily disabling webservices module to try and fix hudson build
diff --git a/modules/enterprise/remoting/pom.xml b/modules/enterprise/remoting/pom.xml
index d615902..f09c10e 100644
--- a/modules/enterprise/remoting/pom.xml
+++ b/modules/enterprise/remoting/pom.xml
@@ -43,7 +43,9 @@
</activation>
<modules>
+ <!--
<module>webservices</module>
+ -->
</modules>
</profile>
13 years, 7 months
[rhq] Branch 'delete-agent-plugin' - 5 commits - modules/enterprise modules/helpers
by John Sanda
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java | 4 +---
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java | 3 +--
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java | 1 -
modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java | 5 ++++-
modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java | 2 --
5 files changed, 6 insertions(+), 9 deletions(-)
New commits:
commit b5fd30f9a7c1ce7e79f9aaab2130a096012a49c6
Merge: 22e236a... 75e5b1b...
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Oct 27 09:02:14 2010 -0400
Merge branch 'master' into delete-agent-plugin
commit 75e5b1b2a50369a4951cdc59c9b2deebe807ea8e
Merge: 3602a25... 6f81d33...
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Oct 27 14:56:14 2010 +0200
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit 3602a2549e5278591129f31effe1f6ed53ca8120
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Oct 25 10:03:57 2010 +0200
Small cleanup.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
index 1c5bbb2..1c35c5f 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
@@ -77,7 +77,6 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
@BeforeMethod
public void beforeMethod() {
Date now = new Date();
- System.out.println(">>>>> beforeMethod (AI Purge Test) === " + now.getTime());
try {
this.availabilityManager = LookupUtil.getAvailabilityManager();
this.resourceManager = LookupUtil.getResourceManager();
@@ -109,7 +108,6 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
Subject overlord = LookupUtil.getSubjectManager().getOverlord();
Date now = new Date();
- System.out.println(">>>>>>> testAlternating (AI Purge Test) === " + now.getTime());
EntityManager em = getEntityManager();
Query q = em.createQuery("SELECT r FROM Resource r");
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
index 0332905..1b62820 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
@@ -80,7 +80,6 @@ public class EventsInsertPurgeTest extends AbstractEJB3PerformanceTest {
@BeforeMethod
public void beforeMethod() {
Date now = new Date();
- System.out.println(">>>>> beforeMethod (AI Purge Test) === " + now.getTime());
try {
this.availabilityManager = LookupUtil.getAvailabilityManager();
this.resourceManager = LookupUtil.getResourceManager();
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java
index 280db19..b38d934 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java
@@ -99,7 +99,6 @@ public class AbstractEJB3PerformanceTest extends AbstractEJB3Test {
@AfterMethod
protected void reportTimings(ITestResult result, Method meth) {
Date now = new Date();
- System.out.println(">>> after " + meth.getName() + " (AbstraceEJB3PerformanceTest) === " + now.getTime());
printTimings(meth.getName());
diff --git a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java
index d7f10ef..9efbdff 100644
--- a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java
+++ b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java
@@ -78,7 +78,6 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
}
Date now = new Date();
- System.out.println(">> beforeInvocation(DBInterceptor) " + method.getTestMethod().getMethodName() + " == " + now.getTime());
try {
@@ -133,7 +132,6 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
}
Date now = new Date();
- System.out.println(">> afterInvocation(DBInterceptor) == " + method.getTestMethod().getMethodName() + " === " + now.getTime()); //nothing to do
try {
IDatabaseConnection connection = new DatabaseDataSourceConnection(new InitialContext(),
commit b1200d28b0ac40586602ac469eaf239b84b11ea0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Oct 22 15:54:25 2010 +0200
Put stuff into target/
diff --git a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java
index 1314ce8..910670d 100644
--- a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java
+++ b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java
@@ -42,6 +42,7 @@ import java.util.TreeSet;
public class ExcelExporter implements PerformanceReportExporter {
private static final String DOT_XLS = ".xls";
+ static final String TARGET = "target/";
String baseFileName ;
PerformanceReporting.Rolling rolling;
CellStyle integerStyle;
@@ -49,7 +50,9 @@ public class ExcelExporter implements PerformanceReportExporter {
@Override
public void setBaseFile(String fileName) {
- baseFileName = fileName;
+ baseFileName = fileName;
+ if (baseFileName.startsWith(TARGET))
+ baseFileName = TARGET + baseFileName;
}
@Override
commit 548bcc3fc7e81012bed6d8bf38626c1679aa8430
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Oct 22 15:52:56 2010 +0200
Re-enable
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
index 44e61f5..1c5bbb2 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
@@ -57,7 +57,7 @@ import org.testng.annotations.Test;
* @author Heiko W. Rupp
* @author Lukas Krejci
*/
-@Test(groups = "PERF" , enabled = false)
+@Test(groups = "PERF" )
@Listeners({ DatabaseSetupInterceptor.class })
@PerformanceReporting(exporter=ExcelExporter.class)
@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94")
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
index 3df95dd..0332905 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
@@ -57,7 +57,7 @@ import java.util.Set;
*
* @author Heiko W. Rupp
*/
-@Test(groups = "PERF", enabled = false)
+@Test(groups = "PERF")
@Listeners({ DatabaseSetupInterceptor.class })
@PerformanceReporting(exporter=ExcelExporter.class)
@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94")
13 years, 7 months
[rhq] Branch 'delete-agent-plugin' - 2 commits - modules/core modules/enterprise
by John Sanda
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java | 3
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java | 25
modules/core/domain-test-utils/pom.xml | 36
modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/BuilderException.java | 49 +
modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java | 413 ++++++++++
modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java | 139 +++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainer.java | 5
modules/core/plugin-container/src/main/java/org/rhq/core/pc/RebootRequestListener.java | 11
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java | 14
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/ResourceUpgradeFailureHandlingTest.java | 2
modules/core/pom.xml | 1
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java | 9
modules/enterprise/remoting/cli/pom.xml | 8
modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/BuilderException.java | 49 -
modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceBuilder.java | 374 ---------
modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceTypeBuilder.java | 140 ---
modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/TabularWriterTest.java | 14
modules/enterprise/server/jar/pom.xml | 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilter.java | 64 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryServerServiceImpl.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/InventoryReportFilter.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java | 7
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilterTest.java | 110 ++
25 files changed, 932 insertions(+), 577 deletions(-)
New commits:
commit 22e236aa3085f9dd1a52a574fa6d06c7d325380d
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Oct 27 08:53:51 2010 -0400
Reject incoming reports (on the server) that contain stale resource types
This commit contains two changes needed for BZ 549852. First, filtering
logic has been added in DiscoveryBossBean.mergeInventoryReport to reject
inventory reports that include any resource types that have been marked
for deletion. A report is rejected by throwing a StaleTypeException.
The second change is handling the StaleTypeException in the agent and in
the plugin container. A new listener interface, RebootRequestListener,
has been added to the PC. When InventoryManager catches a
StaleTypeException, it notifies the listener that a reboot is needed.
This listener is the agent. The agent shuts down the PC, clears out the
data directory, and then restarts the PC.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
index 0622fc5..98e7d5c 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
@@ -63,7 +63,8 @@ public interface DiscoveryServerService {
*/
@LimitedConcurrency(CONCURRENCY_LIMIT_INVENTORY_REPORT)
@Timeout(1000L * 60 * 30)
- ResourceSyncInfo mergeInventoryReport(InventoryReport inventoryReport) throws InvalidInventoryReportException;
+ ResourceSyncInfo mergeInventoryReport(InventoryReport inventoryReport)
+ throws InvalidInventoryReportException, StaleTypeException;
/**
* Merges a new availability report from the agent into the server. This updates the availability statuses of known
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java
index 699717f..07c9486 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java
@@ -4,7 +4,9 @@ package org.rhq.core.clientapi.server.discovery;
* Exception to indicate that a report contains one or more resource types that have been marked for
* deletion.
*/
-public class StaleTypeException extends InvalidInventoryReportException {
+public class StaleTypeException extends Exception {
+ private static final long serialVersionUID = 1L;
+
public StaleTypeException() {
super();
}
diff --git a/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java
index 425fe3e..c065d1f 100644
--- a/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java
+++ b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java
@@ -36,9 +36,7 @@ import java.util.Random;
* in a valid state, specifically, fields that are not nullable are required to have non-null values. Using a builder
* should help make the intent of tests clearer and more self-documenting.
* <br/><br/>
- * A couple things need to be pointed out. First, this class currently does not yet provide support for all Resource
- * fields/properties. Secondly, this class will likely be moved to a test utility module in a subsequent commit so that
- * it can be reused by other tests in other modules.
+ * Note that this class currently does not yet provide support for all Resource fields/properties.
*
* @author John Sanda
*/
diff --git a/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java
index f7d2736..2e83fd3 100644
--- a/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java
+++ b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java
@@ -30,9 +30,7 @@ import java.util.HashSet;
* created in a valid state, specifically fields that are not nullable are required to have non-null values. Using the
* builder should help make the intent of tests clearer and more self-documenting.
* <br/><br/>
- * A couple things need to be pointed out. First, this class currently does not yet provide support for all
- * ResourceType fields/properties. Secondly, this class will likely be moved to a test utility module in a subsequent
- * commit so that it can be reused by other tests in other modules.
+ * Note that this class currently does not yet provide support for all ResourceType fields/properties.
*
* @author John Sanda
*/
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainer.java
index c403878..57d9b14 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainer.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainer.java
@@ -581,4 +581,9 @@ public class PluginContainer implements ContainerService {
public boolean isInsideAgent() {
return (this.configuration != null && this.configuration.isInsideAgent());
}
+
+ public void addRebootRequestListener(RebootRequestListener listener) {
+ inventoryManager.addRebootRequestListener(listener);
+ }
+
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/RebootRequestListener.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/RebootRequestListener.java
new file mode 100644
index 0000000..3ce1976
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/RebootRequestListener.java
@@ -0,0 +1,11 @@
+package org.rhq.core.pc;
+
+/**
+ * This listener can be notified by the plugin container when some condition occurs that
+ * PC needs to be rebooted.
+ */
+public interface RebootRequestListener {
+
+ void reboot();
+
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 2e15f8e..85955f6 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -58,6 +58,7 @@ import org.rhq.core.clientapi.agent.upgrade.ResourceUpgradeResponse;
import org.rhq.core.clientapi.server.discovery.DiscoveryServerService;
import org.rhq.core.clientapi.server.discovery.InvalidInventoryReportException;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.clientapi.server.discovery.StaleTypeException;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.discovery.AvailabilityReport;
import org.rhq.core.domain.discovery.MergeResourceResponse;
@@ -77,6 +78,7 @@ import org.rhq.core.domain.resource.ResourceUpgradeReport;
import org.rhq.core.pc.ContainerService;
import org.rhq.core.pc.PluginContainer;
import org.rhq.core.pc.PluginContainerConfiguration;
+import org.rhq.core.pc.RebootRequestListener;
import org.rhq.core.pc.ServerServices;
import org.rhq.core.pc.agent.AgentRegistrar;
import org.rhq.core.pc.agent.AgentService;
@@ -195,6 +197,8 @@ public class InventoryManager extends AgentService implements ContainerService,
*/
private ResourceUpgradeDelegate resourceUpgradeDelegate = new ResourceUpgradeDelegate(this);
+ private RebootRequestListener rebootRequestListener;
+
public InventoryManager() {
super(DiscoveryAgentService.class);
}
@@ -954,6 +958,12 @@ public class InventoryManager extends AgentService implements ContainerService,
log.debug(String.format("Server DONE merging inventory report [%d] ms.",
(System.currentTimeMillis() - startTime)));
}
+ } catch (StaleTypeException e) {
+ log.error("Failed to merge inventory report with server. The report contains one or more resource types " +
+ "that have been marked for deletion. Notifying the plugin container that a reboot is needed to purge " +
+ "stale types.");
+ rebootRequestListener.reboot();
+ return false;
} catch (InvalidInventoryReportException e) {
log.error("Failure sending inventory report to Server - was this Agent's platform deleted?", e);
if ((this.platform != null) && (this.platform.getInventoryStatus() == InventoryStatus.NEW)
@@ -2697,6 +2707,10 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
+ public void addRebootRequestListener(RebootRequestListener listener) {
+ rebootRequestListener = listener;
+ }
+
/**
* That class implements a listener that gets called when the resource got activated
* @author hrupp
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/ResourceUpgradeFailureHandlingTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/ResourceUpgradeFailureHandlingTest.java
index ab1cd2b..bf12749 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/ResourceUpgradeFailureHandlingTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/ResourceUpgradeFailureHandlingTest.java
@@ -43,6 +43,7 @@ import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.clientapi.agent.discovery.InvalidPluginConfigurationClientException;
import org.rhq.core.clientapi.server.discovery.InvalidInventoryReportException;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.clientapi.server.discovery.StaleTypeException;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
@@ -344,6 +345,7 @@ public class ResourceUpgradeFailureHandlingTest extends ResourceUpgradeTestBase
expectations.will(getCurrentServerSideInventory().upgradeResources());
} catch (InvalidInventoryReportException e) {
//this is not going to happen because we're mocking the invocation
+ } catch (StaleTypeException e) {
}
}
diff --git a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
index 43c2ba5..f6e7cf2 100644
--- a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
+++ b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
@@ -90,6 +90,7 @@ import org.rhq.core.domain.cloud.composite.FailoverListComposite;
import org.rhq.core.domain.cloud.composite.FailoverListComposite.ServerEntry;
import org.rhq.core.pc.PluginContainer;
import org.rhq.core.pc.PluginContainerConfiguration;
+import org.rhq.core.pc.RebootRequestListener;
import org.rhq.core.pc.ServerServices;
import org.rhq.core.pc.inventory.InventoryManager;
import org.rhq.core.pc.plugin.FileSystemPluginFinder;
@@ -1778,6 +1779,14 @@ public class AgentMain {
plugin_container.initialize();
LOG.debug(AgentI18NResourceKeys.PLUGIN_CONTAINER_INITIALIZED, pc_config);
+ plugin_container.addRebootRequestListener(new RebootRequestListener() {
+ public void reboot() {
+ shutdownPluginContainer();
+ cleanDataDirectory();
+ startPluginContainer(0L);
+ }
+ });
+
return plugin_container.isStarted();
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
index 182aa7f..0378d95 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
@@ -115,7 +115,8 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot
@EJB
private SystemManagerLocal systemManager;
- public ResourceSyncInfo mergeInventoryReport(InventoryReport report) throws InvalidInventoryReportException {
+ public ResourceSyncInfo mergeInventoryReport(InventoryReport report)
+ throws InvalidInventoryReportException, StaleTypeException {
validateInventoryReport(report);
InventoryReportFilter filter = new DeletedResourceTypeFilter(subjectManager, resourceTypeManager);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java
index c9208fc..c9f7c2c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java
@@ -33,6 +33,7 @@ import org.rhq.core.clientapi.agent.upgrade.ResourceUpgradeRequest;
import org.rhq.core.clientapi.agent.upgrade.ResourceUpgradeResponse;
import org.rhq.core.clientapi.server.discovery.InvalidInventoryReportException;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.clientapi.server.discovery.StaleTypeException;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.discovery.MergeResourceResponse;
@@ -60,7 +61,8 @@ public interface DiscoveryBossLocal extends DiscoveryBossRemote {
*
* @throws InvalidInventoryReportException if the inventory report is invalid
*/
- ResourceSyncInfo mergeInventoryReport(InventoryReport report) throws InvalidInventoryReportException;
+ ResourceSyncInfo mergeInventoryReport(InventoryReport report)
+ throws InvalidInventoryReportException, StaleTypeException;
/**
* Returns a map of platforms (the keys) and their servers (the values) that are in the auto-discovery queue but not
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryServerServiceImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryServerServiceImpl.java
index 1b939b9..65f8c7c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryServerServiceImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryServerServiceImpl.java
@@ -30,6 +30,7 @@ import org.rhq.core.clientapi.agent.upgrade.ResourceUpgradeResponse;
import org.rhq.core.clientapi.server.discovery.DiscoveryServerService;
import org.rhq.core.clientapi.server.discovery.InvalidInventoryReportException;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.clientapi.server.discovery.StaleTypeException;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.discovery.AvailabilityReport;
@@ -65,7 +66,8 @@ public class DiscoveryServerServiceImpl implements DiscoveryServerService {
/**
* @see DiscoveryServerService#mergeInventoryReport(InventoryReport)
*/
- public ResourceSyncInfo mergeInventoryReport(InventoryReport report) throws InvalidInventoryReportException {
+ public ResourceSyncInfo mergeInventoryReport(InventoryReport report)
+ throws InvalidInventoryReportException, StaleTypeException {
long start = System.currentTimeMillis();
DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
ResourceSyncInfo syncInfo;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
index 39f8635..f1056b1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
@@ -39,6 +39,7 @@ import org.rhq.core.clientapi.server.core.CoreServerService;
import org.rhq.core.clientapi.server.discovery.DiscoveryServerService;
import org.rhq.core.clientapi.server.discovery.InvalidInventoryReportException;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.clientapi.server.discovery.StaleTypeException;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
@@ -147,6 +148,8 @@ public class DiscoveryTestBean implements DiscoveryTestLocal {
this.discoveryServerService.mergeInventoryReport(report);
} catch (InvalidInventoryReportException e) {
throw new RuntimeException(e);
+ } catch (StaleTypeException e) {
+ throw new RuntimeException(e);
}
}
@@ -170,6 +173,8 @@ public class DiscoveryTestBean implements DiscoveryTestLocal {
this.discoveryServerService.mergeInventoryReport(report);
} catch (InvalidInventoryReportException e) {
throw new RuntimeException(e);
+ } catch (StaleTypeException e) {
+ throw new RuntimeException(e);
}
}
@@ -187,6 +192,8 @@ public class DiscoveryTestBean implements DiscoveryTestLocal {
this.discoveryServerService.mergeInventoryReport(report);
} catch (InvalidInventoryReportException e) {
throw new RuntimeException(e);
+ } catch (StaleTypeException e) {
+ throw new RuntimeException(e);
}
}
commit e045184a9d3de2e47c5c56412fdb99f26edfe903
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Oct 26 13:49:02 2010 -0400
Reject inventory reports that contain "stale" resource types
If an inventory report that is sent up to the server contains a resource
type that is marked for deletion, DiscoveryBossBean will throw an
exception letting the plugin container know that it needs to restart so
that it can update its plugins and resource types.
This is also the initial commit for the domain-test-utils module. I have
pulled ResourceBuilder and ResourceTypeBuilder out of the cli module and
moved them into this new module so that they can more easily be shared
across modules.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java
new file mode 100644
index 0000000..699717f
--- /dev/null
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/StaleTypeException.java
@@ -0,0 +1,23 @@
+package org.rhq.core.clientapi.server.discovery;
+
+/**
+ * Exception to indicate that a report contains one or more resource types that have been marked for
+ * deletion.
+ */
+public class StaleTypeException extends InvalidInventoryReportException {
+ public StaleTypeException() {
+ super();
+ }
+
+ public StaleTypeException(String message) {
+ super(message);
+ }
+
+ public StaleTypeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public StaleTypeException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/modules/core/domain-test-utils/pom.xml b/modules/core/domain-test-utils/pom.xml
new file mode 100644
index 0000000..97cb509
--- /dev/null
+++ b/modules/core/domain-test-utils/pom.xml
@@ -0,0 +1,36 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-parent</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-domain-test-utils</artifactId>
+ <name>RHQ Domain Model Test Utils</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>rhq-core-domain</artifactId>
+ <version>${project.version}</version>
+ <type>ejb</type>
+ </dependency>
+ <dependency>
+ <groupId>hibernate-annotations</groupId>
+ <artifactId>hibernate-annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>hibernate-entitymanager</groupId>
+ <artifactId>hibernate-entitymanager</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <version>1.0</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/BuilderException.java b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/BuilderException.java
new file mode 100644
index 0000000..7277c3c
--- /dev/null
+++ b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/BuilderException.java
@@ -0,0 +1,49 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.core.domain.resource;
+
+/**
+ * A builder will throw this exception if it is unable to build the target object. For example, if example if all
+ * required properites of the target object do not have non-null values, then the builder will throw this exception.
+ *
+ * @author John Sanda
+ */
+public class BuilderException extends RuntimeException {
+
+ public BuilderException() {
+ super();
+ }
+
+ public BuilderException(String message) {
+ super(message);
+ }
+
+ public BuilderException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public BuilderException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java
new file mode 100644
index 0000000..425fe3e
--- /dev/null
+++ b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceBuilder.java
@@ -0,0 +1,415 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.core.domain.resource;
+
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.measurement.ResourceAvailability;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * ResoureBuilder is a builder object that creates Resource objects. The builder ensures that a Resource is created
+ * in a valid state, specifically, fields that are not nullable are required to have non-null values. Using a builder
+ * should help make the intent of tests clearer and more self-documenting.
+ * <br/><br/>
+ * A couple things need to be pointed out. First, this class currently does not yet provide support for all Resource
+ * fields/properties. Secondly, this class will likely be moved to a test utility module in a subsequent commit so that
+ * it can be reused by other tests in other modules.
+ *
+ * @author John Sanda
+ */
+public class ResourceBuilder {
+
+ private ResourceBuilder parentBuilder;
+
+ private Resource resource;
+
+ private Random random;
+
+ private boolean useDefaultResourceType;
+
+ private ResourceCategory category;
+
+ private List<ResourceBuilder> childBuilders = new ArrayList<ResourceBuilder>();
+
+ public static class AssociationBuilder {
+ private ResourceBuilder resourceBuilder;
+
+ private int count;
+
+ AssociationBuilder(ResourceBuilder builder, int count) {
+ resourceBuilder = builder;
+ this.count = count;
+ }
+
+ public ResourceBuilder randomChildServers() {
+ for (int i = 0; i < count; ++i) {
+ ResourceBuilder childBuilder = new ResourceBuilder(ResourceCategory.SERVER, resourceBuilder);
+ resourceBuilder.childBuilders.add(childBuilder.createRandomServer());
+ }
+ return resourceBuilder;
+ }
+
+ public ResourceBuilder randomChildServices() {
+ for (int i = 0; i < count; ++i) {
+ ResourceBuilder childBuilder = new ResourceBuilder(ResourceCategory.SERVICE, resourceBuilder);
+ resourceBuilder.childBuilders.add(childBuilder.createRandomService());
+ }
+ return resourceBuilder;
+ }
+ }
+
+ public static class ChildrenResourceBuilder {
+ private ResourceBuilder parentBuilder;
+
+ ChildrenResourceBuilder(ResourceBuilder builder, ResourceCategory category, int numChildren) {
+ parentBuilder = builder;
+ parentBuilder.childBuilders = new ArrayList<ResourceBuilder>(numChildren);
+ for (int i = 0; i < numChildren; ++i) {
+ parentBuilder.childBuilders.add(new ResourceBuilder(category, parentBuilder).createResource());
+ }
+ }
+
+ public ChildrenResourceBuilder inInventory() {
+ for (ResourceBuilder childBuilder : parentBuilder.childBuilders) {
+ childBuilder.inInventory();
+ }
+ return this;
+ }
+
+ public ChildrenResourceBuilder notInInventory() {
+ for (ResourceBuilder childBuilder : parentBuilder.childBuilders) {
+ childBuilder.notInInventory();
+ }
+ return this;
+ }
+
+ public ResourceBuilder included() {
+ return parentBuilder;
+ }
+ }
+
+
+ public ResourceBuilder() {
+ }
+
+ private ResourceBuilder(ResourceCategory category, ResourceBuilder parentBuilder) {
+ this.category = category;
+ this.parentBuilder = parentBuilder;
+ }
+
+ public ResourceBuilder createResource() {
+ resource = new Resource();
+ random = new Random();
+ return this;
+ }
+
+ public ResourceBuilder createPlatform() {
+ category = ResourceCategory.PLATFORM;
+ return createResource();
+ }
+
+ public ResourceBuilder createServer() {
+ category = ResourceCategory.SERVER;
+ return createResource();
+ }
+
+ public ResourceBuilder createRandomServer() {
+ category = ResourceCategory.SERVER;
+ createResource();
+ withRandomId();
+ withRandomName("server:");
+ withRandomResourceKey("server:");
+ withRandomUuid("server:");
+ withDefaultServerResourceType();
+
+ return this;
+ }
+
+ public ResourceBuilder createService() {
+ category = ResourceCategory.SERVICE;
+ return createResource();
+ }
+
+ public ResourceBuilder createRandomService() {
+ category = ResourceCategory.SERVICE;
+ createResource();
+ withRandomId();
+ withRandomName("service:");
+ withRandomResourceKey("service:");
+ withRandomUuid("service:");
+ withDefaultServiceResourceType();
+
+ return this;
+ }
+
+ /**
+ * Using a default resource type results in <code>Resource.resourceType</code> being assigned to a new
+ * ResourceType object that has some default values applied to it. If the Resource being created is a platform, then
+ * the ResourceType will be a platform. More specifically, <code>ResourceType.category</code> will be assigned a
+ * value of {@link ResourceCategory#PLATFORM}. Likewise, if the Resource being created is a server, then its
+ * ResourceType object will have a category of {@link ResourceCategory#SERVER}. And if the Resource is a service,
+ * then the ResourceType category will be {@link ResourceCategory#SERVICE}.
+ * <br/><br/>
+ * The resource type name defaults to the name of resource. And the plugin name (as specified by
+ * ResourceType.plugin) defaults to <code>Resource.name + " Plugin"</code>
+ * <br/><br/>
+ * When using a default resource type, the resource must be created using one of {@link #createPlatform()},
+ * {@link #createServer()}, or {@link #createService()}; otherwise, an exception will be thrown since the builder
+ * will not have sufficient information to create the resource type.
+ * <br/><br/>
+ * Lastly, if you specify that a default resource type by calling this method and also specify the resource tye
+ * with {@link #withResourceType(ResourceType)}, the latter will be overwritten regardless of when it is called. The
+ * default will be used instead.
+ *
+ * @return The builder
+ *
+ */
+ public ResourceBuilder usingDefaultResourceType() {
+ useDefaultResourceType = true;
+ return this;
+ }
+
+ public ResourceBuilder withId(int id) {
+ resource.setId(id);
+ return this;
+ }
+
+ public ResourceBuilder withRandomId() {
+ resource.setId(random.nextInt());
+ return this;
+ }
+
+ public ResourceBuilder withResourceKey(String key) {
+ resource.setResourceKey(key);
+ return this;
+ }
+
+ public ResourceBuilder withRandomResourceKey(String prefix) {
+ resource.setResourceKey(prefix + randomString());
+ return this;
+ }
+
+ public ResourceBuilder withRandomResourceKey() {
+ return withRandomResourceKey("");
+ }
+
+ public ResourceBuilder withName(String name) {
+ resource.setName(name);
+ return this;
+ }
+
+ public ResourceBuilder withRandomName(String prefix) {
+ resource.setName(prefix + randomString());
+ return this;
+ }
+
+ public ResourceBuilder withRandomName() {
+ return withRandomName("");
+ }
+
+ public ResourceBuilder withResourceType(ResourceType resourceType) {
+ resource.setResourceType(resourceType);
+ return this;
+ }
+
+ public ResourceBuilder withUuid(String uuid) {
+ resource.setUuid(uuid);
+ return this;
+ }
+
+ public ResourceBuilder withRandomUuid(String prefix) {
+ resource.setUuid(prefix + randomString());
+ return this;
+ }
+
+ public ResourceBuilder withRandomUuid() {
+ return withRandomUuid("");
+ }
+
+ public ResourceBuilder withVersion(String version) {
+ resource.setVersion(version);
+ return this;
+ }
+
+ public ResourceBuilder withCurrentAvailability(AvailabilityType availabilityType) {
+ ResourceAvailability availability = new ResourceAvailability(resource, availabilityType);
+ resource.setCurrentAvailability(availability);
+ return this;
+ }
+
+ public ResourceBuilder withInventoryStatus(InventoryStatus inventoryStatus) {
+ resource.setInventoryStatus(inventoryStatus);
+ return this;
+ }
+
+ /**
+ * Set the <code>inventoryStatus</code> to {@link InventoryStatus#COMMITTED}
+ *
+ * @return The builder
+ */
+ public ResourceBuilder inInventory() {
+ resource.setInventoryStatus(InventoryStatus.COMMITTED);
+ return this;
+ }
+
+ /**
+ * Set the <code>inventoryStatus</code> to {@link InventoryStatus#NEW}
+ *
+ * @return The builder
+ */
+ public ResourceBuilder notInInventory() {
+ resource.setInventoryStatus(InventoryStatus.NEW);
+ return this;
+ }
+
+ public AssociationBuilder with(int count) {
+ return new AssociationBuilder(this, count);
+ }
+
+ public ResourceBuilder withChildService() {
+ ResourceBuilder childBuilder = new ResourceBuilder(ResourceCategory.SERVICE, this);
+ childBuilders.add(childBuilder.createService());
+ return childBuilder;
+ }
+
+ public ResourceBuilder included() {
+ return this.parentBuilder;
+ }
+
+ public Resource build() {
+ String errors = validate();
+ if (errors != null) {
+ throw new BuilderException(errors);
+ }
+
+ if (useDefaultResourceType) {
+ withDefaultResourceType();
+ }
+
+ for (ResourceBuilder childBuilder : childBuilders) {
+ resource.addChildResource(childBuilder.build());
+ }
+
+ return resource;
+ }
+
+ private String validate() {
+ StringBuilder errors = new StringBuilder();
+
+ if (resource.getUuid() == null) {
+ // Making uuid required since it is used in equals/hashCode
+ errors.append("uuid is a required property\n");
+ }
+
+ if (resource.getName() == null) {
+ errors.append("name is a required property\n");
+ }
+
+ if (useDefaultResourceType && category == null) {
+ errors.append("When using default resource type, the resource must be created with one of " +
+ "createPlatform(), createServer(), or createService()\n");
+ }
+
+ // We only care that resourceType is set if we are not using a default type. If we are using a default,
+ // then the resourceType property will be set after validation, assuming there are no validation errors.
+ if (!useDefaultResourceType && resource.getResourceType() == null) {
+ errors.append("resourceType is a required property\n");
+ }
+
+ for (ResourceBuilder childBuilder : childBuilders) {
+ String childErrors = childBuilder.validate();
+ if (childErrors != null) {
+ errors.append("The following child resource errors were found:\n" + childErrors);
+ }
+ }
+
+ if (errors.length() == 0) {
+ return null;
+ }
+
+ return "Unable to build Resource instance due to the following validation errors:\n" + errors;
+ }
+
+ private ResourceBuilder withDefaultResourceType() {
+ switch (category) {
+ case PLATFORM: return withDefaultPlatformResourceType();
+ case SERVER: return withDefaultServerResourceType();
+ default: return withDefaultServiceResourceType();
+ }
+ }
+
+ /**
+ * The default platform resource type is as its name implies a platform type whose name defaults to the resource
+ * name and the plugin name (i.e., ResourceType.plugin property) defaults to resource name + 'Plugin'.
+ *
+ * @return The builder
+ */
+ private ResourceBuilder withDefaultPlatformResourceType() {
+ resource.setResourceType(new ResourceTypeBuilder().createPlatformResourceType()
+ .withName(resource.getName())
+ .withPlugin(resource.getName() + " Plugin")
+ .withParentResourceType(resource.getResourceType())
+ .build());
+ return this;
+ }
+
+ /**
+ * The default server resource type is as its name implies a server type whose name defaults to the resource name
+ * and the plugin name (i.e., ResourceType.plugin property) defaults to resource name + 'Plugin'
+ *
+ * @return The builder
+ */
+ private ResourceBuilder withDefaultServerResourceType() {
+ resource.setResourceType(new ResourceTypeBuilder().createServerResourceType()
+ .withName(resource.getName())
+ .withPlugin(resource.getName() + " Plugin")
+ .withParentResourceType(resource.getResourceType())
+ .build());
+ return this;
+ }
+
+ /**
+ * The default service resource type is as its name implies a service type whose name defaults to the resource name
+ * and the plugin name (i.e., ResourceType.plugin property) defaults to resource name + 'Plugin'
+ *
+ * @return The builder
+ */
+ private ResourceBuilder withDefaultServiceResourceType() {
+ resource.setResourceType(new ResourceTypeBuilder().createServerResourceType()
+ .withName(resource.getName())
+ .withPlugin(resource.getName() + " Plugin")
+ .withParentResourceType(resource.getResourceType())
+ .build());
+ return this;
+ }
+
+ private String randomString() {
+ return new BigInteger(16, random).toString(32);
+ }
+
+}
diff --git a/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java
new file mode 100644
index 0000000..f7d2736
--- /dev/null
+++ b/modules/core/domain-test-utils/src/main/java/org/rhq/core/domain/resource/ResourceTypeBuilder.java
@@ -0,0 +1,141 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.core.domain.resource;
+
+import java.util.HashSet;
+
+/**
+ * ResourceTypeBuilder is a builder that creates ResourceType objects. The builder ensures that the ResourceType is
+ * created in a valid state, specifically fields that are not nullable are required to have non-null values. Using the
+ * builder should help make the intent of tests clearer and more self-documenting.
+ * <br/><br/>
+ * A couple things need to be pointed out. First, this class currently does not yet provide support for all
+ * ResourceType fields/properties. Secondly, this class will likely be moved to a test utility module in a subsequent
+ * commit so that it can be reused by other tests in other modules.
+ *
+ * @author John Sanda
+ */
+public class ResourceTypeBuilder {
+
+ private ResourceType resourceType;
+
+ public ResourceTypeBuilder createResourceType() {
+ resourceType = new ResourceType();
+ resourceType.setParentResourceTypes(new HashSet<ResourceType>());
+ resourceType.setChildResourceTypes(new HashSet<ResourceType>());
+
+ return this;
+ }
+
+ public ResourceTypeBuilder createPlatformResourceType() {
+ return createResourceType().withCategory(ResourceCategory.PLATFORM);
+ }
+
+ public ResourceTypeBuilder createServerResourceType() {
+ return createResourceType().withCategory(ResourceCategory.SERVER);
+ }
+
+ public ResourceTypeBuilder createServiceResourceType() {
+ return createResourceType().withCategory(ResourceCategory.SERVICE);
+ }
+
+ public ResourceTypeBuilder withId(int id) {
+ resourceType.setId(id);
+ return this;
+ }
+
+ public ResourceTypeBuilder withName(String name) {
+ resourceType.setName(name);
+ return this;
+ }
+
+ public ResourceTypeBuilder withPlugin(String plugin) {
+ resourceType.setPlugin(plugin);
+ return this;
+ }
+
+ public ResourceTypeBuilder withCategory(ResourceCategory category) {
+ resourceType.setCategory(category);
+ return this;
+ }
+
+ public ResourceTypeBuilder thatIsDeleted() {
+ resourceType.setDeleted(true);
+ return this;
+ }
+
+ public ResourceTypeBuilder withParentResourceType(ResourceType parentResourceType) {
+ if (parentResourceType != null) {
+ resourceType.addParentResourceType(parentResourceType);
+ }
+ return this;
+ }
+
+ public ResourceTypeBuilder withParentResourceTypes(ResourceType... parentResourceTypes) {
+ for (ResourceType parent : parentResourceTypes) {
+ resourceType.addParentResourceType(parent);
+ }
+ return this;
+ }
+
+ public ResourceType build() {
+ String errors = valdiate();
+ if (errors != null) {
+ throw new BuilderException(errors);
+ }
+
+ return resourceType;
+ }
+
+ private String valdiate() {
+ StringBuilder errors = new StringBuilder();
+
+ if (resourceType.getName() == null) {
+ errors.append("name is a required property\n");
+ }
+
+ if (resourceType.getCategory() == null) {
+ errors.append("category is a required property\n");
+ }
+
+ if (resourceType.getCreationDataType() == null) {
+ errors.append("creationDate is a required property\n");
+ }
+
+ if (resourceType.getCreateDeletePolicy() == null) {
+ errors.append("createDeletePolicy is a required property\n");
+ }
+
+ if (resourceType.getPlugin() == null) {
+ errors.append("plugin is a required property\n");
+ }
+
+ if (errors.length() == 0) {
+ return null;
+ }
+
+ return "Unable to build ResourceType instance due to the following validation errors:\n" + errors;
+ }
+
+}
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index f6f8289..b936f26 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -47,6 +47,7 @@
<module>comm-api</module>
<module>dbutils</module>
<module>domain</module>
+ <module>domain-test-utils</module>
<module>plugin-api</module>
<module>client-api</module>
<module>plugin-container</module>
diff --git a/modules/enterprise/remoting/cli/pom.xml b/modules/enterprise/remoting/cli/pom.xml
index 9811869..d2c0f16 100644
--- a/modules/enterprise/remoting/cli/pom.xml
+++ b/modules/enterprise/remoting/cli/pom.xml
@@ -31,7 +31,13 @@
<groupId>${groupId}</groupId>
<artifactId>rhq-remoting-client-api</artifactId>
<version>${project.version}</version>
- </dependency>
+ </dependency>
+
+ <dependency>
+ <groupId>${groupId}</groupId>
+ <artifactId>rhq-core-domain-test-utils</artifactId>
+ <version>${version}</version>
+ </dependency>
<dependency>
<groupId>commons-logging</groupId>
diff --git a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/BuilderException.java b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/BuilderException.java
deleted file mode 100644
index 8d06434..0000000
--- a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/BuilderException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.enterprise.client;
-
-/**
- * A builder will throw this exception if it is unable to build the target object. For example, if example if all
- * required properites of the target object do not have non-null values, then the builder will throw this exception.
- *
- * @author John Sanda
- */
-public class BuilderException extends RuntimeException {
-
- public BuilderException() {
- super();
- }
-
- public BuilderException(String message) {
- super(message);
- }
-
- public BuilderException(String message, Throwable cause) {
- super(message, cause);
- }
-
- public BuilderException(Throwable cause) {
- super(cause);
- }
-}
diff --git a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceBuilder.java b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceBuilder.java
deleted file mode 100644
index 30dba39..0000000
--- a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceBuilder.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.enterprise.client;
-
-import org.rhq.core.domain.measurement.AvailabilityType;
-import org.rhq.core.domain.measurement.ResourceAvailability;
-import org.rhq.core.domain.resource.InventoryStatus;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.ResourceType;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-/**
- * ResoureBuilder is a builder object that creates Resource objects. The builder ensures that a Resource is created
- * in a valid state, specifically, fields that are not nullable are required to have non-null values. Using a builder
- * should help make the intent of tests clearer and more self-documenting.
- * <br/><br/>
- * A couple things need to be pointed out. First, this class currently does not yet provide support for all Resource
- * fields/properties. Secondly, this class will likely be moved to a test utility module in a subsequent commit so that
- * it can be reused by other tests in other modules.
- *
- * @author John Sanda
- */
-public class ResourceBuilder {
-
- private ResourceBuilder parentBuilder;
-
- private Resource resource;
-
- private Random random;
-
- private boolean useDefaultResourceType;
-
- private ResourceCategory category;
-
- private List<ResourceBuilder> childBuilders;
-
- static class AssociationBuilder {
- private ResourceBuilder resourceBuilder;
-
- private int count;
-
- AssociationBuilder(ResourceBuilder builder, int count) {
- resourceBuilder = builder;
- this.count = count;
- }
-
- public ChildrenResourceBuilder childServices() {
- return new ChildrenResourceBuilder(resourceBuilder, ResourceCategory.SERVICE, count);
- }
- }
-
- static class ChildrenResourceBuilder {
- private ResourceBuilder parentBuilder;
-
- ChildrenResourceBuilder(ResourceBuilder builder, ResourceCategory category, int numChildren) {
- parentBuilder = builder;
- parentBuilder.childBuilders = new ArrayList<ResourceBuilder>(numChildren);
- for (int i = 0; i < numChildren; ++i) {
- parentBuilder.childBuilders.add(new ResourceBuilder(category, parentBuilder).createResource());
- }
- }
-
- public ChildrenResourceBuilder inInventory() {
- for (ResourceBuilder childBuilder : parentBuilder.childBuilders) {
- childBuilder.inInventory();
- }
- return this;
- }
-
- public ChildrenResourceBuilder notInInventory() {
- for (ResourceBuilder childBuilder : parentBuilder.childBuilders) {
- childBuilder.notInInventory();
- }
- return this;
- }
-
- public ResourceBuilder included() {
- return parentBuilder;
- }
- }
-
-
- public ResourceBuilder() {
- }
-
- private ResourceBuilder(ResourceCategory category, ResourceBuilder parentBuilder) {
- this.category = category;
- this.parentBuilder = parentBuilder;
- }
-
- public ResourceBuilder createResource() {
- resource = new Resource();
- random = new Random();
- return this;
- }
-
- public ResourceBuilder createPlatform() {
- category = ResourceCategory.PLATFORM;
- return createResource();
- }
-
- public ResourceBuilder createServer() {
- category = ResourceCategory.SERVER;
- return createResource();
- }
-
- public ResourceBuilder createService() {
- category = ResourceCategory.SERVICE;
- return createResource();
- }
-
- /**
- * Using a default resource type results in <code>Resource.resourceType</code> being assigned to a new
- * ResourceType object that has some default values applied to it. If the Resource being created is a platform, then
- * the ResourceType will be a platform. More specifically, <code>ResourceType.category</code> will be assigned a
- * value of {@link ResourceCategory#PLATFORM}. Likewise, if the Resource being created is a server, then its
- * ResourceType object will have a category of {@link ResourceCategory#SERVER}. And if the Resource is a service,
- * then the ResourceType category will be {@link ResourceCategory#SERVICE}.
- * <br/><br/>
- * The resource type name defaults to the name of resource. And the plugin name (as specified by
- * ResourceType.plugin) defaults to <code>Resource.name + " Plugin"</code>
- * <br/><br/>
- * When using a default resource type, the resource must be created using one of {@link #createPlatform()},
- * {@link #createServer()}, or {@link #createService()}; otherwise, an exception will be thrown since the builder
- * will not have sufficient information to create the resource type.
- * <br/><br/>
- * Lastly, if you specify that a default resource type by calling this method and also specify the resource tye
- * with {@link #withResourceType(ResourceType)}, the latter will be overwritten regardless of when it is called. The
- * default will be used instead.
- *
- * @return The builder
- *
- */
- public ResourceBuilder usingDefaultResourceType() {
- useDefaultResourceType = true;
- return this;
- }
-
- public ResourceBuilder withId(int id) {
- resource.setId(id);
- return this;
- }
-
- public ResourceBuilder withRandomId() {
- resource.setId(random.nextInt());
- return this;
- }
-
- public ResourceBuilder withResourceKey(String key) {
- resource.setResourceKey(key);
- return this;
- }
-
- public ResourceBuilder withRandomResourceKey(String prefix) {
- resource.setResourceKey(prefix + randomString());
- return this;
- }
-
- public ResourceBuilder withRandomResourceKey() {
- return withRandomResourceKey("");
- }
-
- public ResourceBuilder withName(String name) {
- resource.setName(name);
- return this;
- }
-
- public ResourceBuilder withRandomName(String prefix) {
- resource.setName(prefix + randomString());
- return this;
- }
-
- public ResourceBuilder withRandomName() {
- return withRandomName("");
- }
-
- public ResourceBuilder withResourceType(ResourceType resourceType) {
- resource.setResourceType(resourceType);
- return this;
- }
-
- public ResourceBuilder withUuid(String uuid) {
- resource.setUuid(uuid);
- return this;
- }
-
- public ResourceBuilder withRandomUuid(String prefix) {
- resource.setUuid(prefix + randomString());
- return this;
- }
-
- public ResourceBuilder withRandomUuid() {
- return withRandomUuid("");
- }
-
- public ResourceBuilder withVersion(String version) {
- resource.setVersion(version);
- return this;
- }
-
- public ResourceBuilder withCurrentAvailability(AvailabilityType availabilityType) {
- ResourceAvailability availability = new ResourceAvailability(resource, availabilityType);
- resource.setCurrentAvailability(availability);
- return this;
- }
-
- public ResourceBuilder withInventoryStatus(InventoryStatus inventoryStatus) {
- resource.setInventoryStatus(inventoryStatus);
- return this;
- }
-
- /**
- * Set the <code>inventoryStatus</code> to {@link InventoryStatus#COMMITTED}
- *
- * @return The builder
- */
- public ResourceBuilder inInventory() {
- resource.setInventoryStatus(InventoryStatus.COMMITTED);
- return this;
- }
-
- /**
- * Set the <code>inventoryStatus</code> to {@link InventoryStatus#NEW}
- *
- * @return The builder
- */
- public ResourceBuilder notInInventory() {
- resource.setInventoryStatus(InventoryStatus.NEW);
- return this;
- }
-
- public AssociationBuilder with(int count) {
- return new AssociationBuilder(this, count);
- }
-
- public Resource build() {
- String errors = validate();
- if (errors != null) {
- throw new BuilderException(errors);
- }
-
- if (useDefaultResourceType) {
- withDefaultResourceType();
- }
-
- if (childBuilders != null) {
- int i = 1;
- for (ResourceBuilder childBuilder : childBuilders) {
- resource.addChildResource(childBuilder
- .withName("child-" + i)
- .withUuid("child-" + i++)
- .withVersion(resource.getVersion())
- .withDefaultResourceType()
- .build());
- }
- }
-
- return resource;
- }
-
- private String validate() {
- StringBuilder errors = new StringBuilder();
-
- if (resource.getUuid() == null) {
- // Making uuid required since it is used in equals/hashCode
- errors.append("uuid is a required property\n");
- }
-
- if (resource.getName() == null) {
- errors.append("name is a required property\n");
- }
-
- if (useDefaultResourceType && category == null) {
- errors.append("When using default resource type, the resource must be created with one of " +
- "createPlatform(), createServer(), or createService()\n");
- }
-
- // We only care that resourceType is set if we are not using a default type. If we are using a default,
- // then the resourceType property will be set after validation, assuming there are no validation errors.
- if (!useDefaultResourceType && resource.getResourceType() == null) {
- errors.append("resourceType is a required property\n");
- }
-
- if (errors.length() == 0) {
- return null;
- }
-
- return "Unable to build Resource instance due to the following validation errors:\n" + errors;
- }
-
- private ResourceBuilder withDefaultResourceType() {
- switch (category) {
- case PLATFORM: return withDefaultPlatformResourceType();
- case SERVER: return withDefaultServerResourceType();
- default: return withDefaultServicePlatformResourceType();
- }
- }
-
- /**
- * The default platform resource type is as its name implies a platform type whose name defaults to the resource
- * name and the plugin name (i.e., ResourceType.plugin property) defaults to resource name + 'Plugin'.
- *
- * @return The builder
- */
- private ResourceBuilder withDefaultPlatformResourceType() {
- resource.setResourceType(new ResourceTypeBuilder().createPlatformResourceType()
- .withName(resource.getName())
- .withPlugin(resource.getName() + " Plugin")
- .withParentResourceType(resource.getResourceType())
- .build());
- return this;
- }
-
- /**
- * The default server resource type is as its name implies a server type whose name defaults to the resource name
- * and the plugin name (i.e., ResourceType.plugin property) defaults to resource name + 'Plugin'
- *
- * @return The builder
- */
- private ResourceBuilder withDefaultServerResourceType() {
- resource.setResourceType(new ResourceTypeBuilder().createServerResourceType()
- .withName(resource.getName())
- .withPlugin(resource.getName() + " Plugin")
- .withParentResourceType(resource.getResourceType())
- .build());
- return this;
- }
-
- /**
- * The default service resource type is as its name implies a service type whose name defaults to the resource name
- * and the plugin name (i.e., ResourceType.plugin property) defaults to resource name + 'Plugin'
- *
- * @return The builder
- */
- private ResourceBuilder withDefaultServicePlatformResourceType() {
- resource.setResourceType(new ResourceTypeBuilder().createServerResourceType()
- .withName(resource.getName())
- .withPlugin(resource.getName() + " Plugin")
- .withParentResourceType(resource.getResourceType())
- .build());
- return this;
- }
-
- private String randomString() {
- return new BigInteger(16, random).toString(32);
- }
-
-}
diff --git a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceTypeBuilder.java b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceTypeBuilder.java
deleted file mode 100644
index 73abefd..0000000
--- a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/ResourceTypeBuilder.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.enterprise.client;
-
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.ResourceType;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * ResourceTypeBuilder is a builder that creates ResourceType objects. The builder ensures that the ResourceType is
- * created in a valid state, specifically fields that are not nullable are required to have non-null values. Using the
- * builder should help make the intent of tests clearer and more self-documenting.
- * <br/><br/>
- * A couple things need to be pointed out. First, this class currently does not yet provide support for all
- * ResourceType fields/properties. Secondly, this class will likely be moved to a test utility module in a subsequent
- * commit so that it can be reused by other tests in other modules.
- *
- * @author John Sanda
- */
-public class ResourceTypeBuilder {
-
- private ResourceType resourceType;
-
- public ResourceTypeBuilder createResourceType() {
- resourceType = new ResourceType();
- resourceType.setParentResourceTypes(new HashSet<ResourceType>());
- resourceType.setChildResourceTypes(new HashSet<ResourceType>());
-
- return this;
- }
-
- public ResourceTypeBuilder createPlatformResourceType() {
- return createResourceType().withCategory(ResourceCategory.PLATFORM);
- }
-
- public ResourceTypeBuilder createServerResourceType() {
- return createResourceType().withCategory(ResourceCategory.SERVER);
- }
-
- public ResourceTypeBuilder createServiceResourceType() {
- return createResourceType().withCategory(ResourceCategory.SERVICE);
- }
-
- public ResourceTypeBuilder withId(int id) {
- resourceType.setId(id);
- return this;
- }
-
- public ResourceTypeBuilder withName(String name) {
- resourceType.setName(name);
- return this;
- }
-
- public ResourceTypeBuilder withPlugin(String plugin) {
- resourceType.setPlugin(plugin);
- return this;
- }
-
- public ResourceTypeBuilder withCategory(ResourceCategory category) {
- resourceType.setCategory(category);
- return this;
- }
-
- public ResourceTypeBuilder withParentResourceType(ResourceType parentResourceType) {
- if (parentResourceType != null) {
- resourceType.addParentResourceType(parentResourceType);
- }
- return this;
- }
-
- public ResourceTypeBuilder withParentResourceTypes(ResourceType... parentResourceTypes) {
- for (ResourceType parent : parentResourceTypes) {
- resourceType.addParentResourceType(parent);
- }
- return this;
- }
-
- public ResourceType build() {
- String errors = valdiate();
- if (errors != null) {
- throw new BuilderException(errors);
- }
-
- return resourceType;
- }
-
- private String valdiate() {
- StringBuilder errors = new StringBuilder();
-
- if (resourceType.getName() == null) {
- errors.append("name is a required property\n");
- }
-
- if (resourceType.getCategory() == null) {
- errors.append("category is a required property\n");
- }
-
- if (resourceType.getCreationDataType() == null) {
- errors.append("creationDate is a required property\n");
- }
-
- if (resourceType.getCreateDeletePolicy() == null) {
- errors.append("createDeletePolicy is a required property\n");
- }
-
- if (resourceType.getPlugin() == null) {
- errors.append("plugin is a required property\n");
- }
-
- if (errors.length() == 0) {
- return null;
- }
-
- return "Unable to build ResourceType instance due to the following validation errors:\n" + errors;
- }
-
-}
diff --git a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/TabularWriterTest.java b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/TabularWriterTest.java
index 4470434..c9d8bb6 100644
--- a/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/TabularWriterTest.java
+++ b/modules/enterprise/remoting/cli/src/test/java/org/rhq/enterprise/client/TabularWriterTest.java
@@ -25,11 +25,9 @@ package org.rhq.enterprise.client;
import static org.testng.Assert.*;
-import org.rhq.core.domain.measurement.AvailabilityType;
-import org.rhq.core.domain.measurement.ResourceAvailability;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.ResourceBuilder;
+
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -40,12 +38,10 @@ import javax.persistence.OneToOne;
import javax.persistence.OneToMany;
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import static org.rhq.core.domain.measurement.AvailabilityType.*;
-import static org.rhq.core.domain.resource.ResourceCategory.*;
public class TabularWriterTest {
@@ -261,9 +257,9 @@ public class TabularWriterTest {
.withUuid("12345")
.withVersion("1.0")
.inInventory()
- .with(2).childServices()
- .notInInventory()
- .included()
+ .with(2).randomChildServices()
+// .notInInventory()
+// .included()
.build();
writer.print(parent.getChildResources());
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index 2abdae5..060a8f6 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -80,6 +80,14 @@
<groupId>org.rhq</groupId>
<artifactId>test-utils</artifactId>
<version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-domain-test-utils</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
</dependency>
<!-- 3rd Party Deps -->
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilter.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilter.java
new file mode 100644
index 0000000..ea4d430
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilter.java
@@ -0,0 +1,64 @@
+package org.rhq.enterprise.server.discovery;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+
+public class DeletedResourceTypeFilter implements InventoryReportFilter {
+
+ private SubjectManagerLocal subjectMgr;
+
+ private ResourceTypeManagerLocal resourceTypeMgr;
+
+ private Set<String> deletedTypes;
+
+ public DeletedResourceTypeFilter(SubjectManagerLocal subjectManager, ResourceTypeManagerLocal resourceTypeManager) {
+ subjectMgr = subjectManager;
+ resourceTypeMgr = resourceTypeManager;
+ deletedTypes = new HashSet<String>();
+ loadDeletedTypes();
+ }
+
+ private void loadDeletedTypes() {
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ criteria.addFilterDeleted(true);
+ PageList<ResourceType> results = resourceTypeMgr.findResourceTypesByCriteria(subjectMgr.getOverlord(),
+ criteria);
+ for (ResourceType type : results) {
+ deletedTypes.add(type.getName() + "::" + type.getPlugin());
+ }
+ }
+
+ public boolean accept(InventoryReport report) {
+ for (Resource resource : report.getAddedRoots()) {
+ if (containsDeletedType(resource)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private boolean containsDeletedType(Resource resource) {
+ if (isDeleted(resource.getResourceType())) {
+ return true;
+ }
+ for (Resource child : resource.getChildResources()) {
+ if (containsDeletedType(child)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isDeleted(ResourceType type) {
+ return deletedTypes.contains(type.getName() + "::" + type.getPlugin());
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
index c593d62..182aa7f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
@@ -47,6 +47,7 @@ import org.rhq.core.clientapi.agent.upgrade.ResourceUpgradeRequest;
import org.rhq.core.clientapi.agent.upgrade.ResourceUpgradeResponse;
import org.rhq.core.clientapi.server.discovery.InvalidInventoryReportException;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.clientapi.server.discovery.StaleTypeException;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.configuration.Configuration;
@@ -116,6 +117,13 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot
public ResourceSyncInfo mergeInventoryReport(InventoryReport report) throws InvalidInventoryReportException {
validateInventoryReport(report);
+
+ InventoryReportFilter filter = new DeletedResourceTypeFilter(subjectManager, resourceTypeManager);
+ if (!filter.accept(report)) {
+ throw new StaleTypeException("The report contains one or more resource types that have been marked for " +
+ "deletion.");
+ }
+
Agent agent = report.getAgent();
long start = System.currentTimeMillis();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/InventoryReportFilter.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/InventoryReportFilter.java
new file mode 100644
index 0000000..78ac3e1
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/InventoryReportFilter.java
@@ -0,0 +1,9 @@
+package org.rhq.enterprise.server.discovery;
+
+import org.rhq.core.clientapi.server.discovery.InventoryReport;
+
+public interface InventoryReportFilter {
+
+ boolean accept(InventoryReport report);
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilterTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilterTest.java
new file mode 100644
index 0000000..13de583
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/DeletedResourceTypeFilterTest.java
@@ -0,0 +1,110 @@
+package org.rhq.enterprise.server.discovery;
+
+import java.util.List;
+
+import org.jmock.Expectations;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.clientapi.server.discovery.InventoryReport;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceBuilder;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.ResourceTypeBuilder;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+import org.rhq.test.JMockTest;
+
+import static org.testng.Assert.*;
+
+public class DeletedResourceTypeFilterTest extends JMockTest {
+
+ SubjectManagerLocal subjectMgr;
+
+ ResourceTypeManagerLocal resourceTypeMgr;
+
+ DeletedResourceTypeFilter filter;
+
+ @BeforeMethod
+ public void init() {
+ subjectMgr = context.mock(SubjectManagerLocal.class);
+ resourceTypeMgr = context.mock(ResourceTypeManagerLocal.class);
+ }
+
+ @Test
+ public void acceptReportWithNoDeletedTypes() {
+ context.checking(new Expectations() {{
+ allowing(subjectMgr).getOverlord();
+ will(returnValue(new Subject("overlord", true, true)));
+
+ allowing(resourceTypeMgr).findResourceTypesByCriteria(with(aNonNull(Subject.class)),
+ with(aNonNull(ResourceTypeCriteria.class)));
+ will(returnValue(new PageList<ResourceType>()));
+ }});
+
+ InventoryReport report = createReport();
+ report.addAddedRoot(new ResourceBuilder()
+ .createRandomServer()
+ .with(2).randomChildServices()
+ .build());
+ report.addAddedRoot(new ResourceBuilder()
+ .createRandomService()
+ .with(2).randomChildServices()
+ .build());
+
+ filter = new DeletedResourceTypeFilter(subjectMgr, resourceTypeMgr);
+
+ assertTrue(filter.accept(report), "Expected report to be accepted when it does not contain any deleted " +
+ "resource types");
+ }
+
+ @Test
+ public void rejectReportWithDeletedTypes() {
+ ResourceType deletedServiceType = new ResourceTypeBuilder()
+ .createServiceResourceType()
+ .withName("TestService")
+ .withPlugin("TestPlugin")
+ .thatIsDeleted()
+ .build();
+
+ final PageList<ResourceType> deletedTypes = new PageList<ResourceType>();
+ deletedTypes.add(deletedServiceType);
+
+ context.checking(new Expectations() {{
+ allowing(subjectMgr).getOverlord();
+ will(returnValue(new Subject("overlord", true, true)));
+
+ allowing(resourceTypeMgr).findResourceTypesByCriteria(with(aNonNull(Subject.class)),
+ with(aNonNull(ResourceTypeCriteria.class)));
+ will(returnValue(deletedTypes));
+ }});
+
+ InventoryReport report = createReport();
+ report.addAddedRoot(new ResourceBuilder()
+ .createRandomServer()
+ .withChildService()
+ .withName("ChildService")
+ .withUuid("c1")
+ .withResourceType(new ResourceTypeBuilder()
+ .createServiceResourceType()
+ .withName("TestService")
+ .withPlugin("TestPlugin")
+ .build())
+ .included()
+ .build());
+
+ filter = new DeletedResourceTypeFilter(subjectMgr, resourceTypeMgr);
+
+ assertFalse(filter.accept(report), "Expected report to be rejected since it contains deleted resource types");
+ }
+
+ InventoryReport createReport() {
+ Agent agent = new Agent("localhost", "localhost", 1234, "1234", "test-token");
+ return new InventoryReport(agent);
+ }
+
+}
13 years, 7 months
[rhq] 4 commits - modules/enterprise modules/helpers
by Heiko W. Rupp
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java | 4 +---
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java | 3 +--
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java | 1 -
modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java | 5 ++++-
modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java | 2 --
5 files changed, 6 insertions(+), 9 deletions(-)
New commits:
commit 75e5b1b2a50369a4951cdc59c9b2deebe807ea8e
Merge: 3602a25... 6f81d33...
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Oct 27 14:56:14 2010 +0200
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit 3602a2549e5278591129f31effe1f6ed53ca8120
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Oct 25 10:03:57 2010 +0200
Small cleanup.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
index 1c5bbb2..1c35c5f 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
@@ -77,7 +77,6 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
@BeforeMethod
public void beforeMethod() {
Date now = new Date();
- System.out.println(">>>>> beforeMethod (AI Purge Test) === " + now.getTime());
try {
this.availabilityManager = LookupUtil.getAvailabilityManager();
this.resourceManager = LookupUtil.getResourceManager();
@@ -109,7 +108,6 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
Subject overlord = LookupUtil.getSubjectManager().getOverlord();
Date now = new Date();
- System.out.println(">>>>>>> testAlternating (AI Purge Test) === " + now.getTime());
EntityManager em = getEntityManager();
Query q = em.createQuery("SELECT r FROM Resource r");
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
index 0332905..1b62820 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
@@ -80,7 +80,6 @@ public class EventsInsertPurgeTest extends AbstractEJB3PerformanceTest {
@BeforeMethod
public void beforeMethod() {
Date now = new Date();
- System.out.println(">>>>> beforeMethod (AI Purge Test) === " + now.getTime());
try {
this.availabilityManager = LookupUtil.getAvailabilityManager();
this.resourceManager = LookupUtil.getResourceManager();
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java
index 280db19..b38d934 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java
@@ -99,7 +99,6 @@ public class AbstractEJB3PerformanceTest extends AbstractEJB3Test {
@AfterMethod
protected void reportTimings(ITestResult result, Method meth) {
Date now = new Date();
- System.out.println(">>> after " + meth.getName() + " (AbstraceEJB3PerformanceTest) === " + now.getTime());
printTimings(meth.getName());
diff --git a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java
index d7f10ef..9efbdff 100644
--- a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java
+++ b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java
@@ -78,7 +78,6 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
}
Date now = new Date();
- System.out.println(">> beforeInvocation(DBInterceptor) " + method.getTestMethod().getMethodName() + " == " + now.getTime());
try {
@@ -133,7 +132,6 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
}
Date now = new Date();
- System.out.println(">> afterInvocation(DBInterceptor) == " + method.getTestMethod().getMethodName() + " === " + now.getTime()); //nothing to do
try {
IDatabaseConnection connection = new DatabaseDataSourceConnection(new InitialContext(),
commit b1200d28b0ac40586602ac469eaf239b84b11ea0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Oct 22 15:54:25 2010 +0200
Put stuff into target/
diff --git a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java
index 1314ce8..910670d 100644
--- a/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java
+++ b/modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/reporting/ExcelExporter.java
@@ -42,6 +42,7 @@ import java.util.TreeSet;
public class ExcelExporter implements PerformanceReportExporter {
private static final String DOT_XLS = ".xls";
+ static final String TARGET = "target/";
String baseFileName ;
PerformanceReporting.Rolling rolling;
CellStyle integerStyle;
@@ -49,7 +50,9 @@ public class ExcelExporter implements PerformanceReportExporter {
@Override
public void setBaseFile(String fileName) {
- baseFileName = fileName;
+ baseFileName = fileName;
+ if (baseFileName.startsWith(TARGET))
+ baseFileName = TARGET + baseFileName;
}
@Override
commit 548bcc3fc7e81012bed6d8bf38626c1679aa8430
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Oct 22 15:52:56 2010 +0200
Re-enable
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
index 44e61f5..1c5bbb2 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java
@@ -57,7 +57,7 @@ import org.testng.annotations.Test;
* @author Heiko W. Rupp
* @author Lukas Krejci
*/
-@Test(groups = "PERF" , enabled = false)
+@Test(groups = "PERF" )
@Listeners({ DatabaseSetupInterceptor.class })
@PerformanceReporting(exporter=ExcelExporter.class)
@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94")
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
index 3df95dd..0332905 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java
@@ -57,7 +57,7 @@ import java.util.Set;
*
* @author Heiko W. Rupp
*/
-@Test(groups = "PERF", enabled = false)
+@Test(groups = "PERF")
@Listeners({ DatabaseSetupInterceptor.class })
@PerformanceReporting(exporter=ExcelExporter.class)
@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94")
13 years, 7 months
[rhq] Branch 'gwt-ldap' - 3 commits - modules/enterprise
by Simeon Pinder
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 35 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java | 273 ++++------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 63 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 2
5 files changed, 171 insertions(+), 204 deletions(-)
New commits:
commit 8be35f289a1b0212e361c7418126f48f9afca6fd
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 26 12:45:36 2010 -0400
i)modified AbstractSelector to support additional selection identifier ii)LdapGroupSelector fix.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index 9356370..569b00f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -225,7 +225,7 @@ public class UserSessionManager {
final Subject validSessionSubject = result.get(0);
//include session for subject session processing with LDAP
validSessionSubject.setSessionId(Integer.valueOf(sessionId));
- Log.trace("Completed session check for subject '" + result + "'.");
+ Log.trace("Completed session check for subject '" + validSessionSubject + "'.");
//initiate ldap check for ldap authz update(wrt roles) of subject with silent update
GWTServiceLookup.getSubjectService().processSubjectForLdap(validSessionSubject,
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
index b40ac2b..3ef327a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
@@ -30,7 +30,6 @@ import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
-import com.smartgwt.client.data.RecordList;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.types.Overflow;
@@ -173,8 +172,7 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
public void save() {
final HashSet<Integer> groupSelection = this.groupSelector.getSelection();
final HashSet<Integer> userSelection = this.subjectSelector.getSelection();
- // final HashSet<String> ldapGroupSelection = this.ldapGroupSelector.getGroupSelection();
- final HashSet<Integer> ldapGroupSelection = this.ldapGroupSelector.getSelection();
+ final HashSet<String> ldapGroupSelection = this.ldapGroupSelector.getSelectionAlternateIds();
// The form.saveData() call triggers either RolesDataSource.executeAdd() to create the new Role,
// or executeUpdate() if saving changes to an existing Role. On success we need to perform the
@@ -221,10 +219,10 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
}
});
- // List<String> selectedGroupList = new ArrayList<String>(ldapGroupSelection);
List<String> selectedGroupList = new ArrayList<String>();
- selectedGroupList = loadLdapGroupSelection(ldapGroupSelection);
- // List<Integer> selectedGroupList = new ArrayList<Integer>(ldapGroupSelection);
+ for (String selection : ldapGroupSelection) {
+ selectedGroupList.add(selection);
+ }
if (!selectedGroupList.isEmpty()) {
GWTServiceLookup.getLdapService().setLdapGroupsForRole(roleId, selectedGroupList,
new AsyncCallback<Void>() {
@@ -242,24 +240,6 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
}
}
-
- /** Return list of group names from selection indices.
- *
- * @param ldapGroupSelection
- * @return
- */
- private List<String> loadLdapGroupSelection(HashSet<Integer> ldapGroupSelection) {
- List<String> groupNames = new ArrayList<String>();
- if (ldapGroupSelection != null) {
- RecordList recordList = ldapGroupSelector.getAssignedGrid().getDataAsRecordList();
- for (int index : ldapGroupSelection) {
- Record record = recordList.get(index);
- String name = record.getAttributeAsString("name");
- groupNames.add(name);
- }
- }
- return groupNames;
- }
});
}
@@ -271,12 +251,9 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
.getAttributeAsObject("subjects"));
this.ldapGroupSelector = new RoleLdapGroupSelector(this.extendLocatorId("LdapGroups"), record
.getAttributeAsInt("id"));
- // this.ldapGroupSelector = new RoleLdapGroupSelector(this.extendLocatorId("LdapGroups"), (Set<LdapGroup>) record
- // .getAttributeAsObject("ldapGroupsAvailable"), (Set<LdapGroup>) record
- // .getAttributeAsObject("ldapGroupsAssigned"));
+
this.groupSelectorItem.setCanvas(this.groupSelector);
this.subjectSelectorItem.setCanvas(this.subjectSelector);
-
this.ldapGroupSelectorItem.setCanvas(this.ldapGroupSelector);
Set<Permission> permissions = (Set<Permission>) record.getAttributeAsObject("permissions");
@@ -338,7 +315,7 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
}
public void onSuccess(Set<Map<String, String>> availableLdapGroups) {
- //TODO: get assigned ldap groups
+ //get assigned ldap groups
Set<LdapGroup> availableGroups = RoleLdapGroupSelector
.convertToCollection(availableLdapGroups);
//update record with both objects.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
index f95f23a..4acc912 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
@@ -34,7 +34,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
-import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.RecordList;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.widgets.form.DynamicForm;
@@ -55,7 +54,6 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/**
* @author Simeon Pinder
*/
-//public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String, String>>> {
public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>> {
public static final String id = "id";
public static final String name = "name";
@@ -70,14 +68,10 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
private Set<Map<String, String>> cachedLdapGroupsAvailable;
private HashMap<String, Map<String, String>> cachedNameKeyedMap;
- // public RoleLdapGroupSelector(String locatorId, Set<LdapGroup> available, Set<LdapGroup> assigned) {
- // super(locatorId);
- // if (available != null) {
- // ListGridRecord[] data = (new LdapGroupsDataSource()).buildRecords(available);
- //// setAssigned(data);
- //// setA
- // }
- // }
+ //override the selector key for ldap group selection.
+ protected String getSelectorKey() {
+ return "name";
+ }
public RoleLdapGroupSelector(String locatorId, Integer integer) {
super(locatorId);
@@ -101,11 +95,9 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
}
@Override
- // protected RPCDataSource<HashSet<Map<String, String>>> getDataSource() {
protected RPCDataSource<PageList<LdapGroup>> getDataSource() {
if (availableDatasource == null) {
availableDatasource = new LdapGroupsDataSource();
- Log.debug("++++++++++ RoleLDapGroupSelector.datasourceInit:" + availableDatasource);
//add subsequent listener
int currentRoleId = getCurrentRole();
if (currentRoleId > -1) {
@@ -118,28 +110,21 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
if (currentRoleId > -1) {
if (initialLdapSelectionsLoad) {
GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- // new AsyncCallback<Set<Map<String, String>>>() {
new AsyncCallback<PageList<LdapGroup>>() {
-
public void onFailure(Throwable throwable) {
CoreGUI.getErrorHandler().handleError(
"Failed to load LdapGroups available for role.", throwable);
}
- // public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
public void onSuccess(PageList<LdapGroup> currentlyAssignedLdapGroups) {
//translate groups into records for grid
- // response.setData(buildRecords(locatedGroups));
- // response.setData(buildAssignedRecords(currentlyAssignedLdapGroups));
- //instead of setting the data, find which ones are shared and transfer as before
+ //instead of setting the data, find which ones are shared and transfer as before. eliminate stale
if ((currentlyAssignedLdapGroups != null)
&& (!currentlyAssignedLdapGroups.isEmpty())) {
RecordList loaded = availableGrid.getDataAsRecordList();
if (loaded != null) {
ArrayList<Integer> located = new ArrayList<Integer>();
- // for (Map groupMap : currentlyAssignedLdapGroups) {
for (LdapGroup group : currentlyAssignedLdapGroups) {
- // int index = loaded.findIndex(name, (String) groupMap.get(name));
int index = loaded.findIndex(name, (String) group.getName());
if (index > -1) {
group.setId(index);//overwrite RHQ Resource ID to match ldap fabricated id.
@@ -158,15 +143,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
select(assignedGrid.getSelection());
updateButtons();
assignedGrid.deselectAllRecords();
- // assignedGrid.deselectAllRecords();
- // assignedGrid.transferSelectedData(availableGrid);
- // select(assignedGrid.getSelection());
- // updateButtons();
- Record rec = assignedGrid.getDataAsRecordList().get(0);
- // for (String attr : rec.getAttributes()) {
- // Log.debug("%%%%%%%%%% attribute:" + attr + ":value:"
- // + rec.getAttribute(attr) + ":");
- // }
}
}
}
@@ -192,38 +168,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
return criteria;
}
- // protected void select(ListGridRecord[] records) {
- // availableGrid.deselectAllRecords();
- // for (ListGridRecord record : records) {
- // record.setEnabled(false);
- // selection.add(record.getAttributeAsString(name));
- // }
- // assignedGrid.markForRedraw();
- // }
- //
- // protected void deselect(ListGridRecord[] records) {
- // HashSet<String> toRemove = new HashSet<String>();
- // for (ListGridRecord record : records) {
- // toRemove.add(record.getAttributeAsString(name));
- // }
- // selection.removeAll(toRemove);
- //
- // for (String name : toRemove) {
- // Record r = availableGrid.getDataAsRecordList().find(name, name);
- // if (r != null) {
- // ((ListGridRecord) r).setEnabled(true);
- // }
- // }
- // int cnt = 0;
- // for (Record lgr : availableGrid.getDataAsRecordList().toArray()) {
- // if (lgr.getAttributeAsBoolean("enabled")) {
- // cnt++;
- // }
- // }
- // availableGrid.markForRedraw();
- // }
-
- // public class LdapGroupsDataSource extends RPCDataSource<HashSet<Map<String, String>>> {
public class LdapGroupsDataSource extends RPCDataSource<PageList<LdapGroup>> {
public static final String LDAP_NOT_CONFIGURED_EMPTY_MESSAGE = "(LDAP not configured. 'Administrator'->System Settings to change)";
@@ -238,8 +182,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
setFields(nameField, descriptionField);
}
- // public ListGridRecord[] buildRecords(Set<Map<String, String>> locatedGroups) {
- // public ListGridRecord[] buildRecords(PageList<LdapGroup> locatedGroups) {
public ListGridRecord[] buildRecords(Set<LdapGroup> locatedGroups) {
ListGridRecord[] records = new ListGridRecord[0];
int indx = 0;
@@ -248,19 +190,12 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
records = new ListGridRecord[locatedGroups.size()];
int index = 0;
//for each Map returned then iterate over to retrieve the values
- // Iterator<Map<String, String>> iterator = locatedGroups.iterator();
- // while (iterator.hasNext()) {
for (LdapGroup group : locatedGroups) {
- // Map<String, String> group = iterator.next();
//iterate over the group data to translate into records
ListGridRecord record = new ListGridRecord();
//load identifier
record.setAttribute(id, index++);
- //load name
- // record.setAttribute(name, group.get(name));
record.setAttribute(name, group.getName());
- //load description
- // record.setAttribute(description, group.get(description));
record.setAttribute(description, group.getDescription());
records[indx++] = record;
}
@@ -275,13 +210,11 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
}
@Override
- // public HashSet<Map<String, String>> copyValues(ListGridRecord from) {
public PageList<LdapGroup> copyValues(ListGridRecord from) {
throw new UnsupportedOperationException("Ldap Group data is read only");
}
@Override
- // public ListGridRecord copyValues(HashSet<Map<String, String>> from) {
public ListGridRecord copyValues(PageList<LdapGroup> from) {
return null;
}
@@ -305,17 +238,12 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
}
public void onSuccess(Set<Map<String, String>> locatedGroups) {
- Log.trace("Successfully located groups.");
- Log.debug("---------------------------------- Available groups:"
- + locatedGroups.size());
+ Log.trace("Successfully located " + locatedGroups.size()
+ + " LDAP available groups.");
if (cachedLdapGroupsAvailable == null) {
cachedLdapGroupsAvailable = locatedGroups;
- Log.debug("+++++++++++++++ cachedLdapGroupsAvailable:"
- + cachedLdapGroupsAvailable);
}
- //translate groups into records for grid
- // response.setData(buildRecords(locatedGroups));
- // Set<LdapGroup> collection = new HashSet<LdapGroup>();
+ //all groups displayed initially
response.setData(buildRecords(convertToCollection(locatedGroups)));
//entry count
if (null != locatedGroups) {
@@ -367,7 +295,7 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
locatedGroups.add(cachedNameKeyedMap.get(key));
}
}
- } else {//return full list
+ } else {//return full list .. as no filtering done.
locatedGroups = cachedLdapGroupsAvailable;
}
//then convert.
@@ -402,26 +330,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
return converted;
}
- // public HashSet<String> getGroupSelection() {
- // RecordList records = assignedGrid.getDataAsRecordList();
- // //empty out selection and populate with actual contents
- // selection.clear();
- // if (!records.isEmpty()) {
- // for (Record r : records.toArray()) {
- // selection.add(r.getAttributeAsString(name));
- // }
- // }
- // HashSet<String> assignedSelections = new HashSet<String>();
- // for (ListGridRecord r : assignedGrid.getSelection()) {
- // assignedSelections.add(r.getAttributeAsString(name));
- // }
- // HashSet<String> remainingRecords = new HashSet<String>();
- // for (Record r : assignedGrid.getDataAsRecordList().toArray()) {
- // remainingRecords.add(r.getAttributeAsString(name));
- // }
- // return remainingRecords;
- // }
-
public class LdapAssignedGroupsDatasource extends RPCDataSource<Set<String>> {
private Integer currentRoleId = Integer.valueOf(-1);
@@ -451,7 +359,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
}
GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- // new AsyncCallback<Set<Map<String, String>>>() {
new AsyncCallback<PageList<LdapGroup>>() {
public void onFailure(Throwable throwable) {
@@ -459,17 +366,11 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
throwable);
}
- // public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
public void onSuccess(PageList<LdapGroup> currentlyAssignedLdapGroups) {
- //translate groups into records for grid
- // response.setData(buildRecords(locatedGroups));
- // response.setData(buildAssignedRecords(currentlyAssignedLdapGroups));
//instead of setting the data, find which ones are shared and transfer as before
RecordList loaded = getAssignedGrid().getDataAsRecordList();
ArrayList<Integer> located = new ArrayList<Integer>();
- // for (Map groupMap : currentlyAssignedLdapGroups) {
for (LdapGroup groupMap : currentlyAssignedLdapGroups) {
- // int index = loaded.findIndex(name, (String) groupMap.get(name));
int index = loaded.findIndex(id, groupMap.getId());
if (index > -1) {
located.add(Integer.valueOf(index));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
index 02d39f2..91e4640 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
@@ -58,6 +58,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
public abstract class AbstractSelector<T> extends LocatableVLayout {
protected HashSet<Integer> selection = new HashSet<Integer>();
+ protected HashSet<String> selectionAlternateIds = new HashSet<String>();
protected ListGridRecord[] initialSelection;
protected DynamicForm availableFilterForm;
@@ -70,7 +71,7 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
protected TransferImgButton removeButton;
protected TransferImgButton addAllButton;
protected TransferImgButton removeAllButton;
-
+ private static String SELECTOR_KEY = "id";
protected Criteria latestCriteria;
public AbstractSelector(String locatorId) {
@@ -84,10 +85,18 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
initialSelection = assignedRecords;
}
+ /** List of indices for the records being transferred.
+ *
+ * @return
+ */
public HashSet<Integer> getSelection() {
return selection;
}
+ public HashSet<String> getSelectionAlternateIds() {
+ return selectionAlternateIds;
+ }
+
protected abstract DynamicForm getAvailableFilterForm();
protected abstract RPCDataSource<T> getDataSource();
@@ -259,7 +268,11 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
if (initialSelection != null) {
assignedGrid.setData(initialSelection);
for (ListGridRecord record : initialSelection) {
- selection.add(record.getAttributeAsInt("id"));
+ if (getSelectorKey().equalsIgnoreCase("id")) {
+ selection.add(record.getAttributeAsInt(getSelectorKey()));
+ } else {
+ selectionAlternateIds.add(record.getAttributeAsString(getSelectorKey()));
+ }
}
}
@@ -303,25 +316,43 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
availableGrid.deselectAllRecords();
for (ListGridRecord record : records) {
record.setEnabled(false);
- selection.add(record.getAttributeAsInt("id"));
+ if (getSelectorKey().equalsIgnoreCase("id")) {
+ selection.add(record.getAttributeAsInt(getSelectorKey()));
+ } else {
+ selectionAlternateIds.add(record.getAttributeAsString(getSelectorKey()));
+ }
}
assignedGrid.markForRedraw();
}
protected void deselect(ListGridRecord[] records) {
HashSet<Integer> toRemove = new HashSet<Integer>();
- for (ListGridRecord record : records) {
- // for (String attr : record.getAttributes()) {
- // Log.debug("------- ATTR:" + attr + ":value:" + record.getAttribute(attr) + ":");
- // }
- toRemove.add(record.getAttributeAsInt("id"));
- }
- selection.removeAll(toRemove);
+ HashSet<String> toRemoveStringIds = new HashSet<String>();
+ if (getSelectorKey().equalsIgnoreCase("id")) {//integer id based
+ for (ListGridRecord record : records) {
+ toRemove.add(record.getAttributeAsInt(getSelectorKey()));
+ }
+ selection.removeAll(toRemove);
- for (Integer id : toRemove) {
- Record r = availableGrid.getDataAsRecordList().find("id", id);
- if (r != null) {
- ((ListGridRecord) r).setEnabled(true);
+ for (Integer id : toRemove) {
+ Record r = null;
+ r = availableGrid.getDataAsRecordList().find(getSelectorKey(), id);
+ if (r != null) {
+ ((ListGridRecord) r).setEnabled(true);
+ }
+ }
+ } else {//not using 'id' as selection criteria
+ for (ListGridRecord record : records) {
+ toRemoveStringIds.add(record.getAttributeAsString(getSelectorKey()));
+ }
+ selectionAlternateIds.removeAll(toRemoveStringIds);
+
+ for (String id : toRemoveStringIds) {
+ Record r = null;
+ r = availableGrid.getDataAsRecordList().find(getSelectorKey(), id);
+ if (r != null) {
+ ((ListGridRecord) r).setEnabled(true);
+ }
}
}
availableGrid.markForRedraw();
@@ -335,6 +366,10 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
return assignedGrid;
}
+ protected String getSelectorKey() {
+ return SELECTOR_KEY;
+ }
+
// public TransferImgButton getAddButton() {
// return addButton;
// }
commit f143dd803c1add3ec05aec98421ac5feaf4dbbd2
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 26 09:23:59 2010 -0400
add name search filtering to ldap resource selector.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
index 580da5b..f95f23a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
@@ -23,6 +23,7 @@
package org.rhq.enterprise.gui.coregui.client.admin.roles;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
@@ -37,6 +38,8 @@ import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.RecordList;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.SpacerItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
@@ -47,6 +50,7 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.selector.AbstractSelector;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/**
* @author Simeon Pinder
@@ -62,6 +66,9 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
protected HashSet<String> selection = new HashSet<String>();
private int currentRole = -1;
private boolean initialLdapSelectionsLoad = true;
+ //cache ldap group data from external server
+ private Set<Map<String, String>> cachedLdapGroupsAvailable;
+ private HashMap<String, Map<String, String>> cachedNameKeyedMap;
// public RoleLdapGroupSelector(String locatorId, Set<LdapGroup> available, Set<LdapGroup> assigned) {
// super(locatorId);
@@ -79,9 +86,18 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
}
}
+ /** Define search for case insensitive filtering on ldap name.
+ */
@Override
protected DynamicForm getAvailableFilterForm() {
- return null; // TODO: Implement this method.
+ DynamicForm availableFilterForm = new LocatableDynamicForm(this.getLocatorId());
+ availableFilterForm.setWidth100();
+ availableFilterForm.setNumCols(2);
+
+ final TextItem search = new TextItem("search", "Search");
+ availableFilterForm.setItems(search, new SpacerItem());
+
+ return availableFilterForm;
}
@Override
@@ -164,9 +180,16 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
return availableDatasource;
}
+ /** Retrieve latest search string entered by the user.
+ */
@Override
protected Criteria getLatestCriteria(DynamicForm availableFilterForm) {
- return null; // TODO: Implement this method.
+ String search = (String) availableFilterForm.getValue("search");
+ Criteria criteria = new Criteria();
+ if (null != search) {
+ criteria.addCriteria("name", search);
+ }
+ return criteria;
}
// protected void select(ListGridRecord[] records) {
@@ -265,67 +288,100 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
@Override
protected void executeFetch(final DSRequest request, final DSResponse response) {
- //determine if ldap enabled, if so then chain and proceed with finding groups
- GWTServiceLookup.getLdapService().checkLdapConfiguredStatus(new AsyncCallback<Boolean>() {
- @Override
- public void onSuccess(Boolean ldapConfigured) {
- if (ldapConfigured) {
- availableGrid.setEmptyMessage(EMPTY_MESSAGE);
- GWTServiceLookup.getLdapService().findAvailableGroups(
- new AsyncCallback<Set<Map<String, String>>>() {
-
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError(
- "Failed to load LdapGroups available for role.", throwable);
- }
-
- public void onSuccess(Set<Map<String, String>> locatedGroups) {
- Log.trace("Successfully located groups.");
- Log.debug("---------------------------------- Available groups:"
- + locatedGroups.size());
- //translate groups into records for grid
- // response.setData(buildRecords(locatedGroups));
- // Set<LdapGroup> collection = new HashSet<LdapGroup>();
- response.setData(buildRecords(convertToCollection(locatedGroups)));
- //entry count
- if (null != locatedGroups) {
- response.setTotalRows(locatedGroups.size());
- } else {
- response.setTotalRows(0);
+ //if not null then go through to initialize
+ if (cachedLdapGroupsAvailable == null) {
+ //determine if ldap enabled, if so then chain and proceed with finding groups
+ GWTServiceLookup.getLdapService().checkLdapConfiguredStatus(new AsyncCallback<Boolean>() {
+ @Override
+ public void onSuccess(Boolean ldapConfigured) {
+ if (ldapConfigured) {
+ availableGrid.setEmptyMessage(EMPTY_MESSAGE);
+ GWTServiceLookup.getLdapService().findAvailableGroups(
+ new AsyncCallback<Set<Map<String, String>>>() {
+
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to load LdapGroups available for role.", throwable);
}
- //pass off for processing
- processResponse(request.getRequestId(), response);
- }
-
- // private PageList<LdapGroup> convertToCollection(Set<Map<String, String>> locatedGroups) {
- // private Set<LdapGroup> convertToCollection(Set<Map<String, String>> locatedGroups) {
- // Set<LdapGroup> converted = new HashSet<LdapGroup>();
- // if (locatedGroups != null) {
- // Iterator<Map<String, String>> iterator = locatedGroups.iterator();
- // while (iterator.hasNext()) {
- // Map<String, String> map = iterator.next();
- // LdapGroup group = new LdapGroup();
- // group.setDescription(map.get("description"));
- // group.setName(map.get("name"));
- // converted.add(group);
- // }
- // }
- // return converted;
- // }
- });
- } else {
- Log.debug("(LDAP not currently enabled. " + EMPTY_MESSAGE);
- response.setTotalRows(0);
- availableGrid.setEmptyMessage(LDAP_NOT_CONFIGURED_EMPTY_MESSAGE);
- processResponse(request.getRequestId(), response);
+
+ public void onSuccess(Set<Map<String, String>> locatedGroups) {
+ Log.trace("Successfully located groups.");
+ Log.debug("---------------------------------- Available groups:"
+ + locatedGroups.size());
+ if (cachedLdapGroupsAvailable == null) {
+ cachedLdapGroupsAvailable = locatedGroups;
+ Log.debug("+++++++++++++++ cachedLdapGroupsAvailable:"
+ + cachedLdapGroupsAvailable);
+ }
+ //translate groups into records for grid
+ // response.setData(buildRecords(locatedGroups));
+ // Set<LdapGroup> collection = new HashSet<LdapGroup>();
+ response.setData(buildRecords(convertToCollection(locatedGroups)));
+ //entry count
+ if (null != locatedGroups) {
+ response.setTotalRows(locatedGroups.size());
+ } else {
+ response.setTotalRows(0);
+ }
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
+ }
+ });//end of findAvailableGroups
+ } else {//ldap not configured
+ Log.debug("(LDAP not currently enabled. " + EMPTY_MESSAGE);
+ response.setTotalRows(0);
+ availableGrid.setEmptyMessage(LDAP_NOT_CONFIGURED_EMPTY_MESSAGE);
+ processResponse(request.getRequestId(), response);
+ }
+ }//end onSuccess
+
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.error("Unable to determine whether ldap configured - check server logs.");
+ }
+ });//end of checkLdapConfigured status
+ } else {//use cached data and return correct response
+ //process cachedLdapGroupsAvailable based on criteria
+ Criteria criteria = getLatestCriteria(availableFilterForm);
+ String search = (String) criteria.getValues().get("name");
+ //empty group
+ Set<Map<String, String>> locatedGroups = new HashSet<Map<String, String>>();
+
+ //populate the indexed map
+ if (cachedNameKeyedMap == null) {
+ cachedNameKeyedMap = new HashMap<String, Map<String, String>>();
+ Iterator<Map<String, String>> iterator = cachedLdapGroupsAvailable.iterator();
+ while (iterator.hasNext()) {
+ Map<String, String> map = iterator.next();
+ String id = map.get("name");
+ cachedNameKeyedMap.put(id, map);
}
}
-
- @Override
- public void onFailure(Throwable caught) {
- Log.error("Unable to determine whether ldap configured - check server logs.");
+ //if search non empty
+ if ((search != null) && (!search.trim().isEmpty())) {
+ //now iterate over keys to find matches
+ Set<String> keySet = cachedNameKeyedMap.keySet();
+ for (String key : keySet) {
+ //do case insensitive match to entered string.
+ if (key.toLowerCase().contains(search.trim().toLowerCase())) {
+ locatedGroups.add(cachedNameKeyedMap.get(key));
+ }
+ }
+ } else {//return full list
+ locatedGroups = cachedLdapGroupsAvailable;
+ }
+ //then convert.
+ response.setData(buildRecords(convertToCollection(locatedGroups)));
+ //entry count
+ if (null != locatedGroups) {
+ response.setTotalRows(locatedGroups.size());
+ } else {
+ response.setTotalRows(0);
}
- });
+
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
+ }
}
}
commit 076e333a082a80b61876a894770618f890428500
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Oct 25 19:34:01 2010 -0400
removing left over println.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index 491f26e..a9e7992 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -299,8 +299,6 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
// nope, no session; continue on so we can create the session
}
} else {
- System.out.println("+++++++++++ i)Not yet registered ii)case insensitive login from ldap for username:"
- + username + ":");
// There is no subject in the database yet.
// If LDAP authentication is enabled and we cannot find the subject,
// it means we must have authenticated via LDAP, not JDBC (otherwise,
13 years, 7 months
[rhq] Branch 'delete-agent-plugin' - 21 commits - modules/core modules/enterprise modules/pom.xml
by John Sanda
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceTypeTemplateCountComposite.java | 14
modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java | 8
modules/core/pom.xml | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 59 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java | 233 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java | 445 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java | 134 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 277 +++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java | 254 ++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/InventorySummaryView.java | 44
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java | 44
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceTypeGWTService.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java | 38
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupDataSourceField.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java | 33
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java | 32
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 49 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java | 51 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java | 39
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java | 27
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java | 171 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/SearchBarPane.java | 19
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 14
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java | 21
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java | 24
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java | 85 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceTypeGWTServiceImpl.java | 13
modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css | 2
modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml | 8
modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/alert/Edit_Alert.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/monitor/Edit_Metric.png |binary
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java | 39
modules/pom.xml | 5
40 files changed, 1706 insertions(+), 512 deletions(-)
New commits:
commit f5c83a2f1236e006dd94d6e0f10c21077636069a
Merge: 82a6dcf... 6f81d33...
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Oct 26 09:16:15 2010 -0400
Merge branch 'master' into delete-agent-plugin
Conflicts:
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
diff --cc modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index 068d0c4,e20572f..52dcf32
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@@ -79,26 -79,24 +79,28 @@@ import org.rhq.core.domain.util.Summary
@Table(name = ResourceType.TABLE_NAME)
@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_RESOURCE_TYPE_ID_SEQ")
@NamedQueries( {
- @NamedQuery(name = ResourceType.QUERY_FIND_BY_PLUGIN, query = "SELECT rt FROM ResourceType AS rt WHERE rt.plugin = :plugin"),
+ @NamedQuery(name = ResourceType.QUERY_FIND_BY_PLUGIN, query = "SELECT rt FROM ResourceType AS rt " +
+ "WHERE rt.plugin = :plugin AND rt.deleted = false"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_NAME_AND_PLUGIN, // TODO: QUERY: names are case-sensitive
- query = "SELECT rt FROM ResourceType AS rt WHERE LOWER(rt.name) = LOWER(:name) AND rt.plugin = :plugin"),
- @NamedQuery(name = ResourceType.QUERY_FIND_ALL, query = "SELECT rt FROM ResourceType AS rt"),
+ query = "SELECT rt FROM ResourceType AS rt WHERE LOWER(rt.name) = LOWER(:name) AND rt.plugin = :plugin " +
+ "AND rt.deleted = false"),
+ @NamedQuery(name = ResourceType.QUERY_FIND_ALL, query = "SELECT rt FROM ResourceType AS rt where rt.deleted = false"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_PARENT_AND_NAME, // TODO: QUERY: Not looking up by the full key, get rid of this query
- query = "SELECT rt FROM ResourceType AS rt WHERE :parent MEMBER OF rt.parentResourceTypes AND rt.name = :name"),
+ query = "SELECT rt FROM ResourceType AS rt WHERE :parent MEMBER OF rt.parentResourceTypes AND rt.name = :name " +
+ "AND rt.deleted = false"),
/* authz'ed queries for ResourceTypeManagerBean */
- @NamedQuery(name = ResourceType.QUERY_FIND_CHILDREN, query = "SELECT rt.childResourceTypes "
- + "FROM ResourceType rt WHERE rt.id = :resourceTypeId "),
+ @NamedQuery(name = ResourceType.QUERY_FIND_CHILDREN, query = "SELECT c "
+ + "FROM ResourceType rt JOIN rt.childResourceTypes c WHERE rt.id = :resourceTypeId AND rt.deleted = false "
+ + "AND c.deleted = false"),
@NamedQuery(name = ResourceType.FIND_CHILDREN_BY_PARENT, query = "SELECT DISTINCT rt FROM ResourceType AS rt "
+ "JOIN FETCH rt.parentResourceTypes AS pa " + // also fetch parents, as we need them later
- "WHERE pa IN (:resourceType)"),
+ "WHERE rt.deleted = false and pa IN (:resourceType)"),
+ // template count composites need the parent types fetched; however, because of a quirk in hibernate,
+ // we can't use the template component constructor in the select, we'll build the composites in our code
@NamedQuery(name = ResourceType.FIND_ALL_TEMPLATE_COUNT_COMPOSITES, query = "" //
- // + "SELECT new org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite (" //
- + "SELECT " //
+ + "SELECT new org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite" //
+ + "(" //
+ " rt," //
+ " (SELECT COUNT(md) FROM MeasurementDefinition AS md WHERE md.resourceType = rt AND md.defaultOn = TRUE), "//
+ " (SELECT COUNT(md) FROM MeasurementDefinition AS md WHERE md.resourceType = rt AND md.defaultOn = FALSE), "//
commit 6f81d33409dd1c2098ffc7ee7e35ee824d1a2026
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Oct 25 19:11:04 2010 -0400
favor direct attribute access instead of multiple maps to lookup icon/style
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
index a9e94c2..81f9882 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
@@ -38,7 +38,26 @@ public class Message {
// TODO: Add Debug severity?
public enum Severity {
- Info, Warning, Error, Fatal
+ Info("InfoBlock", "info/icn_info_blue.png"), //
+ Warning("WarnBlock", "info/icn_info_orange.png"), //
+ Error("ErrorBlock", "info/icn_info_red.png"), //
+ Fatal("FatalBlock", "info/icn_info_red.png");
+
+ private String style;
+ private String icon;
+
+ private Severity(String style, String icon) {
+ this.style = style;
+ this.icon = icon;
+ }
+
+ public String getStyle() {
+ return style;
+ }
+
+ public String getIcon() {
+ return icon;
+ }
};
public enum Option {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
index 04fceff..1f95a24 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
@@ -19,9 +19,6 @@
*/
package org.rhq.enterprise.gui.coregui.client.util.message;
-import java.util.HashMap;
-import java.util.Map;
-
import com.google.gwt.user.client.Timer;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
@@ -40,21 +37,6 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
private static final String LOCATOR_ID = "MessageBar";
private static final int AUTO_HIDE_DELAY_MILLIS = 15000; // 15 seconds
- private static final Map<Message.Severity, String> SEVERITY_TO_STYLE_NAME_MAP = new HashMap<Message.Severity, String>();
- static {
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Info, "InfoBlock");
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Warning, "WarnBlock");
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Error, "ErrorBlock");
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Fatal, "FatalBlock");
- }
-
- private static final Map<Message.Severity, String> SEVERITY_TO_ICON_MAP = new HashMap<Message.Severity, String>();
- static {
- SEVERITY_TO_ICON_MAP.put(Message.Severity.Info, "info/icn_info_blue.png");
- SEVERITY_TO_ICON_MAP.put(Message.Severity.Warning, "info/icn_info_orange.png");
- SEVERITY_TO_ICON_MAP.put(Message.Severity.Error, "info/icn_info_red.png");
- }
-
private Label label;
private Message stickyMessage;
@@ -89,7 +71,7 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
} else {
Timer hideTimer = new Timer() {
@Override
- public void run() {
+ public void run() {
clearMessage(false);
if (stickyMessage != null) {
displayMessage(stickyMessage);
@@ -130,7 +112,7 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
label.setContents(contents);
label.setAlign(Alignment.CENTER);
- String styleName = (contents != null) ? SEVERITY_TO_STYLE_NAME_MAP.get(message.getSeverity()) : null;
+ String styleName = (contents != null) ? message.getSeverity().getStyle() : null;
label.setStyleName(styleName);
label.setWidth(400);
@@ -139,7 +121,7 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
// label.
//label.setShowEdges(true);
- String icon = (contents != null) ? SEVERITY_TO_ICON_MAP.get(message.getSeverity()) : null;
+ String icon = (contents != null) ? message.getSeverity().getIcon() : null;
label.setIcon(icon);
return label;
commit c6879b2c24e72b676ba4a7b512f3a14b988d8801
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Oct 25 19:10:13 2010 -0400
get rid of unused method
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
index d61a308..a129b24 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
@@ -122,8 +122,8 @@ public abstract class RPCDataSource<T> extends DataSource {
if (request.getStartRow() == null || request.getEndRow() == null) {
pageControl = new PageControl();
} else {
- pageControl = PageControl.getExplicitPageControl(request.getStartRow(), request.getEndRow()
- - request.getStartRow());
+ pageControl = PageControl.getExplicitPageControl(request.getStartRow(),
+ request.getEndRow() - request.getStartRow());
}
// Initialize sorting.
@@ -260,12 +260,8 @@ public abstract class RPCDataSource<T> extends DataSource {
return newRecord;
}
- public static <S> S[] getArrayFilter(DSRequest request, String paramName, Class<S> type) {
- return getArrayFilter(request, paramName, type, null);
- }
-
@SuppressWarnings("unchecked")
- public static <S> S[] getArrayFilter(DSRequest request, String paramName, Class<S> type, S[] dummy) {
+ public static <S> S[] getArrayFilter(DSRequest request, String paramName, Class<S> type) {
com.allen_sauer.gwt.log.client.Log.debug("Fetching array " + paramName + " (" + type + ")");
Criteria criteria = request.getCriteria();
Map<String, Object> criteriaMap = criteria.getValues();
commit e17fe828c93ecadae7cd07ca14ea643c15beac08
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Sat Oct 23 11:58:59 2010 -0400
there was a bug in the resource type repo code such that
if we loaded a resource type in the cache already but the cache
did not load any metadata, the typeCacheLevel map did not
have the type in it, which causes the if-stmt to erroneously conclude
it did not have to add the type to the typesNeeded collection (the containsKey
resulted in false, meaning the else clause got invoked).
This commit changes the if-stmt to cover that additional edge case.
I added a comment above the if-stmt to indicate the three cases in
which we should be adding to the typesNeeded collection.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
index 1c01176..c998010 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
@@ -26,6 +26,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -160,8 +161,17 @@ public class ResourceTypeRepository {
});
}
- public void getResourceTypes(Integer[] resourceTypeIds, final EnumSet<MetadataType> metadataTypes,
+ public void getResourceTypes(Integer[] resourceTypeIds, EnumSet<MetadataType> metadataTypesNeeded,
final TypesLoadedCallback callback) {
+
+ // note metadataTypesNeeded == null implies EnumSet.noneOf(MetadataType.class)
+ final EnumSet<MetadataType> metadataTypes;
+ if (metadataTypesNeeded == null) {
+ metadataTypes = EnumSet.noneOf(MetadataType.class);
+ } else {
+ metadataTypes = metadataTypesNeeded;
+ }
+
ResourceTypeCriteria criteria = new ResourceTypeCriteria();
final Map<Integer, ResourceType> cachedTypes = new HashMap<Integer, ResourceType>();
@@ -172,9 +182,14 @@ public class ResourceTypeRepository {
} else {
for (Integer typeId : resourceTypeIds) {
- if (!typeCache.containsKey(typeId)
- || (metadataTypes != null && (typeCacheLevel.containsKey(typeId)) && !typeCacheLevel.get(typeId)
- .containsAll(metadataTypes))) {
+ // we need to query for data if:
+ // 1. we don't have the resource type in our cache at all, or...
+ // 2. we have the basic resource type but no additional metadata, but the caller is asking for additional metadata
+ // 3. we have the resource type and some additional metadata, but the caller is asking for metadata that we don't have
+ if (!typeCache.containsKey(typeId) // 1.
+ || (!metadataTypes.isEmpty() && (!typeCacheLevel.containsKey(typeId) // 2.
+ || !typeCacheLevel.get(typeId).containsAll(metadataTypes)))) // 3.
+ {
typesNeeded.add(typeId);
} else {
cachedTypes.put(typeId, typeCache.get(typeId));
@@ -193,41 +208,42 @@ public class ResourceTypeRepository {
if (metadataTypes != null) {
for (MetadataType metadataType : metadataTypes) {
switch (metadataType) {
- case children:
- criteria.fetchChildResourceTypes(true);
- break;
- case content:
- criteria.fetchPackageTypes(true);
- break;
- case events:
- criteria.fetchEventDefinitions(true);
- break;
- case measurements:
- criteria.fetchMetricDefinitions(true);
- break;
- case operations:
- criteria.fetchOperationDefinitions(true);
- break;
- case parentTypes:
- criteria.fetchParentResourceTypes(true);
- break;
- case pluginConfigurationDefinition:
- criteria.fetchPluginConfigurationDefinition(true);
- break;
- case processScans:
- criteria.fetchProcessScans(true);
- break;
- case productVersions:
- criteria.fetchProductVersions(true);
- break;
- case resourceConfigurationDefinition:
- criteria.fetchResourceConfigurationDefinition(true);
- break;
- case subCategory:
- criteria.fetchSubCategory(true);
- break;
- default:
- System.err.println("ERROR: metadataType " + metadataType.name() + " not incorporated into ResourceType criteria.");
+ case children:
+ criteria.fetchChildResourceTypes(true);
+ break;
+ case content:
+ criteria.fetchPackageTypes(true);
+ break;
+ case events:
+ criteria.fetchEventDefinitions(true);
+ break;
+ case measurements:
+ criteria.fetchMetricDefinitions(true);
+ break;
+ case operations:
+ criteria.fetchOperationDefinitions(true);
+ break;
+ case parentTypes:
+ criteria.fetchParentResourceTypes(true);
+ break;
+ case pluginConfigurationDefinition:
+ criteria.fetchPluginConfigurationDefinition(true);
+ break;
+ case processScans:
+ criteria.fetchProcessScans(true);
+ break;
+ case productVersions:
+ criteria.fetchProductVersions(true);
+ break;
+ case resourceConfigurationDefinition:
+ criteria.fetchResourceConfigurationDefinition(true);
+ break;
+ case subCategory:
+ criteria.fetchSubCategory(true);
+ break;
+ default:
+ Log.error("ERROR: metadataType " + metadataType.name()
+ + " not incorporated into ResourceType criteria.");
}
}
}
@@ -249,43 +265,44 @@ public class ResourceTypeRepository {
if (metadataTypes != null) {
for (MetadataType metadataType : metadataTypes) {
switch (metadataType) {
- case children:
- cachedType.setChildResourceTypes(type.getChildResourceTypes());
- break;
- case content:
- cachedType.setPackageTypes(type.getPackageTypes());
- break;
- case events:
- cachedType.setPackageTypes(type.getPackageTypes());
- break;
- case measurements:
- cachedType.setMetricDefinitions(type.getMetricDefinitions());
- break;
- case operations:
- cachedType.setOperationDefinitions(type.getOperationDefinitions());
- break;
- case parentTypes:
- cachedType.setParentResourceTypes(type.getParentResourceTypes());
- break;
- case pluginConfigurationDefinition:
- cachedType
- .setPluginConfigurationDefinition(type.getPluginConfigurationDefinition());
- break;
- case processScans:
- cachedType.setProcessScans(type.getProcessScans());
- break;
- case productVersions:
- cachedType.setProductVersions(type.getProductVersions());
- break;
- case resourceConfigurationDefinition:
- cachedType.setResourceConfigurationDefinition(type
- .getResourceConfigurationDefinition());
- break;
- case subCategory:
- cachedType.setSubCategory(type.getSubCategory());
- break;
- default:
- System.err.println("ERROR: metadataType " + metadataType.name() + " not merged into cached ResourceType.");
+ case children:
+ cachedType.setChildResourceTypes(type.getChildResourceTypes());
+ break;
+ case content:
+ cachedType.setPackageTypes(type.getPackageTypes());
+ break;
+ case events:
+ cachedType.setPackageTypes(type.getPackageTypes());
+ break;
+ case measurements:
+ cachedType.setMetricDefinitions(type.getMetricDefinitions());
+ break;
+ case operations:
+ cachedType.setOperationDefinitions(type.getOperationDefinitions());
+ break;
+ case parentTypes:
+ cachedType.setParentResourceTypes(type.getParentResourceTypes());
+ break;
+ case pluginConfigurationDefinition:
+ cachedType
+ .setPluginConfigurationDefinition(type.getPluginConfigurationDefinition());
+ break;
+ case processScans:
+ cachedType.setProcessScans(type.getProcessScans());
+ break;
+ case productVersions:
+ cachedType.setProductVersions(type.getProductVersions());
+ break;
+ case resourceConfigurationDefinition:
+ cachedType.setResourceConfigurationDefinition(type
+ .getResourceConfigurationDefinition());
+ break;
+ case subCategory:
+ cachedType.setSubCategory(type.getSubCategory());
+ break;
+ default:
+ System.err.println("ERROR: metadataType " + metadataType.name()
+ + " not merged into cached ResourceType.");
}
}
}
@@ -295,7 +312,7 @@ public class ResourceTypeRepository {
cachedTypes.put(type.getId(), type);
}
- if (metadataTypes != null) {
+ if (metadataTypes != null && !metadataTypes.isEmpty()) {
if (typeCacheLevel.containsKey(type.getId())) {
typeCacheLevel.get(type.getId()).addAll(metadataTypes);
} else {
commit 3544cc5af47788cb6d7a1b23a82389e2abdd4578
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Sat Oct 23 11:49:51 2010 -0400
add new alert template GWT service to support alert template modifications
complete the alert template component so it calls the new GWT service to manipulate alert templates in the DB
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
index f0916e2..3097982 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
@@ -78,6 +78,7 @@
<servlet path="/AlertGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AlertGWTServiceImpl"/>
<servlet path="/AlertDefinitionGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AlertDefinitionGWTServiceImpl"/>
+ <servlet path="/AlertTemplateGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AlertTemplateGWTServiceImpl"/>
<servlet path="/AuthorizationGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AuthorizationGWTServiceImpl"/>
<servlet path="/AvailabilityGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AvailabilityGWTServiceImpl"/>
<servlet path="/BundleGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.BundleGWTServiceImpl"/>
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
index bd0a433..6e6c9c4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
@@ -18,7 +18,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.templates;
-import com.google.gwt.user.client.rpc.AsyncCallback;
+import java.util.Map;
+
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionStyle;
@@ -38,10 +39,8 @@ import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeGridField;
import com.smartgwt.client.widgets.tree.TreeNode;
-import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
@@ -50,7 +49,8 @@ import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.alert.definitions.TemplateAlertDefinitionsView;
import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.TypesLoadedCallback;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -205,33 +205,20 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
parentCanvas.markForRedraw();
}
- private void editAlertTemplate(final int resourceTypeId, final ViewPath viewPath) {
- ResourceTypeCriteria criteria = new ResourceTypeCriteria();
- criteria.addFilterId(resourceTypeId);
- // TODO we need to fetch some collections here
-
- GWTServiceLookup.getResourceTypeGWTService().findResourceTypesByCriteria(criteria,
- new AsyncCallback<PageList<ResourceType>>() {
- @Override
- public void onSuccess(PageList<ResourceType> result) {
- if (result != null && result.size() == 1) {
- ResourceType rt = result.get(0);
- Layout alertCanvas = getAlertTemplateCanvas();
- String locatorId = extendLocatorId("alertTemplateDef");
- TemplateAlertDefinitionsView def = new TemplateAlertDefinitionsView(locatorId, rt);
- def.renderView(viewPath.next());
- prepareSubCanvas(alertCanvas, def, viewPath.isEnd()); // don't show our back button if we are going to a template details pane which has its own back button
- switchToCanvas(ResourceTypeTreeView.this, alertCanvas);
- } else {
- CoreGUI.getErrorHandler().handleError("Failed to get resource type: " + resourceTypeId);
- }
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Error getting resource type: " + resourceTypeId, caught);
- }
- });
+ private void editAlertTemplate(int resourceTypeId, final ViewPath viewPath) {
+ final Integer[] idArray = new Integer[] { resourceTypeId };
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(idArray, new TypesLoadedCallback() {
+ @Override
+ public void onTypesLoaded(Map<Integer, ResourceType> types) {
+ ResourceType rt = types.get(idArray[0]);
+ Layout alertCanvas = getAlertTemplateCanvas();
+ String locatorId = extendLocatorId("alertTemplateDef");
+ TemplateAlertDefinitionsView def = new TemplateAlertDefinitionsView(locatorId, rt);
+ def.renderView(viewPath.next());
+ prepareSubCanvas(alertCanvas, def, viewPath.isEnd()); // don't show our back button if we are going to a template details pane which has its own back button
+ switchToCanvas(ResourceTypeTreeView.this, alertCanvas);
+ }
+ });
}
private void editMetricTemplate(int resourceTypeId) {
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 c26a8f9..ef91200 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
@@ -25,14 +25,18 @@ package org.rhq.enterprise.gui.coregui.client.alert.definitions;
import java.util.EnumSet;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
-import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.MetadataType;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* @author John Mazzitelli
@@ -87,6 +91,16 @@ public class TemplateAlertDefinitionsView extends AbstractAlertDefinitionsView {
}
@Override
+ public SingleAlertDefinitionView getDetailsView(int id) {
+ SingleAlertDefinitionView view = super.getDetailsView(id);
+ if (id == 0) {
+ // when creating a new alert def, make sure to set this in the new alert def
+ view.getAlertDefinition().setResourceType(resourceType);
+ }
+ return view;
+ }
+
+ @Override
protected boolean isAllowedToModifyAlertDefinitions() {
// TODO: see if user can modify template alerts
return true;
@@ -94,48 +108,122 @@ public class TemplateAlertDefinitionsView extends AbstractAlertDefinitionsView {
@Override
protected void newButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
- for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
- }
- SC.say(str);
+ newDetails();
}
@Override
protected void enableButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
+ if (selection.length == 0) {
+ return;
+ }
+
+ final Integer[] alertDefIds = new Integer[selection.length];
+ int i = 0;
for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
+ Integer id = record.getAttributeAsInt(AbstractAlertDefinitionsDataSource.FIELD_ID);
+ alertDefIds[i++] = id;
}
- SC.say(str);
+
+ GWTServiceLookup.getAlertTemplateService().enableAlertTemplates(alertDefIds, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void v) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("[" + alertDefIds.length + "] alert templates enabled.", Severity.Info));
+ TemplateAlertDefinitionsView.this.refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to enable alert templates", caught);
+ }
+ });
}
@Override
protected void disableButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
+ if (selection.length == 0) {
+ return;
+ }
+
+ final Integer[] alertDefIds = new Integer[selection.length];
+ int i = 0;
for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
+ Integer id = record.getAttributeAsInt(AbstractAlertDefinitionsDataSource.FIELD_ID);
+ alertDefIds[i++] = id;
}
- SC.say(str);
+
+ GWTServiceLookup.getAlertTemplateService().disableAlertTemplates(alertDefIds, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void v) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("[" + alertDefIds.length + "] alert templates disabled.", Severity.Info));
+ TemplateAlertDefinitionsView.this.refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to disable alert templates", caught);
+ }
+ });
}
@Override
protected void deleteButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
+ if (selection.length == 0) {
+ return;
+ }
+
+ final Integer[] alertDefIds = new Integer[selection.length];
+ int i = 0;
for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
+ Integer id = record.getAttributeAsInt(AbstractAlertDefinitionsDataSource.FIELD_ID);
+ alertDefIds[i++] = id;
}
- SC.say(str);
+
+ GWTServiceLookup.getAlertTemplateService().removeAlertTemplates(alertDefIds, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void v) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("[" + alertDefIds.length + "] alert templates deleted.", Severity.Info));
+ TemplateAlertDefinitionsView.this.refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to delete alert templates", caught);
+ }
+ });
}
@Override
- protected void commitAlertDefinition(AlertDefinition alertDefinition) {
- // TODO call into server SLSB to store alert def
- // AlertTemplateManagerLocal alertTemplateManager = LookupUtil.getAlertTemplateManager();
- // alertTemplateManager.updateAlertTemplate(subject, alertDef, true);
+ protected void commitAlertDefinition(final AlertDefinition alertDefinition) {
+ if (alertDefinition.getId() == 0) {
+ GWTServiceLookup.getAlertTemplateService().createAlertTemplate(alertDefinition,
+ Integer.valueOf(this.resourceType.getId()), new AsyncCallback<Integer>() {
+ @Override
+ public void onSuccess(Integer result) {
+ CoreGUI.getMessageCenter().notify(new Message("Alert template is created", Severity.Info));
+ alertDefinition.setId(result.intValue());
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to create alert template.", caught);
+ }
+ });
+ } else {
+ GWTServiceLookup.getAlertTemplateService().updateAlertTemplate(alertDefinition, true,
+ new AsyncCallback<AlertDefinition>() {
+ @Override
+ public void onSuccess(AlertDefinition result) {
+ CoreGUI.getMessageCenter().notify(new Message("Alert template is updated.", Severity.Info));
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to update alert template.", caught);
+ }
+ });
+ }
}
}
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
new file mode 100644
index 0000000..da8bf55
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java
@@ -0,0 +1,44 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.gwt;
+
+import com.google.gwt.user.client.rpc.RemoteService;
+
+import org.rhq.core.domain.alert.AlertDefinition;
+
+public interface AlertTemplateGWTService extends RemoteService {
+
+ int createAlertTemplate(AlertDefinition alertDefinition, Integer resourceTypeId) throws Exception;
+
+ /**
+ * Updates a alert template definition.
+ *
+ * @param alertDefinition
+ * @param purgeInternals must be true if you are updating conditions or dampening settings, can be false otherwise
+ * @return the updated definition
+ * @throws Exception
+ */
+ AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean purgeInternals) throws Exception;
+
+ void enableAlertTemplates(Integer[] alertDefinitionIds) throws Exception;
+
+ void disableAlertTemplates(Integer[] alertDefinitionIds) throws Exception;
+
+ void removeAlertTemplates(Integer[] alertDefinitionIds) throws Exception;
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
index 92fc25d..67218c5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
@@ -41,6 +41,10 @@ public class GWTServiceLookup {
return secure(AlertDefinitionGWTServiceAsync.Util.getInstance());
}
+ public static AlertTemplateGWTServiceAsync getAlertTemplateService() {
+ return secure(AlertTemplateGWTServiceAsync.Util.getInstance());
+ }
+
public static GroupAlertDefinitionGWTServiceAsync getGroupAlertDefinitionService() {
return secure(GroupAlertDefinitionGWTServiceAsync.Util.getInstance());
}
@@ -169,7 +173,7 @@ public class GWTServiceLookup {
Log.debug("SessionRpcRequestBuilder is adding sessionId to request: " + sessionId);
rb.setHeader(UserSessionManager.SESSION_NAME, sessionId);
} else {
- Log.error("SessionRpcRequestBuilder constructed without a value for " + UserSessionManager.SESSION_NAME);
+ Log.error("SessionRpcRequestBuilder built without a value for " + UserSessionManager.SESSION_NAME);
}
return rb;
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
new file mode 100644
index 0000000..55a24e3
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java
@@ -0,0 +1,85 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.server.gwt;
+
+import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.util.exception.ThrowableUtil;
+import org.rhq.enterprise.gui.coregui.client.gwt.AlertTemplateGWTService;
+import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
+import org.rhq.enterprise.server.alert.AlertTemplateManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+public class AlertTemplateGWTServiceImpl extends AbstractGWTServiceImpl implements AlertTemplateGWTService {
+ private static final long serialVersionUID = 1L;
+
+ private AlertTemplateManagerLocal alertTemplateManager = LookupUtil.getAlertTemplateManager();
+
+ @Override
+ public int createAlertTemplate(AlertDefinition alertDefinition, Integer resourceTypeId) throws Exception {
+ try {
+ int results = alertTemplateManager
+ .createAlertTemplate(getSessionSubject(), alertDefinition, resourceTypeId);
+ return results;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean purgeInternals)
+ throws Exception {
+ try {
+ AlertDefinition results = alertTemplateManager.updateAlertTemplate(getSessionSubject(), alertDefinition,
+ purgeInternals);
+ return SerialUtility.prepare(results, "AlertTemplateService.updateAlertTemplate");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public void enableAlertTemplates(Integer[] alertDefinitionIds) throws Exception {
+ try {
+ alertTemplateManager.enableAlertTemplates(getSessionSubject(), alertDefinitionIds);
+ return;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public void disableAlertTemplates(Integer[] alertDefinitionIds) throws Exception {
+ try {
+ alertTemplateManager.disableAlertTemplates(getSessionSubject(), alertDefinitionIds);
+ return;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public void removeAlertTemplates(Integer[] alertDefinitionIds) throws Exception {
+ try {
+ alertTemplateManager.removeAlertTemplates(getSessionSubject(), alertDefinitionIds);
+ return;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml b/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml
index 40e7f16..1202124 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml
+++ b/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml
@@ -49,6 +49,10 @@
<servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.AlertDefinitionGWTServiceImpl</servlet-class>
</servlet>
<servlet>
+ <servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI AlertTemplateGWTService</servlet-name>
+ <servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.AlertTemplateGWTServiceImpl</servlet-class>
+ </servlet>
+ <servlet>
<servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI GroupAlertDefinitionGWTService</servlet-name>
<servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.GroupAlertDefinitionGWTServiceImpl</servlet-class>
</servlet>
@@ -159,6 +163,10 @@
<url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/AlertDefinitionGWTService</url-pattern>
</servlet-mapping>
<servlet-mapping>
+ <servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI AlertTemplateGWTService</servlet-name>
+ <url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/AlertTemplateGWTService</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
<servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI GroupAlertDefinitionGWTService</servlet-name>
<url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/GroupAlertDefinitionGWTService</url-pattern>
</servlet-mapping>
commit 2d314c765251509e6a0cf4f075a2f9fad4b8b3bd
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 22 23:07:25 2010 -0400
add support for dynamic/open maps to group config editor; inform user that viewing/editing of list properties is not currently supported for group configs
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 163ff47..a46b8bb 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
@@ -128,7 +128,6 @@ import org.rhq.core.domain.configuration.definition.constraint.IntegerRangeConst
import org.rhq.core.domain.configuration.definition.constraint.RegexConstraint;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.components.table.PropertyGrid;
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;
@@ -406,7 +405,7 @@ public class ConfigurationEditor extends LocatableVLayout {
protected VLayout buildStructuredPane() {
LocatableVLayout layout = new LocatableVLayout(extendLocatorId("Structured"));
- List<PropertyGroupDefinition> definitions = configurationDefinition.getGroupDefinitions();
+ List<PropertyGroupDefinition> groupDefinitions = configurationDefinition.getGroupDefinitions();
final SectionStack sectionStack = new LocatableSectionStack(layout.extendLocatorId("Sections"));
sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
@@ -415,11 +414,11 @@ public class ConfigurationEditor extends LocatableVLayout {
sectionStack.setScrollSectionIntoView(true);
sectionStack.setOverflow(Overflow.AUTO);
- if (configurationDefinition.getNonGroupedProperties().size() > 0) {
+ if (!configurationDefinition.getNonGroupedProperties().isEmpty()) {
sectionStack.addSection(buildGroupSection(layout.extendLocatorId("NoGroup"), null));
}
- for (PropertyGroupDefinition definition : definitions) {
+ for (PropertyGroupDefinition definition : groupDefinitions) {
// com.allen_sauer.gwt.log.client.Log.info("building: " + definition.getDisplayName());
sectionStack.addSection(buildGroupSection(layout.extendLocatorId(definition.getName()), definition));
}
@@ -527,15 +526,14 @@ public class ConfigurationEditor extends LocatableVLayout {
form.setColWidths(190, 28, 210);
List<FormItem> fields = new ArrayList<FormItem>();
- addItemsForPropertiesRecursively(locatorId, propertyDefinitions, propertyMap, fields, firePropertyChangedEvents);
+ addItemsForPropertiesRecursively(locatorId, propertyDefinitions, propertyMap, fields);
form.setFields(fields.toArray(new FormItem[fields.size()]));
return form;
}
private void addItemsForPropertiesRecursively(String locatorId, Collection<PropertyDefinition> propertyDefinitions,
- AbstractPropertyMap propertyMap, List<FormItem> fields,
- boolean firePropertyChangedEvents) {
+ AbstractPropertyMap propertyMap, List<FormItem> fields) {
boolean odd = true;
List<PropertyDefinition> sortedPropertyDefinitions = new ArrayList<PropertyDefinition>(propertyDefinitions);
Collections.sort(sortedPropertyDefinitions, new PropertyDefinitionComparator());
@@ -548,7 +546,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
}
addItemsForPropertyRecursively(locatorId + "_" + propertyDefinition.getName(), propertyDefinition, property,
- odd, fields, firePropertyChangedEvents);
+ odd, fields);
odd = !odd;
}
}
@@ -556,7 +554,7 @@ public class ConfigurationEditor extends LocatableVLayout {
public void addItemsForPropertyRecursively(String locatorId, PropertyDefinition propertyDefinition,
Property property,
boolean oddRow,
- List<FormItem> fields, final boolean firePropertyChangedEvents) {
+ List<FormItem> fields) {
List<FormItem> fieldsForThisProperty;
if (propertyDefinition instanceof PropertyDefinitionSimple) {
@@ -640,8 +638,8 @@ public class ConfigurationEditor extends LocatableVLayout {
SpacerItem unsetItem = new SpacerItem();
fields.add(unsetItem);
- CanvasItem listOfSimplesItem = buildListOfSimplesField(locatorId, propertyDefinitionList, propertyList,
- oddRow);
+ CanvasItem listOfSimplesItem = buildListOfSimplesField(locatorId, propertyDefinitionList, propertyList
+ );
fields.add(listOfSimplesItem);
StaticTextItem descriptionItem = buildDescriptionField(propertyDefinition);
@@ -674,7 +672,7 @@ public class ConfigurationEditor extends LocatableVLayout {
return fields;
}
- private StaticTextItem buildNameItem(PropertyDefinition propertyDefinition) {
+ protected StaticTextItem buildNameItem(PropertyDefinition propertyDefinition) {
StaticTextItem nameItem = new StaticTextItem();
nameItem.setStartRow(true);
String title = "<b>"
@@ -693,9 +691,9 @@ public class ConfigurationEditor extends LocatableVLayout {
return descriptionItem;
}
- private void firePropertyChangedEvent(Property property,
- PropertyDefinition propertyDefinition,
- boolean isValid) {
+ protected void firePropertyChangedEvent(Property property,
+ PropertyDefinition propertyDefinition,
+ boolean isValid) {
boolean wasValidBefore = this.invalidPropertyNames.isEmpty();
Property topLevelProperty = getTopLevelProperty(property);
if (isValid) {
@@ -719,76 +717,31 @@ public class ConfigurationEditor extends LocatableVLayout {
private FormItem buildMapField(String parentLocatorId, PropertyDefinitionMap propertyDefinitionMap,
final PropertyMap propertyMap) {
- Canvas canvas;
- Map<String, PropertyDefinition> memberPropertyDefinitions = propertyDefinitionMap.getPropertyDefinitions();
String locatorId = parentLocatorId + "_" + propertyDefinitionMap.getName();
- if (memberPropertyDefinitions == null || memberPropertyDefinitions.isEmpty()) {
- canvas = buildDynamicMapField(locatorId, propertyDefinitionMap, propertyMap);
- } else {
- canvas = buildStaticMapField(locatorId, propertyDefinitionMap, propertyMap);
+ boolean isDynamic = isDynamic(propertyDefinitionMap);
+ if (isDynamic) {
+ PropertyDefinitionMap propertyDefinitionMapClone = new PropertyDefinitionMap(propertyDefinitionMap.getName(),
+ propertyDefinitionMap.getDescription(), propertyDefinitionMap.isRequired());
+ propertyDefinitionMapClone.setConfigurationDefinition(propertyDefinitionMap.getConfigurationDefinition());
+ addMemberPropertyDefinitionsToDynamicPropertyMap(propertyDefinitionMapClone, propertyMap);
+ propertyDefinitionMap = propertyDefinitionMapClone;
}
- CanvasItem canvasItem = buildComplexPropertyField(canvas);
- canvasItem.setColSpan(3);
- canvasItem.setEndRow(true);
-
- return canvasItem;
- }
-
- private CanvasItem buildComplexPropertyField(Canvas canvas) {
- CanvasItem canvasItem = new CanvasItem();
- canvasItem.setCanvas(canvas);
- canvasItem.setShowTitle(false);
- return canvasItem;
- }
-
- private Canvas buildDynamicMapField(String parentLocatorId, PropertyDefinitionMap propertyDefinitionMap,
- final PropertyMap propertyMap) {
- Log.debug("Building dynamic map field for " + propertyMap + "...");
-
- // create the property grid
- final PropertyGrid propertyGrid = new PropertyGrid();
- propertyGrid.getNameField().setName("Name");
- propertyGrid.getValuesField().setName("Value");
-
- // create the editors
- Map<String, FormItem> editorsMap = new HashMap<String, FormItem>();
- TextItem textEditor = new TextItem();
- editorsMap.put("simpleText", textEditor);
-
- // set the editors and attribute name where to find the record type
- propertyGrid.setEditorsMap("fieldType", editorsMap);
+ VLayout layout = new VLayout();
- ListGridRecord[] records = new ListGridRecord[propertyMap.getMap().size()];
- int i = 0;
- for (Property prop : propertyMap.getMap().values()) {
- if (!(prop instanceof PropertySimple)) {
- Log.warn("Unsupported Configuration permutation: PropertyMap " + propertyMap
- + " contains non-simple member Property " + prop + " - skipping...");
- continue;
- }
- PropertySimple propSimple = (PropertySimple)prop;
- ListGridRecord record = new ListGridRecord();
- String propertyName = prop.getName();
- record.setAttribute("Name", propertyName);
- String value = propSimple.getStringValue();
- record.setAttribute("Value", value);
- record.setAttribute("fieldType", "simpleText");
- records[i++] = record;
- }
- propertyGrid.setData(records);
-
- VLayout canvas = new VLayout();
- canvas.addMember(propertyGrid);
+ final PropertyDefinitionMap propertyDefinitionMapFinal = propertyDefinitionMap;
+ Canvas valuesCanvas = buildPropertiesForm(parentLocatorId, propertyDefinitionMapFinal.getPropertyDefinitions().values(),
+ propertyMap, true);
+ layout.addMember(valuesCanvas);
- if (!isReadOnly(propertyDefinitionMap, propertyMap)) {
+ if (isDynamic && !isReadOnly(propertyDefinitionMap, propertyMap)) {
// Map is not read-only - add footer with New and Delete buttons to allow user to add or remove members.
- ToolStrip footer = new ToolStrip();
- footer.setPadding(5);
- footer.setWidth100();
- footer.setMembersMargin(15);
- canvas.addMember(footer);
+ ToolStrip buttonBar = new ToolStrip();
+ buttonBar.setPadding(5);
+ buttonBar.setWidth100();
+ buttonBar.setMembersMargin(15);
+ layout.addMember(buttonBar);
- final IButton deleteButton = new LocatableIButton(extendLocatorId(propertyMap.getName()), "Delete");
+ /*final IButton deleteButton = new LocatableIButton(extendLocatorId(propertyMap.getName()), "Delete");
deleteButton.setDisabled(true);
deleteButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(ClickEvent clickEvent) {
@@ -815,7 +768,7 @@ public class ConfigurationEditor extends LocatableVLayout {
int count = propertyGrid.getSelection().length;
deleteButton.setDisabled(count < 1);
}
- });
+ });*/
final IButton newButton = new LocatableIButton(extendLocatorId(propertyMap.getName()), "New");
newButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
@@ -829,16 +782,11 @@ public class ConfigurationEditor extends LocatableVLayout {
+ "', because the set already contains a property with that name.",
Message.Severity.Error, EnumSet.of(Message.Option.Transient)));
} else {
- propertyMap.put(new PropertySimple(propertyName, null));
-
- ListGridRecord record = new ListGridRecord();
- record.setAttribute("Name", propertyName);
- record.setAttribute("Value", "");
- record.setAttribute("fieldType", "simpleText");
+ PropertySimple memberPropertySimple = new PropertySimple(propertyName, null);
+ addPropertyToDynamicMap(memberPropertySimple, propertyMap);
+ firePropertyChangedEvent(propertyMap, propertyDefinitionMapFinal, true);
- propertyGrid.addData(record);
- propertyGrid.focus();
- propertyGrid.enableSpecificEditor(record);
+ reload();
CoreGUI.getMessageCenter().notify(new Message("Added property to the set.", EnumSet.of(
Message.Option.Transient)));
@@ -847,33 +795,103 @@ public class ConfigurationEditor extends LocatableVLayout {
});
}
});
- footer.addMember(newButton);
- }
+ buttonBar.addMember(newButton);
+
+ DynamicForm deleteForm = new DynamicForm();
+ deleteForm.setNumCols(3);
+ buttonBar.addMember(deleteForm);
+
+ final SelectItem selectItem = new SelectItem();
+ selectItem.setValueMap(propertyDefinitionMap.getPropertyDefinitions().keySet().toArray(
+ new String[propertyDefinitionMap.getPropertyDefinitions().size()]));
+ selectItem.setMultiple(true);
+ selectItem.setMultipleAppearance(MultipleAppearance.GRID);
+ selectItem.setTitle("Delete");
+
+ final ButtonItem okButtonItem = new ButtonItem();
+ okButtonItem.setTitle("OK");
+ okButtonItem.setDisabled(true);
+ okButtonItem.setEndRow(true);
+ okButtonItem.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {
+ public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent clickEvent) {
+ SC.confirm("Are you sure you want to delete the selected properties from the set?", new BooleanCallback() {
+ @Override
+ public void execute(Boolean confirmed) {
+ if (confirmed) {
+ Object value = selectItem.getValue();
+ if (value != null) {
+ String stringValue = value.toString();
+ String[] memberPropertyNames = stringValue.split(",");
+ for (final String memberPropertyName : memberPropertyNames) {
+ PropertySimple memberPropertySimple = propertyMap.getSimple(memberPropertyName);
+ removePropertyFromDynamicMap(memberPropertySimple);
+ firePropertyChangedEvent(propertyMap, propertyDefinitionMapFinal, true);
+ }
+ }
- propertyGrid.addCellSavedHandler(new CellSavedHandler() {
- @Override
- public void onCellSaved(CellSavedEvent cellSavedEvent) {
- Record record = cellSavedEvent.getRecord();
- String propertyName = record.getAttribute("Name");
- PropertySimple prop = propertyMap.getSimple(propertyName);
- if (prop == null) {
- prop = new PropertySimple(propertyName, null);
- propertyMap.put(prop);
+ reload();
+ CoreGUI.getMessageCenter().notify(new Message("Removed properties from the set.", EnumSet.of(
+ Message.Option.Transient)));
+ }
+ }
+ });
}
- String value = record.getAttribute("Value");
- prop.setStringValue(value);
- }
- });
+ });
- return canvas;
+ selectItem.addChangedHandler(new ChangedHandler() {
+ @Override
+ public void onChanged(ChangedEvent changedEvent) {
+ Object value = changedEvent.getValue();
+ if (value != null) {
+ String stringValue = value.toString();
+ String[] memberPropertyNames = stringValue.split(",");
+ okButtonItem.setDisabled(memberPropertyNames.length == 0);
+ }
+ }
+ });
+
+ deleteForm.setFields(selectItem, okButtonItem);
+ }
+
+ CanvasItem canvasItem = buildComplexPropertyField(layout);
+ canvasItem.setColSpan(3);
+ canvasItem.setEndRow(true);
+
+ return canvasItem;
}
- private Canvas buildStaticMapField(String parentLocatorId, PropertyDefinitionMap propertyDefinitionMap,
- PropertyMap propertyMap) {
- Log.debug("Building static map field for " + propertyMap + "...");
+ protected void addPropertyToDynamicMap(PropertySimple memberPropertySimple, PropertyMap propertyMap) {
+ memberPropertySimple.setOverride(true);
+ propertyMap.put(memberPropertySimple);
+ }
- return buildPropertiesForm(parentLocatorId, propertyDefinitionMap.getPropertyDefinitions().values(),
- propertyMap, true);
+ protected void removePropertyFromDynamicMap(PropertySimple propertySimple) {
+ PropertyMap parentMap = propertySimple.getParentMap();
+ parentMap.getMap().remove(propertySimple.getName());
+ }
+
+ private boolean isDynamic(PropertyDefinitionMap propertyDefinitionMap) {
+ Map<String, PropertyDefinition> memberPropertyDefinitions = propertyDefinitionMap.getPropertyDefinitions();
+ return memberPropertyDefinitions == null || memberPropertyDefinitions.isEmpty();
+ }
+
+ private void addMemberPropertyDefinitionsToDynamicPropertyMap(PropertyDefinitionMap propertyDefinitionMap,
+ PropertyMap propertyMap) {
+ for (String propertyName : propertyMap.getMap().keySet()) {
+ PropertySimple memberPropertySimple = propertyMap.getSimple(propertyName);
+ if (memberPropertySimple != null) {
+ PropertyDefinitionSimple memberPropertyDefinitionSimple = new PropertyDefinitionSimple(propertyName,
+ null, false, PropertySimpleType.STRING);
+ propertyDefinitionMap.put(memberPropertyDefinitionSimple);
+ }
+ }
+ }
+
+ private CanvasItem buildComplexPropertyField(Canvas canvas) {
+ CanvasItem canvasItem = new CanvasItem();
+ canvasItem.setCanvas(canvas);
+ canvasItem.setShowTitle(false);
+ return canvasItem;
}
private CanvasItem buildListOfMapsField(final String locatorId,
@@ -1064,7 +1082,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
private CanvasItem buildListOfSimplesField(String locatorId, final PropertyDefinitionList propertyDefinitionList,
- final PropertyList propertyList, boolean oddRow) {
+ final PropertyList propertyList) {
Log.debug("Building list-of-simples field for " + propertyList + "...");
LocatableVLayout vLayout = new LocatableVLayout(locatorId);
@@ -1369,14 +1387,14 @@ public class ConfigurationEditor extends LocatableVLayout {
return currentProperty;
}
- protected FormItem buildUnsetItem(PropertyDefinitionSimple propertyDefinition, final PropertySimple property,
+ protected FormItem buildUnsetItem(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple,
final FormItem valueItem) {
FormItem item;
- if (!propertyDefinition.isRequired()) {
+ if (!propertyDefinitionSimple.isRequired()) {
final CheckboxItem unsetItem = new CheckboxItem();
- boolean unset = isUnset(propertyDefinition, property);
+ boolean unset = isUnset(propertyDefinitionSimple, propertySimple);
unsetItem.setValue(unset);
- unsetItem.setDisabled(isReadOnly(propertyDefinition, property));
+ unsetItem.setDisabled(isReadOnly(propertyDefinitionSimple, propertySimple));
unsetItem.setShowLabel(false);
unsetItem.setShowTitle(false);
unsetItem.setLabelAsTitle(false);
@@ -1387,27 +1405,20 @@ public class ConfigurationEditor extends LocatableVLayout {
Boolean isUnset = (Boolean) changeEvent.getValue();
valueItem.setDisabled(isUnset);
if (isUnset) {
+ updatePropertySimpleValue(null, propertySimple, propertyDefinitionSimple);
setValue(valueItem, null);
} else {
valueItem.focusInItem();
}
valueItem.redraw();
- property.setValue(valueItem.getValue());
- }
- });
-
-/*
- valueItem.addChangeHandler(new ChangeHandler() {
- public void onChange(ChangeEvent changeEvent) {
- Object value = changeEvent.getValue();
- unsetItem.setDisabled(value == null);
+ propertySimple.setValue(valueItem.getValue());
}
});
-*/
item = unsetItem;
} else {
item = new SpacerItem();
+ item.setShowTitle(false);
}
return item;
}
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 c2e2eb7..f544ac6 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
@@ -53,6 +53,7 @@ import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -113,6 +114,26 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
}
@Override
+ protected List<FormItem> buildFieldsForPropertyList(String locatorId, PropertyDefinition propertyDefinition,
+ boolean oddRow, PropertyDefinitionList propertyDefinitionList,
+ PropertyDefinition memberDefinition,
+ PropertyList propertyList) {
+ List<FormItem> fields = new ArrayList<FormItem>();
+
+ StaticTextItem nameItem = buildNameItem(propertyDefinition);
+ fields.add(nameItem);
+
+ StaticTextItem staticTextItem = new StaticTextItem();
+ staticTextItem.setShowTitle(false);
+ staticTextItem.setValue("List properties are not currently supported for group configurations.");
+ staticTextItem.setColSpan(3);
+ staticTextItem.setEndRow(true);
+ fields.add(staticTextItem);
+
+ return fields;
+ }
+
+ @Override
protected FormItem buildSimpleField(final PropertyDefinitionSimple propertyDefinitionSimple,
final PropertySimple propertySimple) {
final FormItem item = super.buildSimpleField(propertyDefinitionSimple, propertySimple);
@@ -138,6 +159,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
return item;
}
+
private FormItemIcon buildEditMemberValuesIcon(final PropertyDefinitionSimple propertyDefinitionSimple,
final PropertySimple propertySimple, final FormItem dynamicItem) {
FormItemIcon icon = new FormItemIcon();
@@ -161,10 +183,9 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
private void updateMemberProperties(PropertyDefinitionSimple propertyDefinitionSimple,
PropertySimple propertySimple, Object value
) {
- for (GroupMemberConfiguration memberConfiguration : memberConfigurations) {
+ for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) {
Configuration configuration = memberConfiguration.getConfiguration();
- PropertySimple memberPropertySimple =
- getPropertySimple(configuration, propertyDefinitionSimple, null);
+ PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null);
memberPropertySimple.setValue(value);
}
}
@@ -173,7 +194,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
protected FormItem buildUnsetItem(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple,
final FormItem valueItem) {
final FormItem unsetItem = super.buildUnsetItem(propertyDefinitionSimple, propertySimple, valueItem);
- if (!isHomogeneous(propertySimple) && isAggregateProperty(propertySimple)) {
+ if (unsetItem instanceof CheckboxItem && !isHomogeneous(propertySimple) && isAggregateProperty(propertySimple)) {
// non-homogeneous aggregate property (i.e. members have mixed values)
unsetItem.setValue(false);
unsetItem.setDisabled(true);
@@ -287,7 +308,8 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
memberItem.setDefaultValue(memberName);
items.add(memberItem);
Configuration configuration = memberConfiguration.getConfiguration();
- PropertySimple memberPropertySimple = getPropertySimple(configuration, propertyDefinitionSimple, index);
+ PropertySimple memberPropertySimple =
+ (PropertySimple)getProperty(configuration, aggregatePropertySimple, index);
FormItem valueItem = buildSimpleField(propertyDefinitionSimple, memberPropertySimple);
valueItems.add(valueItem);
valueItemNameToPropertySimpleMap.put(valueItem.getName(), memberPropertySimple);
@@ -303,12 +325,15 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
okButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(ClickEvent clickEvent) {
boolean valuesHomogeneous = true;
+ boolean isValid = true;
+
Object firstValue = valueItems.get(0).getValue();
for (FormItem valueItem : valueItems) {
Object value = valueItem.getValue();
if ((value != null && !value.equals(firstValue)) || (value == null && firstValue != null)) {
valuesHomogeneous = false;
}
+ isValid = isValid && valueItem.validate();
PropertySimple memberPropertySimple = valueItemNameToPropertySimpleMap.get(valueItem.getName());
memberPropertySimple.setValue(value);
memberPropertySimple.setErrorMessage(null);
@@ -332,7 +357,6 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
aggregateValueItem.setDisabled(false);
aggregateStaticItem.hide();
-
} else {
aggregatePropertySimple.setValue(null);
aggregatePropertySimple.setOverride(false);
@@ -342,6 +366,8 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
aggregateStaticItem.show();
}
+ firePropertyChangedEvent(aggregatePropertySimple, propertyDefinitionSimple, isValid);
+
membersForm.markForRedraw();
popup.destroy();
}
@@ -406,46 +432,79 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
// Update all the member properties.
for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) {
Configuration configuration = memberConfiguration.getConfiguration();
- PropertySimple memberPropertySimple =
- getPropertySimple(configuration, propertyDefinitionSimple, null);
+ PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null);
memberPropertySimple.setErrorMessage(null);
memberPropertySimple.setValue(value);
}
}
- private PropertySimple getPropertySimple(Configuration configuration,
- PropertyDefinitionSimple propertyDefinitionSimple,
- Integer index) {
- LinkedList<PropertyDefinition> propertyDefinitionHierarchy = new LinkedList<PropertyDefinition>();
- PropertyDefinition currentPropertyDefinition = propertyDefinitionSimple;
- propertyDefinitionHierarchy.add(currentPropertyDefinition);
+ @Override
+ protected void removePropertyFromDynamicMap(PropertySimple propertySimple) {
+ // Remove the aggregate property.
+ super.removePropertyFromDynamicMap(propertySimple);
+
+ // Remove the member properties.
+ for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) {
+ Configuration configuration = memberConfiguration.getConfiguration();
+ PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null);
+ PropertyMap parentMap = memberPropertySimple.getParentMap();
+ parentMap.getMap().remove(memberPropertySimple.getName());
+ }
+ }
+
+ @Override
+ protected void addPropertyToDynamicMap(PropertySimple propertySimple, PropertyMap propertyMap) {
+ // Add the aggregate property.
+ super.addPropertyToDynamicMap(propertySimple, propertyMap);
+
+ // Add the member properties.
+ for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) {
+ Configuration configuration = memberConfiguration.getConfiguration();
+ // The below call will create the member property and add it to the appropriate parent property in the member config.
+ PropertySimple memberPropertySimple = (PropertySimple)getProperty(configuration, propertySimple, null);
+ }
+ }
+
+ private Property getProperty(Configuration configuration,
+ Property referenceProperty,
+ Integer index) {
+ LinkedList<Property> propertyHierarchy = new LinkedList<Property>();
+ Property currentProperty = referenceProperty;
+ propertyHierarchy.add(currentProperty);
do {
- if (currentPropertyDefinition.getParentPropertyMapDefinition() != null) {
- currentPropertyDefinition = currentPropertyDefinition.getParentPropertyMapDefinition();
- } else if (currentPropertyDefinition.getParentPropertyListDefinition() != null) {
- currentPropertyDefinition = currentPropertyDefinition.getParentPropertyListDefinition();
- } else if (currentPropertyDefinition.getConfigurationDefinition() == null) {
- throw new IllegalStateException(currentPropertyDefinition + " has no parent.");
+ if (currentProperty.getParentMap() != null) {
+ currentProperty = currentProperty.getParentMap();
+ } else if (currentProperty.getParentList() != null) {
+ currentProperty = currentProperty.getParentList();
+ } else if (currentProperty.getConfiguration() == null) {
+ throw new IllegalStateException(currentProperty + " has no parent.");
}
- propertyDefinitionHierarchy.addFirst(currentPropertyDefinition);
+ propertyHierarchy.addFirst(currentProperty);
}
- while (currentPropertyDefinition.getConfigurationDefinition() == null);
+ while (currentProperty.getConfiguration() == null);
- Property property = configuration.get(propertyDefinitionHierarchy.get(0).getName());
- for (int i = 1, propertyDefinitionHierarchySize = propertyDefinitionHierarchy.size();
- i < propertyDefinitionHierarchySize; i++) {
- PropertyDefinition propertyDefinition = propertyDefinitionHierarchy.get(i);
+ Property property = configuration.get(propertyHierarchy.get(0).getName());
+ for (int i = 1, propertyHierarchySize = propertyHierarchy.size(); i < propertyHierarchySize; i++) {
+ String childPropertyName = propertyHierarchy.get(i).getName();
if (property instanceof PropertyMap) {
PropertyMap propertyMap = (PropertyMap)property;
- property = propertyMap.get(propertyDefinition.getName());
+ property = propertyMap.get(childPropertyName);
+ if (property == null) {
+ property = new PropertySimple(childPropertyName, null);
+ propertyMap.put(property);
+ }
} else if (property instanceof PropertyList) {
PropertyList propertyList = (PropertyList)property;
- property = propertyList.getList().get(index);
+ if (index < propertyList.getList().size()) {
+ property = propertyList.getList().get(index);
+ } else {
+ property = new PropertySimple(childPropertyName, null);
+ propertyList.add(property);
+ }
}
}
- PropertySimple propertySimple = (PropertySimple)property;
- return propertySimple;
+ return property;
}
private boolean isAggregateProperty(PropertySimple propertySimple) {
commit 3fb1547bb631a16537556ad15ea1cdceaf661c5d
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 22 14:48:13 2010 -0400
fix the links on the summary counts portlet so they go to the correct views; fix bug that was causing resource search list views from displaying
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/InventorySummaryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/InventorySummaryView.java
index 0336a29..90c8bc1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/InventorySummaryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/InventorySummaryView.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -20,13 +20,11 @@
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-
package org.rhq.enterprise.gui.coregui.client.dashboard.portlets.summary;
import java.util.ArrayList;
import java.util.List;
-import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
@@ -44,12 +42,10 @@ import org.rhq.enterprise.gui.coregui.client.dashboard.PortletViewFactory;
import org.rhq.enterprise.gui.coregui.client.dashboard.PortletWindow;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceBossGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.InventoryView;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
public class InventorySummaryView extends LocatableVLayout implements Portlet {
-
private ResourceBossGWTServiceAsync resourceBossService = GWTServiceLookup.getResourceBossService();
private LocatableDynamicForm form;
@@ -76,30 +72,32 @@ public class InventorySummaryView extends LocatableVLayout implements Portlet {
// formItems.add(headerItem);
StaticTextItem platformTotal = createSummaryRow("platformTotal", "Platform Total", summary
- .getPlatformCount());
+ .getPlatformCount(), "Inventory/Resources/Platforms");
formItems.add(platformTotal);
- StaticTextItem serverTotal = createSummaryRow("serverTotal", "Server Total", summary.getServerCount());
+ StaticTextItem serverTotal = createSummaryRow("serverTotal", "Server Total", summary.getServerCount(),
+ "Inventory/Resources/Servers");
formItems.add(serverTotal);
StaticTextItem serviceTotal = createSummaryRow("serviceTotal", "Service Total", summary
- .getServiceCount());
+ .getServiceCount(), "Inventory/Resources/Services");
formItems.add(serviceTotal);
StaticTextItem compatibleGroupTotal = createSummaryRow("compatibleGroupTotal",
- "Compatible Group Total", summary.getCompatibleGroupCount());
+ "Compatible Group Total", summary.getCompatibleGroupCount(), "Inventory/Groups/CompatibleGroups");
formItems.add(compatibleGroupTotal);
StaticTextItem mixedGroupTotal = createSummaryRow("mixedGroupTotal", "Mixed Group Total", summary
- .getMixedGroupCount());
+ .getMixedGroupCount(), "Inventory/Groups/MixedGroups");
formItems.add(mixedGroupTotal);
StaticTextItem groupDefinitionTotal = createSummaryRow("groupDefinitionTotal",
- "Group Definition Total", summary.getGroupDefinitionCount());
+ "Group Definition Total", summary.getGroupDefinitionCount(), "Inventory/Groups/DynagroupManager");
formItems.add(groupDefinitionTotal);
StaticTextItem avergeMetricsTotal = createSummaryRow("averageMetricsTotal",
- "Average Metrics per Minute", summary.getScheduledMeasurementsPerMinute());
+ "Average Metrics per Minute", summary.getScheduledMeasurementsPerMinute(),
+ null);
formItems.add(avergeMetricsTotal);
form.setItems(formItems.toArray(new FormItem[formItems.size()]));
@@ -110,16 +108,21 @@ public class InventorySummaryView extends LocatableVLayout implements Portlet {
});
}
- private StaticTextItem createSummaryRow(String name, String label, int value) {
- final LinkItem item = new LinkItem(name);
+ private StaticTextItem createSummaryRow(String name, String label, int value, final String viewPath) {
+ final StaticTextItem item;
+ if (viewPath != null) {
+ item = new LinkItem(name);
+ item.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ CoreGUI.goToView(viewPath);
+ }
+ });
+ } else {
+ item = new StaticTextItem(name);
+ }
+
item.setTitle(label);
item.setValue(value);
- item.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- // TODO Figure out to where the click events should be navigating
- History.newItem(InventoryView.VIEW_ID);
- }
- });
return item;
}
@@ -155,5 +158,4 @@ public class InventorySummaryView extends LocatableVLayout implements Portlet {
return new InventorySummaryView(locatorId);
}
}
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
index e55d846..4702e21 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
@@ -51,7 +51,6 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
* @author Greg Hinkle
*/
public class ResourceDatasource extends RPCDataSource<Resource> {
-
private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
private static ResourceDatasource INSTANCE;
@@ -165,15 +164,15 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
record.setAttribute(DESCRIPTION.propertyName(), from.getDescription());
record.setAttribute(TYPE.propertyName(), from.getResourceType().getId());
record.setAttribute(PLUGIN.propertyName(), from.getResourceType().getPlugin());
- record.setAttribute(CATEGORY.propertyName(), from.getResourceType().getCategory().getDisplayName());
+ record.setAttribute(CATEGORY.propertyName(), from.getResourceType().getCategory().name());
record.setAttribute("icon", from.getResourceType().getCategory().getDisplayName() + "_"
+ (from.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? "up" : "down") + "_16.png");
record
.setAttribute(
AVAILABILITY.propertyName(),
- from.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? "/images/icons/availability_green_16.png"
- : "/images/icons/availability_red_16.png");
+ from.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ?
+ "/images/icons/availability_green_16.png" : "/images/icons/availability_red_16.png");
return record;
}
commit f3abb55db3af3eb6a0e8674a332b54fc7d6c1c23
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 22 12:08:53 2010 -0400
fix for StringUtils.deCamelCase(); stop using activeByDefault in root and core poms, since it breaks intellij's maven plugin
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
index 01a6ddb..ec52b1e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/StringUtils.java
@@ -79,11 +79,11 @@ public class StringUtils {
for (int i = 1; i < target.length(); i++) {
currentChar = target.charAt(i);
- // Make sure to insert spaces in the middle of acronyms or multi-digit numbers.
+ // Make sure to not insert spaces in the middle of acronyms or multi-digit numbers.
if ((previousChar == ' ' && currentChar != ' ')
|| (Character.isDigit(currentChar) && !Character.isDigit(previousChar))
- || (Character.isUpperCase(currentChar) && (!Character.isUpperCase(previousChar)
- || ((i < (target.length() - 1)) && Character.isLowerCase(target.charAt(i + 1)))))) {
+ || (Character.isUpperCase(currentChar) &&
+ (i < (target.length() - 1)) && Character.isLowerCase(target.charAt(i + 1)))) {
// We're at the start of a new word.
appendWord(result, currentWord.toString());
currentWord = new StringBuilder();
@@ -147,4 +147,4 @@ public class StringUtils {
return builder.toString();
}
-}
\ No newline at end of file
+}
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index 5853b59..f6f8289 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -37,7 +37,9 @@
<profile>
<id>default</id>
<activation>
- <activeByDefault>true</activeByDefault>
+ <property>
+ <name>java.home</name>
+ </property>
</activation>
<modules>
<module>util</module>
diff --git a/modules/pom.xml b/modules/pom.xml
index ef98301..c7b9224 100644
--- a/modules/pom.xml
+++ b/modules/pom.xml
@@ -22,7 +22,6 @@
</scm>
<properties>
- <scm.module.path>modules/</scm.module.path>
</properties>
<profiles>
@@ -30,7 +29,9 @@
<profile>
<id>default</id>
<activation>
- <activeByDefault>true</activeByDefault>
+ <property>
+ <name>java.home</name>
+ </property>
</activation>
<modules>
<module>core</module>
commit dd89c2f58af8a86d06ba171912a4a27387a386f5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 22 13:35:47 2010 -0400
quick-n-dirty - get metric template functionality back - this reuses the old jsp page. will have to refactor later with a new GWT impl
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
index 340b8fc..bd0a433 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
@@ -23,7 +23,6 @@ import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.VisibilityMode;
-import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.events.ClickEvent;
@@ -49,6 +48,7 @@ import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.alert.definitions.TemplateAlertDefinitionsView;
+import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
@@ -150,6 +150,7 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
LocatableVLayout layout = new LocatableVLayout(extendLocatorId("alertTemplateLayout"));
layout.setHeight100();
layout.setWidth100();
+ layout.setMargin(5);
this.alertTemplateCanvas = layout;
}
@@ -161,6 +162,7 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
LocatableVLayout layout = new LocatableVLayout(extendLocatorId("metricTemplateLayout"));
layout.setHeight100();
layout.setWidth100();
+ layout.setMargin(5);
this.metricTemplateCanvas = layout;
}
@@ -233,8 +235,12 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
}
private void editMetricTemplate(int resourceTypeId) {
- // http://localhost:7080/admin/platform/monitor/Config.do?nomenu=true&mode=c...
- SC.say("Metric Template : " + resourceTypeId);
+ // TODO: convert this to GWT
+ Layout metricCanvas = getMetricTemplateCanvas();
+ FullHTMLPane jspPage = new FullHTMLPane("/admin/platform/monitor/Config.do?nomenu=true&mode=configure&id="
+ + resourceTypeId + "&type=" + resourceTypeId);
+ prepareSubCanvas(metricCanvas, jspPage, true);
+ switchToCanvas(ResourceTypeTreeView.this, metricCanvas);
}
public class CustomResourceTypeListGrid extends LocatableListGrid {
commit 2bf75b1f2f702f38df5fe3e6c694361f19d98f34
Merge: e874b2f... 7ad728b...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 22 13:22:21 2010 -0400
Merge commit 'origin/master'
commit e874b2f1adca6feaafd946daa0f35e49197f7e9f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 22 13:21:13 2010 -0400
get the admin view to correctly select the proper node when directly navigating to an internal page via a direct URL.
also allow the user to reload the content when clicking an already selected node
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 2d854b3..b28f6a6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -21,12 +21,11 @@ package org.rhq.enterprise.gui.coregui.client.admin;
import java.util.LinkedHashMap;
import java.util.Map;
-import com.google.gwt.user.client.History;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
-import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
-import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.grid.events.CellClickEvent;
+import com.smartgwt.client.widgets.grid.events.CellClickHandler;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import com.smartgwt.client.widgets.tree.Tree;
@@ -107,20 +106,21 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
addMember(contentCanvas);
}
- private void addSection(TreeGrid treeGrid) {
+ private void addSection(final TreeGrid treeGrid) {
final String sectionName = treeGrid.getTree().getRoot().getName();
this.treeGrids.put(sectionName, treeGrid);
- treeGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
- public void onSelectionChanged(SelectionEvent selectionEvent) {
- if (selectionEvent.getState()) {
- TreeNode node = (TreeNode) selectionEvent.getRecord();
- String pageName = node.getName();
+ treeGrid.addCellClickHandler(new CellClickHandler() {
+ @Override
+ public void onCellClick(CellClickEvent event) {
+ // we use cell click as opposed to selected changed handler
+ // because we want to be able to refresh even if clicking
+ // on an already selected node
+ TreeNode selectedRecord = (TreeNode) treeGrid.getSelectedRecord();
+ if (selectedRecord != null) {
+ String pageName = selectedRecord.getName();
String viewPath = AdministrationView.VIEW_ID + "/" + sectionName + "/" + pageName;
- String currentViewPath = History.getToken();
- if (!currentViewPath.startsWith(viewPath)) {
- CoreGUI.goToView(viewPath);
- }
+ CoreGUI.goToView(viewPath);
}
}
});
@@ -276,12 +276,7 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
}
// when changing sections make sure the previous section's selection is deselected
- for (String name : treeGrids.keySet()) {
- TreeGrid treeGrid = treeGrids.get(name);
- if (!name.equals(sectionName)) {
- treeGrid.deselectAllRecords();
- }
- }
+ selectSectionPageTreeGridNode(sectionName, pageName);
// ignore clicks on subsection folder nodes
if (null != content) {
@@ -308,6 +303,22 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
}
}
+ private void selectSectionPageTreeGridNode(String sectionName, String pageName) {
+ for (String name : treeGrids.keySet()) {
+ TreeGrid treeGrid = treeGrids.get(name);
+ if (!name.equals(sectionName)) {
+ treeGrid.deselectAllRecords();
+ } else {
+ TreeNode node = treeGrid.getTree().find(pageName);
+ if (node != null) {
+ treeGrid.selectSingleRecord(node);
+ } else {
+ CoreGUI.getErrorHandler().handleError("Unknown page name - URL is incorrect");
+ }
+ }
+ }
+ }
+
private static String addQueryStringParam(String url, String param) {
char separatorChar = (url.indexOf('?') == -1) ? '?' : '&';
return url + separatorChar + param;
commit 7ad728b11eed2b2cf1117510afdff6c4c4f0b2da
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Oct 22 12:20:11 2010 -0400
Fix issue with resource lists not rendering in debug mode. The issue was
that the ResourceDatsource was setting the listgrid category attribute
to the ResourceCategory object. In non-debug this seemed to render
just fine, using, I guess toString. But in debug it failed silently,
requiring specifically the name string to be set for the attribute.
Unrelated:
- Add support for singleton use of ResourceDatasource and use it for the
ResourceSearchView.
- Use ResourceDataField object where not used and use imports of these
objects where applicable ( just for cleaner code )
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
index dab49e6..86f90bc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
@@ -327,8 +327,8 @@ public class Table extends LocatableHLayout implements RefreshableView {
public void onClick(ClickEvent clickEvent) {
if (tableAction.confirmMessage != null) {
- String message = tableAction.confirmMessage.replaceAll("\\#",
- String.valueOf(listGrid.getSelection().length));
+ String message = tableAction.confirmMessage.replaceAll("\\#", String.valueOf(listGrid
+ .getSelection().length));
SC.ask(message, new BooleanCallback() {
public void execute(Boolean confirmed) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
index c2c2e0e..e55d846 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
@@ -54,6 +54,15 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
+ private static ResourceDatasource INSTANCE;
+
+ public static ResourceDatasource getInstance() {
+ if (INSTANCE == null) {
+ INSTANCE = new ResourceDatasource();
+ }
+ return INSTANCE;
+ }
+
public ResourceDatasource() {
super();
List<DataSourceField> fields = addDataSourceFields();
@@ -110,12 +119,18 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
}
public void onSuccess(PageList<Resource> result) {
-
dataRetrieved(result, response, request);
}
});
}
+ protected void dataRetrieved(PageList<Resource> result, DSResponse response, DSRequest request) {
+ ListGridRecord[] records = buildRecords(result);
+ response.setData(records);
+ response.setTotalRows(result.getTotalSize()); // for paging to work we have to specify size of full result set
+ processResponse(request.getRequestId(), response);
+ }
+
protected ResourceCriteria getFetchCriteria(final DSRequest request) {
ResourceCriteria criteria = new ResourceCriteria();
criteria.setPageControl(getPageControl(request));
@@ -136,13 +151,6 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
return criteria;
}
- protected void dataRetrieved(PageList<Resource> result, DSResponse response, DSRequest request) {
- ListGridRecord[] records = buildRecords(result);
- response.setData(records);
- response.setTotalRows(result.getTotalSize()); // for paging to work we have to specify size of full result set
- processResponse(request.getRequestId(), response);
- }
-
@Override
public Resource copyValues(ListGridRecord from) {
return new Resource(from.getAttributeAsInt("id"));
@@ -157,13 +165,13 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
record.setAttribute(DESCRIPTION.propertyName(), from.getDescription());
record.setAttribute(TYPE.propertyName(), from.getResourceType().getId());
record.setAttribute(PLUGIN.propertyName(), from.getResourceType().getPlugin());
- record.setAttribute(CATEGORY.propertyName(), from.getResourceType().getCategory());
+ record.setAttribute(CATEGORY.propertyName(), from.getResourceType().getCategory().getDisplayName());
record.setAttribute("icon", from.getResourceType().getCategory().getDisplayName() + "_"
+ (from.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? "up" : "down") + "_16.png");
record
.setAttribute(
- "currentAvailability",
+ AVAILABILITY.propertyName(),
from.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? "/images/icons/availability_green_16.png"
: "/images/icons/availability_red_16.png");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
index 82595af..f0154d3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
@@ -18,6 +18,13 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.AVAILABILITY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.CATEGORY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.DESCRIPTION;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.NAME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.PLUGIN;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.TYPE;
+
import java.util.ArrayList;
import java.util.List;
@@ -88,7 +95,7 @@ public class ResourceSearchView extends Table {
// searchPanel.setWrapItemTitles(false);
// searchPanel.setFields(searchBox);
- final ResourceDatasource datasource = new ResourceDatasource();
+ final ResourceDatasource datasource = ResourceDatasource.getInstance();
setDataSource(datasource);
}
@@ -99,8 +106,7 @@ public class ResourceSearchView extends Table {
iconField.setType(ListGridFieldType.IMAGE);
iconField.setImageURLPrefix("types/");
- ListGridField nameField = new ListGridField(ResourceDataSourceField.NAME.propertyName(),
- ResourceDataSourceField.NAME.title(), 250);
+ ListGridField nameField = new ListGridField(NAME.propertyName(), NAME.title(), 250);
nameField.setCellFormatter(new CellFormatter() {
public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
return "<a href=\"" + LinkManager.getResourceLink(listGridRecord.getAttributeAsInt("id")) + "\">" + o
@@ -108,20 +114,15 @@ public class ResourceSearchView extends Table {
}
});
- ListGridField descriptionField = new ListGridField(ResourceDataSourceField.DESCRIPTION.propertyName(),
- ResourceDataSourceField.DESCRIPTION.title());
+ ListGridField descriptionField = new ListGridField(DESCRIPTION.propertyName(), DESCRIPTION.title());
- ListGridField typeNameField = new ListGridField(ResourceDataSourceField.TYPE.propertyName(),
- ResourceDataSourceField.TYPE.title(), 130);
+ ListGridField typeNameField = new ListGridField(TYPE.propertyName(), TYPE.title(), 130);
- ListGridField pluginNameField = new ListGridField(ResourceDataSourceField.PLUGIN.propertyName(),
- ResourceDataSourceField.PLUGIN.title(), 100);
+ ListGridField pluginNameField = new ListGridField(PLUGIN.propertyName(), PLUGIN.title(), 100);
- ListGridField categoryField = new ListGridField(ResourceDataSourceField.CATEGORY.propertyName(),
- ResourceDataSourceField.CATEGORY.title(), 60);
+ ListGridField categoryField = new ListGridField(CATEGORY.propertyName(), CATEGORY.title(), 60);
- ListGridField availabilityField = new ListGridField(ResourceDataSourceField.AVAILABILITY.propertyName(),
- ResourceDataSourceField.AVAILABILITY.title(), 55);
+ ListGridField availabilityField = new ListGridField(AVAILABILITY.propertyName(), AVAILABILITY.title(), 55);
availabilityField.setType(ListGridFieldType.IMAGE);
availabilityField.setAlign(Alignment.CENTER);
commit 0a979fb7c481d111dab06cdf06833bc5366fb9d4
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 22 11:30:15 2010 -0400
this doesn't fix anything but it refactors it to look like what AdministrationView code will look like.
because the authz check is async, the treeGrids collection isn't populated at the time we need it. this should be fixed in the future
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
index d913229..5ade636 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
@@ -286,18 +286,8 @@ public class InventoryView extends LocatableHLayout implements BookmarkableView
}
}
- for (String name : treeGrids.keySet()) {
- TreeGrid treeGrid = treeGrids.get(name);
- if (name.equals(sectionName)) {
- for (TreeNode node : treeGrid.getTree().getAllNodes()) {
- if (pageName.equals(node.getName())) {
- treeGrid.selectSingleRecord(node);
- }
- }
- } else {
- treeGrid.deselectAllRecords();
- }
- }
+ // when changing sections make sure the previous section's selection is deselected
+ selectSectionPageTreeGridNode(sectionName, pageName);
// ignore clicks on subsection folder nodes
if (null != content) {
@@ -309,6 +299,28 @@ public class InventoryView extends LocatableHLayout implements BookmarkableView
}
}
+ private void selectSectionPageTreeGridNode(String sectionName, String pageName) {
+ // TODO this method works, however, its getting invoked prior to treeGrids getting populated due to async authz check. need to fix that
+ for (String name : treeGrids.keySet()) {
+ TreeGrid treeGrid = treeGrids.get(name);
+ if (!name.equals(sectionName)) {
+ treeGrid.deselectAllRecords();
+ } else {
+ boolean gotIt = false;
+ for (TreeNode node : treeGrid.getTree().getAllNodes()) {
+ if (node.getName().equals(pageName)) {
+ treeGrid.selectSingleRecord(node);
+ gotIt = true;
+ break;
+ }
+ }
+ if (!gotIt) {
+ CoreGUI.getErrorHandler().handleError("Unknown page name - URL is incorrect");
+ }
+ }
+ }
+ }
+
public void renderView(ViewPath viewPath) {
if (!viewPath.isCurrent(currentSectionViewId) || !viewPath.isNext(currentPageViewId)) {
if (viewPath.isEnd()) {
commit bd67b5b987759c5a1057f1b8371ed37923c724e8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Oct 21 18:52:17 2010 -0400
preliminary work on getting the alert template window to show up.
this exposes some minor problems with AdministrationView that need to be fixed - mainly dealing with attempting to go back to the main Configuration/Templates URL if we are already showing it (e.g. clicking "Templates" while it is already selected does nothing)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 3888cdc..143045c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -258,6 +258,11 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
}
public static void goToView(String viewPath) {
+ // if path starts with "#" (e.g. if caller used LinkManager to obtain some of the path), strip it off
+ if (viewPath.charAt(0) == '#') {
+ viewPath = viewPath.substring(1);
+ }
+
String currentViewPath = History.getToken();
if (currentViewPath.equals(viewPath)) {
// We're already there - just refresh the view.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 614ac1e..2d854b3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -248,6 +248,7 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
url = "/admin/config/Config.do?mode=edit";
} else if (PAGE_TEMPLATES_VIEW_ID.equals(pageName)) {
content = new ResourceTypeTreeView(this.extendLocatorId("Templates"));
+ currentPageViewId = null; // we always want to refresh, even if we renavigate back
} else if (PAGE_DOWNLOADS_VIEW_ID.equals(pageName)) {
url = "/rhq/admin/downloads-body.xhtml";
} else if (PAGE_LICENSE_VIEW_ID.equals(pageName)) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
index ff50be7..340b8fc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.templates;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionStyle;
@@ -31,13 +32,25 @@ import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.Layout;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeGridField;
import com.smartgwt.client.widgets.tree.TreeNode;
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.ViewId;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.alert.definitions.TemplateAlertDefinitionsView;
+import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -46,61 +59,185 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
* @author Greg Hinkle
* @author John Mazzitelli
*/
-public class ResourceTypeTreeView extends LocatableVLayout {
+public class ResourceTypeTreeView extends LocatableVLayout implements BookmarkableView {
+
+ private Layout gridCanvas;
+ private Layout alertTemplateCanvas;
+ private Layout metricTemplateCanvas;
public ResourceTypeTreeView(String locatorId) {
super(locatorId);
setWidth100();
setHeight100();
+ }
+
+ @Override
+ public void renderView(ViewPath viewPath) {
+ if (viewPath.isEnd()) {
+ switchToCanvas(this, getGridCanvas());
+ } else {
+ // we must be asked to go to a specific resource type
+ // the path must be one of "Alert/#####" or "Metric/#####"
+ // where ##### is a resource type ID
+ ViewId typeOfTemplatePath = viewPath.getCurrent();
+ final boolean isAlertTemplate; // true=alert template; false=metric template
+ if ("Alert".equals(typeOfTemplatePath.getPath())) {
+ isAlertTemplate = true;
+ } else if ("Metric".equals(typeOfTemplatePath.getPath())) {
+ isAlertTemplate = false;
+ } else {
+ CoreGUI.getErrorHandler().handleError(
+ "Invalid URL. Unknown template type: " + typeOfTemplatePath.getPath());
+ return;
+ }
+
+ viewPath.next();
+ final int resourceTypeId;
+ try {
+ resourceTypeId = viewPath.getCurrentAsInt();
+ } catch (Exception e) {
+ CoreGUI.getErrorHandler().handleError("Invalid URL. Bad resource type ID: " + viewPath.getCurrent());
+ return;
+ }
+
+ if (isAlertTemplate) {
+ editAlertTemplate(resourceTypeId, viewPath);
+ } else {
+ editMetricTemplate(resourceTypeId);
+ }
+ }
+ }
- SectionStack sectionStack = new SectionStack();
- sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
+ private Canvas getGridCanvas() {
+ if (this.gridCanvas == null) {
+ LocatableVLayout layout = new LocatableVLayout(extendLocatorId("gridLayout"));
- ListGrid platformsList = new CustomResourceTypeListGrid(extendLocatorId("platformsList"));
- SectionStackSection platforms = new SectionStackSection("Platforms");
- platforms.setExpanded(true);
- platforms.addItem(platformsList);
+ SectionStack sectionStack = new SectionStack();
+ sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
- ListGrid platformServicesList = new CustomResourceTypeListGrid(extendLocatorId("platformServicesList"));
- SectionStackSection platformServices = new SectionStackSection("Platform Services");
- platformServices.setExpanded(true);
- platformServices.addItem(platformServicesList);
+ ListGrid platformsList = new CustomResourceTypeListGrid(extendLocatorId("platformsList"));
+ SectionStackSection platforms = new SectionStackSection("Platforms");
+ platforms.setExpanded(true);
+ platforms.addItem(platformsList);
- TreeGrid serversTreeGrid = new CustomResourceTypeTreeGrid(extendLocatorId("serversTree"));
- SectionStackSection servers = new SectionStackSection("Servers");
- servers.setExpanded(true);
- servers.addItem(serversTreeGrid);
+ ListGrid platformServicesList = new CustomResourceTypeListGrid(extendLocatorId("platformServicesList"));
+ SectionStackSection platformServices = new SectionStackSection("Platform Services");
+ platformServices.setExpanded(true);
+ platformServices.addItem(platformServicesList);
- sectionStack.addSection(platforms);
- sectionStack.addSection(platformServices);
- sectionStack.addSection(servers);
+ TreeGrid serversTreeGrid = new CustomResourceTypeTreeGrid(extendLocatorId("serversTree"));
+ SectionStackSection servers = new SectionStackSection("Servers");
+ servers.setExpanded(true);
+ servers.addItem(serversTreeGrid);
- addMember(sectionStack);
+ sectionStack.addSection(platforms);
+ sectionStack.addSection(platformServices);
+ sectionStack.addSection(servers);
- new ResourceTypeTreeNodeBuilder(platformsList, platformServicesList, serversTreeGrid);
+ layout.addMember(sectionStack);
+ this.gridCanvas = layout;
+
+ // this will asynchronously populate the grids with the appropriate data
+ new ResourceTypeTreeNodeBuilder(platformsList, platformServicesList, serversTreeGrid);
+ }
+
+ return this.gridCanvas;
+ }
+
+ private Layout getAlertTemplateCanvas() {
+ if (this.alertTemplateCanvas == null) {
+ LocatableVLayout layout = new LocatableVLayout(extendLocatorId("alertTemplateLayout"));
+ layout.setHeight100();
+ layout.setWidth100();
+ this.alertTemplateCanvas = layout;
+ }
+
+ return this.alertTemplateCanvas;
}
- private static void editAlertTemplate(Record record) {
- SC.say("Alert Template : " //
- + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME)
- + "==>"
- + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN)
- + "==>"
- + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ private Layout getMetricTemplateCanvas() {
+ if (this.metricTemplateCanvas == null) {
+ LocatableVLayout layout = new LocatableVLayout(extendLocatorId("metricTemplateLayout"));
+ layout.setHeight100();
+ layout.setWidth100();
+ this.metricTemplateCanvas = layout;
+ }
+
+ return this.metricTemplateCanvas;
}
- private static void editMetricTemplate(Record record) {
+ /**
+ * This will remove all members from the given parent canvas and then add
+ * the canvasToShow as the only member to the parent.
+ *
+ * @param parentCanvas parent to show the given canvas
+ * @param canvasToShow the canvas to show in the parent
+ */
+ private void switchToCanvas(Layout parentCanvas, Canvas canvasToShow) {
+ Canvas[] members = getMembers();
+ if (members != null) {
+ for (Canvas c : members) {
+ parentCanvas.removeMember(c);
+ }
+ }
+ parentCanvas.addMember(canvasToShow);
+ parentCanvas.markForRedraw();
+ }
+
+ private void prepareSubCanvas(Layout parentCanvas, Canvas canvasToShow, boolean showBackButton) {
+ Canvas[] members = getMembers();
+ if (members != null) {
+ for (Canvas c : members) {
+ parentCanvas.removeMember(c);
+ c.destroy();
+ }
+ }
+
+ if (showBackButton) {
+ String backLink = LinkManager.getAdminTemplatesLink().substring(1); // strip the #
+ BackButton backButton = new BackButton(extendLocatorId("BackButton"), "Back to List", backLink);
+ parentCanvas.addMember(backButton);
+ }
+ parentCanvas.addMember(canvasToShow);
+ parentCanvas.markForRedraw();
+ }
+
+ private void editAlertTemplate(final int resourceTypeId, final ViewPath viewPath) {
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ criteria.addFilterId(resourceTypeId);
+ // TODO we need to fetch some collections here
+
+ GWTServiceLookup.getResourceTypeGWTService().findResourceTypesByCriteria(criteria,
+ new AsyncCallback<PageList<ResourceType>>() {
+ @Override
+ public void onSuccess(PageList<ResourceType> result) {
+ if (result != null && result.size() == 1) {
+ ResourceType rt = result.get(0);
+ Layout alertCanvas = getAlertTemplateCanvas();
+ String locatorId = extendLocatorId("alertTemplateDef");
+ TemplateAlertDefinitionsView def = new TemplateAlertDefinitionsView(locatorId, rt);
+ def.renderView(viewPath.next());
+ prepareSubCanvas(alertCanvas, def, viewPath.isEnd()); // don't show our back button if we are going to a template details pane which has its own back button
+ switchToCanvas(ResourceTypeTreeView.this, alertCanvas);
+ } else {
+ CoreGUI.getErrorHandler().handleError("Failed to get resource type: " + resourceTypeId);
+ }
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Error getting resource type: " + resourceTypeId, caught);
+ }
+ });
+ }
+
+ private void editMetricTemplate(int resourceTypeId) {
// http://localhost:7080/admin/platform/monitor/Config.do?nomenu=true&mode=c...
- SC.say("Metric Template: " //
- + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME)
- + "==>"
- + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN)
- + "==>"
- + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ SC.say("Metric Template : " + resourceTypeId);
}
- public static class CustomResourceTypeListGrid extends LocatableListGrid {
+ public class CustomResourceTypeListGrid extends LocatableListGrid {
private HLayout rollOverCanvas;
private ListGridRecord rollOverRecord;
@@ -168,7 +305,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
metricTemplateImg.setWidth(16);
metricTemplateImg.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- editMetricTemplate(rollOverRecord);
+ CoreGUI.goToView(LinkManager.getAdminTemplatesLink() + "/Metric/" + getRollOverId());
}
});
@@ -183,7 +320,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
alertTemplateImg.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
- editAlertTemplate(rollOverRecord);
+ CoreGUI.goToView(LinkManager.getAdminTemplatesLink() + "/Alert/" + getRollOverId());
}
});
@@ -192,9 +329,13 @@ public class ResourceTypeTreeView extends LocatableVLayout {
}
return rollOverCanvas;
}
+
+ private int getRollOverId() {
+ return Integer.parseInt(rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
}
- public static class CustomResourceTypeTreeGrid extends LocatableTreeGrid {
+ public class CustomResourceTypeTreeGrid extends LocatableTreeGrid {
private HLayout rollOverCanvas;
private ListGridRecord rollOverRecord;
@@ -260,7 +401,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
metricTemplateImg.setWidth(16);
metricTemplateImg.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- editMetricTemplate(rollOverRecord);
+ CoreGUI.goToView(LinkManager.getAdminTemplatesLink() + "/Metric/" + getRollOverId());
}
});
@@ -275,7 +416,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
alertTemplateImg.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
- editAlertTemplate(rollOverRecord);
+ CoreGUI.goToView(LinkManager.getAdminTemplatesLink() + "/Alert/" + getRollOverId());
}
});
@@ -285,6 +426,10 @@ public class ResourceTypeTreeView extends LocatableVLayout {
return rollOverCanvas;
}
+ private int getRollOverId() {
+ return Integer.parseInt(rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
+
@Override
protected String getIcon(Record record, boolean defaultState) {
commit ad3a5abde7fa98bd78caebda87a88d4366bba2ca
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Oct 21 16:33:01 2010 -0400
Fix Selecting from Bundle Tree
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
index c795669..236f728 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
@@ -56,7 +56,7 @@ public class BundleTreeView extends LocatableTreeGrid {
addNodeClickHandler(new NodeClickHandler() {
public void onNodeClick(NodeClickEvent event) {
- String path = event.getNode().getAttribute("id").replaceAll(":", "/");
+ String path = event.getNode().getAttribute("id").replaceAll("_", "/");
History.newItem("Bundles/Bundle/" + path);
}
});
commit e81f607e26a3d8d260b2bc465e7fa771b0bd34ca
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Oct 21 16:15:15 2010 -0400
Group Fixes
- Avoid NPE and save time by not constructing Group Alert Def subtab for
Mixed Group.
- Fix issue now preventing the user from navigating away from
Group->Inventory->Membership
- Fix Inventory compat and mixed group tree options to actually return the
desired group category
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index 0295877..bcef904 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -45,6 +45,7 @@ import org.rhq.enterprise.gui.coregui.client.alert.definitions.GroupAlertDefinit
import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
import org.rhq.enterprise.gui.coregui.client.components.tab.SubTab;
import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTab;
+import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTabSelectedEvent;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.AbstractTwoLevelTabSetView;
import org.rhq.enterprise.gui.coregui.client.inventory.common.event.EventCompositeHistoryView;
@@ -107,16 +108,28 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
@Override
public Integer getSelectedItemId() {
+ return this.groupId;
+ }
+
+ @Override
+ public void onTabSelected(TwoLevelTabSelectedEvent tabSelectedEvent) {
// if moving from membership subtab then re-load the detail view as the membership and
// group type may have changed.
- if (this.inventoryTab.getTitle().equals(currentTab)
+ if ((null != this.groupId) && this.inventoryTab.getTitle().equals(currentTab)
&& this.inventoryMembership.getTitle().equals(currentSubTab)) {
+
+ String tabPath = "/" + tabSelectedEvent.getId() + "/" + tabSelectedEvent.getSubTabId();
+ String path = this.getBaseViewPath() + "/" + getSelectedItemId() + tabPath;
+
this.currentTab = null;
this.currentSubTab = null;
this.groupId = null;
- }
- return this.groupId;
+ CoreGUI.goToView(path);
+
+ } else {
+ super.onTabSelected(tabSelectedEvent);
+ }
}
@Override
@@ -202,8 +215,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
// summaryTab.updateSubTab("Overview", new DashboardView(resource));
// summaryTab.updateSubTab("Timeline", timelinePane);
// Summary tab is always visible and enabled.
- updateSubTab(this.summaryTab, this.summaryOverview,
- new OverviewView(this.summaryTab.extendLocatorId("OverviewView"), this.groupComposite), true, true);
+ updateSubTab(this.summaryTab, this.summaryOverview, new OverviewView(this.summaryTab
+ .extendLocatorId("OverviewView"), this.groupComposite), true, true);
if (updateTab(this.monitoringTab, groupCategory == GroupCategory.COMPATIBLE, true)) {
visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT);
@@ -225,8 +238,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
// Inventory tab is always visible and enabled.
- updateSubTab(this.inventoryTab, this.inventoryMembers,
- ResourceSearchView.getMembersOf(this.inventoryTab.extendLocatorId("MembersView"), groupId), true, true);
+ updateSubTab(this.inventoryTab, this.inventoryMembers, ResourceSearchView.getMembersOf(this.inventoryTab
+ .extendLocatorId("MembersView"), groupId), true, true);
// TODO: Uncomment this once the group config component is done.
//updateSubTab(this.inventoryTab, this.inventoryConn,
// new GroupPluginConfigurationEditView(this.group.getId(), this.group.getResourceType().getId(), ConfigurationEditor.ConfigType.plugin),
@@ -236,8 +249,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
groupId) : null;
updateSubTab(this.inventoryTab, this.inventoryMembership, canvas, true, enabled);
- if (updateTab(this.operationsTab,
- groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.OPERATION), true)) {
+ if (updateTab(this.operationsTab, groupCategory == GroupCategory.COMPATIBLE
+ && facets.contains(ResourceTypeFacet.OPERATION), true)) {
updateSubTab(this.operationsTab, this.opHistory, new FullHTMLPane(
"/rhq/group/operation/groupOperationHistory-plain.xhtml?groupId=" + groupId), true, true);
updateSubTab(this.operationsTab, this.opSched, new FullHTMLPane(
@@ -249,9 +262,10 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
// alert history is always available
updateSubTab(this.alertsTab, this.alertHistory, GroupAlertHistoryView.get(groupComposite), true, true);
// but alert definitions can only be created on compatible groups
- updateSubTab(this.alertsTab, this.alertDef,
- new GroupAlertDefinitionsView(alertsTab.extendLocatorId("AlertDefView"), this.groupComposite),
- groupCategory == GroupCategory.COMPATIBLE, true);
+ visible = (groupCategory == GroupCategory.COMPATIBLE);
+ canvas = (visible) ? new GroupAlertDefinitionsView(alertsTab.extendLocatorId("AlertDefView"),
+ this.groupComposite) : null;
+ updateSubTab(this.alertsTab, this.alertDef, canvas, visible, true);
}
visible = groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.CONFIGURATION);
@@ -263,13 +277,12 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateSubTab(this.configurationTab, this.configHistory, new FullHTMLPane(
"/rhq/group/configuration/history-plain.xhtml?groupId=" + groupId), true, true);
}
-
- visible = groupCategory == GroupCategory.MIXED || // allow mixed groups to show events from supporting resources
- (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.EVENT));
+ // allow mixed groups to show events from supporting resources
+ visible = groupCategory == GroupCategory.MIXED
+ || (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.EVENT));
if (updateTab(this.eventsTab, visible, true)) {
- updateSubTab(this.eventsTab, this.eventHistory,
- EventCompositeHistoryView.get(this.eventsTab.extendLocatorId("CompositeHistView"), groupComposite),
- true, true);
+ updateSubTab(this.eventsTab, this.eventHistory, EventCompositeHistoryView.get(this.eventsTab
+ .extendLocatorId("CompositeHistView"), groupComposite), true, true);
}
this.show();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
index dee71d2..d913229 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
@@ -46,6 +46,7 @@ import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.components.tree.EnhancedTreeNode;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupListView;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions.GroupDefinitionListView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.ResourceAutodiscoveryView;
@@ -265,11 +266,13 @@ public class InventoryView extends LocatableHLayout implements BookmarkableView
}
} else if (GROUPS_SECTION_VIEW_ID.equals(sectionName)) {
if (PAGE_COMPATIBLE_GROUPS.equals(pageName)) {
- content = new ResourceGroupListView(extendLocatorId("Compatible"), new Criteria("category",
- GroupCategory.COMPATIBLE.name()), "Compatible Groups", "types/Cluster_up_24.png");
+ content = new ResourceGroupListView(extendLocatorId("Compatible"), new Criteria(
+ ResourceGroupDataSourceField.CATEGORY.propertyName(), GroupCategory.COMPATIBLE.name()),
+ "Compatible Groups", "types/Cluster_up_24.png");
} else if (PAGE_MIXED_GROUPS.equals(pageName)) {
- content = new ResourceGroupListView(extendLocatorId("Mixed"), new Criteria("category",
- GroupCategory.MIXED.name()), "Mixed Groups", "types/Group_up_24.png");
+ content = new ResourceGroupListView(extendLocatorId("Mixed"), new Criteria(
+ ResourceGroupDataSourceField.CATEGORY.propertyName(), GroupCategory.MIXED.name()), "Mixed Groups",
+ "types/Group_up_24.png");
} else if (PAGE_GROUP_DEFINITIONS.equals(pageName)) {
content = new GroupDefinitionListView(extendLocatorId("Definitions"), "types/GroupDefinition_16.png");
} else if (PAGE_PROBLEM_GROUPS.equals(pageName)) {
commit 2a6f63978e077abb1bba6f81a7aee7e7b6e85b28
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Oct 21 14:25:27 2010 -0400
- Fix issue with resource group list view using bad field name
-- Make better use of the datasource field enums
- add "id" to the resourcegroupcompositedatasource for display in debug mode
- cosmetic, remove obsolete straggler defs of useDatasourceDefinedFields()
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
index f783b4c..6e7e81e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NotificationsAlertDefinitionForm.java
@@ -190,10 +190,6 @@ public class NotificationsAlertDefinitionForm extends LocatableVLayout implement
}
@Override
- public void useDatasourceDefinedFields() {
- }
-
- @Override
public AlertNotification copyValues(ListGridRecord from) {
return (AlertNotification) from.getAttributeAsObject(FIELD_OBJECT);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
index b2fea0a..cb338a7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
@@ -19,7 +19,10 @@
package org.rhq.enterprise.gui.coregui.client.inventory.groups;
import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.CATEGORY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.DESCRIPTION;
import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.NAME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.PLUGIN;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.TYPE;
import java.util.List;
@@ -27,6 +30,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSourceField;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.widgets.grid.ListGridRecord;
@@ -68,21 +72,27 @@ public class ResourceGroupCompositeDataSource extends RPCDataSource<ResourceGrou
protected List<DataSourceField> addDataSourceFields() {
List<DataSourceField> fields = super.addDataSourceFields();
- DataSourceTextField nameDataField = new DataSourceTextField("name", "Name", 200);
+ DataSourceField idDataField = new DataSourceIntegerField("id", "ID", 50);
+ idDataField.setPrimaryKey(true);
+ idDataField.setCanEdit(false);
+ fields.add(idDataField);
+
+ DataSourceTextField nameDataField = new DataSourceTextField(NAME.propertyName(), NAME.title(), 200);
nameDataField.setCanEdit(false);
fields.add(nameDataField);
- DataSourceTextField descriptionDataField = new DataSourceTextField("description", "Description");
+ DataSourceTextField descriptionDataField = new DataSourceTextField(DESCRIPTION.propertyName(), DESCRIPTION
+ .title());
descriptionDataField.setCanEdit(false);
fields.add(descriptionDataField);
- DataSourceTextField typeNameDataField = new DataSourceTextField("typeName", "Type");
+ DataSourceTextField typeNameDataField = new DataSourceTextField(TYPE.propertyName(), TYPE.title());
fields.add(typeNameDataField);
- DataSourceTextField pluginNameDataField = new DataSourceTextField("pluginName", "Plugin");
+ DataSourceTextField pluginNameDataField = new DataSourceTextField(PLUGIN.propertyName(), PLUGIN.title());
fields.add(pluginNameDataField);
- DataSourceTextField categoryDataField = new DataSourceTextField("category", "Category");
+ DataSourceTextField categoryDataField = new DataSourceTextField(CATEGORY.propertyName(), CATEGORY.title());
fields.add(categoryDataField);
return fields;
@@ -123,10 +133,10 @@ public class ResourceGroupCompositeDataSource extends RPCDataSource<ResourceGrou
@Override
public ResourceGroupComposite copyValues(ListGridRecord from) {
Integer idAttrib = from.getAttributeAsInt("id");
- String nameAttrib = from.getAttribute("name");
- String descriptionAttrib = from.getAttribute("description");
- String typeNameAttrib = from.getAttribute("typeName");
- String pluginNameAttrib = from.getAttribute("pluginName");
+ String nameAttrib = from.getAttribute(NAME.propertyName());
+ String descriptionAttrib = from.getAttribute(DESCRIPTION.propertyName());
+ String typeNameAttrib = from.getAttribute(TYPE.propertyName());
+ String pluginNameAttrib = from.getAttribute(PLUGIN.propertyName());
ResourceType rt = null;
ResourceGroup rg = new ResourceGroup(nameAttrib);
@@ -155,9 +165,9 @@ public class ResourceGroupCompositeDataSource extends RPCDataSource<ResourceGrou
ListGridRecord record = new ListGridRecord();
record.setAttribute("group", from);
record.setAttribute("id", from.getResourceGroup().getId());
- record.setAttribute("name", from.getResourceGroup().getName());
- record.setAttribute("description", from.getResourceGroup().getDescription());
- record.setAttribute("category", from.getResourceGroup().getGroupCategory().name());
+ record.setAttribute(NAME.propertyName(), from.getResourceGroup().getName());
+ record.setAttribute(DESCRIPTION.propertyName(), from.getResourceGroup().getDescription());
+ record.setAttribute(CATEGORY.propertyName(), from.getResourceGroup().getGroupCategory().name());
record.setAttribute("explicitUp", String.valueOf(from.getExplicitUp()));
record.setAttribute("explicitDown", String.valueOf(from.getExplicitDown()));
@@ -169,8 +179,8 @@ public class ResourceGroupCompositeDataSource extends RPCDataSource<ResourceGrou
if (from.getResourceGroup().getResourceType() != null) {
record.setAttribute("resourceType", from.getResourceGroup().getResourceType());
- record.setAttribute("typeName", from.getResourceGroup().getResourceType().getName());
- record.setAttribute("pluginName", from.getResourceGroup().getResourceType().getPlugin());
+ record.setAttribute(TYPE.propertyName(), from.getResourceGroup().getResourceType().getName());
+ record.setAttribute(PLUGIN.propertyName(), from.getResourceGroup().getResourceType().getPlugin());
}
return record;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupDataSourceField.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupDataSourceField.java
index d7deadd..88ecdf6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupDataSourceField.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupDataSourceField.java
@@ -35,7 +35,7 @@ public enum ResourceGroupDataSourceField {
PLUGIN("pluginName", "Plugin"),
- CATEGORY("category", "Category");
+ CATEGORY("groupCategory", "Category");
/**
* Corresponds to a property name of Resource
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
index 32aabb0..5aced32 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
@@ -18,6 +18,12 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.groups;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.CATEGORY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.DESCRIPTION;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.NAME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.PLUGIN;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.TYPE;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.types.Alignment;
@@ -64,7 +70,7 @@ public class ResourceGroupListView extends Table {
@Override
protected void configureTable() {
- ListGridField nameField = new ListGridField("name", "Name", 300);
+ ListGridField nameField = new ListGridField(NAME.propertyName(), NAME.title(), 300);
nameField.setCellFormatter(new CellFormatter() {
public String format(Object value, ListGridRecord record, int i, int i1) {
String groupId = record.getAttribute("id");
@@ -73,10 +79,10 @@ public class ResourceGroupListView extends Table {
}
});
- ListGridField descriptionField = new ListGridField("description", "Description");
- ListGridField typeNameField = new ListGridField("typeName", "Type", 130);
- ListGridField pluginNameField = new ListGridField("pluginName", "Plugin", 100);
- ListGridField categoryField = new ListGridField("category", "Category", 100);
+ ListGridField descriptionField = new ListGridField(DESCRIPTION.propertyName(), DESCRIPTION.title());
+ ListGridField typeNameField = new ListGridField(TYPE.propertyName(), TYPE.title(), 130);
+ ListGridField pluginNameField = new ListGridField(PLUGIN.propertyName(), PLUGIN.title(), 100);
+ ListGridField categoryField = new ListGridField(CATEGORY.propertyName(), CATEGORY.title(), 100);
ListGridField availabilityChildrenField = new ListGridField("availabilityChildren", "Children", 100);
availabilityChildrenField.setWrap(false);
@@ -86,7 +92,7 @@ public class ResourceGroupListView extends Table {
availabilityDescendantsField.setWrap(false);
availabilityDescendantsField.setAlign(Alignment.CENTER);
- getListGrid().setFields(nameField, descriptionField, typeNameField, pluginNameField, categoryField,
+ setListGridFields(nameField, descriptionField, typeNameField, pluginNameField, categoryField,
availabilityChildrenField, availabilityDescendantsField);
addTableAction(extendLocatorId("Delete"), "Delete", Table.SelectionEnablement.ANY,
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
index 3f6e197..a862db6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
@@ -19,7 +19,10 @@
package org.rhq.enterprise.gui.coregui.client.inventory.groups;
import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.CATEGORY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.DESCRIPTION;
import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.NAME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.PLUGIN;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.TYPE;
import java.util.List;
@@ -72,21 +75,22 @@ public class ResourceGroupsDataSource extends RPCDataSource<ResourceGroup> {
idDataField.setPrimaryKey(true);
fields.add(idDataField);
- DataSourceTextField nameDataField = new DataSourceTextField("name", "Name", 200);
+ DataSourceTextField nameDataField = new DataSourceTextField(NAME.propertyName(), NAME.title(), 200);
nameDataField.setCanEdit(false);
fields.add(nameDataField);
- DataSourceTextField descriptionDataField = new DataSourceTextField("description", "Description");
+ DataSourceTextField descriptionDataField = new DataSourceTextField(DESCRIPTION.propertyName(), DESCRIPTION
+ .title());
descriptionDataField.setCanEdit(false);
fields.add(descriptionDataField);
- DataSourceTextField typeNameDataField = new DataSourceTextField("typeName", "Type");
+ DataSourceTextField typeNameDataField = new DataSourceTextField(TYPE.propertyName(), TYPE.title());
fields.add(typeNameDataField);
- DataSourceTextField pluginNameDataField = new DataSourceTextField("pluginName", "Plugin");
+ DataSourceTextField pluginNameDataField = new DataSourceTextField(PLUGIN.propertyName(), PLUGIN.title());
fields.add(pluginNameDataField);
- DataSourceTextField categoryDataField = new DataSourceTextField("category", "Category");
+ DataSourceTextField categoryDataField = new DataSourceTextField(CATEGORY.propertyName(), CATEGORY.title());
fields.add(categoryDataField);
return fields;
@@ -126,10 +130,10 @@ public class ResourceGroupsDataSource extends RPCDataSource<ResourceGroup> {
@Override
public ResourceGroup copyValues(ListGridRecord from) {
Integer idAttrib = from.getAttributeAsInt("id");
- String nameAttrib = from.getAttribute("name");
- String descriptionAttrib = from.getAttribute("description");
- String typeNameAttrib = from.getAttribute("typeName");
- String pluginNameAttrib = from.getAttribute("pluginName");
+ String nameAttrib = from.getAttribute(NAME.propertyName());
+ String descriptionAttrib = from.getAttribute(DESCRIPTION.propertyName());
+ String typeNameAttrib = from.getAttribute(TYPE.propertyName());
+ String pluginNameAttrib = from.getAttribute(PLUGIN.propertyName());
ResourceType rt = null;
ResourceGroup rg = new ResourceGroup(nameAttrib);
@@ -150,14 +154,14 @@ public class ResourceGroupsDataSource extends RPCDataSource<ResourceGroup> {
ListGridRecord record = new ListGridRecord();
record.setAttribute("group", from);
record.setAttribute("id", from.getId());
- record.setAttribute("name", from.getName());
- record.setAttribute("description", from.getDescription());
- record.setAttribute("category", from.getGroupCategory().name());
+ record.setAttribute(NAME.propertyName(), from.getName());
+ record.setAttribute(DESCRIPTION.propertyName(), from.getDescription());
+ record.setAttribute(CATEGORY.propertyName(), from.getGroupCategory().name());
if (from.getResourceType() != null) {
record.setAttribute("resourceType", from.getResourceType());
- record.setAttribute("typeName", from.getResourceType().getName());
- record.setAttribute("pluginName", from.getResourceType().getPlugin());
+ record.setAttribute(TYPE.propertyName(), from.getResourceType().getName());
+ record.setAttribute(PLUGIN.propertyName(), from.getResourceType().getPlugin());
}
return record;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
index 7759f53..c2c2e0e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
@@ -99,12 +99,6 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
return fields;
}
- @Override
- public void useDatasourceDefinedFields() {
- // TODO Auto-generated method stub
-
- }
-
public void executeFetch(final DSRequest request, final DSResponse response) {
ResourceCriteria criteria = getFetchCriteria(request);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/SearchBarPane.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/SearchBarPane.java
index 9546d66..9d8c94d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/SearchBarPane.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/SearchBarPane.java
@@ -18,6 +18,12 @@
*/
package org.rhq.enterprise.gui.coregui.client.menu;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.CATEGORY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.DESCRIPTION;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.NAME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.PLUGIN;
+import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.TYPE;
+
import com.google.gwt.user.client.History;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.TextMatchStyle;
@@ -34,7 +40,6 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.grid.ListGridField;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
-import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource;
@@ -137,16 +142,16 @@ public class SearchBarPane extends LocatableHLayout {
private ComboBoxItem getGroupComboBox() {
final ComboBoxItem comboBox = getBaseComboBox(SearchType.GROUP);
- ListGridField nameField = ResourceGroupDataSourceField.NAME.getListGridField(250);
- ListGridField descriptionField = ResourceGroupDataSourceField.DESCRIPTION.getListGridField();
- ListGridField typeNameField = ResourceGroupDataSourceField.TYPE.getListGridField(130);
- ListGridField pluginNameField = ResourceGroupDataSourceField.PLUGIN.getListGridField(100);
- ListGridField categoryField = ResourceGroupDataSourceField.CATEGORY.getListGridField(105);
+ ListGridField nameField = NAME.getListGridField(250);
+ ListGridField descriptionField = DESCRIPTION.getListGridField();
+ ListGridField typeNameField = TYPE.getListGridField(130);
+ ListGridField pluginNameField = PLUGIN.getListGridField(100);
+ ListGridField categoryField = CATEGORY.getListGridField(105);
comboBox.setPickListFields(nameField, descriptionField, typeNameField, pluginNameField, categoryField);
comboBox.setValueField("id");
- comboBox.setDisplayField(ResourceGroupDataSourceField.NAME.propertyName());
+ comboBox.setDisplayField(NAME.propertyName());
comboBox.setOptionDataSource(new ResourceGroupsDataSource());
return comboBox;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
index ce0ce25..d61a308 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
@@ -73,14 +73,6 @@ public abstract class RPCDataSource<T> extends DataSource {
}
/**
- * Override in each subclass to set the default ds fields for the ds. The datasource should not
- * define and set ds fields in the constructor in case a user of the ds wants to set their own. For example,
- * those that want to use list grid fields (like our list views).
- */
- public void useDatasourceDefinedFields() {
- }
-
- /**
* A pattern that can be used for Datasource subclassing. Each subclass can add it's own fields prior to
* all of the fields being added to the datasource.
*/
@@ -130,8 +122,8 @@ public abstract class RPCDataSource<T> extends DataSource {
if (request.getStartRow() == null || request.getEndRow() == null) {
pageControl = new PageControl();
} else {
- pageControl = PageControl.getExplicitPageControl(request.getStartRow(),
- request.getEndRow() - request.getStartRow());
+ pageControl = PageControl.getExplicitPageControl(request.getStartRow(), request.getEndRow()
+ - request.getStartRow());
}
// Initialize sorting.
commit d8d3923378207946060daf0a7158554a2e94696b
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Oct 20 19:48:29 2010 -0400
group config: add set-all-values-to controls at top of edit-member-values modal; fix a few other bugs in the group config editor
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 28d5960..163ff47 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
@@ -1283,11 +1283,13 @@ public class ConfigurationEditor extends LocatableVLayout {
valueItem = new PasswordItem();
break;
case BOOLEAN:
- valueItem = new RadioGroupItem();
- LinkedHashMap<String, String> valMap = new LinkedHashMap<String, String>();
- valMap.put("true", "Yes");
- valMap.put("false", "No");
- valueItem.setValueMap(valMap);
+ RadioGroupItem radioGroupItem = new RadioGroupItem();
+ radioGroupItem.setVertical(false);
+ valueItem = radioGroupItem;
+ LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
+ valueMap.put("true", "Yes");
+ valueMap.put("false", "No");
+ valueItem.setValueMap(valueMap);
break;
case INTEGER:
case LONG:
@@ -1300,8 +1302,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
}
- valueItem.setDefaultValue((String)null);
- valueItem.setValue(propertySimple.getStringValue());
+ valueItem.setDefaultValue(propertySimple.getStringValue());
valueItem.setRequired(propertyDefinitionSimple.isRequired());
List<Validator> validators = buildValidators(propertyDefinitionSimple, propertySimple);
@@ -1606,6 +1607,7 @@ public class ConfigurationEditor extends LocatableVLayout {
String stringValue = (value != null) ? value.toString() : null;
item.setValue(stringValue);
}
+ item.setDefaultValue((String)null);
}
private static class PropertyDefinitionComparator implements Comparator<PropertyDefinition> {
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 4583a4a..c2e2eb7 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
@@ -32,14 +32,19 @@ import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
+import com.smartgwt.client.widgets.form.fields.ButtonItem;
+import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
+import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
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.ClickHandler;
import com.smartgwt.client.widgets.form.fields.events.FormItemClickHandler;
import com.smartgwt.client.widgets.form.fields.events.FormItemIconClickEvent;
import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
@@ -180,16 +185,81 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
private void displayMemberValuesEditor(String locatorId, final PropertyDefinitionSimple propertyDefinitionSimple,
final PropertySimple aggregatePropertySimple,
Integer index, final FormItem aggregateValueItem) {
+ final Window popup = new Window();
+ popup.setTitle("Member Values for Property '" + propertyDefinitionSimple.getName() + "'");
+ popup.setWidth(800);
+ popup.setHeight(600);
+ popup.setIsModal(true);
+ popup.setShowModalMask(true);
+ popup.setShowCloseButton(false);
+ popup.centerInPage();
+
LocatableVLayout layout = new LocatableVLayout(locatorId);
layout.setHeight100();
+ layout.setMargin(11);
+
+ final DynamicForm setAllForm = new DynamicForm();
+ setAllForm.setNumCols(4);
+ setAllForm.setColWidths(175, 25, 250, 100);
+ setAllForm.setCellPadding(5);
+
+ List<FormItem> setAllItems = new ArrayList<FormItem>();
+
+ // Header Row
+ SpacerItem spacerItem = new SpacerItem();
+ setAllItems.add(spacerItem);
+
+ StaticTextItem unsetAllHeader = new StaticTextItem();
+ unsetAllHeader.setShowTitle(false);
+ unsetAllHeader.setDefaultValue("<h4>Unset</h4>");
+ setAllItems.add(unsetAllHeader);
+
+ StaticTextItem valueAllHeader = new StaticTextItem();
+ valueAllHeader.setShowTitle(false);
+ valueAllHeader.setDefaultValue("<h4>Value</h4>");
+
+ setAllItems.add(valueAllHeader);
+
+ spacerItem = new SpacerItem();
+ //spacerItem.setEndRow(true);
+ setAllItems.add(spacerItem);
+
+ // Input Row
+ StaticTextItem setAllValuesToItem = new StaticTextItem();
+ setAllValuesToItem.setShowTitle(false);
+ setAllValuesToItem.setDefaultValue("<b>Set all values to: </b>");
+ setAllValuesToItem.setAlign(Alignment.RIGHT);
+ setAllItems.add(setAllValuesToItem);
+
+ PropertySimple masterPropertySimple = new PropertySimple(aggregatePropertySimple.getName(), null);
+ final FormItem masterValueItem = super.buildSimpleField(propertyDefinitionSimple, masterPropertySimple);
+ masterValueItem.setDisabled(false);
+
+ FormItem masterUnsetItem = buildUnsetItem(propertyDefinitionSimple, masterPropertySimple, masterValueItem);
+ if (masterUnsetItem instanceof CheckboxItem) {
+ masterUnsetItem.setValue(false);
+ }
- // TODO: Add 'Set All Values To' and 'Unset All' controls in a separate DynamicForm.
+ setAllItems.add(masterUnsetItem);
+ setAllItems.add(masterValueItem);
- final DynamicForm form = new DynamicForm();
- form.setHeight100();
- form.setNumCols(3);
- form.setColWidths("60%", "8%", "32%");
- layout.addMember(form);
+ ButtonItem applyButtonItem = new ButtonItem();
+ applyButtonItem.setTitle("Apply");
+ //applyButtonItem.setEndRow(true);
+ setAllItems.add(applyButtonItem);
+
+ setAllForm.setFields(setAllItems.toArray(new FormItem[setAllItems.size()]));
+ layout.addMember(setAllForm);
+
+ VLayout spacerLayout = new VLayout();
+ spacerLayout.setHeight(20);
+ layout.addMember(spacerLayout);
+
+ final DynamicForm membersForm = new DynamicForm();
+ membersForm.setHeight100();
+ membersForm.setNumCols(3);
+ membersForm.setColWidths("52%", "8%", "40%");
+ layout.addMember(membersForm);
// Add header row.
List<FormItem> items = new ArrayList<FormItem>();
@@ -208,9 +278,8 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
items.add(valueHeader);
// Add data rows.
- final Map<String, PropertySimple> memberProperties = new HashMap<String, PropertySimple>(this.memberConfigurations.size());
final List<FormItem> valueItems = new ArrayList<FormItem>(this.memberConfigurations.size());
- final List<FormItem> unsetItems = new ArrayList<FormItem>(this.memberConfigurations.size());
+ final Map<String, PropertySimple> valueItemNameToPropertySimpleMap = new HashMap<String, PropertySimple>();
for (GroupMemberConfiguration memberConfiguration : this.memberConfigurations) {
String memberName = memberConfiguration.getLabel();
StaticTextItem memberItem = new StaticTextItem();
@@ -219,26 +288,15 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
items.add(memberItem);
Configuration configuration = memberConfiguration.getConfiguration();
PropertySimple memberPropertySimple = getPropertySimple(configuration, propertyDefinitionSimple, index);
- memberProperties.put(memberName, memberPropertySimple);
FormItem valueItem = buildSimpleField(propertyDefinitionSimple, memberPropertySimple);
- valueItem.setAttribute("rhq:property", memberPropertySimple);
valueItems.add(valueItem);
+ valueItemNameToPropertySimpleMap.put(valueItem.getName(), memberPropertySimple);
FormItem unsetItem = buildUnsetItem(propertyDefinitionSimple, memberPropertySimple, valueItem);
items.add(unsetItem);
- unsetItems.add(unsetItem);
items.add(valueItem);
valueItem.setEndRow(true);
}
- form.setItems(items.toArray(new FormItem[items.size()]));
-
- final Window popup = new Window();
- popup.setTitle("Member Values for Property '" + propertyDefinitionSimple.getName());
- popup.setWidth(800);
- popup.setHeight(600);
- popup.setIsModal(true);
- popup.setShowModalMask(true);
- popup.setShowCloseButton(false);
- popup.centerInPage();
+ membersForm.setItems(items.toArray(new FormItem[items.size()]));
final IButton okButton = new IButton("OK");
okButton.disable();
@@ -251,8 +309,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
if ((value != null && !value.equals(firstValue)) || (value == null && firstValue != null)) {
valuesHomogeneous = false;
}
- PropertySimple memberPropertySimple =
- (PropertySimple)valueItem.getAttributeAsObject("rhq:property");
+ PropertySimple memberPropertySimple = valueItemNameToPropertySimpleMap.get(valueItem.getName());
memberPropertySimple.setValue(value);
memberPropertySimple.setErrorMessage(null);
}
@@ -269,8 +326,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
aggregateUnsetItem.setValue(firstValue == null);
- // Set the aggregate value item's value to the homogeneous value, enable it, and make sure it has
- // validators set.
+ // Set the aggregate value item's value to the homogeneous value, unhide it, and enable it.
setValue(aggregateValueItem, firstValue);
aggregateValueItem.show();
aggregateValueItem.setDisabled(false);
@@ -286,18 +342,36 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
aggregateStaticItem.show();
}
- form.markForRedraw();
+ membersForm.markForRedraw();
popup.destroy();
}
});
// Only enable the OK button if all properties are valid.
- form.addItemChangedHandler(new ItemChangedHandler() {
+ membersForm.addItemChangedHandler(new ItemChangedHandler() {
public void onItemChanged(ItemChangedEvent itemChangedEvent) {
- okButton.setDisabled(!form.validate());
+ okButton.setDisabled(!membersForm.validate());
}
});
+ applyButtonItem.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent clickEvent) {
+ Object value = masterValueItem.getValue();
+ for (FormItem valueItem : valueItems) {
+ setValue(valueItem, value);
+
+ FormItem unsetItem = valueItemNameToUnsetItemMap.get(valueItem.getName());
+ if (unsetItem instanceof CheckboxItem) {
+ unsetItem.setValue((value == null));
+ valueItem.setDisabled((value == null));
+ }
+
+ okButton.setDisabled(!membersForm.validate());
+ }
+ }
+ });
+
final IButton cancelButton = new IButton("Cancel");
cancelButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(ClickEvent clickEvent) {
@@ -308,12 +382,11 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
// TODO: Anchor the button bar at the bottom of the modal window, so it's always visible.
HLayout buttons = new HLayout();
buttons.setAlign(Alignment.CENTER);
- buttons.setMembersMargin(10);
+ buttons.setMembersMargin(7);
buttons.setMembers(okButton, cancelButton);
layout.addMember(buttons);
popup.addItem(layout);
-
popup.show();
}
commit 16ff182bc813383485b77bc96312505c74ea37ec
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Oct 20 17:43:44 2010 -0400
no need to store the full resource type in the record
don't allow selections in the grids
refactor out common methods that trigger when edit buttons are pushed
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java
index ec26699..c038076 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java
@@ -141,50 +141,46 @@ public class ResourceTypeTreeNodeBuilder {
public static class ResourceTypeListGridRecord extends ListGridRecord {
- private ResourceType resourceType;
+ private int id;
private ResourceTypeListGridRecord(ResourceTypeTemplateCountComposite composite) {
- this.resourceType = composite.getType();
+ ResourceType resourceType = composite.getType();
+ this.id = resourceType.getId();
- setAttribute(ATTRIB_ID, String.valueOf(resourceType.getId()));
+ setAttribute(ATTRIB_ID, String.valueOf(id));
setAttribute(ATTRIB_NAME, resourceType.getName());
setAttribute(ATTRIB_PLUGIN, resourceType.getPlugin());
- setAttribute(ATTRIB_CATEGORY, resourceType.getCategory().getDisplayName());
+ setAttribute(ATTRIB_CATEGORY, resourceType.getCategory().name());
setAttribute(ATTRIB_ENABLED_ALERT_TEMPLATES, composite.getEnabledAlertCount());
setAttribute(ATTRIB_DISABLED_ALERT_TEMPLATES, composite.getDisabledAlertCount());
setAttribute(ATTRIB_ENABLED_METRIC_TEMPLATES, composite.getEnabledMetricCount());
setAttribute(ATTRIB_DISABLED_METRIC_TEMPLATES, composite.getDisabledMetricCount());
}
- public ResourceType getResourceType() {
- return resourceType;
- }
-
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
- if (!(o instanceof ResourceTypeTreeNode)) {
+ if (!(o instanceof ResourceTypeListGridRecord)) {
return false;
}
- return (this.resourceType.getId() == ((ResourceTypeTreeNode) o).resourceType.getId());
+ return (this.id == ((ResourceTypeListGridRecord) o).id);
}
@Override
public int hashCode() {
- return 31 * resourceType.getId();
+ return 31 * id;
}
}
public static class ResourceTypeTreeNode extends TreeNode {
- private ResourceType resourceType;
private String id;
private String parentId;
private ResourceTypeTreeNode(ResourceTypeTemplateCountComposite composite, String parentId) {
- this.resourceType = composite.getType();
+ ResourceType resourceType = composite.getType();
String id = String.valueOf(resourceType.getId());
setID(id);
@@ -197,7 +193,7 @@ public class ResourceTypeTreeNodeBuilder {
setAttribute(ATTRIB_PARENT_ID, parentId);
setAttribute(ATTRIB_NAME, resourceType.getName());
setAttribute(ATTRIB_PLUGIN, resourceType.getPlugin());
- setAttribute(ATTRIB_CATEGORY, resourceType.getCategory().getDisplayName());
+ setAttribute(ATTRIB_CATEGORY, resourceType.getCategory().name());
setAttribute(ATTRIB_ENABLED_ALERT_TEMPLATES, composite.getEnabledAlertCount());
setAttribute(ATTRIB_DISABLED_ALERT_TEMPLATES, composite.getDisabledAlertCount());
setAttribute(ATTRIB_DISABLED_METRIC_TEMPLATES, composite.getEnabledMetricCount());
@@ -206,10 +202,6 @@ public class ResourceTypeTreeNodeBuilder {
setIsFolder(true);
}
- public ResourceType getResourceType() {
- return resourceType;
- }
-
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
index 6e2047d..ff50be7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
@@ -20,6 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.templates;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
@@ -36,7 +37,7 @@ import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeGridField;
import com.smartgwt.client.widgets.tree.TreeNode;
-import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -80,6 +81,25 @@ public class ResourceTypeTreeView extends LocatableVLayout {
new ResourceTypeTreeNodeBuilder(platformsList, platformServicesList, serversTreeGrid);
}
+ private static void editAlertTemplate(Record record) {
+ SC.say("Alert Template : " //
+ + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME)
+ + "==>"
+ + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN)
+ + "==>"
+ + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
+
+ private static void editMetricTemplate(Record record) {
+ // http://localhost:7080/admin/platform/monitor/Config.do?nomenu=true&mode=c...
+ SC.say("Metric Template: " //
+ + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME)
+ + "==>"
+ + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN)
+ + "==>"
+ + record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
+
public static class CustomResourceTypeListGrid extends LocatableListGrid {
private HLayout rollOverCanvas;
private ListGridRecord rollOverRecord;
@@ -91,6 +111,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
setFixedRecordHeights(false);
setShowRollOverCanvas(true);
setEmptyMessage("Loading...");
+ setSelectionType(SelectionStyle.NONE);
final ListGridField name = new ListGridField(ResourceTypeTreeNodeBuilder.ATTRIB_NAME, "Name");
final ListGridField plugin = new ListGridField(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN, "Plugin");
@@ -147,11 +168,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
metricTemplateImg.setWidth(16);
metricTemplateImg.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- // http://localhost:7080/admin/platform/monitor/Config.do?nomenu=true&mode=c...
- SC.say("Metric Template: "
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ editMetricTemplate(rollOverRecord);
}
});
@@ -166,10 +183,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
alertTemplateImg.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
- SC.say("Alert Template : "
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ editAlertTemplate(rollOverRecord);
}
});
@@ -191,6 +205,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
setFixedRecordHeights(false);
setShowRollOverCanvas(true);
setEmptyMessage("Loading...");
+ setSelectionType(SelectionStyle.NONE);
setAnimateFolders(false);
final TreeGridField name = new TreeGridField(ResourceTypeTreeNodeBuilder.ATTRIB_NAME, "Name");
@@ -245,11 +260,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
metricTemplateImg.setWidth(16);
metricTemplateImg.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- // http://localhost:7080/admin/platform/monitor/Config.do?nomenu=true&mode=c...
- SC.say("Metric Template: "
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ editMetricTemplate(rollOverRecord);
}
});
@@ -264,10 +275,7 @@ public class ResourceTypeTreeView extends LocatableVLayout {
alertTemplateImg.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
- SC.say("Alert Template : "
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
- + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ editAlertTemplate(rollOverRecord);
}
});
@@ -282,10 +290,8 @@ public class ResourceTypeTreeView extends LocatableVLayout {
if (record instanceof TreeNode) {
if (record instanceof ResourceTypeTreeNodeBuilder.ResourceTypeTreeNode) {
- ResourceType resourceType = ((ResourceTypeTreeNodeBuilder.ResourceTypeTreeNode) record)
- .getResourceType();
-
- switch (resourceType.getCategory()) {
+ String c = record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_CATEGORY);
+ switch (ResourceCategory.valueOf(c)) {
case PLATFORM:
return "types/Platform_up_16.png";
case SERVER:
commit a0388ba94ee654ee2dbe79a4c47a12ae9941577f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Oct 20 16:50:20 2010 -0400
the new gwt "templates" admin page. the "edit alert template" and "edit metric template" rollover buttons don't do anything real yet - just pops up a debug window for now
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index add1a53..e20572f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@ -92,16 +92,18 @@ import org.rhq.core.domain.util.Summary;
@NamedQuery(name = ResourceType.FIND_CHILDREN_BY_PARENT, query = "SELECT DISTINCT rt FROM ResourceType AS rt "
+ "JOIN FETCH rt.parentResourceTypes AS pa " + // also fetch parents, as we need them later
"WHERE pa IN (:resourceType)"),
+ // template count composites need the parent types fetched; however, because of a quirk in hibernate,
+ // we can't use the template component constructor in the select, we'll build the composites in our code
@NamedQuery(name = ResourceType.FIND_ALL_TEMPLATE_COUNT_COMPOSITES, query = "" //
- + "SELECT new org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite" //
- + "(" //
+ // + "SELECT new org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite (" //
+ + "SELECT " //
+ " rt," //
+ " (SELECT COUNT(md) FROM MeasurementDefinition AS md WHERE md.resourceType = rt AND md.defaultOn = TRUE), "//
+ " (SELECT COUNT(md) FROM MeasurementDefinition AS md WHERE md.resourceType = rt AND md.defaultOn = FALSE), "//
+ " (SELECT COUNT(ad) FROM AlertDefinition AS ad WHERE ad.resourceType = rt AND ad.deleted = FALSE AND ad.enabled = TRUE), "//
+ " (SELECT COUNT(ad) FROM AlertDefinition AS ad WHERE ad.resourceType = rt AND ad.deleted = FALSE AND ad.enabled = FALSE) "//
- + ")" //
- + "FROM ResourceType AS rt"),
+ // + ")" //
+ + "FROM ResourceType AS rt LEFT JOIN FETCH rt.parentResourceTypes p"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_CATEGORY, query = "SELECT rt FROM ResourceType AS rt "
+ "WHERE rt.category = :category"),
@NamedQuery(name = ResourceType.QUERY_FIND_UTILIZED_BY_CATEGORY, query = "SELECT DISTINCT res.resourceType "
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceTypeTemplateCountComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceTypeTemplateCountComposite.java
index b2a906f..990acde 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceTypeTemplateCountComposite.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceTypeTemplateCountComposite.java
@@ -31,13 +31,17 @@ public class ResourceTypeTemplateCountComposite implements Serializable, Compara
private static final long serialVersionUID = 1L;
- private final ResourceType type;
- private final long enabledMetricCount;
- private final long disabledMetricCount;
- private final long enabledAlertCount;
- private final long disabledAlertCount;
+ private ResourceType type;
+ private long enabledMetricCount;
+ private long disabledMetricCount;
+ private long enabledAlertCount;
+ private long disabledAlertCount;
private String pluginInfo;
+ // no arg constructor required by gwt
+ protected ResourceTypeTemplateCountComposite() {
+ }
+
public ResourceTypeTemplateCountComposite(ResourceType type, long enabledMetricCount, long disabledMetricCount,
long enabledAlertCount, long disabledAlertCount) {
super();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 8c82506..614ac1e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -39,6 +39,7 @@ import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.admin.agent.install.RemoteAgentInstallView;
import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesView;
+import org.rhq.enterprise.gui.coregui.client.admin.templates.ResourceTypeTreeView;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersView;
import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
import org.rhq.enterprise.gui.coregui.client.components.tree.EnhancedTreeNode;
@@ -246,7 +247,7 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
if (PAGE_SYSTEM_SETTINGS_VIEW_ID.equals(pageName)) {
url = "/admin/config/Config.do?mode=edit";
} else if (PAGE_TEMPLATES_VIEW_ID.equals(pageName)) {
- url = "/admin/config/EditDefaults.do?mode=monitor&viewMode=all";
+ content = new ResourceTypeTreeView(this.extendLocatorId("Templates"));
} else if (PAGE_DOWNLOADS_VIEW_ID.equals(pageName)) {
url = "/rhq/admin/downloads-body.xhtml";
} else if (PAGE_LICENSE_VIEW_ID.equals(pageName)) {
@@ -254,8 +255,10 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
} else if (PAGE_PLUGINS_VIEW_ID.equals(pageName)) {
url = "/rhq/admin/plugin/plugin-list-plain.xhtml";
}
- url = addQueryStringParam(url, "nomenu=true");
- content = new FullHTMLPane(url);
+ if (url != null) {
+ url = addQueryStringParam(url, "nomenu=true");
+ content = new FullHTMLPane(url);
+ }
} else if (SECTION_TOPOLOGY_VIEW_ID.equals(sectionName)) {
String url = null;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java
new file mode 100644
index 0000000..ec26699
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java
@@ -0,0 +1,241 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.admin.templates;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTServiceAsync;
+
+/**
+ * @author Greg Hinkle
+ * @author John Mazzitelli
+ */
+public class ResourceTypeTreeNodeBuilder {
+
+ public static final String ATTRIB_ID = "id";
+ public static final String ATTRIB_PARENT_ID = "parentId";
+ public static final String ATTRIB_NAME = "name";
+ public static final String ATTRIB_PLUGIN = "plugin";
+ public static final String ATTRIB_CATEGORY = "category";
+ public static final String ATTRIB_ENABLED_METRIC_TEMPLATES = "enabledMetricTemplates";
+ public static final String ATTRIB_DISABLED_METRIC_TEMPLATES = "disabledMetricTemplates";
+ public static final String ATTRIB_ENABLED_ALERT_TEMPLATES = "enabledAlertTemplates";
+ public static final String ATTRIB_DISABLED_ALERT_TEMPLATES = "disabledAlertTemplates";
+
+ public ResourceTypeTreeNodeBuilder(final ListGrid platformsGrid, final ListGrid platformServicesGrid,
+ final TreeGrid serversGrid) {
+ ResourceTypeGWTServiceAsync resourceTypeService = GWTServiceLookup.getResourceTypeGWTService();
+
+ resourceTypeService
+ .getTemplateCountCompositeMap(new AsyncCallback<Map<Integer, ResourceTypeTemplateCountComposite>>() {
+
+ @Override
+ public void onSuccess(Map<Integer, ResourceTypeTemplateCountComposite> result) {
+ HashSet<ResourceTypeListGridRecord> platformsRecords;
+ HashSet<ResourceTypeListGridRecord> platformServicesRecords;
+ HashSet<ResourceTypeTreeNode> treeNodes;
+
+ platformsRecords = new HashSet<ResourceTypeListGridRecord>();
+ platformServicesRecords = new HashSet<ResourceTypeListGridRecord>();
+ treeNodes = new HashSet<ResourceTypeTreeNode>();
+
+ for (ResourceTypeTemplateCountComposite composite : result.values()) {
+ ResourceType type = composite.getType();
+ Set<ResourceType> parentTypes = type.getParentResourceTypes();
+ if (isEmpty(parentTypes)) {
+ if (type.getCategory() == ResourceCategory.PLATFORM) {
+ // no parents but is a platform - these are our main, top-level platforms
+ platformsRecords.add(new ResourceTypeListGridRecord(composite));
+ } else {
+ // no parents but not a platform - these are our top-level servers
+ treeNodes.add(new ResourceTypeTreeNode(composite, type.getPlugin()));
+ }
+ } else {
+ // has parents; if all the direct parents are top level platforms
+ // and the category is service, consider it a "special" platform service
+ boolean isPlatformService = true; // assume its one, unless one of its parents is not a top level platform
+ if (type.getCategory() == ResourceCategory.SERVICE) {
+ for (ResourceType parentType : parentTypes) {
+ // if one of its parents is not a platform or one of its parent has parents itself,
+ // then this is not a platform service
+ if ((parentType.getCategory() != ResourceCategory.PLATFORM)
+ || !isEmpty(parentType.getParentResourceTypes())) {
+ isPlatformService = false;
+ break;
+ }
+ }
+ } else {
+ isPlatformService = false; // can't be a platform service, its not in the SERVICE category
+ }
+
+ if (isPlatformService) {
+ platformServicesRecords.add(new ResourceTypeListGridRecord(composite));
+ } else {
+ // in some cases, a top level server is limited to which platforms it can run on.
+ // therefore, the parents will not be null/empty (as would be the case if the top level
+ // server can run on ALL platforms), but instead it will have the subset of platforms
+ // the type is valid on. But its the same type - so we only want to show it once. Therefore,
+ // once we see a parent that is a top level platform, we don't add the type again for other
+ // top level platforms. That's what gotPlatform boolean tracks.
+ boolean gotPlatform = false;
+ for (ResourceType parentType : type.getParentResourceTypes()) {
+ boolean isPlatform = (parentType.getCategory() == ResourceCategory.PLATFORM && isEmpty(parentType
+ .getParentResourceTypes()));
+ if (!isPlatform || !gotPlatform) {
+ treeNodes.add(new ResourceTypeTreeNode(composite, String.valueOf(parentType
+ .getId())));
+ }
+ if (isPlatform) {
+ gotPlatform = true;
+ }
+ }
+ }
+ }
+ }
+
+ platformsGrid.setData(platformsRecords.toArray(new ListGridRecord[platformsRecords.size()]));
+ platformServicesGrid.setData(platformServicesRecords
+ .toArray(new ListGridRecord[platformServicesRecords.size()]));
+ serversGrid.getTree().linkNodes(treeNodes.toArray(new TreeNode[treeNodes.size()]));
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load resource types", caught);
+ }
+ });
+ }
+
+ private boolean isEmpty(Set<ResourceType> set) {
+ return set == null || set.isEmpty();
+ }
+
+ public static class ResourceTypeListGridRecord extends ListGridRecord {
+
+ private ResourceType resourceType;
+
+ private ResourceTypeListGridRecord(ResourceTypeTemplateCountComposite composite) {
+ this.resourceType = composite.getType();
+
+ setAttribute(ATTRIB_ID, String.valueOf(resourceType.getId()));
+ setAttribute(ATTRIB_NAME, resourceType.getName());
+ setAttribute(ATTRIB_PLUGIN, resourceType.getPlugin());
+ setAttribute(ATTRIB_CATEGORY, resourceType.getCategory().getDisplayName());
+ setAttribute(ATTRIB_ENABLED_ALERT_TEMPLATES, composite.getEnabledAlertCount());
+ setAttribute(ATTRIB_DISABLED_ALERT_TEMPLATES, composite.getDisabledAlertCount());
+ setAttribute(ATTRIB_ENABLED_METRIC_TEMPLATES, composite.getEnabledMetricCount());
+ setAttribute(ATTRIB_DISABLED_METRIC_TEMPLATES, composite.getDisabledMetricCount());
+ }
+
+ public ResourceType getResourceType() {
+ return resourceType;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof ResourceTypeTreeNode)) {
+ return false;
+ }
+ return (this.resourceType.getId() == ((ResourceTypeTreeNode) o).resourceType.getId());
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * resourceType.getId();
+ }
+ }
+
+ public static class ResourceTypeTreeNode extends TreeNode {
+
+ private ResourceType resourceType;
+ private String id;
+ private String parentId;
+
+ private ResourceTypeTreeNode(ResourceTypeTemplateCountComposite composite, String parentId) {
+ this.resourceType = composite.getType();
+
+ String id = String.valueOf(resourceType.getId());
+ setID(id);
+ this.id = id;
+
+ setParentID(parentId);
+ this.parentId = parentId;
+
+ setAttribute(ATTRIB_ID, id);
+ setAttribute(ATTRIB_PARENT_ID, parentId);
+ setAttribute(ATTRIB_NAME, resourceType.getName());
+ setAttribute(ATTRIB_PLUGIN, resourceType.getPlugin());
+ setAttribute(ATTRIB_CATEGORY, resourceType.getCategory().getDisplayName());
+ setAttribute(ATTRIB_ENABLED_ALERT_TEMPLATES, composite.getEnabledAlertCount());
+ setAttribute(ATTRIB_DISABLED_ALERT_TEMPLATES, composite.getDisabledAlertCount());
+ setAttribute(ATTRIB_DISABLED_METRIC_TEMPLATES, composite.getEnabledMetricCount());
+ setAttribute(ATTRIB_ENABLED_METRIC_TEMPLATES, composite.getDisabledMetricCount());
+
+ setIsFolder(true);
+ }
+
+ public ResourceType getResourceType() {
+ return resourceType;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof ResourceTypeTreeNode)) {
+ return false;
+ }
+
+ ResourceTypeTreeNode that = (ResourceTypeTreeNode) o;
+
+ if (!this.id.equals(that.id)) {
+ return false;
+ }
+ if (this.parentId == null) {
+ return that.parentId == null;
+ }
+ return this.parentId.equals(that.parentId);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 31;
+ result = result * id.hashCode();
+ result = result + (parentId != null ? parentId.hashCode() : 0);
+ return result;
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
new file mode 100644
index 0000000..6e2047d
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
@@ -0,0 +1,301 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.admin.templates;
+
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.VisibilityMode;
+import com.smartgwt.client.util.SC;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.ImgButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.SectionStack;
+import com.smartgwt.client.widgets.layout.SectionStackSection;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeGridField;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * @author Greg Hinkle
+ * @author John Mazzitelli
+ */
+public class ResourceTypeTreeView extends LocatableVLayout {
+
+ public ResourceTypeTreeView(String locatorId) {
+ super(locatorId);
+
+ setWidth100();
+ setHeight100();
+
+ SectionStack sectionStack = new SectionStack();
+ sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
+
+ ListGrid platformsList = new CustomResourceTypeListGrid(extendLocatorId("platformsList"));
+ SectionStackSection platforms = new SectionStackSection("Platforms");
+ platforms.setExpanded(true);
+ platforms.addItem(platformsList);
+
+ ListGrid platformServicesList = new CustomResourceTypeListGrid(extendLocatorId("platformServicesList"));
+ SectionStackSection platformServices = new SectionStackSection("Platform Services");
+ platformServices.setExpanded(true);
+ platformServices.addItem(platformServicesList);
+
+ TreeGrid serversTreeGrid = new CustomResourceTypeTreeGrid(extendLocatorId("serversTree"));
+ SectionStackSection servers = new SectionStackSection("Servers");
+ servers.setExpanded(true);
+ servers.addItem(serversTreeGrid);
+
+ sectionStack.addSection(platforms);
+ sectionStack.addSection(platformServices);
+ sectionStack.addSection(servers);
+
+ addMember(sectionStack);
+
+ new ResourceTypeTreeNodeBuilder(platformsList, platformServicesList, serversTreeGrid);
+ }
+
+ public static class CustomResourceTypeListGrid extends LocatableListGrid {
+ private HLayout rollOverCanvas;
+ private ListGridRecord rollOverRecord;
+
+ public CustomResourceTypeListGrid(String locatorId) {
+ super(locatorId);
+
+ setWrapCells(true);
+ setFixedRecordHeights(false);
+ setShowRollOverCanvas(true);
+ setEmptyMessage("Loading...");
+
+ final ListGridField name = new ListGridField(ResourceTypeTreeNodeBuilder.ATTRIB_NAME, "Name");
+ final ListGridField plugin = new ListGridField(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN, "Plugin");
+ final ListGridField category = new ListGridField(ResourceTypeTreeNodeBuilder.ATTRIB_CATEGORY, "Category");
+ final ListGridField enabledAlertTemplates = new ListGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_ENABLED_ALERT_TEMPLATES, "Enabled Alert Templates");
+ final ListGridField disabledAlertTemplates = new ListGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_DISABLED_ALERT_TEMPLATES, "Disabled Alert Templates");
+ final ListGridField enabledMetricTemplates = new ListGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_ENABLED_METRIC_TEMPLATES, "Enabled Metric Templates");
+ final ListGridField disabledMetricTemplates = new ListGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_DISABLED_METRIC_TEMPLATES, "Disabled Metric Templates");
+
+ plugin.setHidden(true);
+ category.setHidden(true);
+
+ name.setWidth("40%");
+ plugin.setWidth("10%");
+ category.setWidth("10%");
+ enabledAlertTemplates.setWidth("10%");
+ disabledAlertTemplates.setWidth("10%");
+ enabledMetricTemplates.setWidth("10%");
+ disabledMetricTemplates.setWidth("10%");
+
+ enabledAlertTemplates.setPrompt("Number of alert templates that are enabled on this resource type");
+ disabledAlertTemplates
+ .setPrompt("Number of alert templates that are created but disabled on this resource type");
+ enabledMetricTemplates
+ .setPrompt("Number of metric schedules that are enabled by default on this resource type");
+ disabledMetricTemplates
+ .setPrompt("Number of metric schedules that are disabled by default on this resource type");
+
+ setFields(name, plugin, category, enabledAlertTemplates, disabledAlertTemplates, enabledMetricTemplates,
+ disabledMetricTemplates);
+ }
+
+ @Override
+ protected Canvas getRollOverCanvas(Integer rowNum, Integer colNum) {
+ rollOverRecord = this.getRecord(rowNum);
+
+ if (rollOverCanvas == null) {
+ rollOverCanvas = new HLayout(3);
+ rollOverCanvas.setSnapTo("TR");
+ rollOverCanvas.setWidth(50);
+ rollOverCanvas.setHeight(22);
+
+ ImgButton metricTemplateImg = new ImgButton();
+ metricTemplateImg.setShowDown(false);
+ metricTemplateImg.setShowRollOver(false);
+ metricTemplateImg.setLayoutAlign(Alignment.CENTER);
+ metricTemplateImg.setSrc("subsystems/monitor/Edit_Metric.png");
+ metricTemplateImg.setPrompt("Edit Metric Template");
+ metricTemplateImg.setHeight(16);
+ metricTemplateImg.setWidth(16);
+ metricTemplateImg.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ // http://localhost:7080/admin/platform/monitor/Config.do?nomenu=true&mode=c...
+ SC.say("Metric Template: "
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
+ });
+
+ ImgButton alertTemplateImg = new ImgButton();
+ alertTemplateImg.setShowDown(false);
+ alertTemplateImg.setShowRollOver(false);
+ alertTemplateImg.setLayoutAlign(Alignment.CENTER);
+ alertTemplateImg.setSrc("subsystems/alert/Edit_Alert.png");
+ alertTemplateImg.setPrompt("Edit Alert Template");
+ alertTemplateImg.setHeight(16);
+ alertTemplateImg.setWidth(16);
+ alertTemplateImg.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ SC.say("Alert Template : "
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
+ });
+
+ rollOverCanvas.addMember(metricTemplateImg);
+ rollOverCanvas.addMember(alertTemplateImg);
+ }
+ return rollOverCanvas;
+ }
+ }
+
+ public static class CustomResourceTypeTreeGrid extends LocatableTreeGrid {
+ private HLayout rollOverCanvas;
+ private ListGridRecord rollOverRecord;
+
+ public CustomResourceTypeTreeGrid(String locatorId) {
+ super(locatorId);
+
+ setWrapCells(true);
+ setFixedRecordHeights(false);
+ setShowRollOverCanvas(true);
+ setEmptyMessage("Loading...");
+ setAnimateFolders(false);
+
+ final TreeGridField name = new TreeGridField(ResourceTypeTreeNodeBuilder.ATTRIB_NAME, "Name");
+ final TreeGridField plugin = new TreeGridField(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN, "Plugin");
+ final TreeGridField category = new TreeGridField(ResourceTypeTreeNodeBuilder.ATTRIB_CATEGORY, "Category");
+ final TreeGridField enabledAlertTemplates = new TreeGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_ENABLED_ALERT_TEMPLATES, "Enabled Alert Templates");
+ final TreeGridField disabledAlertTemplates = new TreeGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_DISABLED_ALERT_TEMPLATES, "Disabled Alert Templates");
+ final TreeGridField enabledMetricTemplates = new TreeGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_ENABLED_METRIC_TEMPLATES, "Enabled Metric Templates");
+ final TreeGridField disabledMetricTemplates = new TreeGridField(
+ ResourceTypeTreeNodeBuilder.ATTRIB_DISABLED_METRIC_TEMPLATES, "Disabled Metric Templates");
+
+ name.setWidth("40%");
+ plugin.setWidth("10%");
+ category.setWidth("10%");
+ enabledAlertTemplates.setWidth("10%");
+ disabledAlertTemplates.setWidth("10%");
+ enabledMetricTemplates.setWidth("10%");
+ disabledMetricTemplates.setWidth("10%");
+
+ enabledAlertTemplates.setPrompt("Number of alert templates that are enabled on this resource type");
+ disabledAlertTemplates
+ .setPrompt("Number of alert templates that are created but disabled on this resource type");
+ enabledMetricTemplates
+ .setPrompt("Number of metric schedules that are enabled by default on this resource type");
+ disabledMetricTemplates
+ .setPrompt("Number of metric schedules that are disabled by default on this resource type");
+
+ setFields(name, plugin, category, enabledAlertTemplates, disabledAlertTemplates, enabledMetricTemplates,
+ disabledMetricTemplates);
+ }
+
+ @Override
+ protected Canvas getRollOverCanvas(Integer rowNum, Integer colNum) {
+ rollOverRecord = this.getRecord(rowNum);
+
+ if (rollOverCanvas == null) {
+ rollOverCanvas = new HLayout(3);
+ rollOverCanvas.setSnapTo("TR");
+ rollOverCanvas.setWidth(50);
+ rollOverCanvas.setHeight(22);
+
+ ImgButton metricTemplateImg = new ImgButton();
+ metricTemplateImg.setShowDown(false);
+ metricTemplateImg.setShowRollOver(false);
+ metricTemplateImg.setLayoutAlign(Alignment.CENTER);
+ metricTemplateImg.setSrc("subsystems/monitor/Edit_Metric.png");
+ metricTemplateImg.setPrompt("Edit Metric Template");
+ metricTemplateImg.setHeight(16);
+ metricTemplateImg.setWidth(16);
+ metricTemplateImg.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ // http://localhost:7080/admin/platform/monitor/Config.do?nomenu=true&mode=c...
+ SC.say("Metric Template: "
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
+ });
+
+ ImgButton alertTemplateImg = new ImgButton();
+ alertTemplateImg.setShowDown(false);
+ alertTemplateImg.setShowRollOver(false);
+ alertTemplateImg.setLayoutAlign(Alignment.CENTER);
+ alertTemplateImg.setSrc("subsystems/alert/Edit_Alert.png");
+ alertTemplateImg.setPrompt("Edit Alert Template");
+ alertTemplateImg.setHeight(16);
+ alertTemplateImg.setWidth(16);
+ alertTemplateImg.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ SC.say("Alert Template : "
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_NAME) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_PLUGIN) + "==>"
+ + rollOverRecord.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_ID));
+ }
+ });
+
+ rollOverCanvas.addMember(metricTemplateImg);
+ rollOverCanvas.addMember(alertTemplateImg);
+ }
+ return rollOverCanvas;
+ }
+
+ @Override
+ protected String getIcon(Record record, boolean defaultState) {
+
+ if (record instanceof TreeNode) {
+ if (record instanceof ResourceTypeTreeNodeBuilder.ResourceTypeTreeNode) {
+ ResourceType resourceType = ((ResourceTypeTreeNodeBuilder.ResourceTypeTreeNode) record)
+ .getResourceType();
+
+ switch (resourceType.getCategory()) {
+ case PLATFORM:
+ return "types/Platform_up_16.png";
+ case SERVER:
+ return "types/Server_up_16.png";
+ case SERVICE:
+ return "types/Service_up_16.png";
+ }
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceTypeGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceTypeGWTService.java
index e2eeb96..9d4e471 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceTypeGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceTypeGWTService.java
@@ -2,12 +2,14 @@ package org.rhq.enterprise.gui.coregui.client.gwt;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Map;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite;
import org.rhq.core.domain.util.PageList;
@RemoteServiceRelativePath("ResourceTypeGWTService")
@@ -20,4 +22,6 @@ public interface ResourceTypeGWTService extends RemoteService {
ArrayList<ResourceType> getAllResourceTypeAncestors(int resourceTypeId);
HashMap<Integer, String> getResourceTypeDescendantsWithOperations(int resourceTypeId);
+
+ Map<Integer, ResourceTypeTemplateCountComposite> getTemplateCountCompositeMap();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceTypeGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceTypeGWTServiceImpl.java
index be25a0b..5cffd24 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceTypeGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceTypeGWTServiceImpl.java
@@ -3,10 +3,12 @@ package org.rhq.enterprise.gui.coregui.server.gwt;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.ResourceLineageComposite;
+import org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTService;
@@ -72,4 +74,15 @@ public class ResourceTypeGWTServiceImpl extends AbstractGWTServiceImpl implement
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
+
+ @Override
+ public Map<Integer, ResourceTypeTemplateCountComposite> getTemplateCountCompositeMap() {
+ try {
+ ResourceTypeManagerLocal typeManager = LookupUtil.getResourceTypeManager();
+ Map<Integer, ResourceTypeTemplateCountComposite> map = typeManager.getTemplateCountCompositeMap();
+ return SerialUtility.prepare(map, "ResourceTypes.getTemplateCountCompositeMap");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/alert/Edit_Alert.png b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/alert/Edit_Alert.png
new file mode 100644
index 0000000..cecb563
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/alert/Edit_Alert.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/monitor/Edit_Metric.png b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/monitor/Edit_Metric.png
new file mode 100644
index 0000000..6e3de53
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/monitor/Edit_Metric.png differ
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
index 1837023..034cd6e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
@@ -394,12 +394,45 @@ public class ResourceTypeManagerBean implements ResourceTypeManagerLocal, Resour
@SuppressWarnings("unchecked")
public Map<Integer, ResourceTypeTemplateCountComposite> getTemplateCountCompositeMap() {
Query templateCountQuery = entityManager.createNamedQuery(ResourceType.FIND_ALL_TEMPLATE_COUNT_COMPOSITES);
- List<ResourceTypeTemplateCountComposite> composites = templateCountQuery.getResultList();
+ // the weirdness here is because we needed to JOIN FETCH the parent types, but hibernate bombs when you do that
+ // and try to use a composite constructor in the query itself. We need to build the composites here.
+ // Our results will be a list of arrays that we'll build into the composite below
+ List<?> results = templateCountQuery.getResultList();
+
+ // we don't need to send all the data in resource types over the wire, so we'll be scrubbing the types
+ // to avoid the scrubbed types getting persisted back to the db, let's clear the persistence context
+ entityManager.clear();
Map<Integer, ResourceTypeTemplateCountComposite> compositeMap = new HashMap<Integer, ResourceTypeTemplateCountComposite>();
- for (ResourceTypeTemplateCountComposite next : composites) {
- compositeMap.put(next.getType().getId(), next);
+ for (Object result : results) {
+ Object[] array = (Object[]) result;
+
+ ResourceType type = (ResourceType) array[0];
+
+ // scrub it to avoid sending data over the wire we don't need
+ // some of these are eagerly loaded, but my paranoia says assume everything is eagerly loaded to purge it all
+ type.setBundleType(null);
+ type.setChildResourceTypes(null);
+ type.setChildSubCategories(null);
+ type.setClassLoaderType(null);
+ type.setEventDefinitions(null);
+ type.setMetricDefinitions(null);
+ type.setOperationDefinitions(null);
+ type.setPackageTypes(null);
+ type.setPluginConfigurationDefinition(null);
+ type.setProcessScans(null);
+ type.setProductVersions(null);
+ type.setResourceConfigurationDefinition(null);
+ type.setResourceGroups(null);
+ type.setResources(null);
+ type.setSubCategory(null);
+
+ ResourceTypeTemplateCountComposite composite = new ResourceTypeTemplateCountComposite(type,
+ ((Number) array[1]).longValue(), ((Number) array[2]).longValue(), ((Number) array[3]).longValue(),
+ ((Number) array[4]).longValue());
+ compositeMap.put(composite.getType().getId(), composite);
}
+
return compositeMap;
}
commit ae8dfb3eaa8512174d536795aa3f17f5ba2e444b
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Oct 20 15:05:40 2010 -0400
fix a bug i introduced earlier today that was causing the group list views to fail to display; make titles of group list views prettier (separate words rather than camel case)
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 e198fc0..4583a4a 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
@@ -89,7 +89,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
if (isAggregateProperty(propertySimple)) {
// Create the "MEMBER VALUES DIFFER" label that is displayed when member values are heterogeneous.
final StaticTextItem staticItem = new StaticTextItem();
- staticItem.setValue("MEMBER VALUES DIFFER");
+ staticItem.setValue("member values differ");
staticItem.setTextBoxStyle("InlineNote");
staticItem.setShowTitle(false);
staticItem.setTooltip("Member values differ - click icon to edit them.");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
index bdb1160..92fc25d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
@@ -166,7 +166,7 @@ public class GWTServiceLookup {
String sessionId = UserSessionManager.getSessionId();
if (sessionId != null) {
- Log.info("SessionRpcRequestBuilder is adding sessionId to request: " + sessionId);
+ Log.debug("SessionRpcRequestBuilder is adding sessionId to request: " + sessionId);
rb.setHeader(UserSessionManager.SESSION_NAME, sessionId);
} else {
Log.error("SessionRpcRequestBuilder constructed without a value for " + UserSessionManager.SESSION_NAME);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
index 2b5097f..b2fea0a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
@@ -157,7 +157,7 @@ public class ResourceGroupCompositeDataSource extends RPCDataSource<ResourceGrou
record.setAttribute("id", from.getResourceGroup().getId());
record.setAttribute("name", from.getResourceGroup().getName());
record.setAttribute("description", from.getResourceGroup().getDescription());
- record.setAttribute("category", from.getResourceGroup().getGroupCategory());
+ record.setAttribute("category", from.getResourceGroup().getGroupCategory().name());
record.setAttribute("explicitUp", String.valueOf(from.getExplicitUp()));
record.setAttribute("explicitDown", String.valueOf(from.getExplicitDown()));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
index 6aa4e65..32aabb0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
@@ -26,6 +26,7 @@ import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
@@ -65,8 +66,10 @@ public class ResourceGroupListView extends Table {
protected void configureTable() {
ListGridField nameField = new ListGridField("name", "Name", 300);
nameField.setCellFormatter(new CellFormatter() {
- public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
- return "<a href=\"#ResourceGroup/" + listGridRecord.getAttribute("id") + "\">" + o + "</a>";
+ public String format(Object value, ListGridRecord record, int i, int i1) {
+ String groupId = record.getAttribute("id");
+ String groupUrl = LinkManager.getResourceGroupLink(Integer.valueOf(groupId));
+ return "<a href=\"" + groupUrl + "\">" + value + "</a>";
}
});
@@ -79,12 +82,12 @@ public class ResourceGroupListView extends Table {
availabilityChildrenField.setWrap(false);
availabilityChildrenField.setAlign(Alignment.CENTER);
- ListGridField availabilityDescendentsField = new ListGridField("availabilityDescendents", "Descendents", 100);
- availabilityDescendentsField.setWrap(false);
- availabilityDescendentsField.setAlign(Alignment.CENTER);
+ ListGridField availabilityDescendantsField = new ListGridField("availabilityDescendents", "Descendants", 100);
+ availabilityDescendantsField.setWrap(false);
+ availabilityDescendantsField.setAlign(Alignment.CENTER);
getListGrid().setFields(nameField, descriptionField, typeNameField, pluginNameField, categoryField,
- availabilityChildrenField, availabilityDescendentsField);
+ availabilityChildrenField, availabilityDescendantsField);
addTableAction(extendLocatorId("Delete"), "Delete", Table.SelectionEnablement.ANY,
"Delete the selected resource groups?", new TableAction() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
index e0778bb..3f6e197 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
@@ -152,7 +152,7 @@ public class ResourceGroupsDataSource extends RPCDataSource<ResourceGroup> {
record.setAttribute("id", from.getId());
record.setAttribute("name", from.getName());
record.setAttribute("description", from.getDescription());
- record.setAttribute("category", from.getGroupCategory());
+ record.setAttribute("category", from.getGroupCategory().name());
if (from.getResourceType() != null) {
record.setAttribute("resourceType", from.getResourceType());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
index fcef030..dee71d2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
@@ -266,19 +266,19 @@ public class InventoryView extends LocatableHLayout implements BookmarkableView
} else if (GROUPS_SECTION_VIEW_ID.equals(sectionName)) {
if (PAGE_COMPATIBLE_GROUPS.equals(pageName)) {
content = new ResourceGroupListView(extendLocatorId("Compatible"), new Criteria("category",
- GroupCategory.COMPATIBLE.name()), PAGE_COMPATIBLE_GROUPS, "types/Cluster_up_24.png");
+ GroupCategory.COMPATIBLE.name()), "Compatible Groups", "types/Cluster_up_24.png");
} else if (PAGE_MIXED_GROUPS.equals(pageName)) {
content = new ResourceGroupListView(extendLocatorId("Mixed"), new Criteria("category",
- GroupCategory.MIXED.name()), PAGE_MIXED_GROUPS, "types/Group_up_24.png");
+ GroupCategory.MIXED.name()), "Mixed Groups", "types/Group_up_24.png");
} else if (PAGE_GROUP_DEFINITIONS.equals(pageName)) {
content = new GroupDefinitionListView(extendLocatorId("Definitions"), "types/GroupDefinition_16.png");
} else if (PAGE_PROBLEM_GROUPS.equals(pageName)) {
//TODO - there is no underlying support for this criteria. Also, there should not be an active
// new button on this page.
content = new ResourceGroupListView(extendLocatorId("DownGroups"),
- new Criteria("availability", "down"), PAGE_PROBLEM_GROUPS, "types/Cluster_down_16.png");
+ new Criteria("availability", "down"), "Problem Groups", "types/Cluster_down_16.png");
} else { // selected the Inventory node itself
- content = new ResourceGroupListView(extendLocatorId("AllGroups"), null, PAGE_GROUPS,
+ content = new ResourceGroupListView(extendLocatorId("AllGroups"), null, "All Groups",
"types/Cluster_up_24.png", "types/Group_up_24.png");
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
index d60a616..0c5c221 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
+++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
@@ -387,7 +387,7 @@ a:hover {
}
.InlineNote {
- color: #511;
+ color: #C22;
}
.log-panel {
13 years, 7 months
[rhq] Branch 'gwt-ldap' - modules/enterprise
by Simeon Pinder
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java | 6 +++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java | 5 +++++
2 files changed, 10 insertions(+), 1 deletion(-)
New commits:
commit 3e7508545cefc67b88e4ed02945d9ec000c94d80
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Oct 25 18:51:40 2010 -0400
Cookie cleanup.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index 813e9fc..c301bd3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
@@ -95,7 +95,7 @@ public class LoginView extends Canvas {
private TextItem department;
private static final String FIRST = "first";
private static final String LAST = "last";
- private static final String USERNAME = "ldap.username";
+ static final String USERNAME = "ldap.username";
private static final String EMAIL = "email";
private static final String PHONE = "phone";
private static final String DEPARTMENT = "department";
@@ -349,6 +349,10 @@ public class LoginView extends Canvas {
public void onClick(ClickEvent event) {
UserSessionManager.logout();
resetLogin();
+ //wipe all cookies.
+ Cookies.removeCookie("username");
+ Cookies.removeCookie(LoginView.PASSWORD);
+ Cookies.removeCookie(LoginView.USERNAME);
return;
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index 1b47e02..9356370 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -259,6 +259,7 @@ public class UserSessionManager {
//clean out cookies if actually logged out.
Cookies.removeCookie("username");
Cookies.removeCookie(LoginView.PASSWORD);
+ Cookies.removeCookie(LoginView.USERNAME);
new LoginView().showLoginDialog();
}
}
@@ -341,6 +342,10 @@ public class UserSessionManager {
sessionState = State.IS_LOGGED_OUT;
Log.info("Destroying session timer...");
sessionTimer.cancel();
+ //wipe all cookies.
+ Cookies.removeCookie("username");
+ Cookies.removeCookie(LoginView.PASSWORD);
+ Cookies.removeCookie(LoginView.USERNAME);
// log out the web session on the server-side in a delayed fashion,
// allowing enough time to pass to let in-flight requests complete
13 years, 7 months
[rhq] 2 commits - modules/enterprise
by Joseph Marques
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 10 +---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java | 21 ++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java | 24 +---------
3 files changed, 26 insertions(+), 29 deletions(-)
New commits:
commit 6f81d33409dd1c2098ffc7ee7e35ee824d1a2026
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Oct 25 19:11:04 2010 -0400
favor direct attribute access instead of multiple maps to lookup icon/style
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
index a9e94c2..81f9882 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java
@@ -38,7 +38,26 @@ public class Message {
// TODO: Add Debug severity?
public enum Severity {
- Info, Warning, Error, Fatal
+ Info("InfoBlock", "info/icn_info_blue.png"), //
+ Warning("WarnBlock", "info/icn_info_orange.png"), //
+ Error("ErrorBlock", "info/icn_info_red.png"), //
+ Fatal("FatalBlock", "info/icn_info_red.png");
+
+ private String style;
+ private String icon;
+
+ private Severity(String style, String icon) {
+ this.style = style;
+ this.icon = icon;
+ }
+
+ public String getStyle() {
+ return style;
+ }
+
+ public String getIcon() {
+ return icon;
+ }
};
public enum Option {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
index 04fceff..1f95a24 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
@@ -19,9 +19,6 @@
*/
package org.rhq.enterprise.gui.coregui.client.util.message;
-import java.util.HashMap;
-import java.util.Map;
-
import com.google.gwt.user.client.Timer;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
@@ -40,21 +37,6 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
private static final String LOCATOR_ID = "MessageBar";
private static final int AUTO_HIDE_DELAY_MILLIS = 15000; // 15 seconds
- private static final Map<Message.Severity, String> SEVERITY_TO_STYLE_NAME_MAP = new HashMap<Message.Severity, String>();
- static {
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Info, "InfoBlock");
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Warning, "WarnBlock");
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Error, "ErrorBlock");
- SEVERITY_TO_STYLE_NAME_MAP.put(Message.Severity.Fatal, "FatalBlock");
- }
-
- private static final Map<Message.Severity, String> SEVERITY_TO_ICON_MAP = new HashMap<Message.Severity, String>();
- static {
- SEVERITY_TO_ICON_MAP.put(Message.Severity.Info, "info/icn_info_blue.png");
- SEVERITY_TO_ICON_MAP.put(Message.Severity.Warning, "info/icn_info_orange.png");
- SEVERITY_TO_ICON_MAP.put(Message.Severity.Error, "info/icn_info_red.png");
- }
-
private Label label;
private Message stickyMessage;
@@ -89,7 +71,7 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
} else {
Timer hideTimer = new Timer() {
@Override
- public void run() {
+ public void run() {
clearMessage(false);
if (stickyMessage != null) {
displayMessage(stickyMessage);
@@ -130,7 +112,7 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
label.setContents(contents);
label.setAlign(Alignment.CENTER);
- String styleName = (contents != null) ? SEVERITY_TO_STYLE_NAME_MAP.get(message.getSeverity()) : null;
+ String styleName = (contents != null) ? message.getSeverity().getStyle() : null;
label.setStyleName(styleName);
label.setWidth(400);
@@ -139,7 +121,7 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
// label.
//label.setShowEdges(true);
- String icon = (contents != null) ? SEVERITY_TO_ICON_MAP.get(message.getSeverity()) : null;
+ String icon = (contents != null) ? message.getSeverity().getIcon() : null;
label.setIcon(icon);
return label;
commit c6879b2c24e72b676ba4a7b512f3a14b988d8801
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Oct 25 19:10:13 2010 -0400
get rid of unused method
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
index d61a308..a129b24 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
@@ -122,8 +122,8 @@ public abstract class RPCDataSource<T> extends DataSource {
if (request.getStartRow() == null || request.getEndRow() == null) {
pageControl = new PageControl();
} else {
- pageControl = PageControl.getExplicitPageControl(request.getStartRow(), request.getEndRow()
- - request.getStartRow());
+ pageControl = PageControl.getExplicitPageControl(request.getStartRow(),
+ request.getEndRow() - request.getStartRow());
}
// Initialize sorting.
@@ -260,12 +260,8 @@ public abstract class RPCDataSource<T> extends DataSource {
return newRecord;
}
- public static <S> S[] getArrayFilter(DSRequest request, String paramName, Class<S> type) {
- return getArrayFilter(request, paramName, type, null);
- }
-
@SuppressWarnings("unchecked")
- public static <S> S[] getArrayFilter(DSRequest request, String paramName, Class<S> type, S[] dummy) {
+ public static <S> S[] getArrayFilter(DSRequest request, String paramName, Class<S> type) {
com.allen_sauer.gwt.log.client.Log.debug("Fetching array " + paramName + " (" + type + ")");
Criteria criteria = request.getCriteria();
Map<String, Object> criteriaMap = criteria.getValues();
13 years, 7 months
[rhq] Branch 'gwt-ldap' - 7 commits - modules/enterprise
by Simeon Pinder
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java | 130 ++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java | 213 +++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 70 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java | 218 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java | 23 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java | 26 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java | 163 -------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java | 33 -
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java | 58 --
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/AuthenticateUserAction.java | 44 --
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 100 ++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/LdapLoginModule.java | 43 -
21 files changed, 533 insertions(+), 636 deletions(-)
New commits:
commit f30c1641e3821253a6597f7af3721576a345c05d
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Sun Oct 24 15:34:39 2010 -0400
i)fixes to UserSessionManager and SubjectManagerBean for login process. ii)fixes to LoginView for refresh/F5 registration problems iii)start on returning LdapGroup objects where possible.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
index a5f67c1..98ce5ec 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
@@ -24,7 +24,8 @@
<!-- ============================ gwt-log ============================= -->
<!-- For development, a default of 'DEBUG' is recommended. -->
- <inherits name="com.allen_sauer.gwt.log.gwt-log-DEBUG" />
+ <!-- <inherits name="com.allen_sauer.gwt.log.gwt-log-DEBUG" />-->
+ <inherits name="com.allen_sauer.gwt.log.gwt-log-TRACE" />
<!-- For production, most teams prefer to set the default log level to 'OFF'. -->
<!--<inherits name="com.allen_sauer.gwt.log.gwt-log-OFF" />-->
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index c59ce69..813e9fc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
@@ -100,7 +100,7 @@ public class LoginView extends Canvas {
private static final String PHONE = "phone";
private static final String DEPARTMENT = "department";
private static final String SESSIONID = "ldap.sessionid";
- private static final String PASSWORD = "ldap.password";
+ static final String PASSWORD = "ldap.password";
public void showLoginDialog(String message) {
showLoginDialog();
@@ -190,15 +190,16 @@ public class LoginView extends Canvas {
*/
public void showRegistrationDialog(String user, final String sessionId, final String password,
final AsyncCallback<Subject> callback) {
-
if (!loginShowing) {
- if ((user != null) && (!user.trim().isEmpty())) {
+ //store registration values as cookies for F5 refresh
+ if ((user != null) && (!user.trim().isEmpty()) && (Cookies.getCookie(USERNAME) == null)) {
Cookies.setCookie(USERNAME, user);
+ }
+ if ((password != null) && (!password.trim().isEmpty()) && (Cookies.getCookie(PASSWORD) == null)) {
Cookies.setCookie(PASSWORD, password);
}
- loginShowing = true;
- // forms = new ArrayList<DynamicForm>();
+ loginShowing = true;
form = new DynamicForm();
form.setMargin(25);
@@ -231,7 +232,6 @@ public class LoginView extends Canvas {
username.setDisabled(true);
username.setWidth(fieldWidth);
- //column.addMember(wrapInDynamicForm(6, first, last, username));
}
email = new TextItem(EMAIL, "Email");
email.setRequired(true);
@@ -383,6 +383,7 @@ public class LoginView extends Canvas {
private void resetLogin() {
window.destroy();
loginShowing = false;
+ UserSessionManager.setSessionState(UserSessionManager.State.IS_LOGGED_OUT);
new LoginView().showLoginDialog();
}
@@ -392,7 +393,9 @@ public class LoginView extends Canvas {
* @param callback
*/
protected void registerLdapUser(DynamicForm populatedForm, final AsyncCallback<Subject> callback) {
+
final Subject newSubject = new Subject();
+ newSubject.setId(0);//enforce registration element for LDAP processing
//insert some required data checking
boolean proceed = true;
@@ -438,14 +441,14 @@ public class LoginView extends Canvas {
newSubject.setFsystem(false);
if (proceed) {
- GWTServiceLookup.getLdapService().processSubjectForLdap(newSubject, password, true,
+ Log.trace("New LDAP user registration details valid for user'" + newSubject.getName() + "'.");
+ //proceed with LDAP processing request.
+ GWTServiceLookup.getSubjectService().processSubjectForLdap(newSubject, password,
new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
- Log.debug("Failed to register LDAP subject:" + caught.getMessage());
- //TODO: how/what to display in LoginView when unexpected communication with server occurs?
- // LoginView
- // .displayFormError("UserSessionManager: Unable to check subject for LDAP authorization "
- // + "- check Server status.");
+ Log.debug("Failed to register LDAP subject '" + newSubject.getName() + "' "
+ + caught.getMessage());
+ //TODO: pass in warning message to Login Dialog.
new LoginView().showLoginDialog();
}
@@ -455,6 +458,8 @@ public class LoginView extends Canvas {
CoreGUI.getMessageCenter().notify(
new Message("Succesfully registered the new ldap Subject.", Message.Severity.Info));
Log.trace("Succesfully registered the new ldap Subject.");
+ //clean out password from cookie. No further need.
+ Cookies.removeCookie(PASSWORD);
window.destroy();
loginShowing = false;
callback.onSuccess(checked);
@@ -462,8 +467,11 @@ public class LoginView extends Canvas {
});
} else {//log them out then reload LoginView
- Log.warn("Failed to locate username required to create LDAP subject.");
+ Log.warn("Failed to locate required components to create LDAP subject.");
UserSessionManager.logout();
+ window.destroy();
+ loginShowing = false;
+ //TODO: pass informative message to login.
new LoginView().showLoginDialog();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java
index 0932e6f..d716136 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.gui.coregui.client;
import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.SC;
@@ -46,7 +47,7 @@ public class SearchGUI implements EntryPoint {
return;
}
- UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Subject>() {
+ UserSessionManager.checkLoginStatus(Cookies.getCookie("username"), null, new AsyncCallback<Subject>() {
@Override
public void onFailure(Throwable caught) {
SC.say("Unable to determine login status, check server status");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index d505fd1..1b47e02 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -33,6 +33,8 @@ import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.SubjectCriteria;
+import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
@@ -60,7 +62,7 @@ public class UserSessionManager {
private static Subject sessionSubject;
private static UserPreferences userPreferences;
- private enum State {
+ enum State {
IS_LOGGED_IN, //
IS_REGISTERING, //
IS_LOGGED_OUT;
@@ -135,48 +137,128 @@ public class UserSessionManager {
Log.info("sessionAccess-reschedulingSessionTimeout: " + expiryMillis);
sessionTimer.schedule((int) expiryMillis);
}
+ if (Cookies.getCookie("username") == null) {
+ Cookies.setCookie("username", user);
+ }
// set the session subject, so the fetch to load the configuration works
- Subject subject = new Subject();
+ final Subject subject = new Subject();
subject.setId(subjectId);
subject.setSessionId(Integer.valueOf(sessionId));
sessionSubject = subject;
- subject.setName(user);
- // figure out if ldap auth is used and whether case insenitive ldap auth requests should be handled.
- GWTServiceLookup.getLdapService().processSubjectForLdap(subject, password, false,
- new AsyncCallback<Subject>() {
- public void onFailure(Throwable caught) {
- Log.debug("Failed to load user's subject:" + caught.getMessage());
- //TODO: how/what to display in LoginView when unexpected communication with server occurs?
- // LoginView
- // .displayFormError("UserSessionManager: Unable to check subject for LDAP authorization "
- // + "- check Server status.");
- new LoginView().showLoginDialog();
- }
-
- public void onSuccess(Subject checked) {
- Log.trace("Successfully checked subject '" + checked + "' for LDAP processing.");
- if (checked.getId() > 0) {//subject is already registered.
- sessionState = State.IS_LOGGED_IN;
+ //populate the username for the subject for isUserWithPrincipal check
+ subject.setName(Cookies.getCookie("username"));
+
+ if (subject.getId() == 0) {//either i)ldap new user registration ii)ldap case sensitive match
+ //BZ-586435: insert case insensitivity for usernames with ldap auth
+ // locate first matching subject and attach.
+ SubjectCriteria subjectCriteria = new SubjectCriteria();
+ subjectCriteria.setCaseSensitive(false);
+ subjectCriteria.setStrict(true);
+ subjectCriteria.fetchRoles(false);
+ subjectCriteria.fetchConfiguration(false);
+ subjectCriteria.addFilterName(subject.getName());
+
+ //check for case insensitive matches.
+ GWTServiceLookup.getSubjectService().findSubjectsByCriteria(subjectCriteria,
+ new AsyncCallback<PageList<Subject>>() {
+
+ public void onFailure(Throwable caught) {//none found, launch registration
+ //TODO: log to Login.error
+ Log
+ .warn("There was a problem querying subjects by criteria during loginStatus check."
+ + caught.getMessage());
+ }
+
+ //pipe through method to handle case insensitive
+ public void onSuccess(PageList<Subject> result) {
+ if (result.size() == 0) {//none found, launch registration
+ Log.trace("Proceeding with registration for ldap user '" + user + "'.");
+ sessionState = State.IS_REGISTERING;
+ //no need to store username away in cookie for F5 refresh as registration ui handles.
+ new LoginView().showRegistrationDialog(subject.getName(), sessionId,
+ password, callback);
+ } else {//launch case sensitive code handling
+ Log
+ .trace("Checking login and determined that ldap case insensitive login '"
+ + subject.getName() + "' should be used instead of '" + user + "'");
+ //use the original username to pass session check.
+ subject.setName(user);
+ GWTServiceLookup.getSubjectService().processSubjectForLdap(subject,
+ password, new AsyncCallback<Subject>() {
+ public void onFailure(Throwable caught) {
+ Log.debug("Failed to complete ldap processing for subject:"
+ + caught.getMessage());
+ //TODO: pass message to login dialog.
+ new LoginView().showLoginDialog();
+ }
+
+ public void onSuccess(Subject checked) {
+ Log.trace("Proceeding with registration for ldap user '" + user
+ + "'.");
+ sessionState = State.IS_LOGGED_IN;
+ callback.onSuccess(checked);
+ }
+ });//end processSubjectForLdap
+ }
+ }
+ });//end findSubjectsByCriteria
+
+ } else {//else send through regular session check
+
+ SubjectCriteria criteria = new SubjectCriteria();
+ criteria.fetchConfiguration(true);
+ criteria.addFilterId(subjectId);
+
+ GWTServiceLookup.getSubjectService().findSubjectsByCriteria(criteria,
+ new AsyncCallback<PageList<Subject>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "UserSessionManager: Failed to load user's subject", caught);
+ Log.info("Failed to load user's subject");
+ //TODO: pass message to login ui.
+ new LoginView().showLoginDialog();
+ }
+
+ public void onSuccess(PageList<Subject> result) {
+ final Subject validSessionSubject = result.get(0);
+ //include session for subject session processing with LDAP
+ validSessionSubject.setSessionId(Integer.valueOf(sessionId));
+ Log.trace("Completed session check for subject '" + result + "'.");
+
+ //initiate ldap check for ldap authz update(wrt roles) of subject with silent update
+ GWTServiceLookup.getSubjectService().processSubjectForLdap(validSessionSubject,
+ "", new AsyncCallback<Subject>() {
+ public void onFailure(Throwable caught) {
+ Log.warn("Errors occurred processing subject for LDAP."
+ + caught.getMessage());
+ //TODO: pass informative message to Login UI.
+ }
+
+ public void onSuccess(Subject result) {
+ Log.trace("Succesfully updated authorization for ldap subject '"
+ + validSessionSubject.getName() + "'");
+ }
+ });
+
+ //update the returned subject with current session id
+ validSessionSubject.setSessionId(Integer.valueOf(sessionId));
+
// reset the session subject to the latest, for wrapping in user preferences
- sessionSubject = checked;
- //insert ldap check logic
+ sessionSubject = validSessionSubject;
userPreferences = new UserPreferences(sessionSubject);
refresh();
-
- callback.onSuccess(checked);
-
- Log.trace("Subject registration required:" + needsRegistration);
- } else {//subject requires registration
- Log.trace("Proceeding with registration for ldap user '" + user + "'.");
- sessionState = State.IS_REGISTERING;
- new LoginView().showRegistrationDialog(user, sessionId, password, callback);
+ sessionState = State.IS_LOGGED_IN;
+ callback.onSuccess(validSessionSubject);
}
- }
- });
+ });
+ }
} else {//invalid session. Back to login
sessionState = State.IS_LOGGED_OUT;
+ //clean out cookies if actually logged out.
+ Cookies.removeCookie("username");
+ Cookies.removeCookie(LoginView.PASSWORD);
new LoginView().showLoginDialog();
}
}
@@ -194,7 +276,7 @@ public class UserSessionManager {
}
public static void login() {
- login(null, null);
+ login(Cookies.getCookie("username"), null);
}
/**Same as login, but passes in credentials optionally needed during new LDAP user registration.
@@ -207,9 +289,12 @@ public class UserSessionManager {
public void onSuccess(Subject result) {
// will build UI if necessary, then fires history event
sessionState = State.IS_LOGGED_IN;
- // subject and session has been updated during this login request
- Log.trace("A new subject and session may has been returned. Updating sessionSubject.");
- sessionSubject = result;
+ // subject and session may have been updated during this login request
+ if (sessionSubject.getSessionId() != result.getSessionId()) {//update
+ Log.trace("A new subject and session may has been returned. Updating sessionSubject.");
+ sessionSubject = result;
+ }
+ Cookies.setCookie("username", sessionSubject.getName());
CoreGUI.get().buildCoreUI();
}
@@ -309,4 +394,8 @@ public class UserSessionManager {
public static UserPreferences getUserPreferences() {
return userPreferences;
}
+
+ public static void setSessionState(State newSessionState) {
+ sessionState = newSessionState;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
index 836a355..b40ac2b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.roles;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.History;
@@ -29,6 +30,7 @@ import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
+import com.smartgwt.client.data.RecordList;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.types.Overflow;
@@ -46,6 +48,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.RoleCriteria;
+import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
@@ -170,7 +173,8 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
public void save() {
final HashSet<Integer> groupSelection = this.groupSelector.getSelection();
final HashSet<Integer> userSelection = this.subjectSelector.getSelection();
- final HashSet<String> ldapGroupSelection = this.ldapGroupSelector.getGroupSelection();
+ // final HashSet<String> ldapGroupSelection = this.ldapGroupSelector.getGroupSelection();
+ final HashSet<Integer> ldapGroupSelection = this.ldapGroupSelector.getSelection();
// The form.saveData() call triggers either RolesDataSource.executeAdd() to create the new Role,
// or executeUpdate() if saving changes to an existing Role. On success we need to perform the
@@ -217,7 +221,10 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
}
});
- List<String> selectedGroupList = new ArrayList<String>(ldapGroupSelection);
+ // List<String> selectedGroupList = new ArrayList<String>(ldapGroupSelection);
+ List<String> selectedGroupList = new ArrayList<String>();
+ selectedGroupList = loadLdapGroupSelection(ldapGroupSelection);
+ // List<Integer> selectedGroupList = new ArrayList<Integer>(ldapGroupSelection);
if (!selectedGroupList.isEmpty()) {
GWTServiceLookup.getLdapService().setLdapGroupsForRole(roleId, selectedGroupList,
new AsyncCallback<Void>() {
@@ -235,6 +242,24 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
}
}
+
+ /** Return list of group names from selection indices.
+ *
+ * @param ldapGroupSelection
+ * @return
+ */
+ private List<String> loadLdapGroupSelection(HashSet<Integer> ldapGroupSelection) {
+ List<String> groupNames = new ArrayList<String>();
+ if (ldapGroupSelection != null) {
+ RecordList recordList = ldapGroupSelector.getAssignedGrid().getDataAsRecordList();
+ for (int index : ldapGroupSelection) {
+ Record record = recordList.get(index);
+ String name = record.getAttributeAsString("name");
+ groupNames.add(name);
+ }
+ }
+ return groupNames;
+ }
});
}
@@ -246,7 +271,9 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
.getAttributeAsObject("subjects"));
this.ldapGroupSelector = new RoleLdapGroupSelector(this.extendLocatorId("LdapGroups"), record
.getAttributeAsInt("id"));
-
+ // this.ldapGroupSelector = new RoleLdapGroupSelector(this.extendLocatorId("LdapGroups"), (Set<LdapGroup>) record
+ // .getAttributeAsObject("ldapGroupsAvailable"), (Set<LdapGroup>) record
+ // .getAttributeAsObject("ldapGroupsAssigned"));
this.groupSelectorItem.setCanvas(this.groupSelector);
this.subjectSelectorItem.setCanvas(this.subjectSelector);
@@ -280,7 +307,6 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
}
private void editRole(int roleId, final ViewId current) {
-
final int id = Integer.valueOf(current.getBreadcrumbs().get(0).getName());
if (id > 0) {
@@ -298,12 +324,38 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
@Override
public void onSuccess(PageList<Role> result) {
- Role role = result.get(0);
- Record record = new RolesDataSource().copyValues(role);
- editRecord(record);
+ final Role role = result.get(0);
+ final Record record = new RolesDataSource().copyValues(role);
+ //if ldap configured
+ GWTServiceLookup.getLdapService().checkLdapConfiguredStatus(new AsyncCallback<Boolean>() {
+ public void onSuccess(Boolean result) {
+ //get available ldap groups
+ GWTServiceLookup.getLdapService().findAvailableGroups(
+ new AsyncCallback<Set<Map<String, String>>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to retrieve available LDAP groups.", caught);
+ }
+
+ public void onSuccess(Set<Map<String, String>> availableLdapGroups) {
+ //TODO: get assigned ldap groups
+ Set<LdapGroup> availableGroups = RoleLdapGroupSelector
+ .convertToCollection(availableLdapGroups);
+ //update record with both objects.
+ record.setAttribute("ldapGroupsAvailable", availableGroups);
+ editRecord(record);
+ current.getBreadcrumbs().get(0).setDisplayName("Editing: " + role.getName());
+ CoreGUI.refreshBreadCrumbTrail();
+ }
+ });
+ }
- current.getBreadcrumbs().get(0).setDisplayName("Editing: " + role.getName());
- CoreGUI.refreshBreadCrumbTrail();
+ public void onFailure(Throwable caught) {//ldap not configured, proceed
+ editRecord(record);
+ current.getBreadcrumbs().get(0).setDisplayName("Editing: " + role.getName());
+ CoreGUI.refreshBreadCrumbTrail();
+ }
+ });
}
});
} else {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
index 2443c5b..580da5b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
@@ -42,6 +42,7 @@ import com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
import org.rhq.core.domain.resource.group.LdapGroup;
+import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.selector.AbstractSelector;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
@@ -50,7 +51,8 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
/**
* @author Simeon Pinder
*/
-public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String, String>>> {
+//public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String, String>>> {
+public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>> {
public static final String id = "id";
public static final String name = "name";
public static final String description = "description";
@@ -61,6 +63,15 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
private int currentRole = -1;
private boolean initialLdapSelectionsLoad = true;
+ // public RoleLdapGroupSelector(String locatorId, Set<LdapGroup> available, Set<LdapGroup> assigned) {
+ // super(locatorId);
+ // if (available != null) {
+ // ListGridRecord[] data = (new LdapGroupsDataSource()).buildRecords(available);
+ //// setAssigned(data);
+ //// setA
+ // }
+ // }
+
public RoleLdapGroupSelector(String locatorId, Integer integer) {
super(locatorId);
if (integer != null) {
@@ -74,9 +85,11 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
}
@Override
- protected RPCDataSource<HashSet<Map<String, String>>> getDataSource() {
+ // protected RPCDataSource<HashSet<Map<String, String>>> getDataSource() {
+ protected RPCDataSource<PageList<LdapGroup>> getDataSource() {
if (availableDatasource == null) {
availableDatasource = new LdapGroupsDataSource();
+ Log.debug("++++++++++ RoleLDapGroupSelector.datasourceInit:" + availableDatasource);
//add subsequent listener
int currentRoleId = getCurrentRole();
if (currentRoleId > -1) {
@@ -89,14 +102,16 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
if (currentRoleId > -1) {
if (initialLdapSelectionsLoad) {
GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- new AsyncCallback<Set<Map<String, String>>>() {
+ // new AsyncCallback<Set<Map<String, String>>>() {
+ new AsyncCallback<PageList<LdapGroup>>() {
public void onFailure(Throwable throwable) {
CoreGUI.getErrorHandler().handleError(
"Failed to load LdapGroups available for role.", throwable);
}
- public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
+ // public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
+ public void onSuccess(PageList<LdapGroup> currentlyAssignedLdapGroups) {
//translate groups into records for grid
// response.setData(buildRecords(locatedGroups));
// response.setData(buildAssignedRecords(currentlyAssignedLdapGroups));
@@ -106,9 +121,12 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
RecordList loaded = availableGrid.getDataAsRecordList();
if (loaded != null) {
ArrayList<Integer> located = new ArrayList<Integer>();
- for (Map groupMap : currentlyAssignedLdapGroups) {
- int index = loaded.findIndex(name, (String) groupMap.get(name));
+ // for (Map groupMap : currentlyAssignedLdapGroups) {
+ for (LdapGroup group : currentlyAssignedLdapGroups) {
+ // int index = loaded.findIndex(name, (String) groupMap.get(name));
+ int index = loaded.findIndex(name, (String) group.getName());
if (index > -1) {
+ group.setId(index);//overwrite RHQ Resource ID to match ldap fabricated id.
located.add(Integer.valueOf(index));
}
}
@@ -124,6 +142,15 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
select(assignedGrid.getSelection());
updateButtons();
assignedGrid.deselectAllRecords();
+ // assignedGrid.deselectAllRecords();
+ // assignedGrid.transferSelectedData(availableGrid);
+ // select(assignedGrid.getSelection());
+ // updateButtons();
+ Record rec = assignedGrid.getDataAsRecordList().get(0);
+ // for (String attr : rec.getAttributes()) {
+ // Log.debug("%%%%%%%%%% attribute:" + attr + ":value:"
+ // + rec.getAttribute(attr) + ":");
+ // }
}
}
}
@@ -142,38 +169,39 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
return null; // TODO: Implement this method.
}
- protected void select(ListGridRecord[] records) {
- availableGrid.deselectAllRecords();
- for (ListGridRecord record : records) {
- record.setEnabled(false);
- selection.add(record.getAttributeAsString(name));
- }
- assignedGrid.markForRedraw();
- }
-
- protected void deselect(ListGridRecord[] records) {
- HashSet<String> toRemove = new HashSet<String>();
- for (ListGridRecord record : records) {
- toRemove.add(record.getAttributeAsString(name));
- }
- selection.removeAll(toRemove);
-
- for (String name : toRemove) {
- Record r = availableGrid.getDataAsRecordList().find(name, name);
- if (r != null) {
- ((ListGridRecord) r).setEnabled(true);
- }
- }
- int cnt = 0;
- for (Record lgr : availableGrid.getDataAsRecordList().toArray()) {
- if (lgr.getAttributeAsBoolean("enabled")) {
- cnt++;
- }
- }
- availableGrid.markForRedraw();
- }
-
- public class LdapGroupsDataSource extends RPCDataSource<HashSet<Map<String, String>>> {
+ // protected void select(ListGridRecord[] records) {
+ // availableGrid.deselectAllRecords();
+ // for (ListGridRecord record : records) {
+ // record.setEnabled(false);
+ // selection.add(record.getAttributeAsString(name));
+ // }
+ // assignedGrid.markForRedraw();
+ // }
+ //
+ // protected void deselect(ListGridRecord[] records) {
+ // HashSet<String> toRemove = new HashSet<String>();
+ // for (ListGridRecord record : records) {
+ // toRemove.add(record.getAttributeAsString(name));
+ // }
+ // selection.removeAll(toRemove);
+ //
+ // for (String name : toRemove) {
+ // Record r = availableGrid.getDataAsRecordList().find(name, name);
+ // if (r != null) {
+ // ((ListGridRecord) r).setEnabled(true);
+ // }
+ // }
+ // int cnt = 0;
+ // for (Record lgr : availableGrid.getDataAsRecordList().toArray()) {
+ // if (lgr.getAttributeAsBoolean("enabled")) {
+ // cnt++;
+ // }
+ // }
+ // availableGrid.markForRedraw();
+ // }
+
+ // public class LdapGroupsDataSource extends RPCDataSource<HashSet<Map<String, String>>> {
+ public class LdapGroupsDataSource extends RPCDataSource<PageList<LdapGroup>> {
public static final String LDAP_NOT_CONFIGURED_EMPTY_MESSAGE = "(LDAP not configured. 'Administrator'->System Settings to change)";
public static final String EMPTY_MESSAGE = "No items to show";
@@ -187,7 +215,9 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
setFields(nameField, descriptionField);
}
- public ListGridRecord[] buildRecords(Set<Map<String, String>> locatedGroups) {
+ // public ListGridRecord[] buildRecords(Set<Map<String, String>> locatedGroups) {
+ // public ListGridRecord[] buildRecords(PageList<LdapGroup> locatedGroups) {
+ public ListGridRecord[] buildRecords(Set<LdapGroup> locatedGroups) {
ListGridRecord[] records = new ListGridRecord[0];
int indx = 0;
if ((locatedGroups != null) && (!locatedGroups.isEmpty())) {
@@ -195,18 +225,20 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
records = new ListGridRecord[locatedGroups.size()];
int index = 0;
//for each Map returned then iterate over to retrieve the values
- Iterator<Map<String, String>> iterator = locatedGroups.iterator();
- while (iterator.hasNext()) {
- Map<String, String> group = iterator.next();
+ // Iterator<Map<String, String>> iterator = locatedGroups.iterator();
+ // while (iterator.hasNext()) {
+ for (LdapGroup group : locatedGroups) {
+ // Map<String, String> group = iterator.next();
//iterate over the group data to translate into records
ListGridRecord record = new ListGridRecord();
//load identifier
record.setAttribute(id, index++);
- //load name
- record.setAttribute(name, group.get(name));
+ //load name
+ // record.setAttribute(name, group.get(name));
+ record.setAttribute(name, group.getName());
//load description
- record.setAttribute(description, group.get(description));
-
+ // record.setAttribute(description, group.get(description));
+ record.setAttribute(description, group.getDescription());
records[indx++] = record;
}
@@ -220,12 +252,14 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
}
@Override
- public HashSet<Map<String, String>> copyValues(ListGridRecord from) {
+ // public HashSet<Map<String, String>> copyValues(ListGridRecord from) {
+ public PageList<LdapGroup> copyValues(ListGridRecord from) {
throw new UnsupportedOperationException("Ldap Group data is read only");
}
@Override
- public ListGridRecord copyValues(HashSet<Map<String, String>> from) {
+ // public ListGridRecord copyValues(HashSet<Map<String, String>> from) {
+ public ListGridRecord copyValues(PageList<LdapGroup> from) {
return null;
}
@@ -246,9 +280,13 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
}
public void onSuccess(Set<Map<String, String>> locatedGroups) {
- Log.debug("Successfully located groups.");
+ Log.trace("Successfully located groups.");
+ Log.debug("---------------------------------- Available groups:"
+ + locatedGroups.size());
//translate groups into records for grid
- response.setData(buildRecords(locatedGroups));
+ // response.setData(buildRecords(locatedGroups));
+ // Set<LdapGroup> collection = new HashSet<LdapGroup>();
+ response.setData(buildRecords(convertToCollection(locatedGroups)));
//entry count
if (null != locatedGroups) {
response.setTotalRows(locatedGroups.size());
@@ -258,6 +296,22 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
//pass off for processing
processResponse(request.getRequestId(), response);
}
+
+ // private PageList<LdapGroup> convertToCollection(Set<Map<String, String>> locatedGroups) {
+ // private Set<LdapGroup> convertToCollection(Set<Map<String, String>> locatedGroups) {
+ // Set<LdapGroup> converted = new HashSet<LdapGroup>();
+ // if (locatedGroups != null) {
+ // Iterator<Map<String, String>> iterator = locatedGroups.iterator();
+ // while (iterator.hasNext()) {
+ // Map<String, String> map = iterator.next();
+ // LdapGroup group = new LdapGroup();
+ // group.setDescription(map.get("description"));
+ // group.setName(map.get("name"));
+ // converted.add(group);
+ // }
+ // }
+ // return converted;
+ // }
});
} else {
Log.debug("(LDAP not currently enabled. " + EMPTY_MESSAGE);
@@ -275,26 +329,43 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
}
}
- public HashSet<String> getGroupSelection() {
- RecordList records = assignedGrid.getDataAsRecordList();
- //empty out selection and populate with actual contents
- selection.clear();
- if (!records.isEmpty()) {
- for (Record r : records.toArray()) {
- selection.add(r.getAttributeAsString(name));
+ public static Set<LdapGroup> convertToCollection(Set<Map<String, String>> locatedGroups) {
+ Set<LdapGroup> converted = new HashSet<LdapGroup>();
+ if (locatedGroups != null) {
+ Iterator<Map<String, String>> iterator = locatedGroups.iterator();
+ int index = 0;
+ while (iterator.hasNext()) {
+ Map<String, String> map = iterator.next();
+ LdapGroup group = new LdapGroup();
+ group.setDescription(map.get("description"));
+ group.setName(map.get("name"));
+ group.setId(index++);
+ converted.add(group);
}
}
- HashSet<String> assignedSelections = new HashSet<String>();
- for (ListGridRecord r : assignedGrid.getSelection()) {
- assignedSelections.add(r.getAttributeAsString(name));
- }
- HashSet<String> remainingRecords = new HashSet<String>();
- for (Record r : assignedGrid.getDataAsRecordList().toArray()) {
- remainingRecords.add(r.getAttributeAsString(name));
- }
- return remainingRecords;
+ return converted;
}
+ // public HashSet<String> getGroupSelection() {
+ // RecordList records = assignedGrid.getDataAsRecordList();
+ // //empty out selection and populate with actual contents
+ // selection.clear();
+ // if (!records.isEmpty()) {
+ // for (Record r : records.toArray()) {
+ // selection.add(r.getAttributeAsString(name));
+ // }
+ // }
+ // HashSet<String> assignedSelections = new HashSet<String>();
+ // for (ListGridRecord r : assignedGrid.getSelection()) {
+ // assignedSelections.add(r.getAttributeAsString(name));
+ // }
+ // HashSet<String> remainingRecords = new HashSet<String>();
+ // for (Record r : assignedGrid.getDataAsRecordList().toArray()) {
+ // remainingRecords.add(r.getAttributeAsString(name));
+ // }
+ // return remainingRecords;
+ // }
+
public class LdapAssignedGroupsDatasource extends RPCDataSource<Set<String>> {
private Integer currentRoleId = Integer.valueOf(-1);
@@ -324,22 +395,26 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
}
GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- new AsyncCallback<Set<Map<String, String>>>() {
+ // new AsyncCallback<Set<Map<String, String>>>() {
+ new AsyncCallback<PageList<LdapGroup>>() {
public void onFailure(Throwable throwable) {
CoreGUI.getErrorHandler().handleError("Failed to load LdapGroups available for role.",
throwable);
}
- public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
+ // public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
+ public void onSuccess(PageList<LdapGroup> currentlyAssignedLdapGroups) {
//translate groups into records for grid
// response.setData(buildRecords(locatedGroups));
// response.setData(buildAssignedRecords(currentlyAssignedLdapGroups));
//instead of setting the data, find which ones are shared and transfer as before
RecordList loaded = getAssignedGrid().getDataAsRecordList();
ArrayList<Integer> located = new ArrayList<Integer>();
- for (Map groupMap : currentlyAssignedLdapGroups) {
- int index = loaded.findIndex(name, (String) groupMap.get(name));
+ // for (Map groupMap : currentlyAssignedLdapGroups) {
+ for (LdapGroup groupMap : currentlyAssignedLdapGroups) {
+ // int index = loaded.findIndex(name, (String) groupMap.get(name));
+ int index = loaded.findIndex(id, groupMap.getId());
if (index > -1) {
located.add(Integer.valueOf(index));
}
@@ -375,7 +450,8 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
records = new ListGridRecord[currentlyAssignedLdapGroups.size()];
for (LdapGroup group : currentlyAssignedLdapGroups) {
ListGridRecord record = new ListGridRecord();
- record.setAttribute(id, group.getName());
+ // record.setAttribute(id, group.getName());
+ record.setAttribute(id, group.getId());
//load name
record.setAttribute(name, group.getName());
//load description
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
index 91c622a..02d39f2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
@@ -311,6 +311,9 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
protected void deselect(ListGridRecord[] records) {
HashSet<Integer> toRemove = new HashSet<Integer>();
for (ListGridRecord record : records) {
+ // for (String attr : record.getAttributes()) {
+ // Log.debug("------- ATTR:" + attr + ":value:" + record.getAttribute(attr) + ":");
+ // }
toRemove.add(record.getAttributeAsInt("id"));
}
selection.removeAll(toRemove);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
index 533fcd9..3045c5d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
@@ -28,7 +28,8 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.RemoteService;
-import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.resource.group.LdapGroup;
+import org.rhq.core.domain.util.PageList;
/**
* @author Simeon Pinder
@@ -59,21 +60,12 @@ public interface LdapGWTService extends RemoteService {
*/
void setLdapGroupsForRole(int roleId, List<String> groupIds);
- /**
- *
- * @param currentSubject
- * @param user
- * @param password
- * @return
- */
- Subject processSubjectForLdap(Subject currentSubject, String password, boolean ldapRegistration);
-
/** Finds ldap groups already assigned to this role.
*
* @param currentRoleId
* @return
*/
- Set<Map<String, String>> findLdapGroupsAssignedToRole(int currentRoleId);
+ PageList<LdapGroup> findLdapGroupsAssignedToRole(int currentRoleId);
/** Boolean response about whether ldap configured..
*
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
index 4abe475..50aa21f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
@@ -111,6 +111,6 @@ public interface SubjectGWTService extends RemoteService {
* @param criteria details for the search
* @return PageList<Subject> matching criteria.
*/
- Subject processSubjectForLdap(Subject subjectToModify, String password, boolean registerLdap);
+ Subject processSubjectForLdap(Subject subjectToModify, String password);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java
index a1de14c..a479aa0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.util.rpc;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
+import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.SC;
@@ -64,7 +65,7 @@ public class MonitoringRequestCallback implements RequestCallback {
+ response.getStatusText());
// if we have a rich and coordinated client-side loggedIn state, do we need to check upon failure here?
- UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Subject>() {
+ UserSessionManager.checkLoginStatus(Cookies.getCookie("username"), null, new AsyncCallback<Subject>() {
@Override
public void onSuccess(Subject result) {
History.fireCurrentHistoryState();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
index 8cf63d5..330ed24 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
@@ -20,14 +20,12 @@ package org.rhq.enterprise.gui.coregui.server.gwt;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.allen_sauer.gwt.log.client.Log;
-import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -106,38 +104,11 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
@Override
- public Set<Map<String, String>> findLdapGroupsAssignedToRole(int roleId) {
+ public PageList<LdapGroup> findLdapGroupsAssignedToRole(int roleId) {
try {
PageList<LdapGroup> allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
.getUnlimitedInstance());
- Set<Map<String, String>> ldapGroups = new HashSet<Map<String, String>>();
-
- for (LdapGroup group : allAssignedLdapGroups) {
- HashMap<String, String> map = new HashMap<String, String>();
- map.put("name", group.getName());
- map.put("id", group.getName());
- map.put("description", group.getDescription());
- ldapGroups.add(map);
- }
-
- return SerialUtility.prepare(ldapGroups, "findLdapGroupsAssignedToRole");
- } catch (Exception e) {
- throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- }
- }
-
- /** Does a series of LDAP checks and for case insensitive ldap matching accounts will return new Subject with session id.
- * i) needs registration(user exists in ldap but not yet in RHQ)
- * ii) if LDAP authentication is enabled. All authentication is piped through this method.
- *
- *
- */
- @Override
- public Subject processSubjectForLdap(Subject currentSubject, String password, boolean ldapRegistration) {
- try {
- currentSubject = subjectManager.processSubjectForLdap(currentSubject, password, ldapRegistration);
-
- return SerialUtility.prepare(currentSubject, "processSubjectForLdap");
+ return SerialUtility.prepare(allAssignedLdapGroups, "findLdapGroupsAssignedToRole");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
index 378e269..15d7464 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
@@ -95,10 +95,10 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
}
- public Subject processSubjectForLdap(Subject subjectToModify, String password, boolean registerLdap) {
+ public Subject processSubjectForLdap(Subject subjectToModify, String password) {
try {
- return SerialUtility.prepare(subjectManager.processSubjectForLdap(getSessionSubject(), password,
- registerLdap), "SubjectManager.processSubjectForLdap");
+ return SerialUtility.prepare(subjectManager.processSubjectForLdap(subjectToModify, password),
+ "SubjectManager.processSubjectForLdap");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index e1ffe82..491f26e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -291,14 +291,16 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
try {
int sessionId = sessionManager.getSessionIdFromUsername(username);
subject.setSessionId(sessionId);
- //insert processing for LDAP users who have registered before and have jdbc credentials
+ //insert processing for LDAP users who have registered before and have jdbc credentials, but no principal.
log.trace("Processing subject '" + subject.getName() + "' for LDAP functionality.");
- subject = processSubjectForLdap(subject, password, false);
+ subject = processSubjectForLdap(subject, password);
return subject;
} catch (SessionException se) {
// nope, no session; continue on so we can create the session
}
} else {
+ System.out.println("+++++++++++ i)Not yet registered ii)case insensitive login from ldap for username:"
+ + username + ":");
// There is no subject in the database yet.
// If LDAP authentication is enabled and we cannot find the subject,
// it means we must have authenticated via LDAP, not JDBC (otherwise,
@@ -331,12 +333,12 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
* @return same or new Subject returned from LDAP processing.
* @throws LoginException
*/
- public Subject processSubjectForLdap(Subject subject, String subjectPassword, boolean ldapRegistration)
- throws LoginException {
-
+ public Subject processSubjectForLdap(Subject subject, String subjectPassword) throws LoginException {
if (subject != null) {//null check
//if user has principal then bail as LDAP processing not required
boolean userHasPrincipal = isUserWithPrincipal(subject.getName());
+ log.trace("Processing subject '" + subject.getName() + "' for LDAP check, userHasPrincipal:"
+ + userHasPrincipal);
//if user has principal then return as non-ldap user
if (userHasPrincipal) {
@@ -346,26 +348,13 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
Properties config = systemManager.getSystemConfiguration();
boolean ldapConfigured = config.getProperty(RHQConstants.JAASProvider).equals(
RHQConstants.LDAPJAASProvider);
-
if (ldapConfigured) {//i)registration ii)case sensitive matches iii)authorization updates
//check that session is valid. RHQ auth has already occurred.
if (!isValidSessionId(subject.getSessionId(), subject.getName(), subject.getId())) {
throw new LoginException("User session not valid. Login to proceed.");
}
- if ((subject.getId() == 0) && ldapRegistration) {//insert overlord registration and login
- //we've verified that this user has valid session, requires registration and that ldap is configured.
- Subject superuser = getOverlord();
-
- // create the subject, but don't add a principal since LDAP will handle authentication
- log.trace("registering new LDAP-authenticated subject [" + subject.getName() + "]");
- createSubject(superuser, subject);
-
- // nuke the temporary session and establish a new
- // one for this subject.. must be done before pulling the
- // new subject in order to do it with his own credentials
- logout(subject.getSessionId().intValue());
- subject = login(subject.getName(), subjectPassword);
- } else {//already registered
+ if (subject.getId() == 0) {//i)case insensitive check or ii)ldap new user registration.
+
//BZ-586435: insert case insensitivity for usernames with ldap auth
// locate first matching subject and attach.
SubjectCriteria subjectCriteria = new SubjectCriteria();
@@ -387,12 +376,25 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
log.info(msg);
subject = login(ldapSubject.getName(), subjectPassword);
Integer sessionId = subject.getSessionId();
- log.debug("Logged in as [" + ldapSubject.getName() + "] with session id [" + sessionId
+ log.trace("Logged in as [" + ldapSubject.getName() + "] with session id [" + sessionId
+ "]");
+ } else {//then this is a registration request. insert overlord registration and login
+ //we've verified that this user has valid session, requires registration and that ldap is configured.
+ Subject superuser = getOverlord();
+
+ // create the subject, but don't add a principal since LDAP will handle authentication
+ log.trace("registering new LDAP-authenticated subject [" + subject.getName() + "]");
+ createSubject(superuser, subject);
+
+ // nuke the temporary session and establish a new
+ // one for this subject.. must be done before pulling the
+ // new subject in order to do it with his own credentials
+ logout(subject.getSessionId().intValue());
+ subject = login(subject.getName(), subjectPassword);
}
}
{//now carry out authz refresh for this Subject
- if (subject.getId() > 0) {
+ if (subject.getId() > 0) {//only act on persisted subjects
//BZ-580127: only do group authz check if one or both of group filter fields is set
Properties options = systemManager.getSystemConfiguration();
String groupFilter = (String) options.getProperty(RHQConstants.LDAPGroupFilter, "");
@@ -400,10 +402,13 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
if ((groupFilter.trim().length() > 0) || (groupMember.trim().length() > 0)) {
List<String> groupNames = new ArrayList<String>(ldapManager
.findAvailableGroupsFor(subject.getName()));
+ log.trace("Updating ldap authorization data for user '" + subject.getName() + "'");
ldapManager.assignRolesToLdapSubject(subject.getId(), groupNames);
}
}
}
+ } else {//ldap not configured. Somehow authenticated for LDAP without being ldap being configured. Error. Bail
+ throw new LoginException("You are authenticated for LDAP, but LDAP is not configured.");
}
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
index 2b00345..9339811 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
@@ -219,6 +219,5 @@ public interface SubjectManagerLocal {
*/
PageList<Subject> findSubjectsByCriteria(Subject subject, SubjectCriteria criteria);
- Subject processSubjectForLdap(Subject subject, String subjectPassword, boolean ldapRegistration)
- throws LoginException;
+ Subject processSubjectForLdap(Subject subject, String subjectPassword) throws LoginException;
}
\ No newline at end of file
commit 82d0eb6866f0de15a8ff8e49ea6c39f2a8184b2b
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Oct 22 10:01:03 2010 -0400
Numerous changes: i) register new ldap user validation changes ii)UserSessionMgr cleanup iii)*GWTService cleanup iii)revert to use orig Authorization
permissions approach iv)tighten up security process in processSubjectForLdap v)subjectCriteria performance change.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index 41935c8..c59ce69 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
@@ -22,7 +22,6 @@
*/
package org.rhq.enterprise.gui.coregui.client;
-import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Map;
@@ -46,6 +45,7 @@ import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.ValuesManager;
import com.smartgwt.client.widgets.form.events.SubmitValuesEvent;
import com.smartgwt.client.widgets.form.events.SubmitValuesHandler;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
@@ -82,6 +82,7 @@ public class LoginView extends Canvas {
private DynamicForm form;
private SubmitItem loginButton;
+ private ValuesManager valuesManager = new ValuesManager();
public LoginView() {
}
@@ -92,7 +93,6 @@ public class LoginView extends Canvas {
private TextItem email;
private TextItem phone;
private TextItem department;
- private ArrayList<DynamicForm> forms;
private static final String FIRST = "first";
private static final String LAST = "last";
private static final String USERNAME = "ldap.username";
@@ -102,6 +102,11 @@ public class LoginView extends Canvas {
private static final String SESSIONID = "ldap.sessionid";
private static final String PASSWORD = "ldap.password";
+ public void showLoginDialog(String message) {
+ showLoginDialog();
+ form.setErrorsPreamble(message);
+ }
+
public void showLoginDialog() {
if (!loginShowing) {
loginShowing = true;
@@ -193,7 +198,7 @@ public class LoginView extends Canvas {
}
loginShowing = true;
- forms = new ArrayList<DynamicForm>();
+ // forms = new ArrayList<DynamicForm>();
form = new DynamicForm();
form.setMargin(25);
@@ -237,7 +242,13 @@ public class LoginView extends Canvas {
department.setWidth(fieldWidth);
SpacerItem space = new SpacerItem();
space.setColSpan(1);
- column.addMember(wrapInDynamicForm(6, header, first, last, username, email, phone, department));
+ DynamicForm inputFields = new DynamicForm();
+ inputFields.setNumCols(6);
+ inputFields.setFields(header, first, last, username, email, phone, department);
+ inputFields.setValuesManager(valuesManager);
+ loadValidators(inputFields);
+ column.addMember(inputFields);
+
HTMLFlow hr = new HTMLFlow("<br/><hr/><br/><br/>");
hr.setWidth(750);
hr.setAlign(Alignment.CENTER);
@@ -252,10 +263,11 @@ public class LoginView extends Canvas {
//check for session timeout
if (UserSessionManager.isLoggedOut()) {
resetLogin();
+ return;
}
//validation
- if (validateForms(forms)) {
+ if (valuesManager.validate()) {
Log.trace("Successfully validated all data for user registration.");
//populate form
form.setValue(FIRST, String.valueOf(first.getValue()));
@@ -301,6 +313,8 @@ public class LoginView extends Canvas {
}
public void onFailure(Throwable caught) {
+ form.setFieldErrors(FIRST,
+ "Note: Optional retrieval of ldap details unsuccessful. Manual entry required.", true);
Log.debug("Optional LDAP detail retrieval did not succeed. Registration prepopulation will occur.");
}
});
@@ -310,6 +324,7 @@ public class LoginView extends Canvas {
public void onClick(ClickEvent event) {
if (UserSessionManager.isLoggedOut()) {
resetLogin();
+ return;
}
//clear out all validation messages.
@@ -318,7 +333,7 @@ public class LoginView extends Canvas {
first.setValue(empty);
last.setValue(empty);
email.setValue("test(a)test.com");
- validateForms(forms);
+ valuesManager.validate();
}
first.clearValue();
last.clearValue();
@@ -334,6 +349,7 @@ public class LoginView extends Canvas {
public void onClick(ClickEvent event) {
UserSessionManager.logout();
resetLogin();
+ return;
}
});
row.addMember(logout);
@@ -362,21 +378,6 @@ public class LoginView extends Canvas {
}
}
- /** Iterates through the dynamic forms populated then calls validate().
- *
- * @param forms
- * @return
- */
- private boolean validateForms(ArrayList<DynamicForm> forms) {
- boolean allValid = true;
- for (DynamicForm form : forms) {
- if (!form.validate()) {
- allValid = false;
- }
- }
- return allValid;
- }
-
/** Go through steps of invalidating this login and piping them back to CoreGUI Login.
*/
private void resetLogin() {
@@ -467,29 +468,6 @@ public class LoginView extends Canvas {
}
}
- /**Helper method to wrap N form items one a single line/row represented by a DynamicForm
- *
- * @param columnCount
- * @param header
- * @return
- */
- private Canvas wrapInDynamicForm(int columnCount, FormItem... header) {
- DynamicForm form = new DynamicForm();
- if (header != null) {
- if (columnCount < 1) {//default to label and details for each form item
- form.setNumCols(header.length * 2);
- } else {
- form.setNumCols(columnCount);
- }
- form.setFields(header);
- //store away all forms for final validation
- forms.add(form);
- //load validators for form
- loadValidators(form);
- }
- return form;
- }
-
/**Build and loads the validators for each of the formItems
*
* @param form
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index e875f66..d505fd1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -33,8 +33,6 @@ import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.criteria.SubjectCriteria;
-import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
@@ -195,56 +193,6 @@ public class UserSessionManager {
}
}
- /**
- *
- * @param subjectId
- * @param sessionId
- * @param user
- * @param callback
- */
- private static void locateSubjectOrLogin(int subjectId, final String sessionId, final String user, String password,
- final AsyncCallback<Subject> callback) {
- if (subjectId > 0) {//registration not needed
- Log.trace("SubjectCriteria search with subjectId:" + subjectId);
- SubjectCriteria criteria = new SubjectCriteria();
- criteria.fetchConfiguration(true);
- criteria.addFilterId(subjectId);
-
- //pipe into next asynchronous call.
- GWTServiceLookup.getSubjectService().findSubjectsByCriteria(criteria,
- new AsyncCallback<PageList<Subject>>() {
- public void onFailure(Throwable caught) {
- //TODO: how/what to display in LoginView when unexpected communication with server occurs?
- // LoginView
- // .displayFormError("UserSessionManager: Unable to check subject for LDAP authorization "
- // + "- check Server status.");
- Log.debug("Failed to load user's subject");
- //show login dialog
- new LoginView().showLoginDialog();
- }
-
- public void onSuccess(PageList<Subject> result) {
- Subject subject = result.get(0);
- Log.trace("Found subject [" + subject + "].");
- subject.setSessionId(Integer.valueOf(sessionId));
-
- // reset the session subject to the latest, for wrapping in user preferences
- sessionSubject = subject;
- sessionState = State.IS_LOGGED_IN;
- //insert ldap check logic
- userPreferences = new UserPreferences(sessionSubject);
- refresh();
-
- callback.onSuccess(subject);
- }
- });
- } else {
- Log.trace("Proceeding with registration for ldap user '" + user + "'.");
- sessionState = State.IS_REGISTERING;
- new LoginView().showRegistrationDialog(user, sessionId, password, callback);
- }
- }
-
public static void login() {
login(null, null);
}
@@ -259,10 +207,9 @@ public class UserSessionManager {
public void onSuccess(Subject result) {
// will build UI if necessary, then fires history event
sessionState = State.IS_LOGGED_IN;
- if (result != null) {// subject and session has been updated during this login request
- Log.trace("A new subject and session has been returned. Updating sessionSubject.");
- sessionSubject = result;
- }
+ // subject and session has been updated during this login request
+ Log.trace("A new subject and session may has been returned. Updating sessionSubject.");
+ sessionSubject = result;
CoreGUI.get().buildCoreUI();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java
index 58bae69..13b5572 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java
@@ -72,11 +72,4 @@ public interface AuthorizationGWTService extends RemoteService {
*/
Set<Permission> getExplicitGlobalPermissions();
- /**
- * Lightweight check of whether current user has manage inventory permissions.
- *
- * @return Boolean answer to manage inventory permissions status.
- */
- Boolean checkUserGlobalPermission(Permission permission);
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
index 481ae0b..533fcd9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
@@ -68,15 +68,6 @@ public interface LdapGWTService extends RemoteService {
*/
Subject processSubjectForLdap(Subject currentSubject, String password, boolean ldapRegistration);
- /**
- *
- * @param currentSubject
- * @param user
- * @param password
- * @return
- */
- void updateLdapGroupAssignmentsForSubject(Subject subject);
-
/** Finds ldap groups already assigned to this role.
*
* @param currentRoleId
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
index edb50a0..4abe475 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
@@ -94,8 +94,23 @@ public interface SubjectGWTService extends RemoteService {
*/
Subject updateSubject(Subject subjectToModify);
+ /**
+ * Queries subjects using current logged in user.
+ *
+ * @param criteria details for the search
+ * @return PageList<Subject> matching criteria.
+ */
PageList<Subject> findSubjectsByCriteria(SubjectCriteria criteria);
- Subject processSubjectForLdap(Subject subjectToModify, String password);
+ /**
+ * Checks the subject passed in for LDAP processing, to optionally
+ * i)perform registration of new RHQ LDAP user
+ * ii)handles case insentive username matches.
+ * iii)update ldap user->role ldap assignments
+ *
+ * @param criteria details for the search
+ * @return PageList<Subject> matching criteria.
+ */
+ Subject processSubjectForLdap(Subject subjectToModify, String password, boolean registerLdap);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
index b6b23b6..3645614 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
@@ -23,6 +23,7 @@ import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -128,9 +129,10 @@ public class AutodiscoveryQueueDataSource extends DataSource {
}
//determine if has manage inventory perms, if so then chain and proceed with getting discovered resources
- authorizationService.checkUserGlobalPermission(MANAGE_INVENTORY, new AsyncCallback<Boolean>() {
- public void onSuccess(Boolean hasManageInventoryPermissions) {
- if (hasManageInventoryPermissions) {
+ authorizationService.getExplicitGlobalPermissions(new AsyncCallback<Set<Permission>>() {
+ public void onSuccess(Set<Permission> globalPermissions) {
+ Boolean accessGranted = globalPermissions.contains(MANAGE_INVENTORY);
+ if (accessGranted) {
if (dataContainerReference != null) {
dataContainerReference.setEmptyMessage(EMPTY_MESSAGE);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
index d269e30..be35794 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
@@ -123,7 +123,8 @@ public class ResourceAutodiscoveryView extends LocatableVLayout {
treeGrid.setHeight100();
- treeGrid.setDataSource(dataSource = new AutodiscoveryQueueDataSource(treeGrid));
+ dataSource = new AutodiscoveryQueueDataSource(treeGrid);
+ treeGrid.setDataSource(dataSource);
treeGrid.setAutoFetchData(true);
treeGrid.setResizeFieldsInRealTime(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java
index 7a13a94..56a4857 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java
@@ -83,19 +83,4 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
- /** Lightweight check of whether user has requested permission.
- *
- * @return Boolean data point.
- */
- public Boolean checkUserGlobalPermission(Permission permission) {
- Boolean accessGranted = false;
- try {
- Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(getSessionSubject());
- accessGranted = globalPermissions.contains(permission);
- return accessGranted;
- } catch (Exception e) {
- throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- }
- }
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
index d6723d6..8cf63d5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
@@ -105,65 +105,6 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
}
- public void updateLdapGroupAssignmentsForSubject(Subject subject) {
- try {
- //BZ-580127: only do group authz check if one or both of group filter fields is set
- // Properties options = systemManager.getSystemConfiguration();
- String groupFilter = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(
- RHQConstants.LDAPGroupFilter, "");
- String groupMember = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(
- RHQConstants.LDAPGroupMember, "");
- if ((groupFilter.trim().length() > 0) || (groupMember.trim().length() > 0)) {
- String provider = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(
- RHQConstants.JAASProvider);
- if (RHQConstants.LDAPJAASProvider.equals(provider)) {
- List<String> groupNames = new ArrayList<String>(ldapManager.findAvailableGroupsFor(subject
- .getName()));
- ldapManager.assignRolesToLdapSubject(subject.getId(), groupNames);
- }
- }
- // try { //defend against ldap communication runtime difficulties.
- // } catch (EJBException ejx) {
- // //this is the exception type thrown now that we use SLSB.Local methods
- // // mine out other exceptions
- // Exception cause = ejx.getCausedByException();
- // if (cause == null) {
- // ActionMessages actionMessages = new ActionMessages();
- // actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.cam.general"));
- // saveErrors(request, actionMessages);
- // } else {
- // if (cause instanceof LdapFilterException) {
- // ActionMessages actionMessages = new ActionMessages();
- // actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
- // "admin.role.LdapGroupFilterMessage"));
- // saveErrors(request, actionMessages);
- // } else if (cause instanceof LdapCommunicationException) {
- // ActionMessages actionMessages = new ActionMessages();
- // SystemManagerLocal manager = LookupUtil.getSystemManager();
- // options = manager.getSystemConfiguration();
- // String providerUrl = options.getProperty(RHQConstants.LDAPUrl, "(unavailable)");
- // actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
- // "admin.role.LdapCommunicationMessage", providerUrl));
- // saveErrors(request, actionMessages);
- // }
- // }
- // } catch (LdapFilterException lce) {
- // ActionMessages actionMessages = new ActionMessages();
- // actionMessages.add(ActionMessages.GLOBAL_MESSAGE,
- // new ActionMessage("admin.role.LdapGroupFilterMessage"));
- // saveErrors(request, actionMessages);
- // } catch (LdapCommunicationException lce) {
- // ActionMessages actionMessages = new ActionMessages();
- // String providerUrl = options.getProperty(RHQConstants.LDAPUrl, "(unavailable)");
- // actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
- // "admin.role.LdapCommunicationMessage", providerUrl));
- // saveErrors(request, actionMessages);
- // }
- } catch (Exception e) {
- throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- }
- }
-
@Override
public Set<Map<String, String>> findLdapGroupsAssignedToRole(int roleId) {
try {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
index 953fc36..378e269 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
@@ -95,10 +95,10 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
}
- public Subject processSubjectForLdap(Subject subjectToModify, String password) {
+ public Subject processSubjectForLdap(Subject subjectToModify, String password, boolean registerLdap) {
try {
- return SerialUtility.prepare(subjectManager.processSubjectForLdap(getSessionSubject(), password),
- "SubjectManager.processSubjectForLdap");
+ return SerialUtility.prepare(subjectManager.processSubjectForLdap(getSessionSubject(), password,
+ registerLdap), "SubjectManager.processSubjectForLdap");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index 8e76409..e1ffe82 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -64,7 +64,6 @@ import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
-import org.rhq.enterprise.server.util.LookupUtil;
/**
* Provides functionality to access and manipulate subjects and principals, mainly for authentication purposes.
@@ -349,11 +348,11 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
RHQConstants.LDAPJAASProvider);
if (ldapConfigured) {//i)registration ii)case sensitive matches iii)authorization updates
+ //check that session is valid. RHQ auth has already occurred.
+ if (!isValidSessionId(subject.getSessionId(), subject.getName(), subject.getId())) {
+ throw new LoginException("User session not valid. Login to proceed.");
+ }
if ((subject.getId() == 0) && ldapRegistration) {//insert overlord registration and login
- //check that session is valid
- if (!isValidSessionId(subject.getSessionId(), subject.getName(), subject.getId())) {
- throw new LoginException("User session not valid. Login to proceed.");
- }
//we've verified that this user has valid session, requires registration and that ldap is configured.
Subject superuser = getOverlord();
@@ -372,9 +371,10 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
SubjectCriteria subjectCriteria = new SubjectCriteria();
subjectCriteria.setCaseSensitive(false);
subjectCriteria.setStrict(true);
+ subjectCriteria.fetchRoles(false);
+ subjectCriteria.fetchConfiguration(false);
subjectCriteria.addFilterName(subject.getName());
- PageList<Subject> subjectsLocated = LookupUtil.getSubjectManager().findSubjectsByCriteria(
- subject, subjectCriteria);
+ PageList<Subject> subjectsLocated = findSubjectsByCriteria(subject, subjectCriteria);
//if subject variants located then take the first one with a principal otherwise do nothing
//To defend against the case where they create an account with the same name but not
//case as an rhq sysadmin or higher perms, then make them relogin with same creds entered.
@@ -390,19 +390,6 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
log.debug("Logged in as [" + ldapSubject.getName() + "] with session id [" + sessionId
+ "]");
}
- // {//now carry out authz refresh for this Subject
- // if (subject.getId() > 0) {
- // //BZ-580127: only do group authz check if one or both of group filter fields is set
- // Properties options = systemManager.getSystemConfiguration();
- // String groupFilter = (String) options.getProperty(RHQConstants.LDAPGroupFilter, "");
- // String groupMember = (String) options.getProperty(RHQConstants.LDAPGroupMember, "");
- // if ((groupFilter.trim().length() > 0) || (groupMember.trim().length() > 0)) {
- // List<String> groupNames = new ArrayList<String>(ldapManager
- // .findAvailableGroupsFor(subject.getName()));
- // ldapManager.assignRolesToLdapSubject(subject.getId(), groupNames);
- // }
- // }
- // }
}
{//now carry out authz refresh for this Subject
if (subject.getId() > 0) {
commit bfb2345015cf187c7ded32562b1fbbc6e30a58d7
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Thu Oct 21 17:51:05 2010 -0400
refactor Subject SLSB to include more of LDAP logic.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index e5d202e..41935c8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
@@ -437,37 +437,29 @@ public class LoginView extends Canvas {
newSubject.setFsystem(false);
if (proceed) {
- GWTServiceLookup.getSubjectService().createSubjectUsingOverlord(newSubject, password,
+ GWTServiceLookup.getLdapService().processSubjectForLdap(newSubject, password, true,
new AsyncCallback<Subject>() {
- public void onSuccess(final Subject newLoggedInSubject) {
- CoreGUI.getMessageCenter().notify(
- new Message("Succesfully created new ldap Subject.", Message.Severity.Info));
- Log.trace("New subject created for ldap user.");
- //now do group role assignment for initial login
- GWTServiceLookup.getLdapService().updateLdapGroupAssignmentsForSubject(newLoggedInSubject,
- new AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to assign roles for ldap Subject.",
- caught);
- Log.debug("Failed to assign roles to ldap subject.");
- }
-
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message("Succesfully assigned roles for ldap Subject.",
- Message.Severity.Info));
- Log.trace("Role assignment update for ldap subject complete.");
- window.destroy();
- loginShowing = false;
- callback.onSuccess(newLoggedInSubject);
- }
- });
+ public void onFailure(Throwable caught) {
+ Log.debug("Failed to register LDAP subject:" + caught.getMessage());
+ //TODO: how/what to display in LoginView when unexpected communication with server occurs?
+ // LoginView
+ // .displayFormError("UserSessionManager: Unable to check subject for LDAP authorization "
+ // + "- check Server status.");
+ new LoginView().showLoginDialog();
}
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to create ldap Subject.", caught);
+ public void onSuccess(Subject checked) {
+ Log.trace("Successfully registered LDAP subject '" + checked + "'.");
+
+ CoreGUI.getMessageCenter().notify(
+ new Message("Succesfully registered the new ldap Subject.", Message.Severity.Info));
+ Log.trace("Succesfully registered the new ldap Subject.");
+ window.destroy();
+ loginShowing = false;
+ callback.onSuccess(checked);
}
});
+
} else {//log them out then reload LoginView
Log.warn("Failed to locate username required to create LDAP subject.");
UserSessionManager.logout();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index 06c8604..e875f66 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -144,21 +144,12 @@ public class UserSessionManager {
subject.setSessionId(Integer.valueOf(sessionId));
sessionSubject = subject;
- //checks to see if this user needs registration.
- if (subject.getId() == 0) {
- // Subject with a ID of 0 means the subject wasn't in the database but the login succeeded.
- // This means the login method detected that LDAP authenticated the user and just gave us a dummy subject.
- // Set the needs-registration flag so we can eventually steer the user to the LDAP registration workflow.
- // needsRegistration = true;
- needsRegistration = true;
- }
-
+ subject.setName(user);
// figure out if ldap auth is used and whether case insenitive ldap auth requests should be handled.
- GWTServiceLookup.getLdapService().checkSubjectForLdapAuth(subject, user, password,
+ GWTServiceLookup.getLdapService().processSubjectForLdap(subject, password, false,
new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
- Log.warn("Unable to check subject for LDAP authorization - check Server status."
- + caught.getMessage());
+ Log.debug("Failed to load user's subject:" + caught.getMessage());
//TODO: how/what to display in LoginView when unexpected communication with server occurs?
// LoginView
// .displayFormError("UserSessionManager: Unable to check subject for LDAP authorization "
@@ -167,20 +158,23 @@ public class UserSessionManager {
}
public void onSuccess(Subject checked) {
- //now pull the flags/information back out of this subject
- if (checked == null) {//no new subject was returned.
- // also handles case where user is JDBC-based
- Log.trace("No alternative case insensitive LDAP accounts located.");
- locateSubjectOrLogin(subjectId, sessionId, user, password, callback);
- } else {//alternative Subject returned meaning we located
- Log.trace("Case insensitive matching LDAP account located.");
- needsRegistration = false;
- //change the subject.sessionId
+ Log.trace("Successfully checked subject '" + checked + "' for LDAP processing.");
+ if (checked.getId() > 0) {//subject is already registered.
+ sessionState = State.IS_LOGGED_IN;
+ // reset the session subject to the latest, for wrapping in user preferences
sessionSubject = checked;
- locateSubjectOrLogin(checked.getId(), String.valueOf(checked.getSessionId()),
- checked.getName(), password, callback);
+ //insert ldap check logic
+ userPreferences = new UserPreferences(sessionSubject);
+ refresh();
+
+ callback.onSuccess(checked);
+
+ Log.trace("Subject registration required:" + needsRegistration);
+ } else {//subject requires registration
+ Log.trace("Proceeding with registration for ldap user '" + user + "'.");
+ sessionState = State.IS_REGISTERING;
+ new LoginView().showRegistrationDialog(user, sessionId, password, callback);
}
- Log.trace("Subject registration required:" + needsRegistration);
}
});
} else {//invalid session. Back to login
@@ -236,6 +230,7 @@ public class UserSessionManager {
// reset the session subject to the latest, for wrapping in user preferences
sessionSubject = subject;
+ sessionState = State.IS_LOGGED_IN;
//insert ldap check logic
userPreferences = new UserPreferences(sessionSubject);
refresh();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
index 7915b80..481ae0b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
@@ -66,7 +66,7 @@ public interface LdapGWTService extends RemoteService {
* @param password
* @return
*/
- Subject checkSubjectForLdapAuth(Subject currentSubject, String user, String password);
+ Subject processSubjectForLdap(Subject currentSubject, String password, boolean ldapRegistration);
/**
*
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
index a277f90..edb50a0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
@@ -58,15 +58,6 @@ public interface SubjectGWTService extends RemoteService {
Subject createSubject(Subject subjectToCreate);
/**
- * Create a a new subject. Same as createSubject, but uses overlord privileges to automate Subject creation. Ex. Used during
- * LDAP logins.
- *
- * @param subjectToCreate The subject to be created.
- * @return the newly persisted {@link Subject}
- */
- Subject createSubjectUsingOverlord(Subject subjectToCreate, String password);
-
- /**
* Deletes the given set of users, including both the {@link Subject} and {@link org.rhq.core.domain.auth.Principal} objects associated with
* those users.
*
@@ -105,4 +96,6 @@ public interface SubjectGWTService extends RemoteService {
PageList<Subject> findSubjectsByCriteria(SubjectCriteria criteria);
+ Subject processSubjectForLdap(Subject subjectToModify, String password);
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
index a947c57..b6b23b6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
@@ -150,7 +150,7 @@ public class AutodiscoveryQueueDataSource extends DataSource {
Log.debug("(User does not have required managed inventory permissions. " + EMPTY_MESSAGE);
response.setTotalRows(0);
if (dataContainerReference != null) {
- Log.debug("Setting better empty container message." + NO_MANAGE_INVENTORY_PERMS_EMPTY_MESSAGE);
+ Log.trace("Setting better empty container message." + NO_MANAGE_INVENTORY_PERMS_EMPTY_MESSAGE);
dataContainerReference.setEmptyMessage(NO_MANAGE_INVENTORY_PERMS_EMPTY_MESSAGE);
}
processResponse(request.getRequestId(), response);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
index 7b27fb6..d6723d6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
@@ -28,7 +28,6 @@ import java.util.Set;
import com.allen_sauer.gwt.log.client.Log;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -193,81 +192,11 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
*
*/
@Override
- public Subject checkSubjectForLdapAuth(Subject currentSubject, String user, String password) {
+ public Subject processSubjectForLdap(Subject currentSubject, String password, boolean ldapRegistration) {
try {
- Subject newSubject = null;
- Log.trace("Subject being checked for ldapAuthentication is :" + currentSubject);
+ currentSubject = subjectManager.processSubjectForLdap(currentSubject, password, ldapRegistration);
- boolean needsRegistrationOrCaseIncorrectOnAccountName = false;
-
- //null checks.
- if ((currentSubject != null) && (user != null) && (password != null)) {
- if (currentSubject.getId() == 0) {
- // Subject with a ID of 0 means the subject wasn't in the database but the login succeeded.
- // This means the login method detected the LDAP authenticated user and gave us a dummy subject.
- // Set the needs-registration flag so we can eventually steer the user to the LDAP registration workflow.
- needsRegistrationOrCaseIncorrectOnAccountName = true;
- }
-
- Log.trace("Subject has id of :" + currentSubject.getId() + "and requires Registration:"
- + needsRegistrationOrCaseIncorrectOnAccountName);
-
- // figure out if the user has a principal
- String provider = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(
- RHQConstants.JAASProvider);
- boolean ldapEnabled = ((provider != null) && provider.equals(RHQConstants.LDAPJAASProvider));
-
- Log.trace("LDAP Authentication has been enabled :" + ldapEnabled);
- boolean hasPrincipal = false;
-
- if (ldapEnabled) {
- // when we allow for LDAP authentication, we may still have users logging in with JDBC.
- // The only way we can distinguish these users is by checking to see if they have an
- // entry in the principals table. If they do, then we know we use JDBC authentication
- // for that user. If they do not, then we must be using LDAP to authenticate that user.
- // hasPrincipal = subjectManager.isUserWithPrincipal(currentSubject.getName());
- hasPrincipal = subjectManager.isUserWithPrincipal(user);
- Log.trace("Subject '" + user + "' hasPrincipal :" + hasPrincipal);
-
- if (!hasPrincipal && needsRegistrationOrCaseIncorrectOnAccountName) {
- //for the case when they're already registered but entering a case sensitive different name
- //BZ-586435: insert case insensitivity for usernames with ldap auth
- // locate first matching subject and attach.
- SubjectCriteria subjectCriteria = new SubjectCriteria();
- subjectCriteria.setCaseSensitive(false);
- subjectCriteria.setStrict(true);
- subjectCriteria.addFilterName(user);
- subjectCriteria.fetchRoles(true);
- subjectCriteria.fetchConfiguration(true);
- PageList<Subject> subjectsLocated = LookupUtil.getSubjectManager().findSubjectsByCriteria(
- LookupUtil.getSubjectManager().getOverlord(), subjectCriteria);
- Log.trace("Subjects located with name '" + user + "' and found:" + subjectsLocated.size());
-
- //if subject variants located then take the first one with a principal otherwise do nothing
- //To defend against the case where they create an account with the same name but not
- //case as an rhq sysadmin or higher perms, then make them relogin with same creds entered.
- if (!subjectsLocated.isEmpty()) {//then case insensitive username matches found. Try to use instead.
- Subject ldapSubject = subjectsLocated.get(0);
- String msg = "Located existing ldap account with different case for ["
- + ldapSubject.getName() + "]. "
- + "Attempting to authenticate with that account instead.";
- Log.info(msg);
- Log.trace("Attempting to log back in with credentials passed in.");
- newSubject = subjectManager.login(user, password);
- Log.trace("Logged in as [" + ldapSubject.getName() + "] with session id ["
- + newSubject.getSessionId() + "]");
- needsRegistrationOrCaseIncorrectOnAccountName = false;
- }
- }
-
- } else {
- // with regular JDBC authentication, we are guaranteed to have a principal
- hasPrincipal = true;
- }
- } else {
- Log.debug("The Subject and user/password cannot be null to proceed.");
- }
- return SerialUtility.prepare(newSubject, "checkSubjectForLdapAuth");
+ return SerialUtility.prepare(currentSubject, "processSubjectForLdap");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
index 8c5e9ea..953fc36 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
@@ -18,8 +18,6 @@
*/
package org.rhq.enterprise.gui.coregui.server.gwt;
-import com.allen_sauer.gwt.log.client.Log;
-
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.util.PageList;
@@ -64,28 +62,6 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
}
- /**Same as create subject, but uses Overlord and returns new/non-temporary session.
- *
- * @param subjectToCreate
- * @param password
- * @return
- */
- public Subject createSubjectUsingOverlord(Subject subjectToCreate, String password) {
- try {
- //Officially create the new subject
- subjectToCreate = subjectManager.createSubject(subjectManager.getOverlord(), subjectToCreate);
- // nuke the temporary session and establish a new
- // one for this subject.. must be done before pulling the
- // new subject in order to do it with his own credentials
- subjectManager.logout(getSessionSubject().getSessionId());
- subjectToCreate = subjectManager.login(subjectToCreate.getName(), password);
- Log.trace("Created new user with overlord and logged back in with that user.");
- return SerialUtility.prepare(subjectToCreate, "SubjectManager.createSubjectUsingOverlord");
- } catch (Exception e) {
- throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- }
- }
-
public void deleteSubjects(int[] subjectIds) {
try {
subjectManager.deleteSubjects(getSessionSubject(), subjectIds);
@@ -119,6 +95,15 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
}
+ public Subject processSubjectForLdap(Subject subjectToModify, String password) {
+ try {
+ return SerialUtility.prepare(subjectManager.processSubjectForLdap(getSessionSubject(), password),
+ "SubjectManager.processSubjectForLdap");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public PageList<Subject> findSubjectsByCriteria(SubjectCriteria criteria) {
try {
return SerialUtility.prepare(subjectManager.findSubjectsByCriteria(getSessionSubject(), criteria),
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java
index 91980ad..1702827 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java
@@ -18,12 +18,8 @@
*/
package org.rhq.enterprise.gui.admin.user;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
-import java.util.Properties;
-import javax.ejb.EJBException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@@ -33,8 +29,6 @@ import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
@@ -43,10 +37,7 @@ import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.action.BaseAction;
import org.rhq.enterprise.gui.legacy.util.RequestUtils;
import org.rhq.enterprise.gui.legacy.util.SessionUtils;
-import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
-import org.rhq.enterprise.server.exception.LdapCommunicationException;
-import org.rhq.enterprise.server.exception.LdapFilterException;
import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -121,55 +112,6 @@ public class RegisterAction extends BaseAction {
HashMap parms = new HashMap(1);
parms.put(Constants.USER_PARAM, newSubject.getId());
- //BZ-580127: only do group authz check if one or both of group filter fields is set
- Properties options = systemManager.getSystemConfiguration();
- String groupFilter = (String) options.getProperty(RHQConstants.LDAPGroupFilter, "");
- String groupMember = (String) options.getProperty(RHQConstants.LDAPGroupMember, "");
- if ((groupFilter.trim().length() > 0) || (groupMember.trim().length() > 0)) {
- try { //defend against ldap communication runtime difficulties.
- String provider = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(
- RHQConstants.JAASProvider);
- if (RHQConstants.LDAPJAASProvider.equals(provider)) {
- List<String> groupNames = new ArrayList(ldapManager.findAvailableGroupsFor(newSubject.getName()));
- ldapManager.assignRolesToLdapSubject(newSubject.getId(), groupNames);
- }
- } catch (EJBException ejx) {
- //this is the exception type thrown now that we use SLSB.Local methods
- // mine out other exceptions
- Exception cause = ejx.getCausedByException();
- if (cause == null) {
- ActionMessages actionMessages = new ActionMessages();
- actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.cam.general"));
- saveErrors(request, actionMessages);
- } else {
- if (cause instanceof LdapFilterException) {
- ActionMessages actionMessages = new ActionMessages();
- actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
- "admin.role.LdapGroupFilterMessage"));
- saveErrors(request, actionMessages);
- } else if (cause instanceof LdapCommunicationException) {
- ActionMessages actionMessages = new ActionMessages();
- SystemManagerLocal manager = LookupUtil.getSystemManager();
- options = manager.getSystemConfiguration();
- String providerUrl = options.getProperty(RHQConstants.LDAPUrl, "(unavailable)");
- actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
- "admin.role.LdapCommunicationMessage", providerUrl));
- saveErrors(request, actionMessages);
- }
- }
- } catch (LdapFilterException lce) {
- ActionMessages actionMessages = new ActionMessages();
- actionMessages.add(ActionMessages.GLOBAL_MESSAGE,
- new ActionMessage("admin.role.LdapGroupFilterMessage"));
- saveErrors(request, actionMessages);
- } catch (LdapCommunicationException lce) {
- ActionMessages actionMessages = new ActionMessages();
- String providerUrl = options.getProperty(RHQConstants.LDAPUrl, "(unavailable)");
- actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
- "admin.role.LdapCommunicationMessage", providerUrl));
- saveErrors(request, actionMessages);
- }
- }
return returnSuccess(request, mapping, parms, false);
}
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/AuthenticateUserAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/AuthenticateUserAction.java
index 432d95c..19d7bd3 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/AuthenticateUserAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/AuthenticateUserAction.java
@@ -38,8 +38,6 @@ import org.apache.struts.tiles.actions.TilesAction;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.criteria.SubjectCriteria;
-import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.legacy.AttrConstants;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.WebUser;
@@ -79,6 +77,7 @@ public class AuthenticateUserAction extends TilesAction {
log.debug("Logged in as [" + logonForm.getJ_username() + "] with session id [" + sessionId + "]");
+ boolean hasPrincipal = true;
if (subject.getId() == 0) {
// Subject with a ID of 0 means the subject wasn't in the database but the login succeeded.
// This means the login method detected that LDAP authenticated the user and just gave us a dummy subject.
@@ -86,47 +85,6 @@ public class AuthenticateUserAction extends TilesAction {
needsRegistration = true;
}
- // figure out if the user has a principal
- boolean usingLDAP = usingLDAPAuthentication(ctx);
- boolean hasPrincipal = false;
-
- if (usingLDAP) {
- // when we allow for LDAP authentication, we may still have users logging in with JDBC.
- // The only way we can distinguish these users is by checking to see if they have an
- // entry in the principals table. If they do, then we know we use JDBC authentication
- // for that user. If they do not, then we must be using LDAP to authenticate that user.
- hasPrincipal = subjectManager.isUserWithPrincipal(logonForm.getJ_username());
-
- if (!hasPrincipal && needsRegistration) {
- //for the case when they're already registered but entering a case sensitive different name
- //BZ-586435: insert case insensitivity for usernames with ldap auth
- // locate first matching subject and attach.
- SubjectCriteria subjectCriteria = new SubjectCriteria();
- subjectCriteria.setCaseSensitive(false);
- subjectCriteria.setStrict(true);
- subjectCriteria.addFilterName(logonForm.getJ_username());
- PageList<Subject> subjectsLocated = LookupUtil.getSubjectManager().findSubjectsByCriteria(
- LookupUtil.getSubjectManager().getOverlord(), subjectCriteria);
- //if subject variants located then take the first one with a principal otherwise do nothing
- //To defend against the case where they create an account with the same name but not
- //case as an rhq sysadmin or higher perms, then make them relogin with same creds entered.
- if (!subjectsLocated.isEmpty()) {//then case insensitive username matches found. Try to use instead.
- Subject ldapSubject = subjectsLocated.get(0);
- String msg = "Located existing ldap account with different case for [" + ldapSubject.getName()
- + "]. " + "Attempting to authenticate with that account instead.";
- log.info(msg);
- subject = subjectManager.login(ldapSubject.getName(), logonForm.getJ_password());
- sessionId = subject.getSessionId();
- log.debug("Logged in as [" + ldapSubject.getName() + "] with session id [" + sessionId + "]");
- needsRegistration = false;
- }
- }
-
- } else {
- // with regular JDBC authentication, we are guaranteed to have a principal
- hasPrincipal = true;
- }
-
if (!needsRegistration) {
subject = subjectManager.loadUserConfiguration(subject.getId());
subject.setSessionId(sessionId); // put the transient data back into our new subject
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index 3b125e1..8e76409 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -59,10 +59,12 @@ import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.core.CustomJaasDeploymentServiceMBean;
import org.rhq.enterprise.server.exception.LoginException;
+import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import org.rhq.enterprise.server.util.LookupUtil;
/**
* Provides functionality to access and manipulate subjects and principals, mainly for authentication purposes.
@@ -84,6 +86,10 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
private ResourceGroupManagerLocal resourceGroupManager;
@EJB
+ @IgnoreDependency
+ private LdapGroupManagerLocal ldapManager;
+
+ @EJB
private SystemManagerLocal systemManager;
@EJB
@@ -274,7 +280,7 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
Subject subject = getSubjectByName(username);
- if (subject != null) {
+ if (subject != null) {//regular JDBC user
if (!subject.getFactive()) {
throw new LoginException("User account has been disabled.");
}
@@ -286,6 +292,9 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
try {
int sessionId = sessionManager.getSessionIdFromUsername(username);
subject.setSessionId(sessionId);
+ //insert processing for LDAP users who have registered before and have jdbc credentials
+ log.trace("Processing subject '" + subject.getName() + "' for LDAP functionality.");
+ subject = processSubjectForLdap(subject, password, false);
return subject;
} catch (SessionException se) {
// nope, no session; continue on so we can create the session
@@ -317,6 +326,103 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
return subject;
}
+ /**This method is applied to non-null Subject instances that may require LDAP auth/authz processing.
+ *
+ * @param subject Authenticated subject.
+ * @return same or new Subject returned from LDAP processing.
+ * @throws LoginException
+ */
+ public Subject processSubjectForLdap(Subject subject, String subjectPassword, boolean ldapRegistration)
+ throws LoginException {
+
+ if (subject != null) {//null check
+ //if user has principal then bail as LDAP processing not required
+ boolean userHasPrincipal = isUserWithPrincipal(subject.getName());
+
+ //if user has principal then return as non-ldap user
+ if (userHasPrincipal) {
+ return subject; //bail. No further checking required.
+ } else {//Start LDAP check.
+ //retrieve configuration properties and do LDAP check
+ Properties config = systemManager.getSystemConfiguration();
+ boolean ldapConfigured = config.getProperty(RHQConstants.JAASProvider).equals(
+ RHQConstants.LDAPJAASProvider);
+
+ if (ldapConfigured) {//i)registration ii)case sensitive matches iii)authorization updates
+ if ((subject.getId() == 0) && ldapRegistration) {//insert overlord registration and login
+ //check that session is valid
+ if (!isValidSessionId(subject.getSessionId(), subject.getName(), subject.getId())) {
+ throw new LoginException("User session not valid. Login to proceed.");
+ }
+ //we've verified that this user has valid session, requires registration and that ldap is configured.
+ Subject superuser = getOverlord();
+
+ // create the subject, but don't add a principal since LDAP will handle authentication
+ log.trace("registering new LDAP-authenticated subject [" + subject.getName() + "]");
+ createSubject(superuser, subject);
+
+ // nuke the temporary session and establish a new
+ // one for this subject.. must be done before pulling the
+ // new subject in order to do it with his own credentials
+ logout(subject.getSessionId().intValue());
+ subject = login(subject.getName(), subjectPassword);
+ } else {//already registered
+ //BZ-586435: insert case insensitivity for usernames with ldap auth
+ // locate first matching subject and attach.
+ SubjectCriteria subjectCriteria = new SubjectCriteria();
+ subjectCriteria.setCaseSensitive(false);
+ subjectCriteria.setStrict(true);
+ subjectCriteria.addFilterName(subject.getName());
+ PageList<Subject> subjectsLocated = LookupUtil.getSubjectManager().findSubjectsByCriteria(
+ subject, subjectCriteria);
+ //if subject variants located then take the first one with a principal otherwise do nothing
+ //To defend against the case where they create an account with the same name but not
+ //case as an rhq sysadmin or higher perms, then make them relogin with same creds entered.
+ if ((!subjectsLocated.isEmpty())
+ && (!subjectsLocated.get(0).getName().equals(subject.getName()))) {//then case insensitive username matches found. Try to use instead.
+ Subject ldapSubject = subjectsLocated.get(0);
+ String msg = "Located existing ldap account with different case for ["
+ + ldapSubject.getName() + "]. "
+ + "Attempting to authenticate with that account instead.";
+ log.info(msg);
+ subject = login(ldapSubject.getName(), subjectPassword);
+ Integer sessionId = subject.getSessionId();
+ log.debug("Logged in as [" + ldapSubject.getName() + "] with session id [" + sessionId
+ + "]");
+ }
+ // {//now carry out authz refresh for this Subject
+ // if (subject.getId() > 0) {
+ // //BZ-580127: only do group authz check if one or both of group filter fields is set
+ // Properties options = systemManager.getSystemConfiguration();
+ // String groupFilter = (String) options.getProperty(RHQConstants.LDAPGroupFilter, "");
+ // String groupMember = (String) options.getProperty(RHQConstants.LDAPGroupMember, "");
+ // if ((groupFilter.trim().length() > 0) || (groupMember.trim().length() > 0)) {
+ // List<String> groupNames = new ArrayList<String>(ldapManager
+ // .findAvailableGroupsFor(subject.getName()));
+ // ldapManager.assignRolesToLdapSubject(subject.getId(), groupNames);
+ // }
+ // }
+ // }
+ }
+ {//now carry out authz refresh for this Subject
+ if (subject.getId() > 0) {
+ //BZ-580127: only do group authz check if one or both of group filter fields is set
+ Properties options = systemManager.getSystemConfiguration();
+ String groupFilter = (String) options.getProperty(RHQConstants.LDAPGroupFilter, "");
+ String groupMember = (String) options.getProperty(RHQConstants.LDAPGroupMember, "");
+ if ((groupFilter.trim().length() > 0) || (groupMember.trim().length() > 0)) {
+ List<String> groupNames = new ArrayList<String>(ldapManager
+ .findAvailableGroupsFor(subject.getName()));
+ ldapManager.assignRolesToLdapSubject(subject.getId(), groupNames);
+ }
+ }
+ }
+ }
+ }
+ }
+ return subject;
+ }
+
/**
* @see org.rhq.enterprise.server.auth.SubjectManagerLocal#logout(Subject)
*/
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
index d62096b..2b00345 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
@@ -219,4 +219,6 @@ public interface SubjectManagerLocal {
*/
PageList<Subject> findSubjectsByCriteria(Subject subject, SubjectCriteria criteria);
+ Subject processSubjectForLdap(Subject subject, String subjectPassword, boolean ldapRegistration)
+ throws LoginException;
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/LdapLoginModule.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/LdapLoginModule.java
index bb29a47..6136d27 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/LdapLoginModule.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/LdapLoginModule.java
@@ -19,11 +19,8 @@
package org.rhq.enterprise.server.core.jaas;
import java.security.acl.Group;
-import java.util.ArrayList;
import java.util.Iterator;
-import java.util.List;
import java.util.Properties;
-import java.util.Set;
import java.util.Map.Entry;
import javax.naming.Context;
@@ -39,12 +36,6 @@ import org.apache.commons.logging.LogFactory;
import org.jboss.security.SimpleGroup;
import org.jboss.security.auth.spi.UsernamePasswordLoginModule;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.resource.group.LdapGroup;
-import org.rhq.core.domain.util.PageControl;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.server.auth.SubjectManagerLocal;
-import org.rhq.enterprise.server.authz.RoleManagerLocal;
import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.enterprise.server.util.security.UntrustedSSLSocketFactory;
@@ -207,40 +198,6 @@ public class LdapLoginModule extends UsernamePasswordLoginModule {
//if successful then verified that user and pw are valid ldap credentials
ctx.reconnect(null);
- //if group auth enabled and user acct already exists then insert authorization check
- String groupFilter = (String) options.get("GroupFilter");
- String groupMember = (String) options.get("GroupMemberFilter");
- SubjectManagerLocal sManager = LookupUtil.getSubjectManager();
- Subject ldapSubject = sManager.getSubjectByName(getUsername());
- if (ldapSubject != null && ((groupFilter != null) && !groupFilter.trim().equals(""))
- && ((groupMember != null) && !groupMember.trim().equals(""))) {
- //check authorized groups to see if this user is authorized via ldap
- //BUT still must always return true as authz is handled by RHQ if roles/groups correct
-
- //retrieve all ldap groups that this user is authorized for based on ldap group filter and group member settings
- Set<String> authorizedLdapGroups = ldapManager.findAvailableGroupsFor(userName);
- RoleManagerLocal roleManager = LookupUtil.getRoleManager();
-
- //find all currently mapped ldap groups
- PageList<LdapGroup> allCurrentLdapGroupsRegistered = ldapManager.findLdapGroups(PageControl
- .getUnlimitedInstance());
-
- //find all roles for currently mapped ldap groups.
- //empty current user from all groups -synch
- for (LdapGroup gp : allCurrentLdapGroupsRegistered) {
- if (gp.getRole() != null) {
- gp.getRole().removeSubject(ldapSubject);
- }
- }
- if (authorizedLdapGroups.isEmpty()) {
- return true; //bailing out as now correctly authorized correctly.
- }
-
- //else add this subject back to all AuthoriziedLdapGroups
- //lookup all roles that map to the authorizedLdapGroup names
- List authorizedList = new ArrayList(authorizedLdapGroups);
- ldapManager.assignRolesToLdapSubject(ldapSubject.getId(), authorizedList);
- }
return true;
}
commit 100fcb7bef6bafcc061e308c1a1240c7c2343372
Merge: 98209e5... e19fff4...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Oct 20 13:11:14 2010 -0400
Merge remote branch 'origin/gwt-ldap' into gwt-ldap2
commit 98209e5176c76ad61bccc00313591f7eff3768aa
Merge: b949685... 39280ce...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Oct 20 12:31:16 2010 -0400
Merge remote branch 'origin/gwt-ldap' into gwt-ldap2
commit b9496858222af18d9d04a2b515390dc258495140
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 19 16:27:00 2010 -0400
Revert " BZ-644344: fix for ldap accounts named 'admin' case insensitive."
This reverts commit 3989386b8cf1fa4ff96c973b4f93eefe4df0f902.
- no need. Case insensitive check still returns 'admin' which is still not allowed.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java
index a821bde..e862db9 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java
@@ -87,10 +87,9 @@ public class JDBCPrincipalCheckLoginModule extends UsernamePasswordLoginModule {
@Override
protected String getUsersPassword() throws LoginException {
String username = getUsername();
- if ("admin".equalsIgnoreCase(username)) {
+ if ("admin".equals(username)) {
throw new FailedLoginException("Cannot log in as overlord");
}
-
String password = getUsernameAndPassword()[1]; // what did the user enter?
Connection conn = null;
PreparedStatement ps = null;
commit 3989386b8cf1fa4ff96c973b4f93eefe4df0f902
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 19 12:26:46 2010 -0400
BZ-644344: fix for ldap accounts named 'admin' case insensitive.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java
index e862db9..a821bde 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/JDBCPrincipalCheckLoginModule.java
@@ -87,9 +87,10 @@ public class JDBCPrincipalCheckLoginModule extends UsernamePasswordLoginModule {
@Override
protected String getUsersPassword() throws LoginException {
String username = getUsername();
- if ("admin".equals(username)) {
+ if ("admin".equalsIgnoreCase(username)) {
throw new FailedLoginException("Cannot log in as overlord");
}
+
String password = getUsernameAndPassword()[1]; // what did the user enter?
Connection conn = null;
PreparedStatement ps = null;
13 years, 7 months
[rhq] 2 commits - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java | 49 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/TemplateAlertDefinitionsView.java | 134 ++++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java | 44 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java | 171 +++++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java | 85 ++++
modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml | 8
8 files changed, 366 insertions(+), 132 deletions(-)
New commits:
commit e17fe828c93ecadae7cd07ca14ea643c15beac08
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Sat Oct 23 11:58:59 2010 -0400
there was a bug in the resource type repo code such that
if we loaded a resource type in the cache already but the cache
did not load any metadata, the typeCacheLevel map did not
have the type in it, which causes the if-stmt to erroneously conclude
it did not have to add the type to the typesNeeded collection (the containsKey
resulted in false, meaning the else clause got invoked).
This commit changes the if-stmt to cover that additional edge case.
I added a comment above the if-stmt to indicate the three cases in
which we should be adding to the typesNeeded collection.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
index 1c01176..c998010 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
@@ -26,6 +26,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -160,8 +161,17 @@ public class ResourceTypeRepository {
});
}
- public void getResourceTypes(Integer[] resourceTypeIds, final EnumSet<MetadataType> metadataTypes,
+ public void getResourceTypes(Integer[] resourceTypeIds, EnumSet<MetadataType> metadataTypesNeeded,
final TypesLoadedCallback callback) {
+
+ // note metadataTypesNeeded == null implies EnumSet.noneOf(MetadataType.class)
+ final EnumSet<MetadataType> metadataTypes;
+ if (metadataTypesNeeded == null) {
+ metadataTypes = EnumSet.noneOf(MetadataType.class);
+ } else {
+ metadataTypes = metadataTypesNeeded;
+ }
+
ResourceTypeCriteria criteria = new ResourceTypeCriteria();
final Map<Integer, ResourceType> cachedTypes = new HashMap<Integer, ResourceType>();
@@ -172,9 +182,14 @@ public class ResourceTypeRepository {
} else {
for (Integer typeId : resourceTypeIds) {
- if (!typeCache.containsKey(typeId)
- || (metadataTypes != null && (typeCacheLevel.containsKey(typeId)) && !typeCacheLevel.get(typeId)
- .containsAll(metadataTypes))) {
+ // we need to query for data if:
+ // 1. we don't have the resource type in our cache at all, or...
+ // 2. we have the basic resource type but no additional metadata, but the caller is asking for additional metadata
+ // 3. we have the resource type and some additional metadata, but the caller is asking for metadata that we don't have
+ if (!typeCache.containsKey(typeId) // 1.
+ || (!metadataTypes.isEmpty() && (!typeCacheLevel.containsKey(typeId) // 2.
+ || !typeCacheLevel.get(typeId).containsAll(metadataTypes)))) // 3.
+ {
typesNeeded.add(typeId);
} else {
cachedTypes.put(typeId, typeCache.get(typeId));
@@ -193,41 +208,42 @@ public class ResourceTypeRepository {
if (metadataTypes != null) {
for (MetadataType metadataType : metadataTypes) {
switch (metadataType) {
- case children:
- criteria.fetchChildResourceTypes(true);
- break;
- case content:
- criteria.fetchPackageTypes(true);
- break;
- case events:
- criteria.fetchEventDefinitions(true);
- break;
- case measurements:
- criteria.fetchMetricDefinitions(true);
- break;
- case operations:
- criteria.fetchOperationDefinitions(true);
- break;
- case parentTypes:
- criteria.fetchParentResourceTypes(true);
- break;
- case pluginConfigurationDefinition:
- criteria.fetchPluginConfigurationDefinition(true);
- break;
- case processScans:
- criteria.fetchProcessScans(true);
- break;
- case productVersions:
- criteria.fetchProductVersions(true);
- break;
- case resourceConfigurationDefinition:
- criteria.fetchResourceConfigurationDefinition(true);
- break;
- case subCategory:
- criteria.fetchSubCategory(true);
- break;
- default:
- System.err.println("ERROR: metadataType " + metadataType.name() + " not incorporated into ResourceType criteria.");
+ case children:
+ criteria.fetchChildResourceTypes(true);
+ break;
+ case content:
+ criteria.fetchPackageTypes(true);
+ break;
+ case events:
+ criteria.fetchEventDefinitions(true);
+ break;
+ case measurements:
+ criteria.fetchMetricDefinitions(true);
+ break;
+ case operations:
+ criteria.fetchOperationDefinitions(true);
+ break;
+ case parentTypes:
+ criteria.fetchParentResourceTypes(true);
+ break;
+ case pluginConfigurationDefinition:
+ criteria.fetchPluginConfigurationDefinition(true);
+ break;
+ case processScans:
+ criteria.fetchProcessScans(true);
+ break;
+ case productVersions:
+ criteria.fetchProductVersions(true);
+ break;
+ case resourceConfigurationDefinition:
+ criteria.fetchResourceConfigurationDefinition(true);
+ break;
+ case subCategory:
+ criteria.fetchSubCategory(true);
+ break;
+ default:
+ Log.error("ERROR: metadataType " + metadataType.name()
+ + " not incorporated into ResourceType criteria.");
}
}
}
@@ -249,43 +265,44 @@ public class ResourceTypeRepository {
if (metadataTypes != null) {
for (MetadataType metadataType : metadataTypes) {
switch (metadataType) {
- case children:
- cachedType.setChildResourceTypes(type.getChildResourceTypes());
- break;
- case content:
- cachedType.setPackageTypes(type.getPackageTypes());
- break;
- case events:
- cachedType.setPackageTypes(type.getPackageTypes());
- break;
- case measurements:
- cachedType.setMetricDefinitions(type.getMetricDefinitions());
- break;
- case operations:
- cachedType.setOperationDefinitions(type.getOperationDefinitions());
- break;
- case parentTypes:
- cachedType.setParentResourceTypes(type.getParentResourceTypes());
- break;
- case pluginConfigurationDefinition:
- cachedType
- .setPluginConfigurationDefinition(type.getPluginConfigurationDefinition());
- break;
- case processScans:
- cachedType.setProcessScans(type.getProcessScans());
- break;
- case productVersions:
- cachedType.setProductVersions(type.getProductVersions());
- break;
- case resourceConfigurationDefinition:
- cachedType.setResourceConfigurationDefinition(type
- .getResourceConfigurationDefinition());
- break;
- case subCategory:
- cachedType.setSubCategory(type.getSubCategory());
- break;
- default:
- System.err.println("ERROR: metadataType " + metadataType.name() + " not merged into cached ResourceType.");
+ case children:
+ cachedType.setChildResourceTypes(type.getChildResourceTypes());
+ break;
+ case content:
+ cachedType.setPackageTypes(type.getPackageTypes());
+ break;
+ case events:
+ cachedType.setPackageTypes(type.getPackageTypes());
+ break;
+ case measurements:
+ cachedType.setMetricDefinitions(type.getMetricDefinitions());
+ break;
+ case operations:
+ cachedType.setOperationDefinitions(type.getOperationDefinitions());
+ break;
+ case parentTypes:
+ cachedType.setParentResourceTypes(type.getParentResourceTypes());
+ break;
+ case pluginConfigurationDefinition:
+ cachedType
+ .setPluginConfigurationDefinition(type.getPluginConfigurationDefinition());
+ break;
+ case processScans:
+ cachedType.setProcessScans(type.getProcessScans());
+ break;
+ case productVersions:
+ cachedType.setProductVersions(type.getProductVersions());
+ break;
+ case resourceConfigurationDefinition:
+ cachedType.setResourceConfigurationDefinition(type
+ .getResourceConfigurationDefinition());
+ break;
+ case subCategory:
+ cachedType.setSubCategory(type.getSubCategory());
+ break;
+ default:
+ System.err.println("ERROR: metadataType " + metadataType.name()
+ + " not merged into cached ResourceType.");
}
}
}
@@ -295,7 +312,7 @@ public class ResourceTypeRepository {
cachedTypes.put(type.getId(), type);
}
- if (metadataTypes != null) {
+ if (metadataTypes != null && !metadataTypes.isEmpty()) {
if (typeCacheLevel.containsKey(type.getId())) {
typeCacheLevel.get(type.getId()).addAll(metadataTypes);
} else {
commit 3544cc5af47788cb6d7a1b23a82389e2abdd4578
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Sat Oct 23 11:49:51 2010 -0400
add new alert template GWT service to support alert template modifications
complete the alert template component so it calls the new GWT service to manipulate alert templates in the DB
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
index f0916e2..3097982 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
@@ -78,6 +78,7 @@
<servlet path="/AlertGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AlertGWTServiceImpl"/>
<servlet path="/AlertDefinitionGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AlertDefinitionGWTServiceImpl"/>
+ <servlet path="/AlertTemplateGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AlertTemplateGWTServiceImpl"/>
<servlet path="/AuthorizationGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AuthorizationGWTServiceImpl"/>
<servlet path="/AvailabilityGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AvailabilityGWTServiceImpl"/>
<servlet path="/BundleGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.BundleGWTServiceImpl"/>
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
index bd0a433..6e6c9c4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java
@@ -18,7 +18,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.templates;
-import com.google.gwt.user.client.rpc.AsyncCallback;
+import java.util.Map;
+
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionStyle;
@@ -38,10 +39,8 @@ import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeGridField;
import com.smartgwt.client.widgets.tree.TreeNode;
-import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
@@ -50,7 +49,8 @@ import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.alert.definitions.TemplateAlertDefinitionsView;
import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.TypesLoadedCallback;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -205,33 +205,20 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
parentCanvas.markForRedraw();
}
- private void editAlertTemplate(final int resourceTypeId, final ViewPath viewPath) {
- ResourceTypeCriteria criteria = new ResourceTypeCriteria();
- criteria.addFilterId(resourceTypeId);
- // TODO we need to fetch some collections here
-
- GWTServiceLookup.getResourceTypeGWTService().findResourceTypesByCriteria(criteria,
- new AsyncCallback<PageList<ResourceType>>() {
- @Override
- public void onSuccess(PageList<ResourceType> result) {
- if (result != null && result.size() == 1) {
- ResourceType rt = result.get(0);
- Layout alertCanvas = getAlertTemplateCanvas();
- String locatorId = extendLocatorId("alertTemplateDef");
- TemplateAlertDefinitionsView def = new TemplateAlertDefinitionsView(locatorId, rt);
- def.renderView(viewPath.next());
- prepareSubCanvas(alertCanvas, def, viewPath.isEnd()); // don't show our back button if we are going to a template details pane which has its own back button
- switchToCanvas(ResourceTypeTreeView.this, alertCanvas);
- } else {
- CoreGUI.getErrorHandler().handleError("Failed to get resource type: " + resourceTypeId);
- }
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Error getting resource type: " + resourceTypeId, caught);
- }
- });
+ private void editAlertTemplate(int resourceTypeId, final ViewPath viewPath) {
+ final Integer[] idArray = new Integer[] { resourceTypeId };
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(idArray, new TypesLoadedCallback() {
+ @Override
+ public void onTypesLoaded(Map<Integer, ResourceType> types) {
+ ResourceType rt = types.get(idArray[0]);
+ Layout alertCanvas = getAlertTemplateCanvas();
+ String locatorId = extendLocatorId("alertTemplateDef");
+ TemplateAlertDefinitionsView def = new TemplateAlertDefinitionsView(locatorId, rt);
+ def.renderView(viewPath.next());
+ prepareSubCanvas(alertCanvas, def, viewPath.isEnd()); // don't show our back button if we are going to a template details pane which has its own back button
+ switchToCanvas(ResourceTypeTreeView.this, alertCanvas);
+ }
+ });
}
private void editMetricTemplate(int resourceTypeId) {
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 c26a8f9..ef91200 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
@@ -25,14 +25,18 @@ package org.rhq.enterprise.gui.coregui.client.alert.definitions;
import java.util.EnumSet;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
-import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.MetadataType;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* @author John Mazzitelli
@@ -87,6 +91,16 @@ public class TemplateAlertDefinitionsView extends AbstractAlertDefinitionsView {
}
@Override
+ public SingleAlertDefinitionView getDetailsView(int id) {
+ SingleAlertDefinitionView view = super.getDetailsView(id);
+ if (id == 0) {
+ // when creating a new alert def, make sure to set this in the new alert def
+ view.getAlertDefinition().setResourceType(resourceType);
+ }
+ return view;
+ }
+
+ @Override
protected boolean isAllowedToModifyAlertDefinitions() {
// TODO: see if user can modify template alerts
return true;
@@ -94,48 +108,122 @@ public class TemplateAlertDefinitionsView extends AbstractAlertDefinitionsView {
@Override
protected void newButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
- for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
- }
- SC.say(str);
+ newDetails();
}
@Override
protected void enableButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
+ if (selection.length == 0) {
+ return;
+ }
+
+ final Integer[] alertDefIds = new Integer[selection.length];
+ int i = 0;
for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
+ Integer id = record.getAttributeAsInt(AbstractAlertDefinitionsDataSource.FIELD_ID);
+ alertDefIds[i++] = id;
}
- SC.say(str);
+
+ GWTServiceLookup.getAlertTemplateService().enableAlertTemplates(alertDefIds, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void v) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("[" + alertDefIds.length + "] alert templates enabled.", Severity.Info));
+ TemplateAlertDefinitionsView.this.refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to enable alert templates", caught);
+ }
+ });
}
@Override
protected void disableButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
+ if (selection.length == 0) {
+ return;
+ }
+
+ final Integer[] alertDefIds = new Integer[selection.length];
+ int i = 0;
for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
+ Integer id = record.getAttributeAsInt(AbstractAlertDefinitionsDataSource.FIELD_ID);
+ alertDefIds[i++] = id;
}
- SC.say(str);
+
+ GWTServiceLookup.getAlertTemplateService().disableAlertTemplates(alertDefIds, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void v) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("[" + alertDefIds.length + "] alert templates disabled.", Severity.Info));
+ TemplateAlertDefinitionsView.this.refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to disable alert templates", caught);
+ }
+ });
}
@Override
protected void deleteButtonPressed(ListGridRecord[] selection) {
- // TODO Auto-generated method stub
- String str = "this is not implemented yet but you selected";
+ if (selection.length == 0) {
+ return;
+ }
+
+ final Integer[] alertDefIds = new Integer[selection.length];
+ int i = 0;
for (ListGridRecord record : selection) {
- str += ": " + record.getAttribute("name");
+ Integer id = record.getAttributeAsInt(AbstractAlertDefinitionsDataSource.FIELD_ID);
+ alertDefIds[i++] = id;
}
- SC.say(str);
+
+ GWTServiceLookup.getAlertTemplateService().removeAlertTemplates(alertDefIds, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void v) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("[" + alertDefIds.length + "] alert templates deleted.", Severity.Info));
+ TemplateAlertDefinitionsView.this.refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to delete alert templates", caught);
+ }
+ });
}
@Override
- protected void commitAlertDefinition(AlertDefinition alertDefinition) {
- // TODO call into server SLSB to store alert def
- // AlertTemplateManagerLocal alertTemplateManager = LookupUtil.getAlertTemplateManager();
- // alertTemplateManager.updateAlertTemplate(subject, alertDef, true);
+ protected void commitAlertDefinition(final AlertDefinition alertDefinition) {
+ if (alertDefinition.getId() == 0) {
+ GWTServiceLookup.getAlertTemplateService().createAlertTemplate(alertDefinition,
+ Integer.valueOf(this.resourceType.getId()), new AsyncCallback<Integer>() {
+ @Override
+ public void onSuccess(Integer result) {
+ CoreGUI.getMessageCenter().notify(new Message("Alert template is created", Severity.Info));
+ alertDefinition.setId(result.intValue());
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to create alert template.", caught);
+ }
+ });
+ } else {
+ GWTServiceLookup.getAlertTemplateService().updateAlertTemplate(alertDefinition, true,
+ new AsyncCallback<AlertDefinition>() {
+ @Override
+ public void onSuccess(AlertDefinition result) {
+ CoreGUI.getMessageCenter().notify(new Message("Alert template is updated.", Severity.Info));
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to update alert template.", caught);
+ }
+ });
+ }
}
}
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
new file mode 100644
index 0000000..da8bf55
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertTemplateGWTService.java
@@ -0,0 +1,44 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.gwt;
+
+import com.google.gwt.user.client.rpc.RemoteService;
+
+import org.rhq.core.domain.alert.AlertDefinition;
+
+public interface AlertTemplateGWTService extends RemoteService {
+
+ int createAlertTemplate(AlertDefinition alertDefinition, Integer resourceTypeId) throws Exception;
+
+ /**
+ * Updates a alert template definition.
+ *
+ * @param alertDefinition
+ * @param purgeInternals must be true if you are updating conditions or dampening settings, can be false otherwise
+ * @return the updated definition
+ * @throws Exception
+ */
+ AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean purgeInternals) throws Exception;
+
+ void enableAlertTemplates(Integer[] alertDefinitionIds) throws Exception;
+
+ void disableAlertTemplates(Integer[] alertDefinitionIds) throws Exception;
+
+ void removeAlertTemplates(Integer[] alertDefinitionIds) throws Exception;
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
index 92fc25d..67218c5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java
@@ -41,6 +41,10 @@ public class GWTServiceLookup {
return secure(AlertDefinitionGWTServiceAsync.Util.getInstance());
}
+ public static AlertTemplateGWTServiceAsync getAlertTemplateService() {
+ return secure(AlertTemplateGWTServiceAsync.Util.getInstance());
+ }
+
public static GroupAlertDefinitionGWTServiceAsync getGroupAlertDefinitionService() {
return secure(GroupAlertDefinitionGWTServiceAsync.Util.getInstance());
}
@@ -169,7 +173,7 @@ public class GWTServiceLookup {
Log.debug("SessionRpcRequestBuilder is adding sessionId to request: " + sessionId);
rb.setHeader(UserSessionManager.SESSION_NAME, sessionId);
} else {
- Log.error("SessionRpcRequestBuilder constructed without a value for " + UserSessionManager.SESSION_NAME);
+ Log.error("SessionRpcRequestBuilder built without a value for " + UserSessionManager.SESSION_NAME);
}
return rb;
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
new file mode 100644
index 0000000..55a24e3
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertTemplateGWTServiceImpl.java
@@ -0,0 +1,85 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.server.gwt;
+
+import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.util.exception.ThrowableUtil;
+import org.rhq.enterprise.gui.coregui.client.gwt.AlertTemplateGWTService;
+import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
+import org.rhq.enterprise.server.alert.AlertTemplateManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+public class AlertTemplateGWTServiceImpl extends AbstractGWTServiceImpl implements AlertTemplateGWTService {
+ private static final long serialVersionUID = 1L;
+
+ private AlertTemplateManagerLocal alertTemplateManager = LookupUtil.getAlertTemplateManager();
+
+ @Override
+ public int createAlertTemplate(AlertDefinition alertDefinition, Integer resourceTypeId) throws Exception {
+ try {
+ int results = alertTemplateManager
+ .createAlertTemplate(getSessionSubject(), alertDefinition, resourceTypeId);
+ return results;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public AlertDefinition updateAlertTemplate(AlertDefinition alertDefinition, boolean purgeInternals)
+ throws Exception {
+ try {
+ AlertDefinition results = alertTemplateManager.updateAlertTemplate(getSessionSubject(), alertDefinition,
+ purgeInternals);
+ return SerialUtility.prepare(results, "AlertTemplateService.updateAlertTemplate");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public void enableAlertTemplates(Integer[] alertDefinitionIds) throws Exception {
+ try {
+ alertTemplateManager.enableAlertTemplates(getSessionSubject(), alertDefinitionIds);
+ return;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public void disableAlertTemplates(Integer[] alertDefinitionIds) throws Exception {
+ try {
+ alertTemplateManager.disableAlertTemplates(getSessionSubject(), alertDefinitionIds);
+ return;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public void removeAlertTemplates(Integer[] alertDefinitionIds) throws Exception {
+ try {
+ alertTemplateManager.removeAlertTemplates(getSessionSubject(), alertDefinitionIds);
+ return;
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml b/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml
index 40e7f16..1202124 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml
+++ b/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml
@@ -49,6 +49,10 @@
<servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.AlertDefinitionGWTServiceImpl</servlet-class>
</servlet>
<servlet>
+ <servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI AlertTemplateGWTService</servlet-name>
+ <servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.AlertTemplateGWTServiceImpl</servlet-class>
+ </servlet>
+ <servlet>
<servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI GroupAlertDefinitionGWTService</servlet-name>
<servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.GroupAlertDefinitionGWTServiceImpl</servlet-class>
</servlet>
@@ -159,6 +163,10 @@
<url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/AlertDefinitionGWTService</url-pattern>
</servlet-mapping>
<servlet-mapping>
+ <servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI AlertTemplateGWTService</servlet-name>
+ <url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/AlertTemplateGWTService</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
<servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI GroupAlertDefinitionGWTService</servlet-name>
<url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/GroupAlertDefinitionGWTService</url-pattern>
</servlet-mapping>
13 years, 7 months