[rhq] Branch 'delete-agent-plugin' - modules/core modules/enterprise
by John Sanda
modules/core/domain/src/main/java/org/rhq/core/domain/alert/Alert.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotificationLog.java | 7
modules/enterprise/server/jar/pom.xml | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java | 11
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java | 146 +++-------
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.xml | 84 +++++
7 files changed, 171 insertions(+), 94 deletions(-)
New commits:
commit 0aeedb45b4c1924a25be152ae278427dc17edc95
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Nov 2 11:10:04 2010 -0400
Adding support for deleting alerts by template
When deleting a resource type, the alert definition templates for that
type need to be deleted as well. If they are not deleted, we run into a
FK constraint violation. This commit add JPQL queries and logic to
AlertManagerBean.deleteAlertsByContext to support deleting by template.
I have also updated and added tests in AlertManagerBeanTest. I have made
a significant change in the set up/tear down logic by utilizing dbunit.
By using dbunit we can more easily ensure that the relevant parts of the
db are in a known, consistent state before and after test runs. Tables
are seeded with data before each test, and then those tables are wiped
clean afterwards to avoid introducing side affects for other test
classes.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/Alert.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/Alert.java
index 737e1cf..e288428 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/Alert.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/Alert.java
@@ -123,6 +123,12 @@ import org.rhq.core.domain.alert.notification.AlertNotificationLog;
+ " FROM AlertDefinition ad " //
+ " JOIN ad.alerts innerA " //
+ " WHERE ad.resource.id IN ( :resourceIds ) )"),
+ @NamedQuery(name = Alert.QUERY_DELETE_BY_RESOURCE_TEMPLATE, query =
+ "DELETE FROM Alert alert "
+ + "WHERE alert.id IN (SELECT innerAlerts.id "
+ + " FROM AlertDefinition alertDef "
+ + " JOIN alertDef.alerts innerAlerts "
+ + " WHERE alertDef.resourceType.id = :resourceTypeId)"),
@NamedQuery(name = Alert.QUERY_DELETE_BY_RESOURCE_GROUPS, query = "" //
+ "DELETE FROM Alert alert " //
+ " WHERE alert.id IN ( SELECT innerA.id " //
@@ -217,6 +223,7 @@ public class Alert implements Serializable {
public static final String QUERY_DELETE_ALL = "Alert.deleteByAll";
public static final String QUERY_DELETE_BY_IDS = "Alert.deleteByIds";
public static final String QUERY_DELETE_BY_RESOURCES = "Alert.deleteByResources";
+ public static final String QUERY_DELETE_BY_RESOURCE_TEMPLATE = "Alert.deleteByResourceType";
public static final String QUERY_DELETE_BY_RESOURCE_GROUPS = "Alert.deleteByResourceGroups";
public static final String QUERY_ACKNOWLEDGE_ALL = "Alert.acknowledgeByAll";
public static final String QUERY_ACKNOWLEDGE_BY_IDS = "Alert.acknowledgeByIds";
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
index 8108605..e5f39c3 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
@@ -69,6 +69,12 @@ import javax.persistence.Table;
+ " FROM AlertDefinition ad " //
+ " JOIN ad.alerts alert " //
+ " WHERE ad.resource.id IN ( :resourceIds ) ))"),
+ @NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCE_TEMPLATE,
+ query = "DELETE AlertConditionLog log "
+ + " WHERE log.alert.id IN (SELECT alert.id "
+ + " FROM AlertDefinition alertDef "
+ + " JOIN alertDef.alerts alert "
+ + " WHERE alertDef.resourceType.id = :resourceTypeId)"),
@NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCE_GROUPS, //
query = "DELETE AlertConditionLog acl " //
+ " WHERE acl.alert.id IN ( SELECT alert.id " //
@@ -97,6 +103,7 @@ public class AlertConditionLog implements Serializable {
public static final String QUERY_DELETE_ALL = "AlertConditionLog.deleteByAll";
public static final String QUERY_DELETE_BY_ALERT_IDS = "AlertConditionLog.deleteByAlertIds";
public static final String QUERY_DELETE_BY_RESOURCES = "AlertConditionLog.deleteByResources";
+ public static final String QUERY_DELETE_BY_RESOURCE_TEMPLATE = "AlertConditionLog.deleteByResourceType";
public static final String QUERY_DELETE_BY_RESOURCE_GROUPS = "AlertConditionLog.deleteByResourceGroups";
public static final String QUERY_DELETE_BY_ALERT_CTIME = "AlertConditionLog.deleteByAlertCTime";
public static final String QUERY_DELETE_UNMATCHED_BY_ALERT_DEFINITION_ID = "AlertConditionLog.deleteUnmatchedByAlertDefinitionId";
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotificationLog.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotificationLog.java
index 9408ce2..a1293a5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotificationLog.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotificationLog.java
@@ -68,6 +68,12 @@ import org.rhq.core.domain.alert.Alert;
+ " FROM AlertDefinition ad " //
+ " JOIN ad.alerts alert " //
+ " WHERE ad.resource.id IN ( :resourceIds ) ))"),
+ @NamedQuery(name = AlertNotificationLog.QUERY_DELETE_BY_RESOURCE_TEMPLATE,
+ query = "DELETE AlertNotificationLog log "
+ + " WHERE log.alert.id IN (SELECT alert.id "
+ + " FROM AlertDefinition alertDef "
+ + " JOIN alertDef.alerts alert "
+ + " WHERE alertDef.resourceType.id = :resourceTypeId)"),
@NamedQuery(name = AlertNotificationLog.QUERY_DELETE_BY_RESOURCE_GROUPS, //
query = "DELETE AlertNotificationLog anl " //
+ " WHERE anl.alert.id IN ( SELECT alert.id " //
@@ -91,6 +97,7 @@ public class AlertNotificationLog implements Serializable {
public static final String QUERY_DELETE_ALL = "AlertNotificationLog.deleteByAll";
public static final String QUERY_DELETE_BY_ALERT_IDS = "AlertNotificationLog.deleteByAlertIds";
public static final String QUERY_DELETE_BY_RESOURCES = "AlertNotificationLog.deleteByResources";
+ public static final String QUERY_DELETE_BY_RESOURCE_TEMPLATE = "AlertNotificationLog.deleteByResourceType";
public static final String QUERY_DELETE_BY_RESOURCE_GROUPS = "AlertNotificationLog.deleteByResourceGroups";
public static final String QUERY_DELETE_BY_ALERT_CTIME = "AlertNotificationLog.deleteByAlertCtime";
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index e33e006..84e48c0 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -27,6 +27,8 @@
<!-- dependency versions -->
<jboss-embeddable-ejb3.version>1.0.0.Alpha9</jboss-embeddable-ejb3.version>
+
+ <clean.db>true</clean.db>
</properties>
<dependencies>
@@ -535,6 +537,7 @@ Build-OS-Version=${os.version}
<embeddedDeployment>true</embeddedDeployment>
<deploymentDirectory>target/classes</deploymentDirectory>
<hibernate.dialect>${rhq.test.ds.hibernate-dialect}</hibernate.dialect>
+ <clean.db>${clean.db}</clean.db>
</systemPropertyVariables>
<additionalClasspathElements>
<!-- The below is required for tests to run against Oracle. -->
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
index 4a27685..aebb93b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
@@ -243,6 +243,17 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
deleteConditionLogsQuery = entityManager.createNamedQuery(AlertConditionLog.QUERY_DELETE_ALL);
deleteNotificationLogsQuery = entityManager.createNamedQuery(AlertNotificationLog.QUERY_DELETE_ALL);
deleteAlertsQuery = entityManager.createNamedQuery(Alert.QUERY_DELETE_ALL);
+ } else if (context.type == EntityContext.Type.ResourceTemplate) {
+ deleteAlertsQuery = entityManager.createNamedQuery(Alert.QUERY_DELETE_BY_RESOURCE_TEMPLATE);
+ deleteAlertsQuery.setParameter("resourceTypeId", context.resourceTypeId);
+
+ deleteConditionLogsQuery = entityManager.createNamedQuery(AlertConditionLog.QUERY_DELETE_BY_RESOURCE_TEMPLATE);
+ deleteConditionLogsQuery.setParameter("resourceTypeId", context.resourceTypeId);
+
+ deleteNotificationLogsQuery = entityManager.createNamedQuery(
+ AlertNotificationLog.QUERY_DELETE_BY_RESOURCE_TEMPLATE);
+ deleteNotificationLogsQuery.setParameter("resourceTypeId", context.resourceTypeId);
+
} else {
throw new IllegalArgumentException("No support for deleting alerts for " + context);
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
index e0cb447..579912c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
@@ -18,13 +18,22 @@
*/
package org.rhq.enterprise.server.alert.test;
+import java.util.List;
import java.util.Random;
import javax.persistence.EntityManager;
+import org.dbunit.database.DatabaseConnection;
+import org.dbunit.database.IDatabaseConnection;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.xml.FlatXmlDataSet;
+import org.dbunit.dataset.xml.FlatXmlProducer;
+import org.dbunit.operation.DatabaseOperation;
+import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertCondition;
@@ -55,113 +64,62 @@ public class AlertManagerBeanTest extends AbstractEJB3Test {
private Subject superuser;
private Resource newResource;
+
@BeforeMethod
public void beforeMethod() throws Exception {
alertManager = LookupUtil.getAlertManager();
superuser = LookupUtil.getSubjectManager().getOverlord();
- newResource = createNewResource();
- }
- @AfterMethod
- public void afterMethod() throws Exception {
- deleteNewResource(newResource);
+ IDatabaseConnection connection = new DatabaseConnection(getConnection());
+ DatabaseOperation.CLEAN_INSERT.execute(connection, getDataSet());
+
+ newResource = getEntityManager().find(Resource.class, 1);
}
- public void testAlertDelete() {
- assert 1 == alertManager.deleteAlertsByContext(superuser, EntityContext.forResource(newResource.getId()));
+ @AfterClass
+ public void cleanupDB() throws Exception {
+ if ("true".equals(System.getProperty("clean.db"))) {
+ IDatabaseConnection connection = new DatabaseConnection(getConnection());
+ DatabaseOperation.DELETE_ALL.execute(connection, getDataSet());
+ }
}
- public void testAlertDeleteInRange() {
- assert 1 == alertManager.deleteAlerts(0L, System.currentTimeMillis() + 600000L); // go out into the future to make sure we get our alert
+ IDataSet getDataSet() throws Exception {
+ FlatXmlProducer xmlProducer = new FlatXmlProducer(new InputSource(getClass()
+ .getResourceAsStream("AlertManagerBeanTest.xml")));
+ xmlProducer.setColumnSensing(true);
+ return new FlatXmlDataSet(xmlProducer);
}
- private Resource createNewResource() throws Exception {
- getTransactionManager().begin();
- EntityManager em = getEntityManager();
-
- Resource resource;
-
- try {
- try {
- long now = System.currentTimeMillis();
- ResourceType resourceType = new ResourceType("plat" + now, "test", ResourceCategory.PLATFORM, null);
-
- em.persist(resourceType);
-
- Agent agent = new Agent("testagent", "testaddress", 1, "", "testtoken");
- em.persist(agent);
- em.flush();
-
- resource = new Resource("reskey" + now, "resname", resourceType);
- resource.setAgent(agent);
- resource.setUuid("" + new Random().nextInt());
- em.persist(resource);
-
- AlertDefinition ad = new AlertDefinition();
- ad.setName("alertTest");
- ad.setEnabled(true);
- ad.setPriority(AlertPriority.HIGH);
- ad.setResource(resource);
- ad.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
- ad.setConditionExpression(BooleanExpression.ALL);
- ad.setRecoveryId(0);
- em.persist(ad);
-
- AlertCondition ac = new AlertCondition(ad, AlertConditionCategory.AVAILABILITY);
- ac.setComparator("==");
- em.persist(ac);
-
- AlertConditionLog acl = new AlertConditionLog(ac, now);
- acl.setValue("dummy value");
- em.persist(acl);
-
- Alert a = new Alert(ad, now);
- em.persist(a);
-
- AlertNotificationLog anl = new AlertNotificationLog(a, "dummy", ResultState.SUCCESS, "message");
- em.persist(anl);
-
- } catch (Exception e) {
- System.out.println("CANNOT PREPARE TEST: " + e);
- getTransactionManager().rollback();
- throw e;
- }
-
- getTransactionManager().commit();
- } finally {
- em.close();
- }
+ public void deleteAlertsForResource() {
+ assert 1 == alertManager.deleteAlertsByContext(superuser, EntityContext.forResource(newResource.getId()));
+ }
- return resource;
+ @SuppressWarnings("unchecked")
+ public void deleteAlertsForResourceTemplate() {
+ int resourceTypeId = 1;
+ int deletedCount = alertManager.deleteAlertsByContext(superuser, EntityContext.forTemplate(resourceTypeId));
+
+ List<AlertConditionLog> alertConditionLogs = getEntityManager().createQuery(
+ "from AlertConditionLog log where log.id = :id")
+ .setParameter("id", 2)
+ .getResultList();
+
+ List<AlertNotificationLog> notificationLogs = getEntityManager().createQuery(
+ "from AlertNotificationLog log where log.id = :id")
+ .setParameter("id", 2)
+ .getResultList();
+
+ assertEquals("Failed to delete alerts by template", 1, deletedCount);
+ assertEquals("Failed to delete alert condition logs when deleting alerts by template", 0,
+ alertConditionLogs.size());
+ assertEquals("Failed to delete alert notification logs when deleting alerts by template", 0,
+ notificationLogs.size());
}
- private void deleteNewResource(Resource resource) throws Exception {
- if (resource != null) {
- getTransactionManager().begin();
- EntityManager em = getEntityManager();
- try {
- ResourceType type = em.find(ResourceType.class, resource.getResourceType().getId());
- Resource res = em.find(Resource.class, resource.getId());
- Agent agent = em.find(Agent.class, resource.getAgent().getId());
-
- for (AlertDefinition ad : res.getAlertDefinitions()) {
- em.remove(ad);
- }
-
- em.remove(res);
- em.remove(agent);
- em.remove(type);
-
- getTransactionManager().commit();
- } catch (Exception e) {
- try {
- System.out.println("CANNOT CLEAN UP TEST: Cause: " + e);
- getTransactionManager().rollback();
- } catch (Exception ignore) {
- }
- } finally {
- em.close();
- }
- }
+ public void testAlertDeleteInRange() {
+ assert 2 == alertManager.deleteAlerts(0L, System.currentTimeMillis() + 600000L); // go out into the future to make sure we get our alert
}
+
+
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.xml b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.xml
new file mode 100644
index 0000000..475cd0a
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.xml
@@ -0,0 +1,84 @@
+<dataset>
+ <rhq_resource_type id="1"
+ name="AlertManagerBeanTest_Platform"
+ plugin="AlertManagerBeanTest_Plugin"
+ category="PLATFORM"
+ creation_data_type="CONFIGURATION"
+ create_delete_policy="BOTH"
+ singleton="false"
+ supports_manual_add="false"
+ deleted="false"/>
+
+ <rhq_resource id="1"
+ resource_key="1"
+ name="test1"
+ resource_type_id="1"
+ uuid="-10000000000000000000000000000000000"
+ inventory_status="COMMITTED"
+ connected="false"/>
+
+ <rhq_alert_definition id="1"
+ name="alerttest"
+ enabled="true"
+ priority="HIGH"
+ resource_id="1"
+ dampening_category="0"
+ dampening_value="0"
+ dampening_period="0"
+ required="1"
+ recovery_id="0"
+ ctime="12345"
+ mtime="12345"/>
+ <rhq_alert_definition id="2"
+ name="delete_by_type_def"
+ enabled="true"
+ priority="HIGH"
+ resource_type_id="1"
+ dampening_category="0"
+ dampening_value="0"
+ dampening_period="0"
+ required="1"
+ recovery_id="0"
+ ctime="12345"
+ mtime="12345"/>
+
+ <rhq_alert_condition id="1"
+ alert_definition_id="1"
+ type="AVAILABILITY"
+ comparator="=="/>
+ <rhq_alert_condition id="2"
+ alert_definition_id="2"
+ type="AVAILABILITY"
+ comparator="=="/>
+
+ <rhq_alert id="1"
+ alert_definition_id="1"
+ ctime="12345"
+ recovery_id="0"/>
+ <rhq_alert id="2"
+ alert_definition_id="2"
+ ctime="12345"
+ recovery_id="0"/>
+
+ <rhq_alert_condition_log id="1"
+ ctime="12345"
+ condition_id="1"
+ value="dummy value"
+ alert_id="1"/>
+ <rhq_alert_condition_log id="2"
+ ctime="12345"
+ condition_id="2"
+ value="dummy value"
+ alert_id="2"/>
+
+ <rhq_alert_notif_log id="1"
+ alert_id="1"
+ sender="dummy"
+ result_state="SUCCESS"
+ message="message"/>
+ <rhq_alert_notif_log id="2"
+ alert_id="2"
+ sender="dummy"
+ result_state="SUCCESS"
+ message="message"/>
+</dataset>
\ No newline at end of file
13 years, 7 months
[rhq] 37 commits - modules/enterprise
by Simeon Pinder
modules/enterprise/gui/coregui/pom.xml | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java | 36
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java | 367 ++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/SearchGUI.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java | 225 ++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 86 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java | 435 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java | 41
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java | 37
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 60 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/queue/AutodiscoveryPortlet.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourceDS.java | 74 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java | 71 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java | 25
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SystemGWTService.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java | 57 +
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/operation/RecentOperationsDataSource.java | 47 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java | 44 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java | 45 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java | 175 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java | 40
modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml | 8
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/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 127 ++
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
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java | 54 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java | 2
40 files changed, 1850 insertions(+), 400 deletions(-)
New commits:
commit 6c27f30bcbd410df29653e551f110be770db5fce
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 17:36:10 2010 -0400
reverting smartgwt component to 2.2 due to regression in Selector component.
diff --git a/modules/enterprise/gui/coregui/pom.xml b/modules/enterprise/gui/coregui/pom.xml
index 58cdf8a..e942014 100644
--- a/modules/enterprise/gui/coregui/pom.xml
+++ b/modules/enterprise/gui/coregui/pom.xml
@@ -24,7 +24,8 @@
<properties>
<!-- dependency versions -->
<gwt.version>2.0.4</gwt.version>
- <smartgwt.version>2.2.RHQ1</smartgwt.version>
+<!-- <smartgwt.version>2.2.RHQ1</smartgwt.version> -->
+ <smartgwt.version>2.2</smartgwt.version>
<!-- If this is too much memory to allocate to your gwt:debug process then override this property in
in your settings.xml -->
commit 280fdda7acf409ec8034e6ab8874844dd5557903
Merge: c68d856... 65210f0...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 17:35:55 2010 -0400
Merge branch 'master' into gwt-ldap2
commit c68d8568cda385d086f2bcf2af956fb9a36536d0
Merge: fde139a... 7c1fb18...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 11:46:48 2010 -0400
Merge branch 'master' into gwt-ldap2
commit fde139ab95d632c9a4684eda9b6c1e6c29512671
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 11:43:22 2010 -0400
i)removed unused ldap method ii)wrapped findAvailableLdapGroups,getLdapGroupsForRole and findGroupsAssignedToRole in Manage_Security check.
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 d77b808..841d8e0 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
@@ -309,7 +309,7 @@ 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.");
+ Log.debug("Optional LDAP detail retrieval did not succeed. Registration prepopulation will not occur.");
}
});
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 3045c5d..673f3c7 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
@@ -46,11 +46,6 @@ public interface LdapGWTService extends RemoteService {
*/
Map<String, String> getLdapDetailsFor(String user);
- /**
- * Updates the role with the ldap groups selected.
- */
- void addLdapGroupsToRole(int roleId, List<String> groupIds);
-
/** In setting the LDAP groups for this role, all previous group
* assignments for this role are removed before most up to date
* list of valid LDAP groups is assigned.
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 330ed24..5969954 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
@@ -24,8 +24,10 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import com.allen_sauer.gwt.log.client.Log;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -34,6 +36,8 @@ import org.rhq.enterprise.gui.coregui.client.gwt.LdapGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -48,56 +52,71 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
private LdapGroupManagerLocal ldapManager = LookupUtil.getLdapGroupManager();
private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
private SystemManagerLocal systemManager = LookupUtil.getSystemManager();
+ private AuthorizationManagerLocal authorizationManager = LookupUtil.getAuthorizationManager();
+
+ private final Log log = LogFactory.getLog(LdapGWTServiceImpl.class);
@Override
public Set<Map<String, String>> findAvailableGroups() {
-
+ //add permissions check
+ Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(getSessionSubject());
+ Boolean accessGranted = globalPermissions.contains(Permission.MANAGE_SECURITY);
try {
- Set<Map<String, String>> results = ldapManager.findAvailableGroups();
+ Set<Map<String, String>> results = null;
+ if (accessGranted) {
+ results = ldapManager.findAvailableGroups();
+ } else {
+ String message = "User '" + getSessionSubject().getName()
+ + "' does not have sufficient permissions to query available LDAP groups.";
+ log.debug(message);
+ throw new PermissionException(message);
+ }
return SerialUtility.prepare(results, "findAvailableGroups");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
- @Override
- public void addLdapGroupsToRole(int roleId, List<String> groupIds) {
- try {
- ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
- } catch (Exception e) {
- throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- }
-
- }
-
public void setLdapGroupsForRole(int roleId, List<String> groupIds) {
+ //add permissions check
+ Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(getSessionSubject());
+ Boolean accessGranted = globalPermissions.contains(Permission.MANAGE_SECURITY);
try {
- //clean out existing roles as this defines the new list of roles
- PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- Log.trace("Removing " + existing.getTotalSize() + " groups from role '" + roleId + "'.");
- int[] groupIndices = new int[existing.size()];
- int indx = 0;
- for (LdapGroup lg : existing) {
- groupIndices[indx++] = lg.getId();
- }
- Log.trace("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
- ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
- PageList<LdapGroup> nowGroups = ldapManager
- .findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ if (accessGranted) {
+ //clean out existing roles as this defines the new list of roles
+ PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl
+ .getUnlimitedInstance());
+ log.trace("Removing " + existing.getTotalSize() + " groups from role '" + roleId + "'.");
+ int[] groupIndices = new int[existing.size()];
+ int indx = 0;
+ for (LdapGroup lg : existing) {
+ groupIndices[indx++] = lg.getId();
+ }
+ log.trace("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
+ ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
+ PageList<LdapGroup> nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
+ .getUnlimitedInstance());
- //from among all available groups, if group name matches then add it to the list.
- ArrayList<String> validGroupIds = new ArrayList<String>();
- Set<Map<String, String>> allAvailableLdapGroups = ldapManager.findAvailableGroups();
- for (String group : groupIds) {
- for (Map<String, String> map : allAvailableLdapGroups) {
- if (map.get("name").equals(group)) {
- validGroupIds.add(group);
+ //from among all available groups, if group name matches then add it to the list.
+ ArrayList<String> validGroupIds = new ArrayList<String>();
+ Set<Map<String, String>> allAvailableLdapGroups = ldapManager.findAvailableGroups();
+ for (String group : groupIds) {
+ for (Map<String, String> map : allAvailableLdapGroups) {
+ if (map.get("name").equals(group)) {
+ validGroupIds.add(group);
+ }
}
}
+ log.trace("Adding " + validGroupIds.size() + " ldap groups to role[" + roleId + "].");
+ ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ } else {
+ String message = "User '" + getSessionSubject().getName()
+ + "' does not have sufficient permissions to modify LDAP group assignments for roles.";
+ log.debug(message);
+ throw new PermissionException(message);
}
- Log.trace("Adding " + validGroupIds.size() + " ldap groups to role[" + roleId + "].");
- ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
- nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
@@ -105,9 +124,20 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
@Override
public PageList<LdapGroup> findLdapGroupsAssignedToRole(int roleId) {
+ //add permissions check
+ Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(getSessionSubject());
+ Boolean accessGranted = globalPermissions.contains(Permission.MANAGE_SECURITY);
+
try {
- PageList<LdapGroup> allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
- .getUnlimitedInstance());
+ PageList<LdapGroup> allAssignedLdapGroups = null;
+ if (accessGranted) {
+ allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ } else {
+ String message = "User '" + getSessionSubject().getName()
+ + "' does not have permissions to query LDAP group by role.";
+ log.debug(message);
+ throw new PermissionException(message);
+ }
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 4dbb7fa..1e5d316 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,6 +18,9 @@
*/
package org.rhq.enterprise.gui.coregui.server.gwt;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.util.PageList;
@@ -25,6 +28,7 @@ import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.gui.coregui.client.gwt.SubjectGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.exception.LoginException;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -36,6 +40,8 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
private static final long serialVersionUID = 1L;
private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ private AuthorizationManagerLocal authorizationManager = LookupUtil.getAuthorizationManager();
+ private final Log log = LogFactory.getLog(SubjectGWTServiceImpl.class);
public void changePassword(String username, String password) {
try {
@@ -96,6 +102,7 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
public Subject processSubjectForLdap(Subject subjectToModify, String password) {
+ //no permissions check as embedded in the SLSB call.
try {
Subject processedSubject = subjectManager.processSubjectForLdap(subjectToModify, password);
//if sessionId has changed then need to refresh the WebUser
commit 78751fef7b35ad8e41a71cd7a3b5d1578457469c
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 08:56:58 2010 -0400
i)Long standing Logout bug in ui ii)removed cookie caching/use code iii)remove userSessionMgr.setSetsionState iv)new ldap user reg, back to logout on F5 refresh v)more documentation.
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 143045c..f32842a 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
@@ -209,6 +209,7 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
// TODO: don't make LogOut a history event, just perform the logout action by responding to click event
LoginView logoutView = new LoginView();
canvas = logoutView;
+ UserSessionManager.logout();
logoutView.showLoginDialog();
} else if (breadcrumbName.equals(TaggedView.VIEW_ID)) {
canvas = new TaggedView("Tag");
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 c301bd3..d77b808 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
@@ -31,7 +31,6 @@ import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
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.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.FormErrorOrientation;
@@ -188,17 +187,9 @@ public class LoginView extends Canvas {
* @param sessionId pass in valid session id for LDAP registration steps.
* @param callback pass in callback reference to indicate success and launch of coreGUI
*/
- public void showRegistrationDialog(String user, final String sessionId, final String password,
+ public void showRegistrationDialog(final String user, final String sessionId, final String password,
final AsyncCallback<Subject> callback) {
if (!loginShowing) {
- //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;
form = new DynamicForm();
@@ -228,7 +219,7 @@ public class LoginView extends Canvas {
}
final TextItem username = new TextItem(USERNAME, "Username");
{
- username.setValue(Cookies.getCookie(USERNAME));
+ username.setValue(user);
username.setDisabled(true);
username.setWidth(fieldWidth);
@@ -260,8 +251,11 @@ public class LoginView extends Canvas {
IButton okButton = new IButton("OK");
okButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
+ //F5 refresh check? If they've reloaded the form for some reason then bail.
+ boolean credentialsEmpty = ((user == null) || (user.trim().isEmpty()) || (password == null) || (password
+ .trim().isEmpty()));
//check for session timeout
- if (UserSessionManager.isLoggedOut()) {
+ if (UserSessionManager.isLoggedOut() || (credentialsEmpty)) {
resetLogin();
return;
}
@@ -277,7 +271,7 @@ public class LoginView extends Canvas {
form.setValue(PHONE, String.valueOf(phone.getValue()));
form.setValue(DEPARTMENT, String.valueOf(department.getValue()));
form.setValue(SESSIONID, sessionId);
- form.setValue(PASSWORD, Cookies.getCookie(PASSWORD));
+ form.setValue(PASSWORD, password);
registerLdapUser(form, callback);
}
}
@@ -322,7 +316,10 @@ public class LoginView extends Canvas {
IButton resetButton = new IButton("Reset");
resetButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- if (UserSessionManager.isLoggedOut()) {
+ //F5 refresh check? If they've reloaded the form for some reason then bail.
+ boolean credentialsEmpty = ((user == null) || (user.trim().isEmpty()) || (password == null) || (password
+ .trim().isEmpty()));
+ if (UserSessionManager.isLoggedOut() || credentialsEmpty) {
resetLogin();
return;
}
@@ -349,10 +346,6 @@ 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;
}
});
@@ -387,7 +380,7 @@ public class LoginView extends Canvas {
private void resetLogin() {
window.destroy();
loginShowing = false;
- UserSessionManager.setSessionState(UserSessionManager.State.IS_LOGGED_OUT);
+ UserSessionManager.logout();
new LoginView().showLoginDialog();
}
@@ -445,7 +438,7 @@ public class LoginView extends Canvas {
newSubject.setFsystem(false);
if (proceed) {
- Log.trace("New LDAP user registration details valid for user'" + newSubject.getName() + "'.");
+ 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>() {
@@ -462,8 +455,6 @@ 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);
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 d716136..0932e6f 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,7 +19,6 @@
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;
@@ -47,7 +46,7 @@ public class SearchGUI implements EntryPoint {
return;
}
- UserSessionManager.checkLoginStatus(Cookies.getCookie("username"), null, new AsyncCallback<Subject>() {
+ UserSessionManager.checkLoginStatus(null, 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 569b00f..4e29b9e 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
@@ -73,6 +73,7 @@ public class UserSessionManager {
@Override
public void run() {
Log.info("Session timer expired.");
+ sessionState = State.IS_LOGGED_OUT;
new LoginView().showLoginDialog(); // log user out, show login dialog
}
};
@@ -87,12 +88,10 @@ public class UserSessionManager {
// static access only
}
- private static Boolean needsRegistration = false;
-
public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Subject> callback) {
BrowserUtility.forceIe6Hacks();
- RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
+ final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
try {
b.setCallback(new RequestCallback() {
public void onResponseReceived(final Request request, final Response response) {
@@ -137,9 +136,6 @@ 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
final Subject subject = new Subject();
@@ -147,10 +143,19 @@ public class UserSessionManager {
subject.setSessionId(Integer.valueOf(sessionId));
sessionSubject = subject;
- //populate the username for the subject for isUserWithPrincipal check
- subject.setName(Cookies.getCookie("username"));
+ //populate the username for the subject for isUserWithPrincipal check in ldap processing
+ subject.setName(user);
if (subject.getId() == 0) {//either i)ldap new user registration ii)ldap case sensitive match
+ if ((subject.getName() == null) || (subject.getName().trim().isEmpty())) {
+ //we've lost crucial information, probably in a browser refresh. Send them back through login
+ Log
+ .trace("Unable to locate information critical to ldap registration/account lookup. Log back in.");
+ sessionState = State.IS_LOGGED_OUT;
+ new LoginView().showLoginDialog();
+ return;
+ }
+
//BZ-586435: insert case insensitivity for usernames with ldap auth
// locate first matching subject and attach.
SubjectCriteria subjectCriteria = new SubjectCriteria();
@@ -166,23 +171,27 @@ public class UserSessionManager {
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());
+ Log.warn("Problem querying subjects by criteria during loginStatus check."
+ + caught.getMessage());
+ return;
}
//pipe through method to handle case insensitive
- public void onSuccess(PageList<Subject> result) {
- if (result.size() == 0) {//none found, launch registration
+ public void onSuccess(PageList<Subject> results) {
+ if (results.size() == 0) {//no case insensitive matches 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);
+ return;
} else {//launch case sensitive code handling
+ Subject locatedSubject = results.get(0);
Log
- .trace("Checking login and determined that ldap case insensitive login '"
- + subject.getName() + "' should be used instead of '" + user + "'");
+ .trace("Checked credentials and determined that ldap case insensitive login '"
+ + locatedSubject.getName()
+ + "' should be used instead of '"
+ + user
+ + "'");
//use the original username to pass session check.
subject.setName(user);
GWTServiceLookup.getSubjectService().processSubjectForLdap(subject,
@@ -192,15 +201,20 @@ public class UserSessionManager {
+ caught.getMessage());
//TODO: pass message to login dialog.
new LoginView().showLoginDialog();
+ return;
}
public void onSuccess(Subject checked) {
Log.trace("Proceeding with registration for ldap user '" + user
+ "'.");
sessionState = State.IS_LOGGED_IN;
+ userPreferences = new UserPreferences(checked);
+ refresh();
+
callback.onSuccess(checked);
+ return;
}
- });//end processSubjectForLdap
+ });//end processSubjectForLdap call
}
}
});//end findSubjectsByCriteria
@@ -219,48 +233,48 @@ public class UserSessionManager {
Log.info("Failed to load user's subject");
//TODO: pass message to login ui.
new LoginView().showLoginDialog();
+ return;
}
- public void onSuccess(PageList<Subject> result) {
- final Subject validSessionSubject = result.get(0);
- //include session for subject session processing with LDAP
+ public void onSuccess(PageList<Subject> results) {
+ final Subject validSessionSubject = results.get(0);
+ //update the returned subject with current session id
validSessionSubject.setSessionId(Integer.valueOf(sessionId));
+
Log.trace("Completed session check for subject '" + validSessionSubject + "'.");
//initiate ldap check for ldap authz update(wrt roles) of subject with silent update
+ //as the subject.id > 0 then only group authorization updates will occur if ldap configured.
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.
+ return;
}
public void onSuccess(Subject result) {
- Log.trace("Succesfully updated authorization for ldap subject '"
- + validSessionSubject.getName() + "'");
+ Log.trace("Succesfully processed subject '"
+ + validSessionSubject.getName() + "' for ldap.");
+ return;
}
});
- //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 = validSessionSubject;
userPreferences = new UserPreferences(sessionSubject);
refresh();
sessionState = State.IS_LOGGED_IN;
callback.onSuccess(validSessionSubject);
+ return;
}
});
- }
- } else {//invalid session. Back to login
+ }//end of server side session check;
+ } else {//invalid client session. Back to login
sessionState = State.IS_LOGGED_OUT;
- //clean out cookies if actually logged out.
- Cookies.removeCookie("username");
- Cookies.removeCookie(LoginView.PASSWORD);
- Cookies.removeCookie(LoginView.USERNAME);
new LoginView().showLoginDialog();
+ return;
}
}
@@ -277,10 +291,10 @@ public class UserSessionManager {
}
public static void login() {
- login(Cookies.getCookie("username"), null);
+ login(null, null);
}
- /**Same as login, but passes in credentials optionally needed during new LDAP user registration.
+ /**Same as login, but passes in credentials optionally needed during ldap[i)new user registration or ii)case insensitive] logins.
*
* @param user
* @param password
@@ -292,10 +306,12 @@ public class UserSessionManager {
sessionState = State.IS_LOGGED_IN;
// 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.");
+ Log.trace("A new subject and session were returned. Updating sessionSubject.");
sessionSubject = result;
+ //update savedSessionId for browser refresh
+ saveSessionId(String.valueOf(sessionSubject.getSessionId()));
}
- Cookies.setCookie("username", sessionSubject.getName());
+
CoreGUI.get().buildCoreUI();
}
@@ -342,10 +358,6 @@ 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
@@ -379,6 +391,10 @@ public class UserSessionManager {
return sessionState == State.IS_LOGGED_OUT;
}
+ public static boolean isRegistering() {
+ return sessionState == State.IS_REGISTERING;
+ }
+
public static Subject getSessionSubject() {
return sessionSubject;
}
@@ -399,8 +415,4 @@ 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/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
index 15d7464..4dbb7fa 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
@@ -97,8 +97,31 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
public Subject processSubjectForLdap(Subject subjectToModify, String password) {
try {
- return SerialUtility.prepare(subjectManager.processSubjectForLdap(subjectToModify, password),
- "SubjectManager.processSubjectForLdap");
+ Subject processedSubject = subjectManager.processSubjectForLdap(subjectToModify, password);
+ //if sessionId has changed then need to refresh the WebUser
+ // if (subjectToModify.getSessionId() != processedSubject.getSessionId()) {
+ // HttpServletRequest request = requestReference;
+ // if ((request != null) && (request.getSession() != null)) {
+ // HttpSession session = request.getSession();
+ //
+ // // //move this to the sessionAccessServlet
+ // // WebUser webUser = new WebUser(processedSubject, false);
+ // // session.invalidate();
+ // // session = request.getSession(true);
+ // // SessionUtils.setWebUser(session, webUser);
+ // // // look up the user's permissions
+ // // Set<Permission> all_permissions = LookupUtil.getAuthorizationManager()
+ // // .getExplicitGlobalPermissions(processedSubject);
+ // //
+ // // Map<String, Boolean> userGlobalPermissionsMap = new HashMap<String, Boolean>();
+ // // for (Permission permission : all_permissions) {
+ // // userGlobalPermissionsMap.put(permission.toString(), Boolean.TRUE);
+ // // }
+ // // //load all session attributes
+ // // session.setAttribute(Constants.USER_OPERATIONS_ATTR, userGlobalPermissionsMap);
+ // }
+ // }
+ return SerialUtility.prepare(processedSubject, "SubjectManager.processSubjectForLdap");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
@@ -112,4 +135,5 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
+
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
index 6739824..037e6b9 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
@@ -49,7 +49,6 @@ public class SessionAccessServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request = (HttpServletRequest) req;
@@ -73,14 +72,12 @@ public class SessionAccessServlet extends HttpServlet {
// the web user exists, so update our SessionManager's session last-access-time
Subject subject = webUser.getSubject();
-
try {
SessionManager.getInstance().getSubject(subject.getSessionId());
long lastAccess = SessionManager.getInstance().getlastAccess(subject.getSessionId());
ServletOutputStream out = response.getOutputStream();
String output = subject.getId() + ":" + webUser.getSessionId() + ":" + lastAccess;
-
out.write(output.getBytes());
} catch (SessionNotFoundException snfe) {
session.removeAttribute(ParamConstants.USER_PARAM);
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 a9e7992..86d220b 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
@@ -293,8 +293,8 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
subject.setSessionId(sessionId);
//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.");
+ //as already logged in as regular JDBC
subject = processSubjectForLdap(subject, password);
- return subject;
} catch (SessionException se) {
// nope, no session; continue on so we can create the session
}
@@ -325,7 +325,10 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
return subject;
}
- /**This method is applied to non-null Subject instances that may require LDAP auth/authz processing.
+ /**This method is applied to Subject instances that may require LDAP auth/authz processing.
+ * Called from both SLSB and SubjectGWTServiceImpl and:
+ * -if Subject passed in has Principal(not LDAP account) then we immediately return Subject as no processing needed.
+ * -if Subject for LDAP account
*
* @param subject Authenticated subject.
* @return same or new Subject returned from LDAP processing.
@@ -333,6 +336,7 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
*/
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:"
@@ -342,17 +346,23 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
if (userHasPrincipal) {
return subject; //bail. No further checking required.
} else {//Start LDAP check.
- //retrieve configuration properties and do LDAP check
+
+ //retrieve configuration properties and do LDAP check(permissions check in SubjectGWTImpl)
Properties config = systemManager.getSystemConfiguration();
+
+ //determine if ldap configured.
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 (ldapConfigured) {//we can proceed with LDAP checking
+ //check that session is valid. RHQ auth has already occurred. Security check required to initiate following
if (!isValidSessionId(subject.getSessionId(), subject.getName(), subject.getId())) {
throw new LoginException("User session not valid. Login to proceed.");
}
- if (subject.getId() == 0) {//i)case insensitive check or ii)ldap new user registration.
+ //Subject.id == 0 then is registration or case insensitive check and subject update.
+ 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();
@@ -372,6 +382,7 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
+ ldapSubject.getName() + "]. "
+ "Attempting to authenticate with that account instead.";
log.info(msg);
+ logout(subject.getSessionId().intValue());
subject = login(ldapSubject.getName(), subjectPassword);
Integer sessionId = subject.getSessionId();
log.trace("Logged in as [" + ldapSubject.getName() + "] with session id [" + sessionId
@@ -390,22 +401,38 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
logout(subject.getSessionId().intValue());
subject = login(subject.getName(), subjectPassword);
}
+ // //either way need to refresh the WebUser
+ // if ((request != null) && (request.getSession() != null)) {
+ // HttpSession session = request.getSession();
+ // WebUser webUser = new WebUser(subject, false);
+ // session.invalidate();
+ // session = request.getSession(true);
+ // SessionUtils.setWebUser(session, webUser);
+ // // look up the user's permissions
+ // Set<Permission> all_permissions = LookupUtil.getAuthorizationManager()
+ // .getExplicitGlobalPermissions(subject);
+ //
+ // Map<String, Boolean> userGlobalPermissionsMap = new HashMap<String, Boolean>();
+ // for (Permission permission : all_permissions) {
+ // userGlobalPermissionsMap.put(permission.toString(), Boolean.TRUE);
+ // }
+ // //load all session attributes
+ // session.setAttribute(Constants.USER_OPERATIONS_ATTR, userGlobalPermissionsMap);
+ // }
}
- {//now carry out authz refresh for this Subject
- 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, "");
- 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()));
- log.trace("Updating ldap authorization data for user '" + subject.getName() + "'");
- ldapManager.assignRolesToLdapSubject(subject.getId(), groupNames);
- }
- }
+
+ //Subject.id guaranteed to be > 0 then iii)authorization updates for ldap groups necessary
+ //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()));
+ 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
+ } else {//ldap not configured. Somehow authenticated for LDAP without ldap being configured. Error. Bail
throw new LoginException("You are authenticated for LDAP, but LDAP is not configured.");
}
}
commit 981b66fcc3db652f7b9da4f3a6a7eaf4db9ead96
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Oct 27 16:47:45 2010 -0400
fix bug in ldapConfigured check and availableGroups load.
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 3ef327a..891c950 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
@@ -24,6 +24,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.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSCallback;
@@ -305,32 +306,38 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
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) {
- //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();
- }
- });
+ public void onSuccess(Boolean ldapConfigured) {
+ if (ldapConfigured) {
+ //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) {
+ //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();
+ }
+ });
+ } else {//ldap not configured, proceed
+ editRecord(record);
+ 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();
+ public void onFailure(Throwable caught) {
+ Log.warn("Failed to determine if ldap configured - Check server");
+ CoreGUI.getErrorHandler().handleError("Failed to determine if ldap configured", caught);
}
});
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
index 81aebe8..328150e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
@@ -85,10 +85,15 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
public Set<Map<String, String>> findAvailableGroups() {
Properties options = systemManager.getSystemConfiguration();
- String groupFilter = (String) options.get(RHQConstants.LDAPGroupFilter);
- String filter = String.format("(%s)", groupFilter);
+ Set<Map<String, String>> emptyAvailableGroups = new HashSet<Map<String, String>>();
- return buildGroup(options, filter);
+ //retrieve the filters.
+ String groupFilter = (String) options.get(RHQConstants.LDAPGroupFilter);
+ if ((groupFilter != null) && (!groupFilter.trim().isEmpty())) {
+ String filter = String.format("(%s)", groupFilter);
+ return buildGroup(options, filter);
+ }
+ return emptyAvailableGroups;
}
public Set<String> findAvailableGroupsFor(String userName) {
commit 915cae5db66629a388d7395c04d8944047f787b8
Merge: 8be35f2... 5ea3d1e...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Oct 27 15:27:38 2010 -0400
Merge branch 'master' into gwt-ldap2
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,
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
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 e19fff4cb308169c6972769598f1e23bb3e67b05
Author: Joseph Marques <joseph(a)redhat.com>
Date: Wed Oct 20 13:02:11 2010 -0400
consolidation of form items into a single DynamicForm for ldap user registration
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 ef1c18c..e5d202e 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
@@ -207,7 +207,6 @@ public class LoginView extends Canvas {
header
.setValue("Welcome to JBoss ON! <br/><br/> Enter/update the following fields to complete your registration process."
+ "<br/> Once you click \"OK\" you will be logged in.<br/><br/>");
- column.addMember(wrapInDynamicForm(1, header));
//build ui elements for registration screen
first = new TextItem(FIRST, "First Name");
{
@@ -238,7 +237,7 @@ public class LoginView extends Canvas {
department.setWidth(fieldWidth);
SpacerItem space = new SpacerItem();
space.setColSpan(1);
- column.addMember(wrapInDynamicForm(6, first, last, username, email, phone, department));
+ column.addMember(wrapInDynamicForm(6, header, first, last, username, email, phone, department));
HTMLFlow hr = new HTMLFlow("<br/><hr/><br/><br/>");
hr.setWidth(750);
hr.setAlign(Alignment.CENTER);
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 39280cec639b1e8be47318cdcdd28ca27a6eaa4f
Author: Joseph Marques <joseph(a)redhat.com>
Date: Wed Oct 20 12:26:49 2010 -0400
small fix to the logout() method logic
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 8ad6016..06c8604 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
@@ -307,7 +307,7 @@ public class UserSessionManager {
}
public static void logout() {
- if (!isLoggedIn()) {
+ if (isLoggedOut()) {
return; // nothing to do, already called
}
commit 6eaf988abf1e4d2f485e1b24aba13813deacbe47
Author: Joseph Marques <joseph(a)redhat.com>
Date: Wed Oct 20 12:24:41 2010 -0400
some LDAP fixes / enhancements:
* use less calls to wrapInDynamicForm, which aligns the form items
* use a tri-boolean variable to represent client-side session state
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 03e46e1..ef1c18c 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
@@ -185,6 +185,7 @@ 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())) {
Cookies.setCookie(USERNAME, user);
@@ -226,7 +227,7 @@ public class LoginView extends Canvas {
username.setDisabled(true);
username.setWidth(fieldWidth);
- column.addMember(wrapInDynamicForm(6, first, last, username));
+ //column.addMember(wrapInDynamicForm(6, first, last, username));
}
email = new TextItem(EMAIL, "Email");
email.setRequired(true);
@@ -237,7 +238,7 @@ public class LoginView extends Canvas {
department.setWidth(fieldWidth);
SpacerItem space = new SpacerItem();
space.setColSpan(1);
- column.addMember(wrapInDynamicForm(6, email, phone, department));
+ column.addMember(wrapInDynamicForm(6, first, last, username, email, phone, department));
HTMLFlow hr = new HTMLFlow("<br/><hr/><br/><br/>");
hr.setWidth(750);
hr.setAlign(Alignment.CENTER);
@@ -250,7 +251,7 @@ public class LoginView extends Canvas {
okButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
//check for session timeout
- if (isSessionStale()) {
+ if (UserSessionManager.isLoggedOut()) {
resetLogin();
}
@@ -308,7 +309,7 @@ public class LoginView extends Canvas {
IButton resetButton = new IButton("Reset");
resetButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- if (isSessionStale()) {
+ if (UserSessionManager.isLoggedOut()) {
resetLogin();
}
@@ -332,6 +333,7 @@ public class LoginView extends Canvas {
IButton logout = new IButton("Logout");
logout.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
+ UserSessionManager.logout();
resetLogin();
}
});
@@ -379,28 +381,11 @@ public class LoginView extends Canvas {
/** Go through steps of invalidating this login and piping them back to CoreGUI Login.
*/
private void resetLogin() {
- UserSessionManager.invalidateSession();
window.destroy();
loginShowing = false;
new LoginView().showLoginDialog();
}
- /** Check to see whether session has timed out while user has been waiting on this form.
- * @return
- */
- private boolean isSessionStale() {
- boolean staleSession = false;
- String lastAccess = UserSessionManager.getLastAccessTime();
- if ((lastAccess != null) && (!lastAccess.trim().isEmpty())) {
- long expiryTime = Long.valueOf(lastAccess) + UserSessionManager.SESSION_TIMEOUT;
- long expiryMillis = expiryTime - System.currentTimeMillis();
- if (expiryMillis < 0) {
- staleSession = true;
- }
- }
- return staleSession;
- }
-
/**Uses the information from the populated form to create the Subject for the new LDAP user.
*
* @param populatedForm - validated data
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 71c62b8..8ad6016 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
@@ -58,12 +58,17 @@ public class UserSessionManager {
private static int LOGOUT_DELAY = 5 * 1000; // wait 5 seconds for in-flight requests to complete before logout
public static final String SESSION_NAME = "RHQ_Sesssion";
- public static final String SESSION_LAST_ACCESS = SESSION_NAME + ".LAST_ACCESS";
private static Subject sessionSubject;
private static UserPreferences userPreferences;
- private static boolean loggedIn = false;
+ private enum State {
+ IS_LOGGED_IN, //
+ IS_REGISTERING, //
+ IS_LOGGED_OUT;
+ }
+
+ private static State sessionState = State.IS_LOGGED_OUT;
private static Timer sessionTimer = new Timer() {
@Override
public void run() {
@@ -101,7 +106,6 @@ public class UserSessionManager {
final int subjectId = Integer.parseInt(parts[0]);
final String sessionId = parts[1]; // not null
final long lastAccess = Long.parseLong(parts[2]);
- Cookies.setCookie(SESSION_LAST_ACCESS, String.valueOf(lastAccess));
Log.info("sessionAccess-subjectId: " + subjectId);
Log.info("sessionAccess-sessionId: " + sessionId);
Log.info("sessionAccess-lastAccess: " + lastAccess);
@@ -165,6 +169,7 @@ 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
@@ -179,7 +184,7 @@ public class UserSessionManager {
}
});
} else {//invalid session. Back to login
- loggedIn = false;
+ sessionState = State.IS_LOGGED_OUT;
new LoginView().showLoginDialog();
}
}
@@ -240,6 +245,7 @@ public class UserSessionManager {
});
} else {
Log.trace("Proceeding with registration for ldap user '" + user + "'.");
+ sessionState = State.IS_REGISTERING;
new LoginView().showRegistrationDialog(user, sessionId, password, callback);
}
}
@@ -257,7 +263,7 @@ public class UserSessionManager {
checkLoginStatus(user, password, new AsyncCallback<Subject>() {
public void onSuccess(Subject result) {
// will build UI if necessary, then fires history event
- loggedIn = true;
+ 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;
@@ -295,26 +301,17 @@ public class UserSessionManager {
logoutTimer.cancel();
// now continue with the rest of the login logic
- loggedIn = true;
+ sessionState = State.IS_LOGGED_IN;
Log.info("Refreshing session timer...");
sessionTimer.schedule(millis);
}
public static void logout() {
- if (!loggedIn) {
+ if (!isLoggedIn()) {
return; // nothing to do, already called
}
- invalidateSession();
- }
-
- /** There are times when you're logged in but you don't want the application to proceed as if you are.
- * In these cases, like LDAP new user registration, the session only needs
- * to be invalidated to reset the user back to the beginning.
- */
- public static void invalidateSession() {
-
- loggedIn = false;
+ sessionState = State.IS_LOGGED_OUT;
Log.info("Destroying session timer...");
sessionTimer.cancel();
@@ -342,8 +339,12 @@ public class UserSessionManager {
}
public static boolean isLoggedIn() {
- Log.trace("isLoggedIn = " + loggedIn);
- return loggedIn;
+ Log.trace("isLoggedIn = " + sessionState);
+ return sessionState == State.IS_LOGGED_IN;
+ }
+
+ public static boolean isLoggedOut() {
+ return sessionState == State.IS_LOGGED_OUT;
}
public static Subject getSessionSubject() {
@@ -366,8 +367,4 @@ public class UserSessionManager {
public static UserPreferences getUserPreferences() {
return userPreferences;
}
-
- public static String getLastAccessTime() {
- return Cookies.getCookie(SESSION_LAST_ACCESS);
- }
}
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;
commit 5a98621a7fc36c9940cf60dfe32bab71eae40c68
Merge: 079be6e... 81d68da...
Author: Joseph Marques <joseph(a)redhat.com>
Date: Tue Oct 19 11:30:16 2010 -0400
Merge branch 'master' into gwt-ldap
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java
index 6fdc4f6,a14ba41..0a91d76
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java
@@@ -18,12 -18,9 +18,10 @@@
*/
package org.rhq.enterprise.gui.coregui.client.alert;
- import java.util.Arrays;
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.JavaScriptObject;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java
index 28da47f,bad2073..d823c56
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java
@@@ -84,33 -83,25 +84,33 @@@ public class AlertPortletDataSource ext
criteria.addFilterResourceIds(getAlertFilterResourceIds());
}
if (getAlertPriorityIndex() > 0) {//add priority selection
- criteria.addFilterPriority(AlertPriority.getByLegacyIndex(getAlertPriorityIndex()));
+ criteria.addFilterPriorities(AlertPriority.getByLegacyIndex(getAlertPriorityIndex()));
}
- getAlertService().findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
+ //check for still logged in before submitting server side request
+ if (userStillLoggedIn()) {
+ getAlertService().findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to fetch alerts data", caught);
- response.setStatus(RPCResponse.STATUS_FAILURE);
- processResponse(request.getRequestId(), response);
- }
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to fetch alerts data", caught);
+ response.setStatus(RPCResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
- public void onSuccess(PageList<Alert> result) {
- long fetchTime = System.currentTimeMillis() - start;
- com.allen_sauer.gwt.log.client.Log.info(result.size() + " alerts fetched in: " + fetchTime + "ms");
- response.setData(buildRecords(result));
- response.setTotalRows(result.size());
- processResponse(request.getRequestId(), response);
- }
- });
+ public void onSuccess(PageList<Alert> result) {
+ long fetchTime = System.currentTimeMillis() - start;
+ Log.info(result.size() + " alerts fetched in: " + fetchTime + "ms");
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.size());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ } else {//dump request
+ response.setTotalRows(0);
+ processResponse(request.getRequestId(), response);
+ //TODO: spinder 10/13/10: not sure if we should log anything here. Could be noisy in log with not a lot of gain.
+ Log.debug("user not logged in. Not fetching any alerts now.");
+ }
}
public int getAlertRangeCompleted() {
commit 079be6eeb1d8b3141f884375895e38a59af4120e
Merge: 018b306... cec52a7...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Oct 15 19:41:17 2010 -0400
Merge branch 'master' into gwt-ldap2
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
index f0c2135,38a9386..2a88a26
--- 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
@@@ -39,8 -39,8 +39,9 @@@ import com.smartgwt.client.widgets.grid
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.util.effects.ColoringUtility;
+ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* Base GWT-RPC oriented DataSource class.
commit 018b306f018c85e7a8472dfebbdd3e1d00e63b4e
Merge: 34f9d85... f767f23...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Oct 15 19:38:56 2010 -0400
i)fixed ldap role-user regression
ii)lowered log levels.
iii)Merge branch 'master' into gwt-ldap2
Conflicts:
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
index c96f73a,f0916e2..a5f67c1
--- 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
@@@ -86,7 -86,7 +86,8 @@@
<servlet path="/ContentGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ContentGWTServiceImpl"/>
<servlet path="/DashboardGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.DashboardGWTServiceImpl"/>
<servlet path="/EventGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.EventGWTServiceImpl"/>
+ <servlet path="/GroupAlertDefinitionGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.GroupAlertDefinitionGWTServiceImpl"/>
+ <servlet path="/LdapGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.LdapGWTServiceImpl"/>
<servlet path="/MeasurementDataGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.MeasurementDataGWTServiceImpl"/>
<servlet path="/OperationGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.OperationGWTServiceImpl"/>
<servlet path="/RemoteInstallGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.RemoteInstallGWTServiceImpl"/>
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index 66c37c6,3d79afd..03e46e1
--- 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
@@@ -86,22 -67,6 +86,22 @@@ public class LoginView extends Canvas
public LoginView() {
}
+ //registration fields
+ private TextItem first;
+ private TextItem last;
+ 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 = "username";
++ private static final String USERNAME = "ldap.username";
+ private static final String EMAIL = "email";
+ private static final String PHONE = "phone";
+ private static final String DEPARTMENT = "department";
- private static final String SESSIONID = "sessionid";
- private static final String PASSWORD = "password";
++ private static final String SESSIONID = "ldap.sessionid";
++ private static final String PASSWORD = "ldap.password";
+
public void showLoginDialog() {
if (!loginShowing) {
loginShowing = true;
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
index fe68250,0000000..7b27fb6
mode 100644,000000..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
@@@ -1,311 -1,0 +1,304 @@@
+/*
+ * 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 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.criteria.SubjectCriteria;
+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.core.util.exception.ThrowableUtil;
+import org.rhq.enterprise.gui.coregui.client.gwt.LdapGWTService;
+import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
+import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
+import org.rhq.enterprise.server.system.SystemManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * @author Simeon Pinder
+ */
+public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGWTService {
+
+ private static final long serialVersionUID = 1L;
+
+ private LdapGroupManagerLocal ldapManager = LookupUtil.getLdapGroupManager();
+ private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ private SystemManagerLocal systemManager = LookupUtil.getSystemManager();
+
+ @Override
+ public Set<Map<String, String>> findAvailableGroups() {
+
+ try {
+ Set<Map<String, String>> results = ldapManager.findAvailableGroups();
+ return SerialUtility.prepare(results, "findAvailableGroups");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ public void addLdapGroupsToRole(int roleId, List<String> groupIds) {
+ try {
+ ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+
+ }
+
+ public void setLdapGroupsForRole(int roleId, List<String> groupIds) {
+ try {
+ //clean out existing roles as this defines the new list of roles
+ PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- com.allen_sauer.gwt.log.client.Log.debug("Removing " + existing.getTotalSize() + " groups from role '"
- + roleId + "'.");
++ Log.trace("Removing " + existing.getTotalSize() + " groups from role '" + roleId + "'.");
+ int[] groupIndices = new int[existing.size()];
+ int indx = 0;
+ for (LdapGroup lg : existing) {
+ groupIndices[indx++] = lg.getId();
+ }
- com.allen_sauer.gwt.log.client.Log
- .debug("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
++ Log.trace("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
+ ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
+ PageList<LdapGroup> nowGroups = ldapManager
+ .findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+
+ //from among all available groups, if group name matches then add it to the list.
+ ArrayList<String> validGroupIds = new ArrayList<String>();
+ Set<Map<String, String>> allAvailableLdapGroups = ldapManager.findAvailableGroups();
+ for (String group : groupIds) {
+ for (Map<String, String> map : allAvailableLdapGroups) {
+ if (map.get("name").equals(group)) {
+ validGroupIds.add(group);
+ }
+ }
+ }
- com.allen_sauer.gwt.log.client.Log.debug("Adding " + validGroupIds.size() + " ldap groups to role["
- + roleId + "].");
++ Log.trace("Adding " + validGroupIds.size() + " ldap groups to role[" + roleId + "].");
+ ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ 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, "");
- // 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(subject.getName()));
++ 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 {
+ 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 checkSubjectForLdapAuth(Subject currentSubject, String user, String password) {
+ try {
+ Subject newSubject = null;
- com.allen_sauer.gwt.log.client.Log.debug("Subject being checked for ldapAuthentication is :"
- + currentSubject);
++ Log.trace("Subject being checked for ldapAuthentication is :" + currentSubject);
+
+ 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;
+ }
+
- com.allen_sauer.gwt.log.client.Log.debug("Subject has id of :" + currentSubject.getId()
- + "and requires Registration:" + needsRegistrationOrCaseIncorrectOnAccountName);
++ 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));
+
- com.allen_sauer.gwt.log.client.Log.debug("LDAP Authentication has been enabled :" + ldapEnabled);
++ 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);
- com.allen_sauer.gwt.log.client.Log.debug("Subject '" + user + "' hasPrincipal :" + hasPrincipal);
- // System.out.println("Subject hasPrincipal :" + hasPrincipal);
++ 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);
- com.allen_sauer.gwt.log.client.Log.debug("Subjects located with name '" + user + "' and found:"
- + subjectsLocated.size());
++ 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.";
- com.allen_sauer.gwt.log.client.Log.info(msg);
- com.allen_sauer.gwt.log.client.Log
- .debug("Attempting to log back in with credentials passed in.");
++ Log.info(msg);
++ Log.trace("Attempting to log back in with credentials passed in.");
+ newSubject = subjectManager.login(user, password);
- com.allen_sauer.gwt.log.client.Log.debug("Logged in as [" + ldapSubject.getName()
- + "] with session id [" + newSubject.getSessionId() + "]");
++ 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 {
- com.allen_sauer.gwt.log.client.Log.debug("The Subject and user/password cannot be null to proceed.");
++ Log.debug("The Subject and user/password cannot be null to proceed.");
+ }
+ return SerialUtility.prepare(newSubject, "checkSubjectForLdapAuth");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ /**Light call to determine ldap configuration status.
+ *
+ */
+ @Override
+ public Boolean checkLdapConfiguredStatus() {
+ Boolean ldapEnabled = false;
+ try {
+ String provider = systemManager.getSystemConfiguration().getProperty(RHQConstants.JAASProvider);
+ ldapEnabled = ((provider != null) && provider.equals(RHQConstants.LDAPJAASProvider));
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ return ldapEnabled;
+ }
+
+ /**Returns all LDAP details for a given user, using the configured ldap details of server.
+ *
+ */
+ @Override
+ public Map<String, String> getLdapDetailsFor(String user) {
+ Map<String, String> ldapDetails = new HashMap<String, String>();
+ try {
+ ldapDetails = ldapManager.findLdapUserDetails(user);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ return ldapDetails;
+ }
+}
diff --cc modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
index 2cff69b,409d64e..81aebe8
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
@@@ -103,7 -104,7 +103,10 @@@ public class LdapGroupManagerBean imple
filter = String.format("(&(%s)(%s=%s))", groupFilter, groupMember, userDN);
Set<Map<String, String>> matched = buildGroup(options, filter);
++ log.trace("Located '" + matched.size() + "' LDAP groups for user '" + userName
++ + "' using following ldap filter '" + filter + "'.");
++ //iterate to extract just the group names.
Set<String> ldapSet = new HashSet<String>();
for (Map<String, String> match : matched) {
ldapSet.add(match.get("id"));
@@@ -205,20 -206,12 +208,26 @@@
Query query = PersistenceUtility.createQueryWithOrderBy(entityManager, queryName, pc);
long count = (Long) queryCount.getSingleResult();
-- // List<Role> roles = query.getResultList();
List<LdapGroup> groups = query.getResultList();
return new PageList<LdapGroup>(groups, (int) count, pc);
}
++ /**Build/retrieve the user DN. Not usually a property.
++ *
++ * @param options
++ * @param userName
++ * @return
++ */
private String getUserDN(Properties options, String userName) {
+ Map<String, String> details = findLdapUserDetails(userName);
+ String userDN = details.get("dn");
++
+ return userDN;
+ }
+
+ public Map<String, String> findLdapUserDetails(String userName) {
+ Properties options = systemManager.getSystemConfiguration();
+ HashMap<String, String> userDetails = new HashMap<String, String>();
// Load our LDAP specific properties
Properties env = getProperties(options);
@@@ -271,19 -265,14 +280,22 @@@
// We use the first match
SearchResult si = (SearchResult) answer.next();
++ //generate the DN
++ String userDN = si.getName() + "," + baseDNs[x];
++ userDetails.put("dn", userDN);
// Construct the UserDN
- String userDN = si.getName() + "," + baseDNs[x];
- return userDN;
+ NamingEnumeration<String> keys = si.getAttributes().getIDs();
+ while (keys.hasMore()) {
+ String key = keys.next();
+ Attribute value = si.getAttributes().get(key);
+ if (value != null) {
+ userDetails.put(key, value.get() + "");
+ }
+ }
+ return userDetails;
}
-
- // If we try all the BaseDN's and have not found a match, return false
- return "";
+ return userDetails;
} catch (NamingException e) {
throw new RuntimeException(e);
}
commit 34f9d85692a50c7b5c578591562ee6e623f3e16d
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Oct 15 12:05:27 2010 -0400
i)ldap user registration prepopulation ii)numerous ldap fixes a)F5 refresh username b)last name required c)stale session checks.
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 da1ee4c..66c37c6 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
@@ -32,6 +32,7 @@ import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
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.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.FormErrorOrientation;
@@ -185,6 +186,10 @@ 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())) {
+ Cookies.setCookie(USERNAME, user);
+ Cookies.setCookie(PASSWORD, password);
+ }
loginShowing = true;
forms = new ArrayList<DynamicForm>();
@@ -194,6 +199,7 @@ public class LoginView extends Canvas {
form.setAutoFocus(true);
form.setShowErrorText(true);
form.setErrorOrientation(FormErrorOrientation.BOTTOM);
+ int fieldWidth = 120;
VLayout column = new VLayout();
HeaderItem header = new HeaderItem();
@@ -206,28 +212,29 @@ public class LoginView extends Canvas {
{
first.setRequired(true);
first.setWrapTitle(false);
- first.setWidth(100);
+ first.setWidth(fieldWidth);
}
last = new TextItem(LAST, "Last Name");
{
last.setWrapTitle(false);
- last.setWidth(100);
+ last.setWidth(fieldWidth);
+ last.setRequired(true);
}
final TextItem username = new TextItem(USERNAME, "Username");
{
- username.setRequired(true);
- username.setValue(user);
+ username.setValue(Cookies.getCookie(USERNAME));
+
username.setDisabled(true);
- username.setWidth(100);
+ username.setWidth(fieldWidth);
column.addMember(wrapInDynamicForm(6, first, last, username));
}
email = new TextItem(EMAIL, "Email");
email.setRequired(true);
- email.setWidth(100);
+ email.setWidth(fieldWidth);
phone = new TextItem(PHONE, "Phone");
- phone.setWidth(100);
+ phone.setWidth(fieldWidth);
department = new TextItem(DEPARTMENT, "Department");
- department.setWidth(100);
+ department.setWidth(fieldWidth);
SpacerItem space = new SpacerItem();
space.setColSpan(1);
column.addMember(wrapInDynamicForm(6, email, phone, department));
@@ -242,6 +249,11 @@ public class LoginView extends Canvas {
IButton okButton = new IButton("OK");
okButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
+ //check for session timeout
+ if (isSessionStale()) {
+ resetLogin();
+ }
+
//validation
if (validateForms(forms)) {
Log.trace("Successfully validated all data for user registration.");
@@ -253,31 +265,61 @@ public class LoginView extends Canvas {
form.setValue(PHONE, String.valueOf(phone.getValue()));
form.setValue(DEPARTMENT, String.valueOf(department.getValue()));
form.setValue(SESSIONID, sessionId);
- form.setValue(PASSWORD, password);
+ form.setValue(PASSWORD, Cookies.getCookie(PASSWORD));
registerLdapUser(form, callback);
}
}
- /** 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;
+ });
+ row.addMember(okButton);
+ //send request to LDAP server to grab user details for this user. Already sure ldap user exists
+ GWTServiceLookup.getLdapService().getLdapDetailsFor(user, new AsyncCallback<Map<String, String>>() {
+ public void onSuccess(final Map<String, String> ldapUserDetails) {
+ //now prepopulate UI fields if they exist
+ for (String key : ldapUserDetails.keySet()) {
+ String value;
+ if (key.equalsIgnoreCase("givenName")) {//aka first name
+ value = ldapUserDetails.get(key);
+ first.setValue(value);
+ } else if (key.equalsIgnoreCase("sn")) {//aka Surname
+ value = ldapUserDetails.get(key);
+ if ((value != null) && (!value.isEmpty())) {
+ last.setValue(value);
+ }
+ } else if (key.equalsIgnoreCase("telephoneNumber")) {
+ value = ldapUserDetails.get(key);
+ if ((value != null) && (!value.isEmpty())) {
+ phone.setValue(value);
+ }
+ } else if (key.equalsIgnoreCase("mail")) {
+ value = ldapUserDetails.get(key);
+ if ((value != null) && (!value.isEmpty())) {
+ email.setValue(value);
+ }
}
}
- return allValid;
+ }
+
+ public void onFailure(Throwable caught) {
+ Log.debug("Optional LDAP detail retrieval did not succeed. Registration prepopulation will occur.");
}
});
- row.addMember(okButton);
IButton resetButton = new IButton("Reset");
resetButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
+ if (isSessionStale()) {
+ resetLogin();
+ }
+
+ //clear out all validation messages.
+ {
+ String empty = " ";
+ first.setValue(empty);
+ last.setValue(empty);
+ email.setValue("test(a)test.com");
+ validateForms(forms);
+ }
first.clearValue();
last.clearValue();
email.clearValue();
@@ -290,10 +332,7 @@ public class LoginView extends Canvas {
IButton logout = new IButton("Logout");
logout.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- UserSessionManager.invalidateSession();
- window.destroy();
- loginShowing = false;
- new LoginView().showLoginDialog();
+ resetLogin();
}
});
row.addMember(logout);
@@ -322,6 +361,46 @@ 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() {
+ UserSessionManager.invalidateSession();
+ window.destroy();
+ loginShowing = false;
+ new LoginView().showLoginDialog();
+ }
+
+ /** Check to see whether session has timed out while user has been waiting on this form.
+ * @return
+ */
+ private boolean isSessionStale() {
+ boolean staleSession = false;
+ String lastAccess = UserSessionManager.getLastAccessTime();
+ if ((lastAccess != null) && (!lastAccess.trim().isEmpty())) {
+ long expiryTime = Long.valueOf(lastAccess) + UserSessionManager.SESSION_TIMEOUT;
+ long expiryMillis = expiryTime - System.currentTimeMillis();
+ if (expiryMillis < 0) {
+ staleSession = true;
+ }
+ }
+ return staleSession;
+ }
+
/**Uses the information from the populated form to create the Subject for the new LDAP user.
*
* @param populatedForm - validated data
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 2d283a3..71c62b8 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
@@ -54,10 +54,12 @@ import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
* @author Joseph Marques
*/
public class UserSessionManager {
- private static int SESSION_TIMEOUT = 29 * 60 * 1000; // 29 mins, just shorter than the 30-min web session timeout
+ public static int SESSION_TIMEOUT = 29 * 60 * 1000; // 29 mins, just shorter than the 30-min web session timeout
private static int LOGOUT_DELAY = 5 * 1000; // wait 5 seconds for in-flight requests to complete before logout
public static final String SESSION_NAME = "RHQ_Sesssion";
+ public static final String SESSION_LAST_ACCESS = SESSION_NAME + ".LAST_ACCESS";
+
private static Subject sessionSubject;
private static UserPreferences userPreferences;
@@ -99,6 +101,7 @@ public class UserSessionManager {
final int subjectId = Integer.parseInt(parts[0]);
final String sessionId = parts[1]; // not null
final long lastAccess = Long.parseLong(parts[2]);
+ Cookies.setCookie(SESSION_LAST_ACCESS, String.valueOf(lastAccess));
Log.info("sessionAccess-subjectId: " + subjectId);
Log.info("sessionAccess-sessionId: " + sessionId);
Log.info("sessionAccess-lastAccess: " + lastAccess);
@@ -363,4 +366,8 @@ public class UserSessionManager {
public static UserPreferences getUserPreferences() {
return userPreferences;
}
+
+ public static String getLastAccessTime() {
+ return Cookies.getCookie(SESSION_LAST_ACCESS);
+ }
}
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 0209e37..7915b80 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
@@ -41,6 +41,11 @@ public interface LdapGWTService extends RemoteService {
Set<Map<String, String>> findAvailableGroups();
/**
+ * @return Map with LDAP details for user passed.
+ */
+ Map<String, String> getLdapDetailsFor(String user);
+
+ /**
* Updates the role with the ldap groups selected.
*/
void addLdapGroupsToRole(int roleId, List<String> groupIds);
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 d03c53c..fe68250 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
@@ -294,4 +294,18 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
return ldapEnabled;
}
+
+ /**Returns all LDAP details for a given user, using the configured ldap details of server.
+ *
+ */
+ @Override
+ public Map<String, String> getLdapDetailsFor(String user) {
+ Map<String, String> ldapDetails = new HashMap<String, String>();
+ try {
+ ldapDetails = ldapManager.findLdapUserDetails(user);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ return ldapDetails;
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
index 8c75852..2cff69b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
@@ -211,6 +211,14 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
}
private String getUserDN(Properties options, String userName) {
+ Map<String, String> details = findLdapUserDetails(userName);
+ String userDN = details.get("dn");
+ return userDN;
+ }
+
+ public Map<String, String> findLdapUserDetails(String userName) {
+ Properties options = systemManager.getSystemConfiguration();
+ HashMap<String, String> userDetails = new HashMap<String, String>();
// Load our LDAP specific properties
Properties env = getProperties(options);
@@ -265,12 +273,17 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
SearchResult si = (SearchResult) answer.next();
// Construct the UserDN
- String userDN = si.getName() + "," + baseDNs[x];
- return userDN;
+ NamingEnumeration<String> keys = si.getAttributes().getIDs();
+ while (keys.hasMore()) {
+ String key = keys.next();
+ Attribute value = si.getAttributes().get(key);
+ if (value != null) {
+ userDetails.put(key, value.get() + "");
+ }
+ }
+ return userDetails;
}
-
- // If we try all the BaseDN's and have not found a match, return false
- return "";
+ return userDetails;
} catch (NamingException e) {
throw new RuntimeException(e);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java
index 6709b32..17a008a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java
@@ -50,4 +50,6 @@ public interface LdapGroupManagerLocal {
Set<Map<String, String>> findAvailableGroups();
Set<String> findAvailableGroupsFor(String userName);
+
+ Map<String, String> findLdapUserDetails(String userName);
}
\ No newline at end of file
commit b671cbfcba20b9ff445b17410a816231e6bcb420
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Thu Oct 14 13:14:15 2010 -0400
i)fixed on more new registration session issue ii)extracted UserSessionManager.invalidateSession() method.
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 ff9f246..da1ee4c 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
@@ -290,7 +290,7 @@ public class LoginView extends Canvas {
IButton logout = new IButton("Logout");
logout.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- UserSessionManager.logout();
+ UserSessionManager.invalidateSession();
window.destroy();
loginShowing = false;
new LoginView().showLoginDialog();
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 0dc4482..2d283a3 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
@@ -176,6 +176,7 @@ public class UserSessionManager {
}
});
} else {//invalid session. Back to login
+ loggedIn = false;
new LoginView().showLoginDialog();
}
}
@@ -301,6 +302,15 @@ public class UserSessionManager {
return; // nothing to do, already called
}
+ invalidateSession();
+ }
+
+ /** There are times when you're logged in but you don't want the application to proceed as if you are.
+ * In these cases, like LDAP new user registration, the session only needs
+ * to be invalidated to reset the user back to the beginning.
+ */
+ public static void invalidateSession() {
+
loggedIn = false;
Log.info("Destroying session timer...");
sessionTimer.cancel();
commit 7e38fa92bec032c5556e88a316db7cadf31c7cb6
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Thu Oct 14 11:26:36 2010 -0400
i)fixed new registration session issues ii)lowered some logging to trace.
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 97a97d9..ff9f246 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
@@ -99,6 +99,7 @@ public class LoginView extends Canvas {
private static final String PHONE = "phone";
private static final String DEPARTMENT = "department";
private static final String SESSIONID = "sessionid";
+ private static final String PASSWORD = "password";
public void showLoginDialog() {
if (!loginShowing) {
@@ -181,7 +182,8 @@ public class LoginView extends Canvas {
* @param sessionId pass in valid session id for LDAP registration steps.
* @param callback pass in callback reference to indicate success and launch of coreGUI
*/
- public void showRegistrationDialog(String user, final String sessionId, final AsyncCallback<Void> callback) {
+ public void showRegistrationDialog(String user, final String sessionId, final String password,
+ final AsyncCallback<Subject> callback) {
if (!loginShowing) {
loginShowing = true;
@@ -242,7 +244,7 @@ public class LoginView extends Canvas {
public void onClick(ClickEvent event) {
//validation
if (validateForms(forms)) {
- Log.trace("Successfully validated all forms");
+ Log.trace("Successfully validated all data for user registration.");
//populate form
form.setValue(FIRST, String.valueOf(first.getValue()));
form.setValue(LAST, String.valueOf(last.getValue()));
@@ -251,10 +253,16 @@ public class LoginView extends Canvas {
form.setValue(PHONE, String.valueOf(phone.getValue()));
form.setValue(DEPARTMENT, String.valueOf(department.getValue()));
form.setValue(SESSIONID, sessionId);
+ form.setValue(PASSWORD, password);
registerLdapUser(form, callback);
}
}
+ /** 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) {
@@ -314,8 +322,13 @@ public class LoginView extends Canvas {
}
}
- protected void registerLdapUser(DynamicForm populatedForm, final AsyncCallback<Void> callback) {
- Subject newSubject = new Subject();
+ /**Uses the information from the populated form to create the Subject for the new LDAP user.
+ *
+ * @param populatedForm - validated data
+ * @param callback
+ */
+ protected void registerLdapUser(DynamicForm populatedForm, final AsyncCallback<Subject> callback) {
+ final Subject newSubject = new Subject();
//insert some required data checking
boolean proceed = true;
@@ -327,8 +340,14 @@ public class LoginView extends Canvas {
if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) {
proceed = false;
}
+ retrieved = populatedForm.getValueAsString(PASSWORD);
+ if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) {
+ proceed = false;
+ }
+
newSubject.setName(populatedForm.getValueAsString(USERNAME));
newSubject.setSessionId(Integer.valueOf(populatedForm.getValueAsString(SESSIONID)));
+ String password = populatedForm.getValueAsString(PASSWORD);
//don't load null values not set or returned from ldap server
retrieved = populatedForm.getValueAsString(FIRST);
@@ -355,34 +374,39 @@ public class LoginView extends Canvas {
newSubject.setFsystem(false);
if (proceed) {
- GWTServiceLookup.getSubjectService().createSubjectUsingOverlord(newSubject, new AsyncCallback<Subject>() {
- public void onSuccess(Subject result) {
- CoreGUI.getMessageCenter().notify(
- new Message("Succesfully created new ldap Subject.", Message.Severity.Info));
- //now do group role assignment for initial login
- GWTServiceLookup.getLdapService().updateLdapGroupAssignmentsForSubject(result,
- new AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to assign roles for ldap Subject.",
- caught);
- }
-
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message("Succesfully assigned roles for ldap Subject.", Message.Severity.Info));
- window.destroy();
- loginShowing = false;
- callback.onSuccess(result);
- }
- });
- }
+ GWTServiceLookup.getSubjectService().createSubjectUsingOverlord(newSubject, password,
+ 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) {
- CoreGUI.getErrorHandler().handleError("Failed to create ldap Subject.", caught);
- }
- });
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to create ldap Subject.", caught);
+ }
+ });
} else {//log them out then reload LoginView
- com.allen_sauer.gwt.log.client.Log.warn("Failed to locate username required to create LDAP subject.");
+ Log.warn("Failed to locate username required to create LDAP subject.");
UserSessionManager.logout();
new LoginView().showLoginDialog();
}
@@ -411,7 +435,7 @@ public class LoginView extends Canvas {
return form;
}
- /**Build and loads the custom validators for each of the formItems
+ /**Build and loads the validators for each of the formItems
*
* @param form
*/
@@ -478,7 +502,7 @@ public class LoginView extends Canvas {
ResourceTypeRepository.Cache.getInstance().getResourceTypes((Integer[]) null,
EnumSet.allOf(ResourceTypeRepository.MetadataType.class), new ResourceTypeRepository.TypesLoadedCallback() {
public void onTypesLoaded(Map<Integer, ResourceType> types) {
- com.allen_sauer.gwt.log.client.Log.info("Preloaded [" + types.size() + "] resource types");
+ Log.info("Preloaded [" + types.size() + "] resource types");
}
});
}
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 e3dc5df..0932e6f 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
@@ -22,6 +22,7 @@ import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.SC;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.enterprise.gui.coregui.client.search.SearchBar;
/**
@@ -45,14 +46,14 @@ public class SearchGUI implements EntryPoint {
return;
}
- UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Void>() {
+ UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Subject>() {
@Override
public void onFailure(Throwable caught) {
SC.say("Unable to determine login status, check server status");
}
@Override
- public void onSuccess(Void result) {
+ public void onSuccess(Subject result) {
singleton.buildSearchGUI();
}
});
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 2722ea4..0dc4482 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
@@ -82,8 +82,7 @@ public class UserSessionManager {
private static Boolean needsRegistration = false;
- public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Void> callback) {
- // public static void checkLoginStatus(final String password, final AsyncCallback<Boolean> callback) {
+ public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Subject> callback) {
BrowserUtility.forceIe6Hacks();
RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
@@ -151,7 +150,7 @@ public class UserSessionManager {
GWTServiceLookup.getLdapService().checkSubjectForLdapAuth(subject, user, password,
new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
- Log.info("Unable to check subject for LDAP authorization - check Server status."
+ Log.warn("Unable to check subject for LDAP authorization - check Server status."
+ caught.getMessage());
//TODO: how/what to display in LoginView when unexpected communication with server occurs?
// LoginView
@@ -163,20 +162,20 @@ 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.
- Log.debug("No alternative case insensitive LDAP accounts located.");
- locateSubjectOrLogin(subjectId, sessionId, user, callback);
+ Log.trace("No alternative case insensitive LDAP accounts located.");
+ locateSubjectOrLogin(subjectId, sessionId, user, password, callback);
} else {//alternative Subject returned meaning we located
- Log.debug("Case insensitive matching LDAP account located.");
+ Log.trace("Case insensitive matching LDAP account located.");
needsRegistration = false;
//change the subject.sessionId
sessionSubject = checked;
locateSubjectOrLogin(checked.getId(), String.valueOf(checked.getSessionId()),
- checked.getName(), callback);
+ checked.getName(), password, callback);
}
- Log.debug("Subject registration required:" + needsRegistration);
+ Log.trace("Subject registration required:" + needsRegistration);
}
});
- } else {
+ } else {//invalid session. Back to login
new LoginView().showLoginDialog();
}
}
@@ -200,10 +199,10 @@ public class UserSessionManager {
* @param user
* @param callback
*/
- private static void locateSubjectOrLogin(int subjectId, final String sessionId, final String user,
- final AsyncCallback<Void> 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.debug("SubjectCriteria search with subjectId:" + subjectId);
+ Log.trace("SubjectCriteria search with subjectId:" + subjectId);
SubjectCriteria criteria = new SubjectCriteria();
criteria.fetchConfiguration(true);
criteria.addFilterId(subjectId);
@@ -216,14 +215,14 @@ public class UserSessionManager {
// LoginView
// .displayFormError("UserSessionManager: Unable to check subject for LDAP authorization "
// + "- check Server status.");
- com.allen_sauer.gwt.log.client.Log.info("Failed to load user's subject");
+ 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.debug("Found subject [" + subject + "].");
+ Log.trace("Found subject [" + subject + "].");
subject.setSessionId(Integer.valueOf(sessionId));
// reset the session subject to the latest, for wrapping in user preferences
@@ -232,13 +231,12 @@ public class UserSessionManager {
userPreferences = new UserPreferences(sessionSubject);
refresh();
- callback.onSuccess((Void) null);
+ callback.onSuccess(subject);
}
});
} else {
- Log.info("Proceeding with registration for ldap user '" + user + "'.");
- loggedIn = true;
- new LoginView().showRegistrationDialog(user, sessionId, callback);
+ Log.trace("Proceeding with registration for ldap user '" + user + "'.");
+ new LoginView().showRegistrationDialog(user, sessionId, password, callback);
}
}
@@ -246,18 +244,30 @@ public class UserSessionManager {
login(null, null);
}
+ /**Same as login, but passes in credentials optionally needed during new LDAP user registration.
+ *
+ * @param user
+ * @param password
+ */
public static void login(String user, String password) {
- checkLoginStatus(user, password, new AsyncCallback<Void>() {
- @Override
- public void onSuccess(Void result) {
+ checkLoginStatus(user, password, new AsyncCallback<Subject>() {
+ public void onSuccess(Subject result) {
// will build UI if necessary, then fires history event
+ loggedIn = true;
+ 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;
+ }
CoreGUI.get().buildCoreUI();
}
- @Override
public void onFailure(Throwable caught) {
Log.error("Unable to determine login status - check Server status.");
}
+
+ public String toString() {//attempt to identify call back
+ return super.toString() + " UserSessionManager.checkLoginStatus()";
+ }
});
}
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 b50900a..a277f90 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
@@ -64,7 +64,7 @@ public interface SubjectGWTService extends RemoteService {
* @param subjectToCreate The subject to be created.
* @return the newly persisted {@link Subject}
*/
- Subject createSubjectUsingOverlord(Subject subjectToCreate);
+ 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
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 46f37b9..f0c2135 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
@@ -313,12 +313,10 @@ public abstract class RPCDataSource<T> extends DataSource {
}
/** Quick method to determine if current user is still logged in.
- * Builds a
- *
+ *
* @return boolean indication of logged in status.
*/
protected boolean userStillLoggedIn() {
return UserSessionManager.isLoggedIn();
}
-
}
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 6d06e3c..a1de14c 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
@@ -25,6 +25,7 @@ import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.SC;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
/**
@@ -63,9 +64,9 @@ 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<Void>() {
+ UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Subject>() {
@Override
- public void onSuccess(Void result) {
+ public void onSuccess(Subject result) {
History.fireCurrentHistoryState();
}
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 fa515bd..8c5e9ea 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,6 +18,8 @@
*/
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;
@@ -62,10 +64,23 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
}
- public Subject createSubjectUsingOverlord(Subject subjectToCreate) {
+ /**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 {
- return SerialUtility.prepare(subjectManager.createSubject(subjectManager.getOverlord(), subjectToCreate),
- "SubjectManager.createSubjectUsingOverlord");
+ //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));
}
commit 96463b629a150b7df7792d0b23040851470ed96e
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Oct 13 17:24:00 2010 -0400
i)new user registration validation ii)check client side for loggedIn before fetches.
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 69ff0ae..97a97d9 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,9 +22,11 @@
*/
package org.rhq.enterprise.gui.coregui.client;
+import java.util.ArrayList;
import java.util.EnumSet;
import java.util.Map;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
@@ -55,6 +57,8 @@ import com.smartgwt.client.widgets.form.fields.SubmitItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent;
import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler;
+import com.smartgwt.client.widgets.form.validator.LengthRangeValidator;
+import com.smartgwt.client.widgets.form.validator.RegExpValidator;
import com.smartgwt.client.widgets.layout.HStack;
import com.smartgwt.client.widgets.layout.VLayout;
@@ -81,6 +85,21 @@ public class LoginView extends Canvas {
public LoginView() {
}
+ //registration fields
+ private TextItem first;
+ private TextItem last;
+ 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 = "username";
+ private static final String EMAIL = "email";
+ private static final String PHONE = "phone";
+ private static final String DEPARTMENT = "department";
+ private static final String SESSIONID = "sessionid";
+
public void showLoginDialog() {
if (!loginShowing) {
loginShowing = true;
@@ -166,6 +185,8 @@ public class LoginView extends Canvas {
if (!loginShowing) {
loginShowing = true;
+ forms = new ArrayList<DynamicForm>();
+
form = new DynamicForm();
form.setMargin(25);
form.setAutoFocus(true);
@@ -179,18 +200,18 @@ public class LoginView extends Canvas {
+ "<br/> Once you click \"OK\" you will be logged in.<br/><br/>");
column.addMember(wrapInDynamicForm(1, header));
//build ui elements for registration screen
- final TextItem first = new TextItem("first", "First Name");
+ first = new TextItem(FIRST, "First Name");
{
first.setRequired(true);
first.setWrapTitle(false);
first.setWidth(100);
}
- final TextItem last = new TextItem("last", "Last Name");
+ last = new TextItem(LAST, "Last Name");
{
last.setWrapTitle(false);
last.setWidth(100);
}
- final TextItem username = new TextItem("username", "Username");
+ final TextItem username = new TextItem(USERNAME, "Username");
{
username.setRequired(true);
username.setValue(user);
@@ -198,12 +219,12 @@ public class LoginView extends Canvas {
username.setWidth(100);
column.addMember(wrapInDynamicForm(6, first, last, username));
}
- final TextItem email = new TextItem("email", "Email");
+ email = new TextItem(EMAIL, "Email");
email.setRequired(true);
email.setWidth(100);
- final TextItem phone = new TextItem("phone", "Phone");
+ phone = new TextItem(PHONE, "Phone");
phone.setWidth(100);
- final TextItem department = new TextItem("department", "Department");
+ department = new TextItem(DEPARTMENT, "Department");
department.setWidth(100);
SpacerItem space = new SpacerItem();
space.setColSpan(1);
@@ -219,20 +240,30 @@ public class LoginView extends Canvas {
IButton okButton = new IButton("OK");
okButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- //pull in all relevant fields and do regular create
- //TODO: validation
- if (form.validate()) {
+ //validation
+ if (validateForms(forms)) {
+ Log.trace("Successfully validated all forms");
//populate form
- form.setValue("first", String.valueOf(first.getValue()));
- form.setValue("last", String.valueOf(last.getValue()));
- form.setValue("username", String.valueOf(username.getValue()));
- form.setValue("email", String.valueOf(email.getValue()));
- form.setValue("phone", String.valueOf(phone.getValue()));
- form.setValue("department", String.valueOf(department.getValue()));
- form.setValue("sessionid", sessionId);
+ form.setValue(FIRST, String.valueOf(first.getValue()));
+ form.setValue(LAST, String.valueOf(last.getValue()));
+ form.setValue(USERNAME, String.valueOf(username.getValue()));
+ form.setValue(EMAIL, String.valueOf(email.getValue()));
+ form.setValue(PHONE, String.valueOf(phone.getValue()));
+ form.setValue(DEPARTMENT, String.valueOf(department.getValue()));
+ form.setValue(SESSIONID, sessionId);
registerLdapUser(form, callback);
}
}
+
+ private boolean validateForms(ArrayList<DynamicForm> forms) {
+ boolean allValid = true;
+ for (DynamicForm form : forms) {
+ if (!form.validate()) {
+ allValid = false;
+ }
+ }
+ return allValid;
+ }
});
row.addMember(okButton);
@@ -251,7 +282,6 @@ public class LoginView extends Canvas {
IButton logout = new IButton("Logout");
logout.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- // System.out.println("---------- CLICKED logout");
UserSessionManager.logout();
window.destroy();
loginShowing = false;
@@ -281,15 +311,6 @@ public class LoginView extends Canvas {
window.addItem(form);
window.show();
-
- // form.addSubmitValuesHandler(new SubmitValuesHandler() {
- // public void onSubmitValues(SubmitValuesEvent submitValuesEvent) {
- // System.out.println("IN SUBMIT HANDER");
- // if (form.validate()) {
- // login(form.getValueAsString("user"), form.getValueAsString("password"));
- // }
- // }
- // });
}
}
@@ -298,36 +319,36 @@ public class LoginView extends Canvas {
//insert some required data checking
boolean proceed = true;
- String retrieved = populatedForm.getValueAsString("username");
+ String retrieved = populatedForm.getValueAsString(USERNAME);
if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) {
proceed = false;
}
- retrieved = populatedForm.getValueAsString("sessionid");
+ retrieved = populatedForm.getValueAsString(SESSIONID);
if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) {
proceed = false;
}
- newSubject.setName(populatedForm.getValueAsString("username"));
- newSubject.setSessionId(Integer.valueOf(populatedForm.getValueAsString("sessionid")));
+ newSubject.setName(populatedForm.getValueAsString(USERNAME));
+ newSubject.setSessionId(Integer.valueOf(populatedForm.getValueAsString(SESSIONID)));
//don't load null values not set or returned from ldap server
- retrieved = populatedForm.getValueAsString("first");
+ retrieved = populatedForm.getValueAsString(FIRST);
if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
- newSubject.setFirstName(populatedForm.getValueAsString("first"));
- retrieved = populatedForm.getValueAsString("last");
+ newSubject.setFirstName(populatedForm.getValueAsString(FIRST));
+ retrieved = populatedForm.getValueAsString(LAST);
if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
- newSubject.setLastName(populatedForm.getValueAsString("last"));
+ newSubject.setLastName(populatedForm.getValueAsString(LAST));
- retrieved = populatedForm.getValueAsString("department");
+ retrieved = populatedForm.getValueAsString(DEPARTMENT);
if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
- newSubject.setDepartment(populatedForm.getValueAsString("department"));
+ newSubject.setDepartment(populatedForm.getValueAsString(DEPARTMENT));
- retrieved = populatedForm.getValueAsString("email");
+ retrieved = populatedForm.getValueAsString(EMAIL);
if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
- newSubject.setEmailAddress(populatedForm.getValueAsString("email"));
+ newSubject.setEmailAddress(populatedForm.getValueAsString(EMAIL));
- retrieved = populatedForm.getValueAsString("phone");
+ retrieved = populatedForm.getValueAsString(PHONE);
if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
- newSubject.setPhoneNumber(populatedForm.getValueAsString("phone"));
+ newSubject.setPhoneNumber(populatedForm.getValueAsString(PHONE));
// newSubject.setSmsAddress(populatedForm.getValueAsString("sms"));
newSubject.setFactive(true);
@@ -360,8 +381,10 @@ public class LoginView extends Canvas {
CoreGUI.getErrorHandler().handleError("Failed to create ldap Subject.", caught);
}
});
- } else {
+ } else {//log them out then reload LoginView
com.allen_sauer.gwt.log.client.Log.warn("Failed to locate username required to create LDAP subject.");
+ UserSessionManager.logout();
+ new LoginView().showLoginDialog();
}
}
@@ -373,15 +396,51 @@ public class LoginView extends Canvas {
*/
private Canvas wrapInDynamicForm(int columnCount, FormItem... header) {
DynamicForm form = new DynamicForm();
- if (columnCount < 1) {//default to label and details for each form item
- form.setNumCols(header.length * 2);
- } else {
- form.setNumCols(columnCount);
+ 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);
}
- form.setFields(header);
return form;
}
+ /**Build and loads the custom validators for each of the formItems
+ *
+ * @param form
+ */
+ private void loadValidators(DynamicForm form) {
+ if (form != null) {
+ for (FormItem item : form.getFields()) {
+ String name = item.getName();
+ if ((name != null) && (!name.isEmpty())) {
+ if (name.equals(USERNAME)) {
+ LengthRangeValidator validator = new LengthRangeValidator();
+ validator.setMin(6);
+ item.setValidators(validator);
+ }
+ if (name.equals(FIRST)) {
+ LengthRangeValidator validator = new LengthRangeValidator();
+ validator.setMin(1);
+ item.setValidators(validator);
+ }
+ if (name.equals(EMAIL)) {
+ RegExpValidator emailValidator = new RegExpValidator();
+ emailValidator.setErrorMessage("Invalid email address");
+ emailValidator.setExpression("^([a-zA-Z0-9_.\\-+])+(a)(([a-zA-Z0-9\\-])+\\.)+[a-zA-Z0-9]{2,4}$");
+ item.setValidators(emailValidator);
+ }
+ }
+ }
+ }
+ }
+
private void login(final String user, final String password) {
BrowserUtility.forceIe6Hacks();
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 82305b3..2443c5b 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
@@ -104,26 +104,27 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
if ((currentlyAssignedLdapGroups != null)
&& (!currentlyAssignedLdapGroups.isEmpty())) {
RecordList loaded = availableGrid.getDataAsRecordList();
- ArrayList<Integer> located = new ArrayList<Integer>();
- // for (LdapGroup group : currentlyAssignedLdapGroups) {
- for (Map groupMap : currentlyAssignedLdapGroups) {
- int index = loaded.findIndex(name, (String) groupMap.get(name));
- if (index > -1) {
- located.add(Integer.valueOf(index));
+ if (loaded != null) {
+ ArrayList<Integer> located = new ArrayList<Integer>();
+ for (Map groupMap : currentlyAssignedLdapGroups) {
+ int index = loaded.findIndex(name, (String) groupMap.get(name));
+ if (index > -1) {
+ located.add(Integer.valueOf(index));
+ }
}
+ int[] records = new int[located.size()];
+ int i = 0;
+ for (Integer index : located) {
+ records[i++] = index.intValue();
+ }
+ availableGrid.selectRecords(records);
+ //now simulate button push
+ assignedGrid.transferSelectedData(availableGrid);
+ initialLdapSelectionsLoad = false;
+ select(assignedGrid.getSelection());
+ updateButtons();
+ assignedGrid.deselectAllRecords();
}
- int[] records = new int[located.size()];
- int i = 0;
- for (Integer index : located) {
- records[i++] = index.intValue();
- }
- availableGrid.selectRecords(records);
- //now simulate button push
- assignedGrid.transferSelectedData(availableGrid);
- initialLdapSelectionsLoad = false;
- select(assignedGrid.getSelection());
- updateButtons();
- assignedGrid.deselectAllRecords();
}
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourceDS.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourceDS.java
index 17b4074..7d4ab76 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourceDS.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourceDS.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
@@ -42,6 +43,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.RecentlyAddedResourceComposite;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.dashboard.Portlet;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.MeasurementUtility;
@@ -126,59 +128,35 @@ public class RecentlyAddedResourceDS extends DataSource {
// TODO GH: Enhance resourceCriteria query to support itime based filtering for
// "Recently imported" resources
- // GWTServiceLookup.getResourceService().findRecentlyAddedResources(0, 100,
- GWTServiceLookup.getResourceService().findRecentlyAddedResources(ctime, maxItems,
- new AsyncCallback<List<RecentlyAddedResourceComposite>>() {
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError("Failed to load recently added resources", throwable);
- }
+ //if logged in then proceed making server side calls
+ if (UserSessionManager.isLoggedIn()) {
+ GWTServiceLookup.getResourceService().findRecentlyAddedResources(ctime, maxItems,
+ new AsyncCallback<List<RecentlyAddedResourceComposite>>() {
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError("Failed to load recently added resources", throwable);
+ }
- public void onSuccess(List<RecentlyAddedResourceComposite> recentlyAddedList) {
- List<RecentlyAddedResourceComposite> list = new ArrayList<RecentlyAddedResourceComposite>();
+ public void onSuccess(List<RecentlyAddedResourceComposite> recentlyAddedList) {
+ List<RecentlyAddedResourceComposite> list = new ArrayList<RecentlyAddedResourceComposite>();
- for (RecentlyAddedResourceComposite recentlyAdded : recentlyAddedList) {
- list.add(recentlyAdded);
- list.addAll(recentlyAdded.getChildren());
- }
+ for (RecentlyAddedResourceComposite recentlyAdded : recentlyAddedList) {
+ list.add(recentlyAdded);
+ list.addAll(recentlyAdded.getChildren());
+ }
- response.setData(buildNodes(list));
- response.setTotalRows(list.size());
- processResponse(request.getRequestId(), response);
- }
- });
- //
- // GWTServiceLookup.getResourceService().findResourcesByCriteria(c, new AsyncCallback<PageList<Resource>>() {
- // public void onFailure(Throwable caught) {
- // CoreGUI.getErrorHandler().handleError("Failed to load recently added resources data",caught);
- // response.setStatus(DSResponse.STATUS_FAILURE);
- // processResponse(request.getRequestId(), response);
- // }
- //
- // public void onSuccess(PageList<Resource> result) {
- // PageList<Resource> all = new PageList<Resource>();
- //
- // for (Resource root : result) {
- // all.add(root);
- // if (root.getChildResources() != null)
- // all.addAll(root.getChildResources());
- // }
- //
- //
- // response.setData(buildNodes(all));
- // response.setTotalRows(all.getTotalSize());
- // processResponse(request.getRequestId(), response);
- // }
- // });
+ response.setData(buildNodes(list));
+ response.setTotalRows(list.size());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ } else {//
+ Log.debug("user is not logged in. Not fetching recently added resource now.");
+ //answer the datasource
+ response.setTotalRows(0);
+ processResponse(request.getRequestId(), response);
+ }
}
- // private TreeNode[] buildNodes(PageList<Resource> list) {
- // TreeNode[] treeNodes = new TreeNode[list.size()];
- // for (int i = 0; i < list.size(); ++i) {
- // treeNodes[i] = new ResourceTreeNode(list.get(i));
- // }
- // return treeNodes;
- // }
-
private TreeNode[] buildNodes(List<RecentlyAddedResourceComposite> list) {
TreeNode[] treeNodes = new TreeNode[list.size()];
for (int i = 0; i < list.size(); ++i) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
index 863afe2..c79dbd5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/RecentOperationsDataSource.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.operation;
import java.util.Date;
import java.util.List;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -132,28 +133,36 @@ public class RecentOperationsDataSource extends
}
}
- GWTServiceLookup.getOperationService().findRecentCompletedOperations(pageSize,
- new AsyncCallback<List<DisambiguationReport<ResourceOperationLastCompletedComposite>>>() {
+ if (userStillLoggedIn()) {//check session validity
+ GWTServiceLookup.getOperationService().findRecentCompletedOperations(pageSize,
+ new AsyncCallback<List<DisambiguationReport<ResourceOperationLastCompletedComposite>>>() {
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError("Failed to load recently completed operations.", throwable);
- }
-
- public void onSuccess(
- List<DisambiguationReport<ResourceOperationLastCompletedComposite>> recentOperationsList) {
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError("Failed to load recently completed operations.",
+ throwable);
+ }
- //translate DisambiguationReport into dataset entries
- response.setData(buildList(recentOperationsList));
- //entry count
- if (null != recentOperationsList) {
- response.setTotalRows(recentOperationsList.size());
- } else {
- response.setTotalRows(0);
+ public void onSuccess(
+ List<DisambiguationReport<ResourceOperationLastCompletedComposite>> recentOperationsList) {
+
+ //translate DisambiguationReport into dataset entries
+ response.setData(buildList(recentOperationsList));
+ //entry count
+ if (null != recentOperationsList) {
+ response.setTotalRows(recentOperationsList.size());
+ } else {
+ response.setTotalRows(0);
+ }
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
}
- //pass off for processing
- processResponse(request.getRequestId(), response);
- }
- });
+ });
+ } else {
+ Log.debug("user not logged in. Not fetching recently completed operations.");
+ //answer datasource
+ response.setTotalRows(0);
+ processResponse(request.getRequestId(), response);
+ }
}
/** Translates the DisambiguationReport of ResourceOperationLastCompletedComposites into specific
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
index ebb1185..ad86135 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.operation;
import java.util.Date;
import java.util.List;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -125,27 +126,34 @@ public class ScheduledOperationsDataSource extends
}
}
- GWTServiceLookup.getOperationService().findScheduledOperations(pageSize,
- new AsyncCallback<List<DisambiguationReport<ResourceOperationScheduleComposite>>>() {
+ if (userStillLoggedIn()) {
+ GWTServiceLookup.getOperationService().findScheduledOperations(pageSize,
+ new AsyncCallback<List<DisambiguationReport<ResourceOperationScheduleComposite>>>() {
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError("Failed to load scheduled operations.", throwable);
- }
-
- public void onSuccess(List<DisambiguationReport<ResourceOperationScheduleComposite>> scheduledOpsList) {
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError("Failed to load scheduled operations.", throwable);
+ }
- //translate DisambiguationReport into dataset entries
- response.setData(buildList(scheduledOpsList));
- //entry count
- if (null != scheduledOpsList) {
- response.setTotalRows(scheduledOpsList.size());
- } else {
- response.setTotalRows(0);
+ public void onSuccess(
+ List<DisambiguationReport<ResourceOperationScheduleComposite>> scheduledOpsList) {
+
+ //translate DisambiguationReport into dataset entries
+ response.setData(buildList(scheduledOpsList));
+ //entry count
+ if (null != scheduledOpsList) {
+ response.setTotalRows(scheduledOpsList.size());
+ } else {
+ response.setTotalRows(0);
+ }
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
}
- //pass off for processing
- processResponse(request.getRequestId(), response);
- }
- });
+ });
+ } else {
+ Log.debug("user not logged in. Not fetching scheduled operations.");
+ response.setTotalRows(0);
+ processResponse(request.getRequestId(), response);
+ }
}
/** Translates the DisambiguationReport of ProblemResourceComposites into specific
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
index 38c316b..af364e1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.resource;
import java.util.List;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -123,28 +124,34 @@ public class ProblemResourcesDataSource extends RPCDataSource<DisambiguationRepo
}
}
- GWTServiceLookup.getResourceService().findProblemResources(ctime, maxItems,
- new AsyncCallback<List<DisambiguationReport<ProblemResourceComposite>>>() {
+ if (userStillLoggedIn()) {
+ GWTServiceLookup.getResourceService().findProblemResources(ctime, maxItems,
+ new AsyncCallback<List<DisambiguationReport<ProblemResourceComposite>>>() {
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError("Failed to load resources with alerts/unavailability.",
- throwable);
- }
-
- public void onSuccess(List<DisambiguationReport<ProblemResourceComposite>> problemResourcesList) {
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError("Failed to load resources with alerts/unavailability.",
+ throwable);
+ }
- //translate DisambiguationReport into dataset entries
- response.setData(buildList(problemResourcesList));
- //entry count
- if (null != problemResourcesList) {
- response.setTotalRows(problemResourcesList.size());
- } else {
- response.setTotalRows(0);
+ public void onSuccess(List<DisambiguationReport<ProblemResourceComposite>> problemResourcesList) {
+
+ //translate DisambiguationReport into dataset entries
+ response.setData(buildList(problemResourcesList));
+ //entry count
+ if (null != problemResourcesList) {
+ response.setTotalRows(problemResourcesList.size());
+ } else {
+ response.setTotalRows(0);
+ }
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
}
- //pass off for processing
- processResponse(request.getRequestId(), response);
- }
- });
+ });
+ } else {
+ Log.debug("user not logged in. Not fetching resources with alerts/unavailability.");
+ response.setTotalRows(0);
+ processResponse(request.getRequestId(), response);
+ }
}
/** Translates the DisambiguationReport of ProblemResourceComposites into specific
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 014ce99..46f37b9 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
@@ -24,7 +24,6 @@ import java.util.Collection;
import java.util.List;
import java.util.Map;
-import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.JavaScriptObject;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
@@ -319,7 +318,6 @@ public abstract class RPCDataSource<T> extends DataSource {
* @return boolean indication of logged in status.
*/
protected boolean userStillLoggedIn() {
- Log.debug("User still logged in:" + UserSessionManager.isLoggedIn());
return UserSessionManager.isLoggedIn();
}
commit a377d0793945449b692773321e346c0bd5874c0d
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Oct 13 13:51:16 2010 -0400
i)inserted client side checking to lower amount of invalid requests for alerts ii)modified RPCDataSource to include login check method for all DataSources
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
index d7121e3..53e1ba4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.gui.coregui.client;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -149,22 +150,27 @@ public class Footer extends LocatableToolStrip {
// last eight hours
alertCriteria.addFilterStartTime(System.currentTimeMillis() - (1000L * 60 * 60 * 8));
- GWTServiceLookup.getAlertService().findAlertsByCriteria(alertCriteria,
- new AsyncCallback<PageList<Alert>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Latest alerts lookup failed", caught);
- }
-
- public void onSuccess(PageList<Alert> result) {
- if (result.isEmpty()) {
- setContents("no recent alerts");
- setIcon("subsystems/alert/Alert_LOW_16.png");
- } else {
- setContents(result.getTotalSize() + " recent alerts");
- setIcon("subsystems/alert/Alert_HIGH_16.png");
+ //check for still logged in before submitting server side request
+ if (UserSessionManager.isLoggedIn()) {
+ GWTServiceLookup.getAlertService().findAlertsByCriteria(alertCriteria,
+ new AsyncCallback<PageList<Alert>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Latest alerts lookup failed", caught);
+ }
+
+ public void onSuccess(PageList<Alert> result) {
+ if (result.isEmpty()) {
+ setContents("no recent alerts");
+ setIcon("subsystems/alert/Alert_LOW_16.png");
+ } else {
+ setContents(result.getTotalSize() + " recent alerts");
+ setIcon("subsystems/alert/Alert_HIGH_16.png");
+ }
}
- }
- });
+ });
+ } else {//dump request
+ Log.debug("user not logged in. Not fetching any alerts now.");
+ }
}
}
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 f6ca18f..69ff0ae 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
@@ -294,7 +294,6 @@ public class LoginView extends Canvas {
}
protected void registerLdapUser(DynamicForm populatedForm, final AsyncCallback<Void> callback) {
- System.out.println("--------- In registerLdapUser:");
Subject newSubject = new Subject();
//insert some required data checking
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 7d7e738..2722ea4 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
@@ -54,7 +54,6 @@ import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
* @author Joseph Marques
*/
public class UserSessionManager {
-
private static int SESSION_TIMEOUT = 29 * 60 * 1000; // 29 mins, just shorter than the 30-min web session timeout
private static int LOGOUT_DELAY = 5 * 1000; // wait 5 seconds for in-flight requests to complete before logout
@@ -237,7 +236,6 @@ public class UserSessionManager {
}
});
} else {
- // System.out.println("--------------- Registration needed.");
Log.info("Proceeding with registration for ldap user '" + user + "'.");
loggedIn = true;
new LoginView().showRegistrationDialog(user, sessionId, callback);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java
index a950c34..c8dbad3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java
@@ -24,6 +24,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.JavaScriptObject;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -143,23 +144,31 @@ public class AlertDataSource extends RPCDataSource<Alert> {
AlertCriteria criteria = getCriteria(request);
- this.alertService.findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
+ //check for still logged in before submitting server side request
+ if (userStillLoggedIn()) {
+ this.alertService.findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to fetch alerts data", caught);
- response.setStatus(RPCResponse.STATUS_FAILURE);
- processResponse(request.getRequestId(), response);
- }
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to fetch alerts data", caught);
+ response.setStatus(RPCResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(PageList<Alert> result) {
+ long fetchTime = System.currentTimeMillis() - start;
+ com.allen_sauer.gwt.log.client.Log.info(result.size() + " alerts fetched in: " + fetchTime + "ms");
+ response.setData(buildRecords(result));
+ // For paging to work, we have to specify size of full result set.
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ } else {//dump request
+ response.setTotalRows(0);
+ processResponse(request.getRequestId(), response);
+ Log.debug("user not logged in. Not fetching any alerts now.");
+ }
- public void onSuccess(PageList<Alert> result) {
- long fetchTime = System.currentTimeMillis() - start;
- com.allen_sauer.gwt.log.client.Log.info(result.size() + " alerts fetched in: " + fetchTime + "ms");
- response.setData(buildRecords(result));
- // For paging to work, we have to specify size of full result set.
- response.setTotalRows(result.getTotalSize());
- processResponse(request.getRequestId(), response);
- }
- });
}
protected AlertCriteria getCriteria(DSRequest request) {
@@ -284,7 +293,8 @@ public class AlertDataSource extends RPCDataSource<Alert> {
CoreGUI.getMessageCenter().notify(
new Message("Acknowledged [" + alertIds.length + "] alerts", Message.Severity.Info));
- com.allen_sauer.gwt.log.client.Log.info("Acknowledged Alerts with id's: " + Arrays.toString(alertIds) + ".");
+ com.allen_sauer.gwt.log.client.Log.info("Acknowledged Alerts with id's: " + Arrays.toString(alertIds)
+ + ".");
alertsView.refresh();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java
index ad825a9..28da47f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertPortletDataSource.java
@@ -1,5 +1,6 @@
package org.rhq.enterprise.gui.coregui.client.alert;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -86,22 +87,30 @@ public class AlertPortletDataSource extends AlertDataSource {
criteria.addFilterPriority(AlertPriority.getByLegacyIndex(getAlertPriorityIndex()));
}
- getAlertService().findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
+ //check for still logged in before submitting server side request
+ if (userStillLoggedIn()) {
+ getAlertService().findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to fetch alerts data", caught);
- response.setStatus(RPCResponse.STATUS_FAILURE);
- processResponse(request.getRequestId(), response);
- }
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to fetch alerts data", caught);
+ response.setStatus(RPCResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
- public void onSuccess(PageList<Alert> result) {
- long fetchTime = System.currentTimeMillis() - start;
- com.allen_sauer.gwt.log.client.Log.info(result.size() + " alerts fetched in: " + fetchTime + "ms");
- response.setData(buildRecords(result));
- response.setTotalRows(result.size());
- processResponse(request.getRequestId(), response);
- }
- });
+ public void onSuccess(PageList<Alert> result) {
+ long fetchTime = System.currentTimeMillis() - start;
+ Log.info(result.size() + " alerts fetched in: " + fetchTime + "ms");
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.size());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ } else {//dump request
+ response.setTotalRows(0);
+ processResponse(request.getRequestId(), response);
+ //TODO: spinder 10/13/10: not sure if we should log anything here. Could be noisy in log with not a lot of gain.
+ Log.debug("user not logged in. Not fetching any alerts now.");
+ }
}
public int getAlertRangeCompleted() {
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 86ab57e..014ce99 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
@@ -18,12 +18,13 @@
*/
package org.rhq.enterprise.gui.coregui.client.util;
-import java.util.Arrays;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.JavaScriptObject;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
@@ -39,6 +40,7 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.util.effects.ColoringUtility;
/**
@@ -229,7 +231,7 @@ public abstract class RPCDataSource<T> extends DataSource {
addField(field);
}
}
-
+
public void addFields(DataSourceField... fields) {
addFields(Arrays.asList(fields));
}
@@ -310,4 +312,15 @@ public abstract class RPCDataSource<T> extends DataSource {
return result;
}
+
+ /** Quick method to determine if current user is still logged in.
+ * Builds a
+ *
+ * @return boolean indication of logged in status.
+ */
+ protected boolean userStillLoggedIn() {
+ Log.debug("User still logged in:" + UserSessionManager.isLoggedIn());
+ return UserSessionManager.isLoggedIn();
+ }
+
}
commit d44ae2f95128ade4a1081e11e61a927e548f6746
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Oct 13 08:52:39 2010 -0400
fix for manage inventory permissions warnings with discovery queue
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/queue/AutodiscoveryPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/queue/AutodiscoveryPortlet.java
index 062b882..b5e820e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/queue/AutodiscoveryPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/queue/AutodiscoveryPortlet.java
@@ -64,7 +64,7 @@ public class AutodiscoveryPortlet extends ResourceAutodiscoveryView implements C
protected void onInit() {
super.onInit();
//initialize the datasource to include Portlet instance
- this.dataSource = new AutodiscoveryQueueDataSource();
+ this.dataSource = new AutodiscoveryQueueDataSource(getTreeGrid());
if ((getTreeGrid() != null) && (getDataSource() != null)) {
getTreeGrid().setDataSource(getDataSource());
}
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 5beb2b6..58bae69 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
@@ -22,7 +22,6 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.RemoteService;
-import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
/**
@@ -66,7 +65,6 @@ public interface AuthorizationGWTService extends RemoteService {
*/
Set<Permission> getImplicitGroupPermissions(int groupId);
-
/**
* Gets the set of global permissions that the current user explicitly possesses.
*
@@ -74,6 +72,11 @@ 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/ResourceGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java
index ab4ae27..c1ad38b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java
@@ -72,4 +72,5 @@ public interface ResourceGWTService extends RemoteService {
List<ResourceError> findResourceErrors(int resourceId);
Resource manuallyAddResource(int resourceTypeId, int parentResourceId, Configuration pluginConfiguration);
+
}
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 a881444..a947c57 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
@@ -24,6 +24,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -31,14 +32,17 @@ import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.DSDataFormat;
import com.smartgwt.client.types.DSProtocol;
+import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeNode;
+import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.AuthorizationGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
@@ -50,6 +54,11 @@ public class AutodiscoveryQueueDataSource extends DataSource {
private int unlimited = -1;
private int maximumPlatformsToDisplay = -1;
private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
+ private AuthorizationGWTServiceAsync authorizationService = GWTServiceLookup.getAuthorizationService();
+ public static final String NO_MANAGE_INVENTORY_PERMS_EMPTY_MESSAGE = "(Required manage inventory permissions missing. See Administrator to change)";
+ public static final String EMPTY_MESSAGE = "No items to show";
+ private TreeGrid dataContainerReference = null;
+ private static final Permission MANAGE_INVENTORY = Permission.MANAGE_INVENTORY;
public AutodiscoveryQueueDataSource() {
setClientOnly(false);
@@ -78,6 +87,11 @@ public class AutodiscoveryQueueDataSource extends DataSource {
statusField, timestampField);
}
+ public AutodiscoveryQueueDataSource(TreeGrid treeGrid) {
+ this();
+ this.dataContainerReference = treeGrid;
+ }
+
protected Object transformRequest(DSRequest request) {
DSResponse response = new DSResponse();
response.setAttribute("clientContext", request.getAttributeAsObject("clientContext"));
@@ -95,9 +109,9 @@ public class AutodiscoveryQueueDataSource extends DataSource {
}
protected void executeFetch(final DSRequest request, final DSResponse response) {
- PageControl pc = getPageControl(request);
+ final PageControl pc = getPageControl(request);
- HashSet<InventoryStatus> statuses = new HashSet<InventoryStatus>();
+ final HashSet<InventoryStatus> statuses = new HashSet<InventoryStatus>();
String statusesString = request.getCriteria().getAttributeAsString("statuses");
if (statusesString != null) {
@@ -113,16 +127,41 @@ public class AutodiscoveryQueueDataSource extends DataSource {
statuses.add(InventoryStatus.NEW);
}
- resourceService.getQueuedPlatformsAndServers(statuses, pc, new AsyncCallback<Map<Resource, List<Resource>>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to load inventory discovery queue", caught);
+ //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) {
+ if (dataContainerReference != null) {
+ dataContainerReference.setEmptyMessage(EMPTY_MESSAGE);
+ }
+ resourceService.getQueuedPlatformsAndServers(statuses, pc,
+ new AsyncCallback<Map<Resource, List<Resource>>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load inventory discovery queue",
+ caught);
+ }
+
+ public void onSuccess(Map<Resource, List<Resource>> result) {
+ response.setData(buildNodes(result));
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ } else {
+ 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);
+ dataContainerReference.setEmptyMessage(NO_MANAGE_INVENTORY_PERMS_EMPTY_MESSAGE);
+ }
+ processResponse(request.getRequestId(), response);
+ }
}
- public void onSuccess(Map<Resource, List<Resource>> result) {
- response.setData(buildNodes(result));
- processResponse(request.getRequestId(), response);
+ public void onFailure(Throwable caught) {
+ Log.error("Unable to determine whether if user has manage inventory permissions - check server logs.");
}
});
+
}
private TreeNode[] buildNodes(Map<Resource, List<Resource>> result) {
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 e1ea25e..1fee831 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
@@ -121,7 +121,7 @@ public class ResourceAutodiscoveryView extends LocatableVLayout {
treeGrid.setHeight100();
- treeGrid.setDataSource(dataSource = new AutodiscoveryQueueDataSource());
+ treeGrid.setDataSource(dataSource = new AutodiscoveryQueueDataSource(treeGrid));
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 4b8d73f..7a13a94 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
@@ -82,4 +82,20 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
+
+ /** 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/ResourceGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java
index 861fe72..dac630f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java
@@ -297,4 +297,5 @@ public class ResourceGWTServiceImpl extends AbstractGWTServiceImpl implements Re
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
+
}
commit 7158ea3bfd76b3041ed656660c57e206eb6148f2
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 18:51:37 2010 -0400
replace missing Config properties file.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/GeneralPropertiesConfigForm.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/GeneralPropertiesConfigForm.jsp
new file mode 100644
index 0000000..2c8a8a2
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/GeneralPropertiesConfigForm.jsp
@@ -0,0 +1,121 @@
+<%@ page language="java" %>
+<%@ page errorPage="/common/Error.jsp" %>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="/WEB-INF/tld/hq.tld" prefix="hq" %>
+
+<script src="<html:rewrite page="/js/"/>functions.js" type="text/javascript"></script>
+<link rel=stylesheet href="<html:rewrite page="/css/"/>win.css" type="text/css">
+
+<hq:constant
+ classname="org.rhq.enterprise.gui.legacy.Constants"
+ symbol="MINUTES_LABEL" var="CONST_MINUTES" />
+<hq:constant
+ classname="org.rhq.enterprise.gui.legacy.Constants"
+ symbol="HOURS_LABEL" var="CONST_HOURS" />
+<hq:constant
+ classname="org.rhq.enterprise.gui.legacy.Constants"
+ symbol="DAYS_LABEL" var="CONST_DAYS" />
+
+<!-- BASE SERVER CONFIG TITLE -->
+<tiles:insert definition=".header.tab">
+ <tiles:put name="tabKey" value="admin.settings.BaseConfigTab"/>
+</tiles:insert>
+<!-- / -->
+
+<!-- BASE SERVER CONFIG CONTENTS -->
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td width="45%" class="BlockLabel"><fmt:message key="admin.settings.BaseURL"/></td>
+ <td width="55%" class="BlockContent"><html:text size="31" property="baseUrl" /></td>
+ </tr>
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.AgentMaxQuietTimeAllowed"/></td>
+ <td class="BlockContent">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+<logic:messagesPresent property="agentMaxQuietTimeAllowedVal">
+ <td class="ErrorField">
+ <html:text size="2" property="agentMaxQuietTimeAllowedVal" />
+ </td>
+ <td class="ErrorField" width="100%">
+ <html:select property="agentMaxQuietTimeAllowed">
+ <html:option value="${CONST_MINUTES}"><fmt:message key="admin.settings.Minutes"/></html:option>
+ </html:select>
+ </td>
+</logic:messagesPresent>
+<logic:messagesNotPresent property="agentMaxQuietTimeAllowedVal">
+ <td class="BlockContent">
+ <html:text size="2" property="agentMaxQuietTimeAllowedVal" />
+ </td>
+ <td class="BlockContent" width="100%">
+ <html:select property="agentMaxQuietTimeAllowed">
+ <html:option value="${CONST_MINUTES}"><fmt:message key="admin.settings.Minutes"/></html:option>
+ </html:select>
+ </td>
+</logic:messagesNotPresent>
+ </tr>
+<logic:messagesPresent property="agentMaxQuietTimeAllowedVal">
+ <tr>
+ <td class="ErrorField" colspan="2">
+ <span class="ErrorFieldContent"> <html:errors property="agentMaxQuietTimeAllowedVal"/></span>
+ </td>
+ </tr>
+</logic:messagesPresent>
+<logic:messagesNotPresent property="agentMaxQuietTimeAllowedVal">
+ <tr>
+ <td class="BlockContent" colspan="2">
+ </td>
+ </tr>
+</logic:messagesNotPresent>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.EnableAgentAutoUpdate"/></td>
+ <td class="BlockContent">
+ <table cellpadding="0" cellspacing="4" border="0">
+ <tr>
+ <td align="left"><html:radio property="enableAgentAutoUpdate" value="true"/><fmt:message key="yesno.true"/></td>
+ <td align="left"><html:radio property="enableAgentAutoUpdate" value="false"/><fmt:message key="yesno.false"/></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+<hq:authorization permission="superuser">
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.EnableDebugMode"/></td>
+ <td class="BlockContent">
+ <table cellpadding="0" cellspacing="4" border="0">
+ <tr>
+ <td align="left"><html:radio property="enableDebugMode" value="true"/><fmt:message key="yesno.true"/></td>
+ <td align="left"><html:radio property="enableDebugMode" value="false"/><fmt:message key="yesno.false"/></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</hq:authorization>
+
+<fmt:message var="productName" key="product.shortName" />
+<c:if test="${productName eq 'RHQ'}">
+<hq:authorization permission="superuser">
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.EnableExperimentalFeatures"/></td>
+ <td class="BlockContent">
+ <table cellpadding="0" cellspacing="4" border="0">
+ <tr>
+ <td align="left"><html:radio property="enableExperimentalFeatures" value="true"/><fmt:message key="yesno.true"/></td>
+ <td align="left"><html:radio property="enableExperimentalFeatures" value="false"/><fmt:message key="yesno.false"/></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</hq:authorization>
+</c:if>
+
+</table>
commit 9e7e98c20177110b1efe170b2cb0edb1be251cd5
Merge: ffef8a5... 08566cc...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 18:08:47 2010 -0400
Merge branch 'master' into gwt-ldap2
commit ffef8a5480c7e37f1a6d2c0b9080ae9871c4e650
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 17:42:58 2010 -0400
more merge cleanup. Fix no ldap configured display. Lightweight ldap check.
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 4738e30..836a355 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
@@ -115,15 +115,18 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
groupSelectorItem = new CanvasItem("groupSelectionCanvas", "Assigned Resource Groups");
groupSelectorItem.setTitleOrientation(TitleOrientation.TOP);
groupSelectorItem.setColSpan(2);
+ groupSelectorItem.setCanvas(new Canvas());
subjectSelectorItem = new CanvasItem("subjectSelectionCanvas", "Assigned Subjects");
subjectSelectorItem.setTitleOrientation(TitleOrientation.TOP);
subjectSelectorItem.setColSpan(2);
+ subjectSelectorItem.setCanvas(new Canvas());
//instantiate ldap group selector
ldapGroupSelectorItem = new CanvasItem("ldapGroupSelectionCanvas", "LDAP Groups");
ldapGroupSelectorItem.setTitleOrientation(TitleOrientation.TOP);
ldapGroupSelectorItem.setColSpan(2);
+ ldapGroupSelectorItem.setCanvas(new Canvas());
IButton saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save");
saveButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
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 9cd749c..82305b3 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
@@ -28,6 +28,7 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
@@ -56,7 +57,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
public static final String AVAILABLE_GROUPS = "Available Groups";
public static final String SELECTED_GROUPS = "Selected Groups";
private LdapGroupsDataSource availableDatasource;
- // private LdapAssignedGroupsDatasource assignedDataSource;
protected HashSet<String> selection = new HashSet<String>();
private int currentRole = -1;
private boolean initialLdapSelectionsLoad = true;
@@ -174,6 +174,9 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
public class LdapGroupsDataSource extends RPCDataSource<HashSet<Map<String, String>>> {
+ 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";
+
public LdapGroupsDataSource() {
DataSourceTextField nameField = new DataSourceTextField(name, name);
nameField.setPrimaryKey(true);
@@ -227,27 +230,47 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
@Override
protected void executeFetch(final DSRequest request, final DSResponse response) {
- 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) {
-
- //translate groups into records for grid
- response.setData(buildRecords(locatedGroups));
- //entry count
- if (null != locatedGroups) {
- response.setTotalRows(locatedGroups.size());
+ //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.debug("Successfully located groups.");
+ //translate groups into records for grid
+ response.setData(buildRecords(locatedGroups));
+ //entry count
+ if (null != locatedGroups) {
+ response.setTotalRows(locatedGroups.size());
+ } else {
+ response.setTotalRows(0);
+ }
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
+ }
+ });
} else {
+ Log.debug("(LDAP not currently enabled. " + EMPTY_MESSAGE);
response.setTotalRows(0);
+ availableGrid.setEmptyMessage(LDAP_NOT_CONFIGURED_EMPTY_MESSAGE);
+ processResponse(request.getRequestId(), response);
}
- //pass off for processing
- processResponse(request.getRequestId(), response);
}
- });
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.error("Unable to determine whether ldap configured - check server logs.");
+ }
+ });
}
}
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 5daf50e..0209e37 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
@@ -79,4 +79,10 @@ public interface LdapGWTService extends RemoteService {
*/
Set<Map<String, String>> findLdapGroupsAssignedToRole(int currentRoleId);
+ /** Boolean response about whether ldap configured..
+ *
+ * @return
+ */
+ Boolean checkLdapConfiguredStatus();
+
}
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 41d49bb..d03c53c 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
@@ -36,6 +36,7 @@ import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
+import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -47,6 +48,7 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
private LdapGroupManagerLocal ldapManager = LookupUtil.getLdapGroupManager();
private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ private SystemManagerLocal systemManager = LookupUtil.getSystemManager();
@Override
public Set<Map<String, String>> findAvailableGroups() {
@@ -277,4 +279,19 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
+
+ /**Light call to determine ldap configuration status.
+ *
+ */
+ @Override
+ public Boolean checkLdapConfiguredStatus() {
+ Boolean ldapEnabled = false;
+ try {
+ String provider = systemManager.getSystemConfiguration().getProperty(RHQConstants.JAASProvider);
+ ldapEnabled = ((provider != null) && provider.equals(RHQConstants.LDAPJAASProvider));
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ return ldapEnabled;
+ }
}
\ No newline at end of file
commit d7e0f2de7a91644600c7120a5474922d53ef57e4
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 16:13:11 2010 -0400
bad merge cleanup.
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 d57e2d8..9cd749c 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
@@ -63,20 +63,9 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
public RoleLdapGroupSelector(String locatorId, Integer integer) {
super(locatorId);
- //define datasource for AvailableLdap groups
- // dataSource = new LdapGroupsDataSource();
- // getAvailableGrid().setDataSource(dataSource);
- System.out.println("------- instantiating ldapGroupsDataSource:" + integer);
- this.currentRole = integer.intValue();
- // assignedDataSource = new LdapAssignedGroupsDatasource(integer);
- System.out.println("----- instantiated: about to assign:");
- // getAssignedGrid().setDataSource(assignedDataSource);
- // System.out.println("--- set the datasource");
- // if (integer != null) {
- // // ListGridRecord[] data = (new RolesDataSource()).buildRecords(set);
- // ListGridRecord[] data = dataSource.buildAssignedRecords(integer);
- // setAssigned(data);
- // }
+ if (integer != null) {
+ this.currentRole = integer.intValue();
+ }
}
@Override
@@ -86,67 +75,63 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
@Override
protected RPCDataSource<HashSet<Map<String, String>>> getDataSource() {
- // return new SelectedRolesDataSource();
if (availableDatasource == null) {
availableDatasource = new LdapGroupsDataSource();
//add subsequent listener
- //add listener to AvailableGrid, to act after successfully populated.
- getAvailableGrid().addDataArrivedHandler(new DataArrivedHandler() {
- @Override
- public void onDataArrived(DataArrivedEvent event) {
- System.out.println("----------- in ldapAss.executeFetch:" + getCurrentRole() + ":initialLdapLoad:"
- + initialLdapSelectionsLoad);
- int currentRoleId = getCurrentRole();
- if (initialLdapSelectionsLoad) {
- GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- 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>> currentlyAssignedLdapGroups) {
- System.out.println("------ ldapAss.fetch.success:" + 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
- if ((currentlyAssignedLdapGroups != null)
- && (!currentlyAssignedLdapGroups.isEmpty())) {
- RecordList loaded = availableGrid.getDataAsRecordList();
- ArrayList<Integer> located = new ArrayList<Integer>();
- // for (LdapGroup group : currentlyAssignedLdapGroups) {
- for (Map groupMap : currentlyAssignedLdapGroups) {
- System.out.println("------- ldapAss.fetch.suc.grpName:"
- + groupMap.get(name) + ":");
- // .println("------- ldapAss.fetch.suc.grpName:" + group.getName() + ":");
- // int index = loaded.findIndex(name, group.getName());
- int index = loaded.findIndex(name, (String) groupMap.get(name));
- if (index > -1) {
- located.add(Integer.valueOf(index));
- }
+ int currentRoleId = getCurrentRole();
+ if (currentRoleId > -1) {
+
+ //add listener to AvailableGrid, to act after successfully populated.
+ getAvailableGrid().addDataArrivedHandler(new DataArrivedHandler() {
+ @Override
+ public void onDataArrived(DataArrivedEvent event) {
+ int currentRoleId = getCurrentRole();
+ if (currentRoleId > -1) {
+ if (initialLdapSelectionsLoad) {
+ GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
+ new AsyncCallback<Set<Map<String, String>>>() {
+
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to load LdapGroups available for role.", throwable);
}
- System.out.println("--------located:" + located.size());
- int[] records = new int[located.size()];
- int i = 0;
- for (Integer index : located) {
- records[i++] = index.intValue();
+
+ public void onSuccess(Set<Map<String, String>> 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
+ if ((currentlyAssignedLdapGroups != null)
+ && (!currentlyAssignedLdapGroups.isEmpty())) {
+ RecordList loaded = availableGrid.getDataAsRecordList();
+ ArrayList<Integer> located = new ArrayList<Integer>();
+ // for (LdapGroup group : currentlyAssignedLdapGroups) {
+ for (Map groupMap : currentlyAssignedLdapGroups) {
+ int index = loaded.findIndex(name, (String) groupMap.get(name));
+ if (index > -1) {
+ located.add(Integer.valueOf(index));
+ }
+ }
+ int[] records = new int[located.size()];
+ int i = 0;
+ for (Integer index : located) {
+ records[i++] = index.intValue();
+ }
+ availableGrid.selectRecords(records);
+ //now simulate button push
+ assignedGrid.transferSelectedData(availableGrid);
+ initialLdapSelectionsLoad = false;
+ select(assignedGrid.getSelection());
+ updateButtons();
+ assignedGrid.deselectAllRecords();
+ }
}
- availableGrid.selectRecords(records);
- //now simulate button push
- assignedGrid.transferSelectedData(availableGrid);
- initialLdapSelectionsLoad = false;
- select(assignedGrid.getSelection());
- updateButtons();
- assignedGrid.deselectAllRecords();
- }
- }
- });
+ });
+ }
+ }
}
- }
- });
-
+ });
+ }
}
return availableDatasource;
}
@@ -156,118 +141,23 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
return null; // TODO: Implement this method.
}
- // @Override
- // protected void onInit() {
- // super.onInit();
- // removeButton = new LocatableTransferImgButton(this.getLocatorId(), TransferImgButton.LEFT);
- // removeButton.setDisabled(true);
- // // addAllButton = new LocatableTransferImgButton(this.getLocatorId(), TransferImgButton.RIGHT_ALL);
- // removeAllButton = new LocatableTransferImgButton(this.getLocatorId(), TransferImgButton.LEFT_ALL);
- // removeAllButton.setDisabled(true);
- // removeButton.addClickHandler(new ClickHandler() {
- // public void onClick(ClickEvent clickEvent) {
- // System.out.println("Custom remove Button:");
- // ListGridRecord[] storedSelection = assignedGrid.getSelection();
- // deselect(assignedGrid.getSelection());
- // assignedGrid.removeSelectedData();
- // //now walk through and re-enable all selected elements in Available grid
- // RecordList availList = availableGrid.getDataAsRecordList();
- // for (ListGridRecord r : storedSelection) {
- // Record record = availList.find(name, r.getAttributeAsString(name));
- // if (record != null)
- // ((ListGridRecord) record).setEnabled(true);
- // }
- // updateButtons();
- // }
- // });
- // removeAllButton.addClickHandler(new ClickHandler() {
- // public void onClick(ClickEvent clickEvent) {
- // assignedGrid.selectAllRecords();
- // deselect(assignedGrid.getSelection());
- // assignedGrid.removeSelectedData();
- // updateButtons();
- // }
- // });
- //
- // }
-
- // HashSet<String> selection = new HashSet<String>();
-
- // @Override
- // protected void select(ListGridRecord[] records) {
- // availableGrid.deselectAllRecords();
- // // RecordList recordList = availableGrid.getDataAsRecordList();
- // for (ListGridRecord record : records) {
- // record.setEnabled(false);
- // // selection.add(record.getAttributeAsInt("id"));
- // // int selectedIndex = -1;
- // String groupName = record.getAttributeAsString(name);
- // // selectedIndex = recordList.findIndex(name, groupName);
- // // selection.add(Integer.valueOf(selectedIndex));
- // selection.add(groupName);
- // }
- // assignedGrid.markForRedraw();
- // }
protected void select(ListGridRecord[] records) {
- System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
- System.out.println("******** RoleLdapGroupSelector.select:" + records.length);
availableGrid.deselectAllRecords();
for (ListGridRecord record : records) {
record.setEnabled(false);
- // selection.add(record.getAttributeAsInt("id"));
- // selection.add(record.getAttributeAsString(name));
selection.add(record.getAttributeAsString(name));
}
- System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
assignedGrid.markForRedraw();
}
- @Override
- // protected void deselect(ListGridRecord[] records) {
- // HashSet<Integer> toRemove = new HashSet<Integer>();
- // for (ListGridRecord record : records) {
- // // System.out.println("------- record.getAttribAsInt:" + record.getAttributeAsInt(name));
- // String value = null;
- // // System.out.println("------- record.getAttribAsInt:" + record.getAttribute(name));
- // // System.out.println("------- record.getAttribAsString:" + (value = record.getAttributeAsString(name)));
- // // System.out.println("------- record.getAttribAsString-id:" + record.getAttributeAsString(id));
- // // if (record.getAttributeAsInt("id") != null) {
- // if (value != null) {
- // // toRemove.add(record.getAttributeAsInt("id"));
- // System.out.println("--------Inside getAttr as string:" + value + ":");
- // int found = availableGrid.getDataAsRecordList().findIndex(name, record.getAttributeAsString(name));
- // System.out.println("---------- index:" + found);
- // if (found > -1) {
- // toRemove.add(Integer.valueOf(found));
- // }
- // }
- // }
- // selection.removeAll(toRemove);
- //
- // for (Integer id : toRemove) {
- // // Record r = availableGrid.getDataAsRecordList().find("id", id);
- // Record r = availableGrid.getDataAsRecordList().get(id);
- // if (r != null) {
- // ((ListGridRecord) r).setEnabled(true);
- // }
- // }
- // availableGrid.markForRedraw();
- // }
protected void deselect(ListGridRecord[] records) {
- System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
- System.out.println("******** RoleLdapGroupSelector.deselect:" + records.length);
- // HashSet<Integer> toRemove = new HashSet<Integer>();
HashSet<String> toRemove = new HashSet<String>();
for (ListGridRecord record : records) {
- // toRemove.add(record.getAttributeAsInt("id"));
toRemove.add(record.getAttributeAsString(name));
}
selection.removeAll(toRemove);
- System.out.println("Selection size:" + selection.size());
- // for (Integer id : toRemove) {
for (String name : toRemove) {
- // Record r = availableGrid.getDataAsRecordList().find("id", id);
Record r = availableGrid.getDataAsRecordList().find(name, name);
if (r != null) {
((ListGridRecord) r).setEnabled(true);
@@ -279,74 +169,20 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
cnt++;
}
}
- System.out.println("------ availableGrid.enabledCount.size:" + cnt);
- System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
availableGrid.markForRedraw();
}
- // protected void updateButtons() {
- // super.updateButtons();
- // System.out.println("+++++++updateButtons, called Super()");
- // assignedGrid.deselectAllRecords();
- // System.out.println("********** After Update Group Selection size:" + getGroupSelection().size());
- // // addButton.setDisabled(!availableGrid.anySelected() || availableGrid.getTotalRows() == 0);
- // // removeButton.setDisabled(!assignedGrid.anySelected() || assignedGrid.getTotalRows() == 0);
- // // addAllButton.setDisabled(availableGrid.getTotalRows() == 0);
- // // removeAllButton.setDisabled(assignedGrid.getTotalRows() == 0);
- // }
-
- // public class SelectedRolesDataSource extends RolesDataSource {
- //
- // @Override
- // public ListGridRecord[] buildRecords(Collection<Role> roles) {
- // ListGridRecord[] records = super.buildRecords(roles);
- // for (ListGridRecord record : records) {
- // if (selection.contains(record.getAttributeAsInt("id"))) {
- // record.setEnabled(false);
- // }
- // }
- // return records;
- // }
- // }
-
public class LdapGroupsDataSource extends RPCDataSource<HashSet<Map<String, String>>> {
public LdapGroupsDataSource() {
- // DataSourceTextField idField = new DataSourceTextField(id, id);
- // idField.setPrimaryKey(true);
-
DataSourceTextField nameField = new DataSourceTextField(name, name);
nameField.setPrimaryKey(true);
DataSourceTextField descriptionField = new DataSourceTextField(description, description);
- // DataSourceImageField availablilityField = new DataSourceImageField(available, "Current Availability");
-
setFields(nameField, descriptionField);
}
- // public ListGridRecord[] buildAssignedRecords(Set<LdapGroup> currentlyAssignedLdapGroups) {
- // ListGridRecord[] records = new ListGridRecord[0];
- // int index = 0;
- // if ((currentlyAssignedLdapGroups != null) && (!currentlyAssignedLdapGroups.isEmpty())) {
- // //load groupsData
- // records = new ListGridRecord[currentlyAssignedLdapGroups.size()];
- // for (LdapGroup group : currentlyAssignedLdapGroups) {
- // ListGridRecord record = new ListGridRecord();
- // //load identifier
- // // record.setAttribute(id, group.get(id));
- // record.setAttribute(id, group.getName());
- // //load name
- // record.setAttribute(name, group.getName());
- // //load description
- // record.setAttribute(description, group.getDescription());
- //
- // records[index++] = record;
- // }
- // }
- // return records;
- // }
-
public ListGridRecord[] buildRecords(Set<Map<String, String>> locatedGroups) {
ListGridRecord[] records = new ListGridRecord[0];
int indx = 0;
@@ -361,7 +197,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
//iterate over the group data to translate into records
ListGridRecord record = new ListGridRecord();
//load identifier
- // record.setAttribute(id, group.get(id));
record.setAttribute(id, index++);
//load name
record.setAttribute(name, group.get(name));
@@ -414,20 +249,10 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
});
}
-
- // @Override
- // public Set<String> getSelection() {
- // // System.out.println("------------ Returning selection:" + selection.size() + "selection:" + selection);
- // return selection;
- // }
-
}
public HashSet<String> getGroupSelection() {
- System.out.println("------- selection is:" + selection + ":cnt:" + selection.size());
- System.out.println("------- actual size is:" + assignedGrid.getSelection().length);
RecordList records = assignedGrid.getDataAsRecordList();
- System.out.println("------- Rec list cnt:" + records.toArray().length);
//empty out selection and populate with actual contents
selection.clear();
if (!records.isEmpty()) {
@@ -435,10 +260,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
selection.add(r.getAttributeAsString(name));
}
}
- System.out.println("------- selection is:" + selection + ":cnt:" + selection.size());
- System.out.println("-------AS selection is:" + assignedGrid.getSelection() + ":cnt:"
- + assignedGrid.getSelection().length);
- // return selection;
HashSet<String> assignedSelections = new HashSet<String>();
for (ListGridRecord r : assignedGrid.getSelection()) {
assignedSelections.add(r.getAttributeAsString(name));
@@ -447,7 +268,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
for (Record r : assignedGrid.getDataAsRecordList().toArray()) {
remainingRecords.add(r.getAttributeAsString(name));
}
- // return assignedSelections;
return remainingRecords;
}
@@ -455,7 +275,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
private Integer currentRoleId = Integer.valueOf(-1);
public LdapAssignedGroupsDatasource(Integer integer) {
- System.out.println("----------- LdapAssigned.Constructor:" + integer);
if (integer != null) {
this.currentRoleId = integer;
}
@@ -465,34 +284,22 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
@Override
public Set<String> copyValues(ListGridRecord from) {
- // Set<String> copied = new HashSet<String>();
- // if (from != null) {
- // copied.add(from.getAttributeAsString(name));
- // }
- // return copied;
return null;
}
@Override
public ListGridRecord copyValues(Set<String> from) {
- // ListGridRecord lgr = new ListGridRecord();
- // if (from != null) {
- // lgr.setAttribute(name, from.iterator().next());
- // }
- // return lgr;
return null;
}
@Override
protected void executeFetch(final DSRequest request, final DSResponse response) {
- System.out.println("----------- in ldapAss.executeFetch:" + getCurrentRoleId());
int currentRoleId = -1;
if ((getCurrentRoleId() != null) && (getCurrentRoleId().intValue() > -1)) {
currentRoleId = getCurrentRoleId().intValue();
}
GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- // new AsyncCallback<Set<LdapGroup>>() {
new AsyncCallback<Set<Map<String, String>>>() {
public void onFailure(Throwable throwable) {
@@ -500,24 +307,19 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
throwable);
}
- // public void onSuccess(Set<LdapGroup> currentlyAssignedLdapGroups) {
public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
- System.out.println("------ ldapAss.fetch.success:" + 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 (LdapGroup group : currentlyAssignedLdapGroups) {
for (Map groupMap : currentlyAssignedLdapGroups) {
- // int index = loaded.findIndex(name, group.getName());
int index = loaded.findIndex(name, (String) groupMap.get(name));
if (index > -1) {
located.add(Integer.valueOf(index));
}
}
- System.out.println("--------located:" + located.size());
int[] records = new int[located.size()];
int i = 0;
for (Integer index : located) {
@@ -539,13 +341,9 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
processResponse(request.getRequestId(), response);
}
});
- //now find out which groups are shared
- //mock up transfer via buttons
- //TODO: above
}
public ListGridRecord[] buildAssignedRecords(Set<LdapGroup> currentlyAssignedLdapGroups) {
- System.out.println("----- buildAssRecords:");
ListGridRecord[] records = new ListGridRecord[0];
int index = 0;
if ((currentlyAssignedLdapGroups != null) && (!currentlyAssignedLdapGroups.isEmpty())) {
@@ -553,8 +351,6 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
records = new ListGridRecord[currentlyAssignedLdapGroups.size()];
for (LdapGroup group : currentlyAssignedLdapGroups) {
ListGridRecord record = new ListGridRecord();
- //load identifier
- // record.setAttribute(id, group.get(id));
record.setAttribute(id, group.getName());
//load name
record.setAttribute(name, group.getName());
@@ -579,11 +375,4 @@ public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String,
public int getCurrentRole() {
return currentRole;
}
-
- // @Override
- // public HashSet<Integer> getSelection() {
- // // TODO Auto-generated method stub
- // return super.getSelection();
- // }
-
}
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 7c232b7..5daf50e 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
@@ -40,12 +40,6 @@ public interface LdapGWTService extends RemoteService {
*/
Set<Map<String, String>> findAvailableGroups();
- // /** Fin
- // *
- // * @return
- // */
- // Set<String> findAvailableGroupsFor();
-
/**
* Updates the role with the ldap groups selected.
*/
@@ -69,6 +63,13 @@ public interface LdapGWTService extends RemoteService {
*/
Subject checkSubjectForLdapAuth(Subject currentSubject, String user, String password);
+ /**
+ *
+ * @param currentSubject
+ * @param user
+ * @param password
+ * @return
+ */
void updateLdapGroupAssignmentsForSubject(Subject subject);
/** Finds ldap groups already assigned to this role.
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 f52f493..41d49bb 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
@@ -59,38 +59,9 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
}
- // @Override
- // public Set<String> findAvailableGroupsFor() {
- // Set<String> locatedGroups = new HashSet<String>();
- // try {
- // locatedGroups = ldapManager.findAvailableGroupsFor(getSessionSubject().getName());
- // return SerialUtility.prepare(locatedGroups, "findAvailableGroupsFor");
- // } catch (Exception e) {
- // throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- // }
- //
- // }
-
@Override
public void addLdapGroupsToRole(int roleId, List<String> groupIds) {
- // //clean out existing roles as this defines the new list of roles
- // PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- // com.allen_sauer.gwt.log.client.Log.info("------EXISTING:" + existing.getTotalSize() + ":obj:" + existing);
- // if (!existing.isEmpty()) {
- // int i = 0;
- // int[] groupIndices = new int[existing.size()];
- // for (LdapGroup g : existing) {
- // groupIndices[i] = i++;
- // }
- // System.out.println("------- pre-existing:" + groupIndices);
- // com.allen_sauer.gwt.log.client.Log.info("------- pre-existing:" + groupIndices);
- // ldapManager.removeLdapGroupsFromRole(getSessionSubject(), roleId, groupIndices);
- // }
- // System.out.println("------ Adding ldap groups to role:" + roleId + ":gpIds:" + groupIds);
- // com.allen_sauer.gwt.log.client.Log.info("------ Adding ldap groups to role:" + roleId + ":gpIds:" + groupIds);
- // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
try {
- // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
@@ -99,15 +70,11 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
public void setLdapGroupsForRole(int roleId, List<String> groupIds) {
- System.out.println("----------------- Group ids:" + groupIds);
try {
//clean out existing roles as this defines the new list of roles
PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
com.allen_sauer.gwt.log.client.Log.debug("Removing " + existing.getTotalSize() + " groups from role '"
+ roleId + "'.");
- System.out.println("Removing " + existing.getTotalSize() + " groups from role '" + roleId + "'.");
- // PageList<LdapGroup> currentLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- // Log.debug("Found "+currentLdapGroups.size()+" current LDAP groups for role'"+roleId+".");
int[] groupIndices = new int[existing.size()];
int indx = 0;
for (LdapGroup lg : existing) {
@@ -115,12 +82,9 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
com.allen_sauer.gwt.log.client.Log
.debug("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
- System.out.println("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
- // ldapManager.removeLdapGroupsFromRole(getSessionSubject(), roleId, groupIndices);
ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
PageList<LdapGroup> nowGroups = ldapManager
.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- System.out.println("LDAP GROUP count for '" + roleId + "' after deletion. Cnt:" + nowGroups.size());
//from among all available groups, if group name matches then add it to the list.
ArrayList<String> validGroupIds = new ArrayList<String>();
@@ -134,61 +98,11 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
com.allen_sauer.gwt.log.client.Log.debug("Adding " + validGroupIds.size() + " ldap groups to role["
+ roleId + "].");
- System.out.println("NOW adding the following " + validGroupIds.size() + " groupIds");
- // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- System.out.println("LDAP GROUP count for '" + roleId + "' after addition. Cnt:" + nowGroups.size());
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
-
- // if (!existing.isEmpty() && (groupIds != null) && (!groupIds.isEmpty())) {
- // ArrayList<Integer> located = new ArrayList<Integer>();
- // for (String groupName : groupIds) {
- // for (LdapGroup storedGroup : existing) {
- // if (groupName.equals(storedGroup.getName())) {
- // located.add(storedGroup.getId());
- // }
- // }
- // }
- //
- // int i = 0;
- // groupIndices = new int[located.size()];
- // for (Integer l : located) {
- // groupIndices[i++] = l;
- // }
- // // for (LdapGroup g : existing) {
- // //// groupIndices[i] = i++;
- // // //translate the group name into LdapGroup id
- // // if(g.getName().equalsIgnoreCase("")){
- // // groupIndices[i] = i++;
- // // }
- // // }
- // for (int j : groupIndices) {
- // System.out.println("------- Existing LDAP GROUP ID:" + j);
- // }
- // com.allen_sauer.gwt.log.client.Log
- // .debug("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
- // System.out.println("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
- // // ldapManager.removeLdapGroupsFromRole(getSessionSubject(), roleId, groupIndices);
- // ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
- // PageList<LdapGroup> nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- // System.out.println("LDAP GROUP count for '"+roleId+"' after deletion. Cnt:"+nowGroups.size());
- // }
- // // System.out.println("------ Adding ldap groups to role:" + roleId + ":gpIds:" + groupIds);
- // com.allen_sauer.gwt.log.client.Log.debug("Adding " + groupIndices.length + " ldap groups to role[" + roleId
- // + "].");
- // System.out.println("NOW adding the following "+groupIn+" groupIds");
- // // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
- // ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
- // try {
- // // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
- // ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
- // } catch (Exception e) {
- // throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- // }
-
}
public void updateLdapGroupAssignmentsForSubject(Subject subject) {
@@ -253,52 +167,19 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
}
@Override
- // public Set<LdapGroup> findLdapGroupsAssignedToRole(int roleId) {
public Set<Map<String, String>> findLdapGroupsAssignedToRole(int roleId) {
-
- // System.out.println("------- LDAPGWtServicveIMpl.findLdapGroupsAssignedToRole:" + roleId);
- // PageList<LdapGroup> allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
- // .getUnlimitedInstance());
- // // Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
- // Set<Map<String, String>> ldapGroups = new HashSet<Map<String, String>>();
- // // for(LdapGroup group : allAssignedLdapGroups){
- // // ldapGroups.add(group);
- // // }
- // // allAssignedLdapGroups.addAll(ldapGroups);
- // // System.out.println("------------------ assignedGroups:" + ldapGroups.size());
- //
- // for (LdapGroup group : allAssignedLdapGroups) {
- // // ldapGroups.add(group);
- // 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);
- // }
- // System.out.println("------------------ assignedGroups-2:" + ldapGroups.size());
-
- // return ldapGroups;
try {
- System.out.println("------- LDAPGWtServicveIMpl.findLdapGroupsAssignedToRole:" + roleId);
PageList<LdapGroup> allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
.getUnlimitedInstance());
- // Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
Set<Map<String, String>> ldapGroups = new HashSet<Map<String, String>>();
- // for(LdapGroup group : allAssignedLdapGroups){
- // ldapGroups.add(group);
- // }
- // allAssignedLdapGroups.addAll(ldapGroups);
- // System.out.println("------------------ assignedGroups:" + ldapGroups.size());
for (LdapGroup group : allAssignedLdapGroups) {
- // ldapGroups.add(group);
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);
}
- System.out.println("------------------ assignedGroups:" + ldapGroups.size());
return SerialUtility.prepare(ldapGroups, "findLdapGroupsAssignedToRole");
} catch (Exception e) {
@@ -332,8 +213,6 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
com.allen_sauer.gwt.log.client.Log.debug("Subject has id of :" + currentSubject.getId()
+ "and requires Registration:" + needsRegistrationOrCaseIncorrectOnAccountName);
- // System.out.println("Subject has id of :" + currentSubject.getId() + ":needsRegistration:"
- // + needsRegistration);
// figure out if the user has a principal
String provider = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(
@@ -341,8 +220,6 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
boolean ldapEnabled = ((provider != null) && provider.equals(RHQConstants.LDAPJAASProvider));
com.allen_sauer.gwt.log.client.Log.debug("LDAP Authentication has been enabled :" + ldapEnabled);
- // System.out.println("ldapAuthentication enabled :" + usingLDAP);
-
boolean hasPrincipal = false;
if (ldapEnabled) {
@@ -369,10 +246,6 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
LookupUtil.getSubjectManager().getOverlord(), subjectCriteria);
com.allen_sauer.gwt.log.client.Log.debug("Subjects located with name '" + user + "' and found:"
+ subjectsLocated.size());
- // System.out.println("Subjects located with name '" + currentSubject.getName() + "' and found:"
- // + subjectsLocated.size());
- // System.out.println("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
@@ -383,16 +256,11 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
+ ldapSubject.getName() + "]. "
+ "Attempting to authenticate with that account instead.";
com.allen_sauer.gwt.log.client.Log.info(msg);
- // System.out.println(msg);
com.allen_sauer.gwt.log.client.Log
.debug("Attempting to log back in with credentials passed in.");
- // System.out.println("-------------- About to log back in:");
newSubject = subjectManager.login(user, password);
- // sessionId = subject.getSessionId();
com.allen_sauer.gwt.log.client.Log.debug("Logged in as [" + ldapSubject.getName()
+ "] with session id [" + newSubject.getSessionId() + "]");
- // System.out.println("Logged in as [" + ldapSubject.getName() + "] with session id ["
- // + newSubject.getSessionId() + "]");
needsRegistrationOrCaseIncorrectOnAccountName = false;
}
}
commit cd9b71e581584f423ebfd6830fa61addc84ad33b
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 14:58:17 2010 -0400
left over from merge problem.
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 fca8070..7d7e738 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
@@ -32,6 +32,9 @@ import com.google.gwt.user.client.Cookies;
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;
commit 8c44aab326922c753213e1732f59b8c51dff8495
Merge: df34ecb... c0f10a2...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 14:11:44 2010 -0400
Merge branch 'track-master' into gwt-ldap
Conflicts:
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
index 8096fcf,cc8b738..c96f73a
--- 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
@@@ -81,11 -78,8 +81,12 @@@
<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"/>
+ <servlet path="/ClusterGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ClusterGWTServiceImpl"/>
<servlet path="/ConfigurationGwtService" class="org.rhq.enterprise.gui.coregui.server.gwt.ConfigurationGWTServiceImpl"/>
<servlet path="/ContentGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ContentGWTServiceImpl"/>
+ <servlet path="/DashboardGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.DashboardGWTServiceImpl"/>
+ <servlet path="/EventGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.EventGWTServiceImpl"/>
++ <servlet path="/LdapGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.LdapGWTServiceImpl"/>
<servlet path="/MeasurementDataGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.MeasurementDataGWTServiceImpl"/>
<servlet path="/OperationGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.OperationGWTServiceImpl"/>
<servlet path="/RemoteInstallGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.RemoteInstallGWTServiceImpl"/>
diff --cc modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index 65faa6d,fc834a0..fca8070
--- 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
@@@ -32,9 -32,9 +32,6 @@@ import com.google.gwt.user.client.Cooki
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;
@@@ -88,8 -91,10 +88,10 @@@ public class UserSessionManager
try {
b.setCallback(new RequestCallback() {
public void onResponseReceived(final Request request, final Response response) {
- com.allen_sauer.gwt.log.client.Log.info("response text = " + response.getText());
+ Log.info("response text = " + response.getText());
String sessionIdString = response.getText();
+
+ //Checks for valid session strings
if (sessionIdString != null && sessionIdString.length() > 0) {
String[] parts = sessionIdString.split(":");
@@@ -134,30 -142,42 +136,42 @@@
subject.setSessionId(Integer.valueOf(sessionId));
sessionSubject = subject;
- SubjectCriteria criteria = new SubjectCriteria();
- criteria.fetchConfiguration(true);
- criteria.addFilterId(subjectId);
+ //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;
+ }
- GWTServiceLookup.getSubjectService().findSubjectsByCriteria(criteria,
- new AsyncCallback<PageList<Subject>>() {
+ // figure out if ldap auth is used and whether case insenitive ldap auth requests should be handled.
+ GWTServiceLookup.getLdapService().checkSubjectForLdapAuth(subject, user, password,
+ new AsyncCallback<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");
++ Log.info("Unable to check subject for LDAP authorization - check Server status."
++ + 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.");
- com.allen_sauer.gwt.log.client.Log
- .error("Unable to check subject for LDAP authorization - check Server status."
- + caught.getMessage());
+ new LoginView().showLoginDialog();
}
- public void onSuccess(PageList<Subject> result) {
- Subject subject = result.get(0);
- Log.debug("Found subject [" + subject + "].");
- subject.setSessionId(Integer.valueOf(sessionId));
-
- // reset the session subject to the latest, for wrapping in user preferences
- sessionSubject = subject;
- userPreferences = new UserPreferences(sessionSubject);
- refresh();
-
- callback.onSuccess((Void) null);
+ public void onSuccess(Subject checked) {
+ //now pull the flags/information back out of this subject
+ if (checked == null) {//no new subject was returned.
+ Log.debug("No alternative case insensitive LDAP accounts located.");
+ locateSubjectOrLogin(subjectId, sessionId, user, callback);
+ } else {//alternative Subject returned meaning we located
+ Log.debug("Case insensitive matching LDAP account located.");
+ needsRegistration = false;
+ //change the subject.sessionId
+ sessionSubject = checked;
+ locateSubjectOrLogin(checked.getId(), String.valueOf(checked.getSessionId()),
+ checked.getName(), callback);
+ }
+ Log.debug("Subject registration required:" + needsRegistration);
}
});
} else {
commit c0f10a28138756344940b0dcbe89f6b88e0b367a
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 13:44:53 2010 -0400
ldap integration first cut.
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 ed2ce42..cc8b738 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
@@ -99,5 +99,6 @@
<servlet path="/DashboardGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.DashboardGWTServiceImpl"/>
<servlet path="/EventGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.EventGWTServiceImpl"/>
<servlet path="/ClusterGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ClusterGWTServiceImpl"/>
+ <servlet path="/LdapGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.LdapGWTServiceImpl"/>
</module>
\ No newline at end of file
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 3d79afd..f6ca18f 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
@@ -30,26 +30,40 @@ import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.FormErrorOrientation;
+import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.HTMLFlow;
+import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Img;
+import com.smartgwt.client.widgets.Label;
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.events.SubmitValuesEvent;
import com.smartgwt.client.widgets.form.events.SubmitValuesHandler;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
+import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.HeaderItem;
import com.smartgwt.client.widgets.form.fields.PasswordItem;
import com.smartgwt.client.widgets.form.fields.RowSpacerItem;
+import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.SubmitItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent;
import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler;
+import com.smartgwt.client.widgets.layout.HStack;
+import com.smartgwt.client.widgets.layout.VLayout;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.ResourceType;
+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.util.BrowserUtility;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
/**
* @author Greg Hinkle
@@ -141,7 +155,235 @@ public class LoginView extends Canvas {
}
}
- private void login(String user, String password) {
+ /** Duplicate modal Login mechanism to now show last registration screen before launching
+ * core gui.
+ *
+ * @param user prepopulate username field for LDAP registration
+ * @param sessionId pass in valid session id for LDAP registration steps.
+ * @param callback pass in callback reference to indicate success and launch of coreGUI
+ */
+ public void showRegistrationDialog(String user, final String sessionId, final AsyncCallback<Void> callback) {
+ if (!loginShowing) {
+ loginShowing = true;
+
+ form = new DynamicForm();
+ form.setMargin(25);
+ form.setAutoFocus(true);
+ form.setShowErrorText(true);
+ form.setErrorOrientation(FormErrorOrientation.BOTTOM);
+
+ VLayout column = new VLayout();
+ HeaderItem header = new HeaderItem();
+ header
+ .setValue("Welcome to JBoss ON! <br/><br/> Enter/update the following fields to complete your registration process."
+ + "<br/> Once you click \"OK\" you will be logged in.<br/><br/>");
+ column.addMember(wrapInDynamicForm(1, header));
+ //build ui elements for registration screen
+ final TextItem first = new TextItem("first", "First Name");
+ {
+ first.setRequired(true);
+ first.setWrapTitle(false);
+ first.setWidth(100);
+ }
+ final TextItem last = new TextItem("last", "Last Name");
+ {
+ last.setWrapTitle(false);
+ last.setWidth(100);
+ }
+ final TextItem username = new TextItem("username", "Username");
+ {
+ username.setRequired(true);
+ username.setValue(user);
+ username.setDisabled(true);
+ username.setWidth(100);
+ column.addMember(wrapInDynamicForm(6, first, last, username));
+ }
+ final TextItem email = new TextItem("email", "Email");
+ email.setRequired(true);
+ email.setWidth(100);
+ final TextItem phone = new TextItem("phone", "Phone");
+ phone.setWidth(100);
+ final TextItem department = new TextItem("department", "Department");
+ department.setWidth(100);
+ SpacerItem space = new SpacerItem();
+ space.setColSpan(1);
+ column.addMember(wrapInDynamicForm(6, email, phone, department));
+ HTMLFlow hr = new HTMLFlow("<br/><hr/><br/><br/>");
+ hr.setWidth(750);
+ hr.setAlign(Alignment.CENTER);
+ column.addMember(hr);
+
+ HStack row = new HStack();
+ row.setMembersMargin(5);
+ row.setAlign(VerticalAlignment.CENTER);
+ IButton okButton = new IButton("OK");
+ okButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ //pull in all relevant fields and do regular create
+ //TODO: validation
+ if (form.validate()) {
+ //populate form
+ form.setValue("first", String.valueOf(first.getValue()));
+ form.setValue("last", String.valueOf(last.getValue()));
+ form.setValue("username", String.valueOf(username.getValue()));
+ form.setValue("email", String.valueOf(email.getValue()));
+ form.setValue("phone", String.valueOf(phone.getValue()));
+ form.setValue("department", String.valueOf(department.getValue()));
+ form.setValue("sessionid", sessionId);
+ registerLdapUser(form, callback);
+ }
+ }
+ });
+ row.addMember(okButton);
+
+ IButton resetButton = new IButton("Reset");
+ resetButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ first.clearValue();
+ last.clearValue();
+ email.clearValue();
+ phone.clearValue();
+ department.clearValue();
+ }
+ });
+ row.addMember(resetButton);
+
+ IButton logout = new IButton("Logout");
+ logout.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ // System.out.println("---------- CLICKED logout");
+ UserSessionManager.logout();
+ window.destroy();
+ loginShowing = false;
+ new LoginView().showLoginDialog();
+ }
+ });
+ row.addMember(logout);
+ Label logoutLabel = new Label("(Logout - Complete registration later.)");
+ logoutLabel.setWrap(false);
+ row.addMember(logoutLabel);
+ column.addMember(row);
+ form.addChild(column);
+
+ window = new Window();
+ window.setWidth(800);
+ window.setHeight(300);
+ window.setTitle("Register User");
+
+ // forced focused, static size, can't close / dismiss
+ window.setIsModal(true);
+ window.setShowModalMask(true);
+ window.setCanDragResize(false);
+ window.setCanDragReposition(false);
+ window.setShowCloseButton(false);
+ window.setShowMinimizeButton(false);
+ window.setAutoCenter(true);
+
+ window.addItem(form);
+ window.show();
+
+ // form.addSubmitValuesHandler(new SubmitValuesHandler() {
+ // public void onSubmitValues(SubmitValuesEvent submitValuesEvent) {
+ // System.out.println("IN SUBMIT HANDER");
+ // if (form.validate()) {
+ // login(form.getValueAsString("user"), form.getValueAsString("password"));
+ // }
+ // }
+ // });
+ }
+ }
+
+ protected void registerLdapUser(DynamicForm populatedForm, final AsyncCallback<Void> callback) {
+ System.out.println("--------- In registerLdapUser:");
+ Subject newSubject = new Subject();
+
+ //insert some required data checking
+ boolean proceed = true;
+ String retrieved = populatedForm.getValueAsString("username");
+ if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) {
+ proceed = false;
+ }
+ retrieved = populatedForm.getValueAsString("sessionid");
+ if ((retrieved == null) || retrieved.isEmpty() || retrieved.equalsIgnoreCase("null")) {
+ proceed = false;
+ }
+ newSubject.setName(populatedForm.getValueAsString("username"));
+ newSubject.setSessionId(Integer.valueOf(populatedForm.getValueAsString("sessionid")));
+
+ //don't load null values not set or returned from ldap server
+ retrieved = populatedForm.getValueAsString("first");
+ if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
+ newSubject.setFirstName(populatedForm.getValueAsString("first"));
+ retrieved = populatedForm.getValueAsString("last");
+ if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
+ newSubject.setLastName(populatedForm.getValueAsString("last"));
+
+ retrieved = populatedForm.getValueAsString("department");
+ if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
+ newSubject.setDepartment(populatedForm.getValueAsString("department"));
+
+ retrieved = populatedForm.getValueAsString("email");
+ if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
+ newSubject.setEmailAddress(populatedForm.getValueAsString("email"));
+
+ retrieved = populatedForm.getValueAsString("phone");
+ if ((retrieved != null) && (!retrieved.equalsIgnoreCase("null")))
+ newSubject.setPhoneNumber(populatedForm.getValueAsString("phone"));
+
+ // newSubject.setSmsAddress(populatedForm.getValueAsString("sms"));
+ newSubject.setFactive(true);
+ newSubject.setFsystem(false);
+
+ if (proceed) {
+ GWTServiceLookup.getSubjectService().createSubjectUsingOverlord(newSubject, new AsyncCallback<Subject>() {
+ public void onSuccess(Subject result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Succesfully created new ldap Subject.", Message.Severity.Info));
+ //now do group role assignment for initial login
+ GWTServiceLookup.getLdapService().updateLdapGroupAssignmentsForSubject(result,
+ new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to assign roles for ldap Subject.",
+ caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Succesfully assigned roles for ldap Subject.", Message.Severity.Info));
+ window.destroy();
+ loginShowing = false;
+ callback.onSuccess(result);
+ }
+ });
+ }
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to create ldap Subject.", caught);
+ }
+ });
+ } else {
+ com.allen_sauer.gwt.log.client.Log.warn("Failed to locate username required to create LDAP subject.");
+ }
+ }
+
+ /**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 (columnCount < 1) {//default to label and details for each form item
+ form.setNumCols(header.length * 2);
+ } else {
+ form.setNumCols(columnCount);
+ }
+ form.setFields(header);
+ return form;
+ }
+
+ private void login(final String user, final String password) {
BrowserUtility.forceIe6Hacks();
loginButton.setDisabled(true);
@@ -155,7 +397,7 @@ public class LoginView extends Canvas {
if (statusCode == 200) {
window.destroy();
loginShowing = false;
- UserSessionManager.login();
+ UserSessionManager.login(user, password);
} else {
handleError(statusCode);
}
@@ -191,4 +433,5 @@ public class LoginView extends Canvas {
}
loginButton.setDisabled(false);
}
+
}
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 55588e9..e3dc5df 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
@@ -45,7 +45,7 @@ public class SearchGUI implements EntryPoint {
return;
}
- UserSessionManager.checkLoginStatus(new AsyncCallback<Void>() {
+ UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Void>() {
@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 ecbd719..fc834a0 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
@@ -81,7 +81,10 @@ public class UserSessionManager {
// static access only
}
- public static void checkLoginStatus(final AsyncCallback<Void> callback) {
+ private static Boolean needsRegistration = false;
+
+ public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Void> callback) {
+ // public static void checkLoginStatus(final String password, final AsyncCallback<Boolean> callback) {
BrowserUtility.forceIe6Hacks();
RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
@@ -90,6 +93,8 @@ public class UserSessionManager {
public void onResponseReceived(final Request request, final Response response) {
com.allen_sauer.gwt.log.client.Log.info("response text = " + response.getText());
String sessionIdString = response.getText();
+
+ //Checks for valid session strings
if (sessionIdString != null && sessionIdString.length() > 0) {
String[] parts = sessionIdString.split(":");
@@ -101,7 +106,8 @@ public class UserSessionManager {
com.allen_sauer.gwt.log.client.Log.info("sessionAccess-lastAccess: " + lastAccess);
String previousSessionId = getPreviousSessionId(); // may be null
- com.allen_sauer.gwt.log.client.Log.info("sessionAccess-previousSessionId: " + previousSessionId);
+ com.allen_sauer.gwt.log.client.Log
+ .info("sessionAccess-previousSessionId: " + previousSessionId);
if (previousSessionId == null || previousSessionId.equals(sessionId) == false) {
// persist sessionId if different from previously saved sessionId
@@ -109,7 +115,8 @@ public class UserSessionManager {
saveSessionId(sessionId);
// new sessions get the full 29 minutes to expire
- com.allen_sauer.gwt.log.client.Log.info("sessionAccess-schedulingSessionTimeout: " + SESSION_TIMEOUT);
+ com.allen_sauer.gwt.log.client.Log.info("sessionAccess-schedulingSessionTimeout: "
+ + SESSION_TIMEOUT);
sessionTimer.schedule(SESSION_TIMEOUT);
} else {
@@ -124,7 +131,8 @@ public class UserSessionManager {
expiryMillis = SESSION_TIMEOUT; // guarantees maximum is 29 minutes
}
- com.allen_sauer.gwt.log.client.Log.info("sessionAccess-reschedulingSessionTimeout: " + expiryMillis);
+ com.allen_sauer.gwt.log.client.Log.info("sessionAccess-reschedulingSessionTimeout: "
+ + expiryMillis);
sessionTimer.schedule((int) expiryMillis);
}
@@ -134,30 +142,42 @@ public class UserSessionManager {
subject.setSessionId(Integer.valueOf(sessionId));
sessionSubject = subject;
- SubjectCriteria criteria = new SubjectCriteria();
- criteria.fetchConfiguration(true);
- criteria.addFilterId(subjectId);
+ //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;
+ }
- GWTServiceLookup.getSubjectService().findSubjectsByCriteria(criteria,
- new AsyncCallback<PageList<Subject>>() {
+ // figure out if ldap auth is used and whether case insenitive ldap auth requests should be handled.
+ GWTServiceLookup.getLdapService().checkSubjectForLdapAuth(subject, user, password,
+ new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- "UserSessionManager: Failed to load user's subject", caught);
- com.allen_sauer.gwt.log.client.Log.info("Failed to load user's subject");
- new LoginView().showLoginDialog();
+ //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.");
+ com.allen_sauer.gwt.log.client.Log
+ .error("Unable to check subject for LDAP authorization - check Server status."
+ + caught.getMessage());
}
- public void onSuccess(PageList<Subject> result) {
- Subject subject = result.get(0);
- Log.debug("Found subject [" + subject + "].");
- subject.setSessionId(Integer.valueOf(sessionId));
-
- // reset the session subject to the latest, for wrapping in user preferences
- sessionSubject = subject;
- userPreferences = new UserPreferences(sessionSubject);
- refresh();
-
- callback.onSuccess((Void) null);
+ public void onSuccess(Subject checked) {
+ //now pull the flags/information back out of this subject
+ if (checked == null) {//no new subject was returned.
+ Log.debug("No alternative case insensitive LDAP accounts located.");
+ locateSubjectOrLogin(subjectId, sessionId, user, callback);
+ } else {//alternative Subject returned meaning we located
+ Log.debug("Case insensitive matching LDAP account located.");
+ needsRegistration = false;
+ //change the subject.sessionId
+ sessionSubject = checked;
+ locateSubjectOrLogin(checked.getId(), String.valueOf(checked.getSessionId()),
+ checked.getName(), callback);
+ }
+ Log.debug("Subject registration required:" + needsRegistration);
}
});
} else {
@@ -177,8 +197,62 @@ public class UserSessionManager {
}
}
+ /**
+ *
+ * @param subjectId
+ * @param sessionId
+ * @param user
+ * @param callback
+ */
+ private static void locateSubjectOrLogin(int subjectId, final String sessionId, final String user,
+ final AsyncCallback<Void> callback) {
+ if (subjectId > 0) {//registration not needed
+ Log.debug("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.");
+ com.allen_sauer.gwt.log.client.Log.info("Failed to load user's subject");
+ //show login dialog
+ new LoginView().showLoginDialog();
+ }
+
+ public void onSuccess(PageList<Subject> result) {
+ Subject subject = result.get(0);
+ Log.debug("Found subject [" + subject + "].");
+ subject.setSessionId(Integer.valueOf(sessionId));
+
+ // reset the session subject to the latest, for wrapping in user preferences
+ sessionSubject = subject;
+ //insert ldap check logic
+ userPreferences = new UserPreferences(sessionSubject);
+ refresh();
+
+ callback.onSuccess((Void) null);
+ }
+ });
+ } else {
+ // System.out.println("--------------- Registration needed.");
+ Log.info("Proceeding with registration for ldap user '" + user + "'.");
+ loggedIn = true;
+ new LoginView().showRegistrationDialog(user, sessionId, callback);
+ }
+ }
+
public static void login() {
- checkLoginStatus(new AsyncCallback<Void>() {
+ login(null, null);
+ }
+
+ public static void login(String user, String password) {
+ checkLoginStatus(user, password, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
// will build UI if necessary, then fires history event
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 7a81733..4738e30 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
@@ -18,7 +18,9 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.roles;
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import com.google.gwt.user.client.History;
@@ -77,6 +79,9 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
private CanvasItem subjectSelectorItem;
private RoleSubjectSelector subjectSelector;
+ private CanvasItem ldapGroupSelectorItem;
+ private RoleLdapGroupSelector ldapGroupSelector;
+
private RolesDataSource dataSource;
public RoleEditView(String locatorId) {
@@ -115,6 +120,11 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
subjectSelectorItem.setTitleOrientation(TitleOrientation.TOP);
subjectSelectorItem.setColSpan(2);
+ //instantiate ldap group selector
+ ldapGroupSelectorItem = new CanvasItem("ldapGroupSelectionCanvas", "LDAP Groups");
+ ldapGroupSelectorItem.setTitleOrientation(TitleOrientation.TOP);
+ ldapGroupSelectorItem.setColSpan(2);
+
IButton saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save");
saveButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(com.smartgwt.client.widgets.events.ClickEvent clickEvent) {
@@ -144,7 +154,7 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
buttonLayout.addMember(resetButton);
buttonLayout.addMember(cancelButton);
- form.setItems(permissionEditorItem, groupSelectorItem, subjectSelectorItem);
+ form.setItems(permissionEditorItem, groupSelectorItem, subjectSelectorItem, ldapGroupSelectorItem);
this.editCanvas = new VLayout();
@@ -157,6 +167,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();
// 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
@@ -202,6 +213,24 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
History.back();
}
});
+
+ List<String> selectedGroupList = new ArrayList<String>(ldapGroupSelection);
+ if (!selectedGroupList.isEmpty()) {
+ GWTServiceLookup.getLdapService().setLdapGroupsForRole(roleId, selectedGroupList,
+ new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to save role user assignments.", caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter()
+ .notify(
+ new Message("Succesfully saved LDAP group role assignments.",
+ Message.Severity.Info));
+ }
+ });
+ }
+
}
});
}
@@ -212,10 +241,14 @@ public class RoleEditView extends LocatableVLayout implements BookmarkableView {
.getAttributeAsObject("resourceGroups"));
this.subjectSelector = new RoleSubjectSelector(this.extendLocatorId("Subjects"), (Set<Subject>) record
.getAttributeAsObject("subjects"));
+ this.ldapGroupSelector = new RoleLdapGroupSelector(this.extendLocatorId("LdapGroups"), record
+ .getAttributeAsInt("id"));
this.groupSelectorItem.setCanvas(this.groupSelector);
this.subjectSelectorItem.setCanvas(this.subjectSelector);
+ this.ldapGroupSelectorItem.setCanvas(this.ldapGroupSelector);
+
Set<Permission> permissions = (Set<Permission>) record.getAttributeAsObject("permissions");
this.permissionEditorItem.setPermissions(permissions);
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
new file mode 100644
index 0000000..d57e2d8
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
@@ -0,0 +1,589 @@
+/*
+ * 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, 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.gui.coregui.client.admin.roles;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+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;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+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.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;
+
+/**
+ * @author Simeon Pinder
+ */
+public class RoleLdapGroupSelector extends AbstractSelector<HashSet<Map<String, String>>> {
+ public static final String id = "id";
+ public static final String name = "name";
+ public static final String description = "description";
+ public static final String AVAILABLE_GROUPS = "Available Groups";
+ public static final String SELECTED_GROUPS = "Selected Groups";
+ private LdapGroupsDataSource availableDatasource;
+ // private LdapAssignedGroupsDatasource assignedDataSource;
+ protected HashSet<String> selection = new HashSet<String>();
+ private int currentRole = -1;
+ private boolean initialLdapSelectionsLoad = true;
+
+ public RoleLdapGroupSelector(String locatorId, Integer integer) {
+ super(locatorId);
+ //define datasource for AvailableLdap groups
+ // dataSource = new LdapGroupsDataSource();
+ // getAvailableGrid().setDataSource(dataSource);
+ System.out.println("------- instantiating ldapGroupsDataSource:" + integer);
+ this.currentRole = integer.intValue();
+ // assignedDataSource = new LdapAssignedGroupsDatasource(integer);
+ System.out.println("----- instantiated: about to assign:");
+ // getAssignedGrid().setDataSource(assignedDataSource);
+ // System.out.println("--- set the datasource");
+ // if (integer != null) {
+ // // ListGridRecord[] data = (new RolesDataSource()).buildRecords(set);
+ // ListGridRecord[] data = dataSource.buildAssignedRecords(integer);
+ // setAssigned(data);
+ // }
+ }
+
+ @Override
+ protected DynamicForm getAvailableFilterForm() {
+ return null; // TODO: Implement this method.
+ }
+
+ @Override
+ protected RPCDataSource<HashSet<Map<String, String>>> getDataSource() {
+ // return new SelectedRolesDataSource();
+ if (availableDatasource == null) {
+ availableDatasource = new LdapGroupsDataSource();
+ //add subsequent listener
+ //add listener to AvailableGrid, to act after successfully populated.
+ getAvailableGrid().addDataArrivedHandler(new DataArrivedHandler() {
+ @Override
+ public void onDataArrived(DataArrivedEvent event) {
+ System.out.println("----------- in ldapAss.executeFetch:" + getCurrentRole() + ":initialLdapLoad:"
+ + initialLdapSelectionsLoad);
+ int currentRoleId = getCurrentRole();
+ if (initialLdapSelectionsLoad) {
+ GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
+ 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>> currentlyAssignedLdapGroups) {
+ System.out.println("------ ldapAss.fetch.success:" + 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
+ if ((currentlyAssignedLdapGroups != null)
+ && (!currentlyAssignedLdapGroups.isEmpty())) {
+ RecordList loaded = availableGrid.getDataAsRecordList();
+ ArrayList<Integer> located = new ArrayList<Integer>();
+ // for (LdapGroup group : currentlyAssignedLdapGroups) {
+ for (Map groupMap : currentlyAssignedLdapGroups) {
+ System.out.println("------- ldapAss.fetch.suc.grpName:"
+ + groupMap.get(name) + ":");
+ // .println("------- ldapAss.fetch.suc.grpName:" + group.getName() + ":");
+ // int index = loaded.findIndex(name, group.getName());
+ int index = loaded.findIndex(name, (String) groupMap.get(name));
+ if (index > -1) {
+ located.add(Integer.valueOf(index));
+ }
+ }
+ System.out.println("--------located:" + located.size());
+ int[] records = new int[located.size()];
+ int i = 0;
+ for (Integer index : located) {
+ records[i++] = index.intValue();
+ }
+ availableGrid.selectRecords(records);
+ //now simulate button push
+ assignedGrid.transferSelectedData(availableGrid);
+ initialLdapSelectionsLoad = false;
+ select(assignedGrid.getSelection());
+ updateButtons();
+ assignedGrid.deselectAllRecords();
+ }
+ }
+ });
+ }
+ }
+ });
+
+ }
+ return availableDatasource;
+ }
+
+ @Override
+ protected Criteria getLatestCriteria(DynamicForm availableFilterForm) {
+ return null; // TODO: Implement this method.
+ }
+
+ // @Override
+ // protected void onInit() {
+ // super.onInit();
+ // removeButton = new LocatableTransferImgButton(this.getLocatorId(), TransferImgButton.LEFT);
+ // removeButton.setDisabled(true);
+ // // addAllButton = new LocatableTransferImgButton(this.getLocatorId(), TransferImgButton.RIGHT_ALL);
+ // removeAllButton = new LocatableTransferImgButton(this.getLocatorId(), TransferImgButton.LEFT_ALL);
+ // removeAllButton.setDisabled(true);
+ // removeButton.addClickHandler(new ClickHandler() {
+ // public void onClick(ClickEvent clickEvent) {
+ // System.out.println("Custom remove Button:");
+ // ListGridRecord[] storedSelection = assignedGrid.getSelection();
+ // deselect(assignedGrid.getSelection());
+ // assignedGrid.removeSelectedData();
+ // //now walk through and re-enable all selected elements in Available grid
+ // RecordList availList = availableGrid.getDataAsRecordList();
+ // for (ListGridRecord r : storedSelection) {
+ // Record record = availList.find(name, r.getAttributeAsString(name));
+ // if (record != null)
+ // ((ListGridRecord) record).setEnabled(true);
+ // }
+ // updateButtons();
+ // }
+ // });
+ // removeAllButton.addClickHandler(new ClickHandler() {
+ // public void onClick(ClickEvent clickEvent) {
+ // assignedGrid.selectAllRecords();
+ // deselect(assignedGrid.getSelection());
+ // assignedGrid.removeSelectedData();
+ // updateButtons();
+ // }
+ // });
+ //
+ // }
+
+ // HashSet<String> selection = new HashSet<String>();
+
+ // @Override
+ // protected void select(ListGridRecord[] records) {
+ // availableGrid.deselectAllRecords();
+ // // RecordList recordList = availableGrid.getDataAsRecordList();
+ // for (ListGridRecord record : records) {
+ // record.setEnabled(false);
+ // // selection.add(record.getAttributeAsInt("id"));
+ // // int selectedIndex = -1;
+ // String groupName = record.getAttributeAsString(name);
+ // // selectedIndex = recordList.findIndex(name, groupName);
+ // // selection.add(Integer.valueOf(selectedIndex));
+ // selection.add(groupName);
+ // }
+ // assignedGrid.markForRedraw();
+ // }
+ protected void select(ListGridRecord[] records) {
+ System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
+ System.out.println("******** RoleLdapGroupSelector.select:" + records.length);
+ availableGrid.deselectAllRecords();
+ for (ListGridRecord record : records) {
+ record.setEnabled(false);
+ // selection.add(record.getAttributeAsInt("id"));
+ // selection.add(record.getAttributeAsString(name));
+ selection.add(record.getAttributeAsString(name));
+ }
+ System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
+ assignedGrid.markForRedraw();
+ }
+
+ @Override
+ // protected void deselect(ListGridRecord[] records) {
+ // HashSet<Integer> toRemove = new HashSet<Integer>();
+ // for (ListGridRecord record : records) {
+ // // System.out.println("------- record.getAttribAsInt:" + record.getAttributeAsInt(name));
+ // String value = null;
+ // // System.out.println("------- record.getAttribAsInt:" + record.getAttribute(name));
+ // // System.out.println("------- record.getAttribAsString:" + (value = record.getAttributeAsString(name)));
+ // // System.out.println("------- record.getAttribAsString-id:" + record.getAttributeAsString(id));
+ // // if (record.getAttributeAsInt("id") != null) {
+ // if (value != null) {
+ // // toRemove.add(record.getAttributeAsInt("id"));
+ // System.out.println("--------Inside getAttr as string:" + value + ":");
+ // int found = availableGrid.getDataAsRecordList().findIndex(name, record.getAttributeAsString(name));
+ // System.out.println("---------- index:" + found);
+ // if (found > -1) {
+ // toRemove.add(Integer.valueOf(found));
+ // }
+ // }
+ // }
+ // selection.removeAll(toRemove);
+ //
+ // for (Integer id : toRemove) {
+ // // Record r = availableGrid.getDataAsRecordList().find("id", id);
+ // Record r = availableGrid.getDataAsRecordList().get(id);
+ // if (r != null) {
+ // ((ListGridRecord) r).setEnabled(true);
+ // }
+ // }
+ // availableGrid.markForRedraw();
+ // }
+ protected void deselect(ListGridRecord[] records) {
+ System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
+ System.out.println("******** RoleLdapGroupSelector.deselect:" + records.length);
+ // HashSet<Integer> toRemove = new HashSet<Integer>();
+ HashSet<String> toRemove = new HashSet<String>();
+ for (ListGridRecord record : records) {
+ // toRemove.add(record.getAttributeAsInt("id"));
+ toRemove.add(record.getAttributeAsString(name));
+ }
+ selection.removeAll(toRemove);
+ System.out.println("Selection size:" + selection.size());
+
+ // for (Integer id : toRemove) {
+ for (String name : toRemove) {
+ // Record r = availableGrid.getDataAsRecordList().find("id", id);
+ 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++;
+ }
+ }
+ System.out.println("------ availableGrid.enabledCount.size:" + cnt);
+ System.out.println("********** Current Group Selection size:" + getGroupSelection().size());
+ availableGrid.markForRedraw();
+ }
+
+ // protected void updateButtons() {
+ // super.updateButtons();
+ // System.out.println("+++++++updateButtons, called Super()");
+ // assignedGrid.deselectAllRecords();
+ // System.out.println("********** After Update Group Selection size:" + getGroupSelection().size());
+ // // addButton.setDisabled(!availableGrid.anySelected() || availableGrid.getTotalRows() == 0);
+ // // removeButton.setDisabled(!assignedGrid.anySelected() || assignedGrid.getTotalRows() == 0);
+ // // addAllButton.setDisabled(availableGrid.getTotalRows() == 0);
+ // // removeAllButton.setDisabled(assignedGrid.getTotalRows() == 0);
+ // }
+
+ // public class SelectedRolesDataSource extends RolesDataSource {
+ //
+ // @Override
+ // public ListGridRecord[] buildRecords(Collection<Role> roles) {
+ // ListGridRecord[] records = super.buildRecords(roles);
+ // for (ListGridRecord record : records) {
+ // if (selection.contains(record.getAttributeAsInt("id"))) {
+ // record.setEnabled(false);
+ // }
+ // }
+ // return records;
+ // }
+ // }
+
+ public class LdapGroupsDataSource extends RPCDataSource<HashSet<Map<String, String>>> {
+
+ public LdapGroupsDataSource() {
+ // DataSourceTextField idField = new DataSourceTextField(id, id);
+ // idField.setPrimaryKey(true);
+
+ DataSourceTextField nameField = new DataSourceTextField(name, name);
+ nameField.setPrimaryKey(true);
+
+ DataSourceTextField descriptionField = new DataSourceTextField(description, description);
+
+ // DataSourceImageField availablilityField = new DataSourceImageField(available, "Current Availability");
+
+ setFields(nameField, descriptionField);
+ }
+
+ // public ListGridRecord[] buildAssignedRecords(Set<LdapGroup> currentlyAssignedLdapGroups) {
+ // ListGridRecord[] records = new ListGridRecord[0];
+ // int index = 0;
+ // if ((currentlyAssignedLdapGroups != null) && (!currentlyAssignedLdapGroups.isEmpty())) {
+ // //load groupsData
+ // records = new ListGridRecord[currentlyAssignedLdapGroups.size()];
+ // for (LdapGroup group : currentlyAssignedLdapGroups) {
+ // ListGridRecord record = new ListGridRecord();
+ // //load identifier
+ // // record.setAttribute(id, group.get(id));
+ // record.setAttribute(id, group.getName());
+ // //load name
+ // record.setAttribute(name, group.getName());
+ // //load description
+ // record.setAttribute(description, group.getDescription());
+ //
+ // records[index++] = record;
+ // }
+ // }
+ // return records;
+ // }
+
+ public ListGridRecord[] buildRecords(Set<Map<String, String>> locatedGroups) {
+ ListGridRecord[] records = new ListGridRecord[0];
+ int indx = 0;
+ if ((locatedGroups != null) && (!locatedGroups.isEmpty())) {
+ //load groupsData
+ 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();
+ //iterate over the group data to translate into records
+ ListGridRecord record = new ListGridRecord();
+ //load identifier
+ // record.setAttribute(id, group.get(id));
+ record.setAttribute(id, index++);
+ //load name
+ record.setAttribute(name, group.get(name));
+ //load description
+ record.setAttribute(description, group.get(description));
+
+ records[indx++] = record;
+ }
+
+ for (ListGridRecord record : records) {
+ if (selection.contains(record.getAttributeAsInt("id"))) {
+ record.setEnabled(false);
+ }
+ }
+ }
+ return records;
+ }
+
+ @Override
+ public HashSet<Map<String, String>> copyValues(ListGridRecord from) {
+ throw new UnsupportedOperationException("Ldap Group data is read only");
+ }
+
+ @Override
+ public ListGridRecord copyValues(HashSet<Map<String, String>> from) {
+ return null;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+ 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) {
+
+ //translate groups into records for grid
+ response.setData(buildRecords(locatedGroups));
+ //entry count
+ if (null != locatedGroups) {
+ response.setTotalRows(locatedGroups.size());
+ } else {
+ response.setTotalRows(0);
+ }
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
+ }
+ });
+
+ }
+
+ // @Override
+ // public Set<String> getSelection() {
+ // // System.out.println("------------ Returning selection:" + selection.size() + "selection:" + selection);
+ // return selection;
+ // }
+
+ }
+
+ public HashSet<String> getGroupSelection() {
+ System.out.println("------- selection is:" + selection + ":cnt:" + selection.size());
+ System.out.println("------- actual size is:" + assignedGrid.getSelection().length);
+ RecordList records = assignedGrid.getDataAsRecordList();
+ System.out.println("------- Rec list cnt:" + records.toArray().length);
+ //empty out selection and populate with actual contents
+ selection.clear();
+ if (!records.isEmpty()) {
+ for (Record r : records.toArray()) {
+ selection.add(r.getAttributeAsString(name));
+ }
+ }
+ System.out.println("------- selection is:" + selection + ":cnt:" + selection.size());
+ System.out.println("-------AS selection is:" + assignedGrid.getSelection() + ":cnt:"
+ + assignedGrid.getSelection().length);
+ // return selection;
+ 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 assignedSelections;
+ return remainingRecords;
+ }
+
+ public class LdapAssignedGroupsDatasource extends RPCDataSource<Set<String>> {
+ private Integer currentRoleId = Integer.valueOf(-1);
+
+ public LdapAssignedGroupsDatasource(Integer integer) {
+ System.out.println("----------- LdapAssigned.Constructor:" + integer);
+ if (integer != null) {
+ this.currentRoleId = integer;
+ }
+ getAssignedGrid().invalidateCache();
+ getAssignedGrid().markForRedraw();
+ }
+
+ @Override
+ public Set<String> copyValues(ListGridRecord from) {
+ // Set<String> copied = new HashSet<String>();
+ // if (from != null) {
+ // copied.add(from.getAttributeAsString(name));
+ // }
+ // return copied;
+ return null;
+ }
+
+ @Override
+ public ListGridRecord copyValues(Set<String> from) {
+ // ListGridRecord lgr = new ListGridRecord();
+ // if (from != null) {
+ // lgr.setAttribute(name, from.iterator().next());
+ // }
+ // return lgr;
+ return null;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+ System.out.println("----------- in ldapAss.executeFetch:" + getCurrentRoleId());
+ int currentRoleId = -1;
+ if ((getCurrentRoleId() != null) && (getCurrentRoleId().intValue() > -1)) {
+ currentRoleId = getCurrentRoleId().intValue();
+ }
+
+ GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
+ // new AsyncCallback<Set<LdapGroup>>() {
+ 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<LdapGroup> currentlyAssignedLdapGroups) {
+ public void onSuccess(Set<Map<String, String>> currentlyAssignedLdapGroups) {
+ System.out.println("------ ldapAss.fetch.success:" + 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 (LdapGroup group : currentlyAssignedLdapGroups) {
+ for (Map groupMap : currentlyAssignedLdapGroups) {
+ // int index = loaded.findIndex(name, group.getName());
+ int index = loaded.findIndex(name, (String) groupMap.get(name));
+ if (index > -1) {
+ located.add(Integer.valueOf(index));
+ }
+ }
+ System.out.println("--------located:" + located.size());
+ int[] records = new int[located.size()];
+ int i = 0;
+ for (Integer index : located) {
+ records[i++] = index.intValue();
+ }
+ getAssignedGrid().selectRecords(records);
+ //now simulate button push
+ assignedGrid.transferSelectedData(availableGrid);
+ select(assignedGrid.getSelection());
+ updateButtons();
+
+ //entry count
+ if (null != currentlyAssignedLdapGroups) {
+ response.setTotalRows(currentlyAssignedLdapGroups.size());
+ } else {
+ response.setTotalRows(0);
+ }
+ //pass off for processing
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ //now find out which groups are shared
+ //mock up transfer via buttons
+ //TODO: above
+ }
+
+ public ListGridRecord[] buildAssignedRecords(Set<LdapGroup> currentlyAssignedLdapGroups) {
+ System.out.println("----- buildAssRecords:");
+ ListGridRecord[] records = new ListGridRecord[0];
+ int index = 0;
+ if ((currentlyAssignedLdapGroups != null) && (!currentlyAssignedLdapGroups.isEmpty())) {
+ //load groupsData
+ records = new ListGridRecord[currentlyAssignedLdapGroups.size()];
+ for (LdapGroup group : currentlyAssignedLdapGroups) {
+ ListGridRecord record = new ListGridRecord();
+ //load identifier
+ // record.setAttribute(id, group.get(id));
+ record.setAttribute(id, group.getName());
+ //load name
+ record.setAttribute(name, group.getName());
+ //load description
+ record.setAttribute(description, group.getDescription());
+
+ records[index++] = record;
+ }
+ }
+ return records;
+ }
+
+ public Integer getCurrentRoleId() {
+ return currentRoleId;
+ }
+
+ public void setCurrentRoleId(Integer currentRoleId) {
+ this.currentRoleId = currentRoleId;
+ }
+ }
+
+ public int getCurrentRole() {
+ return currentRole;
+ }
+
+ // @Override
+ // public HashSet<Integer> getSelection() {
+ // // TODO Auto-generated method stub
+ // return super.getSelection();
+ // }
+
+}
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 4a9c639..c53f2be 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
@@ -126,6 +126,10 @@ public class GWTServiceLookup {
return secure(ClusterGWTServiceAsync.Util.getInstance());
}
+ public static LdapGWTServiceAsync getLdapService() {
+ return secure(LdapGWTServiceAsync.Util.getInstance());
+ }
+
@SuppressWarnings("unchecked")
private static <T> T secure(Object sdt) {
if (!(sdt instanceof ServiceDefTarget))
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
new file mode 100644
index 0000000..7c232b7
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java
@@ -0,0 +1,81 @@
+/*
+ * 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, 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.gui.coregui.client.gwt;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.gwt.user.client.rpc.RemoteService;
+
+import org.rhq.core.domain.auth.Subject;
+
+/**
+ * @author Simeon Pinder
+ */
+public interface LdapGWTService extends RemoteService {
+
+ /**
+ * @return Map with all LDAP groups available
+ */
+ Set<Map<String, String>> findAvailableGroups();
+
+ // /** Fin
+ // *
+ // * @return
+ // */
+ // Set<String> findAvailableGroupsFor();
+
+ /**
+ * Updates the role with the ldap groups selected.
+ */
+ void addLdapGroupsToRole(int roleId, List<String> groupIds);
+
+ /** In setting the LDAP groups for this role, all previous group
+ * assignments for this role are removed before most up to date
+ * list of valid LDAP groups is assigned.
+ *
+ * @param roleId
+ * @param groupIds
+ */
+ void setLdapGroupsForRole(int roleId, List<String> groupIds);
+
+ /**
+ *
+ * @param currentSubject
+ * @param user
+ * @param password
+ * @return
+ */
+ Subject checkSubjectForLdapAuth(Subject currentSubject, String user, String password);
+
+ void updateLdapGroupAssignmentsForSubject(Subject subject);
+
+ /** Finds ldap groups already assigned to this role.
+ *
+ * @param currentRoleId
+ * @return
+ */
+ Set<Map<String, String>> findLdapGroupsAssignedToRole(int 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 93fbd5d..b50900a 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
@@ -18,21 +18,18 @@
*/
package org.rhq.enterprise.gui.coregui.client.gwt;
+import com.google.gwt.user.client.rpc.RemoteService;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.util.PageList;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.rpc.RemoteService;
-import com.google.gwt.user.client.rpc.ServiceDefTarget;
-
/**
* @author Greg Hinkle
* @see org.rhq.enterprise.server.auth.SubjectManagerRemote
*/
public interface SubjectGWTService extends RemoteService {
-
/**
* Change the password for a user.
*
@@ -61,6 +58,15 @@ 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);
+
+ /**
* Deletes the given set of users, including both the {@link Subject} and {@link org.rhq.core.domain.auth.Principal} objects associated with
* those users.
*
@@ -69,7 +75,6 @@ public interface SubjectGWTService extends RemoteService {
*/
void deleteSubjects(int[] subjectIds);
-
/**
* Logs a user into the system. This will authenticate the given user with the given password. If the user was
* already logged in, the current session will be used but the password will still need to be authenticated.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SystemGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SystemGWTService.java
index c6dc504..03fb121 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SystemGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SystemGWTService.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.gui.coregui.client.gwt;
import com.google.gwt.user.client.rpc.RemoteService;
+
import org.rhq.core.domain.common.ProductInfo;
/**
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 8ae0364..6d06e3c 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
@@ -63,7 +63,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(new AsyncCallback<Void>() {
+ UserSessionManager.checkLoginStatus(null, null, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void 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
new file mode 100644
index 0000000..f52f493
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java
@@ -0,0 +1,412 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+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;
+import org.rhq.core.util.exception.ThrowableUtil;
+import org.rhq.enterprise.gui.coregui.client.gwt.LdapGWTService;
+import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
+import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * @author Simeon Pinder
+ */
+public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGWTService {
+
+ private static final long serialVersionUID = 1L;
+
+ private LdapGroupManagerLocal ldapManager = LookupUtil.getLdapGroupManager();
+ private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+
+ @Override
+ public Set<Map<String, String>> findAvailableGroups() {
+
+ try {
+ Set<Map<String, String>> results = ldapManager.findAvailableGroups();
+ return SerialUtility.prepare(results, "findAvailableGroups");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ // @Override
+ // public Set<String> findAvailableGroupsFor() {
+ // Set<String> locatedGroups = new HashSet<String>();
+ // try {
+ // locatedGroups = ldapManager.findAvailableGroupsFor(getSessionSubject().getName());
+ // return SerialUtility.prepare(locatedGroups, "findAvailableGroupsFor");
+ // } catch (Exception e) {
+ // throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ // }
+ //
+ // }
+
+ @Override
+ public void addLdapGroupsToRole(int roleId, List<String> groupIds) {
+ // //clean out existing roles as this defines the new list of roles
+ // PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ // com.allen_sauer.gwt.log.client.Log.info("------EXISTING:" + existing.getTotalSize() + ":obj:" + existing);
+ // if (!existing.isEmpty()) {
+ // int i = 0;
+ // int[] groupIndices = new int[existing.size()];
+ // for (LdapGroup g : existing) {
+ // groupIndices[i] = i++;
+ // }
+ // System.out.println("------- pre-existing:" + groupIndices);
+ // com.allen_sauer.gwt.log.client.Log.info("------- pre-existing:" + groupIndices);
+ // ldapManager.removeLdapGroupsFromRole(getSessionSubject(), roleId, groupIndices);
+ // }
+ // System.out.println("------ Adding ldap groups to role:" + roleId + ":gpIds:" + groupIds);
+ // com.allen_sauer.gwt.log.client.Log.info("------ Adding ldap groups to role:" + roleId + ":gpIds:" + groupIds);
+ // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
+ try {
+ // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
+ ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+
+ }
+
+ public void setLdapGroupsForRole(int roleId, List<String> groupIds) {
+ System.out.println("----------------- Group ids:" + groupIds);
+ try {
+ //clean out existing roles as this defines the new list of roles
+ PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ com.allen_sauer.gwt.log.client.Log.debug("Removing " + existing.getTotalSize() + " groups from role '"
+ + roleId + "'.");
+ System.out.println("Removing " + existing.getTotalSize() + " groups from role '" + roleId + "'.");
+ // PageList<LdapGroup> currentLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ // Log.debug("Found "+currentLdapGroups.size()+" current LDAP groups for role'"+roleId+".");
+ int[] groupIndices = new int[existing.size()];
+ int indx = 0;
+ for (LdapGroup lg : existing) {
+ groupIndices[indx++] = lg.getId();
+ }
+ com.allen_sauer.gwt.log.client.Log
+ .debug("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
+ System.out.println("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
+ // ldapManager.removeLdapGroupsFromRole(getSessionSubject(), roleId, groupIndices);
+ ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
+ PageList<LdapGroup> nowGroups = ldapManager
+ .findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ System.out.println("LDAP GROUP count for '" + roleId + "' after deletion. Cnt:" + nowGroups.size());
+
+ //from among all available groups, if group name matches then add it to the list.
+ ArrayList<String> validGroupIds = new ArrayList<String>();
+ Set<Map<String, String>> allAvailableLdapGroups = ldapManager.findAvailableGroups();
+ for (String group : groupIds) {
+ for (Map<String, String> map : allAvailableLdapGroups) {
+ if (map.get("name").equals(group)) {
+ validGroupIds.add(group);
+ }
+ }
+ }
+ com.allen_sauer.gwt.log.client.Log.debug("Adding " + validGroupIds.size() + " ldap groups to role["
+ + roleId + "].");
+ System.out.println("NOW adding the following " + validGroupIds.size() + " groupIds");
+ // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
+ ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ System.out.println("LDAP GROUP count for '" + roleId + "' after addition. Cnt:" + nowGroups.size());
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+
+ // if (!existing.isEmpty() && (groupIds != null) && (!groupIds.isEmpty())) {
+ // ArrayList<Integer> located = new ArrayList<Integer>();
+ // for (String groupName : groupIds) {
+ // for (LdapGroup storedGroup : existing) {
+ // if (groupName.equals(storedGroup.getName())) {
+ // located.add(storedGroup.getId());
+ // }
+ // }
+ // }
+ //
+ // int i = 0;
+ // groupIndices = new int[located.size()];
+ // for (Integer l : located) {
+ // groupIndices[i++] = l;
+ // }
+ // // for (LdapGroup g : existing) {
+ // //// groupIndices[i] = i++;
+ // // //translate the group name into LdapGroup id
+ // // if(g.getName().equalsIgnoreCase("")){
+ // // groupIndices[i] = i++;
+ // // }
+ // // }
+ // for (int j : groupIndices) {
+ // System.out.println("------- Existing LDAP GROUP ID:" + j);
+ // }
+ // com.allen_sauer.gwt.log.client.Log
+ // .debug("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
+ // System.out.println("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
+ // // ldapManager.removeLdapGroupsFromRole(getSessionSubject(), roleId, groupIndices);
+ // ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
+ // PageList<LdapGroup> nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ // System.out.println("LDAP GROUP count for '"+roleId+"' after deletion. Cnt:"+nowGroups.size());
+ // }
+ // // System.out.println("------ Adding ldap groups to role:" + roleId + ":gpIds:" + groupIds);
+ // com.allen_sauer.gwt.log.client.Log.debug("Adding " + groupIndices.length + " ldap groups to role[" + roleId
+ // + "].");
+ // System.out.println("NOW adding the following "+groupIn+" groupIds");
+ // // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
+ // ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ // try {
+ // // ldapManager.addLdapGroupsToRole(getSessionSubject(), roleId, groupIds);
+ // ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ // } catch (Exception e) {
+ // throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ // }
+
+ }
+
+ 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, "");
+ // 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(subject.getName()));
+ ldapManager.assignRolesToLdapSubject(subject.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);
+ // }
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ @Override
+ // public Set<LdapGroup> findLdapGroupsAssignedToRole(int roleId) {
+ public Set<Map<String, String>> findLdapGroupsAssignedToRole(int roleId) {
+
+ // System.out.println("------- LDAPGWtServicveIMpl.findLdapGroupsAssignedToRole:" + roleId);
+ // PageList<LdapGroup> allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
+ // .getUnlimitedInstance());
+ // // Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
+ // Set<Map<String, String>> ldapGroups = new HashSet<Map<String, String>>();
+ // // for(LdapGroup group : allAssignedLdapGroups){
+ // // ldapGroups.add(group);
+ // // }
+ // // allAssignedLdapGroups.addAll(ldapGroups);
+ // // System.out.println("------------------ assignedGroups:" + ldapGroups.size());
+ //
+ // for (LdapGroup group : allAssignedLdapGroups) {
+ // // ldapGroups.add(group);
+ // 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);
+ // }
+ // System.out.println("------------------ assignedGroups-2:" + ldapGroups.size());
+
+ // return ldapGroups;
+ try {
+ System.out.println("------- LDAPGWtServicveIMpl.findLdapGroupsAssignedToRole:" + roleId);
+ PageList<LdapGroup> allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
+ .getUnlimitedInstance());
+ // Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
+ Set<Map<String, String>> ldapGroups = new HashSet<Map<String, String>>();
+ // for(LdapGroup group : allAssignedLdapGroups){
+ // ldapGroups.add(group);
+ // }
+ // allAssignedLdapGroups.addAll(ldapGroups);
+ // System.out.println("------------------ assignedGroups:" + ldapGroups.size());
+
+ for (LdapGroup group : allAssignedLdapGroups) {
+ // ldapGroups.add(group);
+ 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);
+ }
+ System.out.println("------------------ assignedGroups:" + ldapGroups.size());
+
+ 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 checkSubjectForLdapAuth(Subject currentSubject, String user, String password) {
+ try {
+ Subject newSubject = null;
+ com.allen_sauer.gwt.log.client.Log.debug("Subject being checked for ldapAuthentication is :"
+ + currentSubject);
+
+ 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;
+ }
+
+ com.allen_sauer.gwt.log.client.Log.debug("Subject has id of :" + currentSubject.getId()
+ + "and requires Registration:" + needsRegistrationOrCaseIncorrectOnAccountName);
+ // System.out.println("Subject has id of :" + currentSubject.getId() + ":needsRegistration:"
+ // + needsRegistration);
+
+ // figure out if the user has a principal
+ String provider = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(
+ RHQConstants.JAASProvider);
+ boolean ldapEnabled = ((provider != null) && provider.equals(RHQConstants.LDAPJAASProvider));
+
+ com.allen_sauer.gwt.log.client.Log.debug("LDAP Authentication has been enabled :" + ldapEnabled);
+ // System.out.println("ldapAuthentication enabled :" + usingLDAP);
+
+ 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);
+ com.allen_sauer.gwt.log.client.Log.debug("Subject '" + user + "' hasPrincipal :" + hasPrincipal);
+ // System.out.println("Subject 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);
+ com.allen_sauer.gwt.log.client.Log.debug("Subjects located with name '" + user + "' and found:"
+ + subjectsLocated.size());
+ // System.out.println("Subjects located with name '" + currentSubject.getName() + "' and found:"
+ // + subjectsLocated.size());
+ // System.out.println("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.";
+ com.allen_sauer.gwt.log.client.Log.info(msg);
+ // System.out.println(msg);
+ com.allen_sauer.gwt.log.client.Log
+ .debug("Attempting to log back in with credentials passed in.");
+ // System.out.println("-------------- About to log back in:");
+ newSubject = subjectManager.login(user, password);
+ // sessionId = subject.getSessionId();
+ com.allen_sauer.gwt.log.client.Log.debug("Logged in as [" + ldapSubject.getName()
+ + "] with session id [" + newSubject.getSessionId() + "]");
+ // System.out.println("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 {
+ com.allen_sauer.gwt.log.client.Log.debug("The Subject and user/password cannot be null to proceed.");
+ }
+ return SerialUtility.prepare(newSubject, "checkSubjectForLdapAuth");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+}
\ No newline at end of file
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 6f86e45..fa515bd 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
@@ -62,6 +62,15 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
}
+ public Subject createSubjectUsingOverlord(Subject subjectToCreate) {
+ try {
+ return SerialUtility.prepare(subjectManager.createSubject(subjectManager.getOverlord(), subjectToCreate),
+ "SubjectManager.createSubjectUsingOverlord");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public void deleteSubjects(int[] subjectIds) {
try {
subjectManager.deleteSubjects(getSessionSubject(), subjectIds);
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 377ae0d..7ec13b3 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
@@ -115,6 +115,10 @@
<servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI ClusterGWTService</servlet-name>
<servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.ClusterGWTServiceImpl</servlet-class>
</servlet>
+ <servlet>
+ <servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI LdapGWTService</servlet-name>
+ <servlet-class>org.rhq.enterprise.gui.coregui.server.gwt.LdapGWTServiceImpl</servlet-class>
+ </servlet>
<servlet-mapping>
@@ -225,6 +229,10 @@
<servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI ClusterGWTService</servlet-name>
<url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/ClusterGWTService</url-pattern>
</servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>org.rhq.enterprise.gui.coregui.CoreGUI LdapGWTService</servlet-name>
+ <url-pattern>/org.rhq.enterprise.gui.coregui.CoreGUI/LdapGWTService</url-pattern>
+ </servlet-mapping>
<welcome-file-list>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
index 409d64e..8c75852 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
@@ -61,7 +61,7 @@ import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.security.UntrustedSSLSocketFactory;
/**
- * This bean provides functionality to manipulate the ldap auth/authz funcitonality.
+ * This bean provides functionality to manipulate the ldap auth/authz functionality.
* That is, adding/modifying/deleting ldap group/users and their
* associated subjects and permissions are performed by this manager.
* @author paji
@@ -70,7 +70,6 @@ import org.rhq.enterprise.server.util.security.UntrustedSSLSocketFactory;
@Stateless
public class LdapGroupManagerBean implements LdapGroupManagerLocal {
- // private static final LdapGroupManagerBean INSTANCE = new LdapGroupManagerBean();
private Log log = LogFactory.getLog(LdapGroupManagerBean.class);
private static final String BASEDN_DELIMITER = ";";
@@ -153,7 +152,7 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
LdapGroup doomedGroup = entityManager.find(LdapGroup.class, groupId);
if (doomedGroup == null) {
throw new IllegalArgumentException("Tried to remove doomedGroup[" + groupId + "] from role["
- + roleId + "], but subject was not found");
+ + roleId + "], but doomedGroup was not found.");
}
role.removeLdapGroup(doomedGroup);
}
@@ -216,7 +215,6 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
Properties env = getProperties(options);
// Load the BaseDN
- // Load the BaseDN
String baseDN = (String) options.get(RHQConstants.LDAPBaseDN);
// Load the LoginProperty
13 years, 7 months
[rhq] Branch 'gwt-ldap' - 57 commits - etc/samples modules/common modules/core modules/enterprise modules/helpers modules/jopr modules/plugins pom.xml
by Simeon Pinder
etc/samples/provisioning/sample-bundle/pom.xml | 1
etc/samples/provisioning/sample-bundle/src/main/scripts/assembly.xml | 2
modules/common/ant-bundle/src/main/scripts/assembly.xml | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java | 136 ++-
modules/enterprise/gui/coregui/pom.xml | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 60 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java | 120 ---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/InitializableView.java | 29
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java | 37 -
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 | 98 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 333 ++-------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeNodeBuilder.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java | 17
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java | 166 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java | 62 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java | 78 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/GroupAlertHistoryView.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/ResourceAlertHistoryView.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java | 13
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java | 70 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java | 249 +++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java | 77 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationSection.java | 55 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/ViewFactory.java | 31
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java | 35 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/InventorySummaryView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/LdapGWTService.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java | 232 ++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java | 33
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 17
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java | 341 ----------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 30
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/DashboardView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java | 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java | 272 ++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java | 311 ---------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationView.java | 133 ---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java | 142 ----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java | 118 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationFactory.java | 311 +++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationView.java | 133 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestGroupConfigurationView.java | 142 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/LdapGWTServiceImpl.java | 104 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java | 28
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java | 35 -
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java | 3
modules/enterprise/remoting/cli/pom.xml | 27
modules/enterprise/remoting/cli/src/main/scripts/rhq-client.assembly.xml | 2
modules/enterprise/server/container/src/main/scripts/rhq-container.assembly.xml | 2
modules/enterprise/server/jar/pom.xml | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 67 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java | 201 +++--
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/EventsInsertPurgeTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java | 1
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 4
modules/enterprise/server/jar/src/test/resources/perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip |binary
modules/helpers/perftest-support/src/main/java/org/rhq/helpers/perftest/support/testng/DatabaseSetupInterceptor.java | 9
modules/helpers/pluginAnnotations/pom.xml | 35 -
modules/helpers/pluginGen/pom.xml | 45 -
modules/helpers/pom.xml | 19
modules/jopr/dist/agent/src/main/scripts/jopr-agent.assembly.xml | 2
modules/jopr/dist/server/src/main/scripts/jopr-server.assembly.xml | 2
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java | 10
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java | 100 +-
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java | 7
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java | 14
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java | 153 +++-
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/TxConnectionFactoryComponent.java | 42 -
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/ManagedComponentUtils.java | 99 --
pom.xml | 70 +-
82 files changed, 2867 insertions(+), 2227 deletions(-)
New commits:
commit 6c27f30bcbd410df29653e551f110be770db5fce
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 17:36:10 2010 -0400
reverting smartgwt component to 2.2 due to regression in Selector component.
diff --git a/modules/enterprise/gui/coregui/pom.xml b/modules/enterprise/gui/coregui/pom.xml
index 58cdf8a..e942014 100644
--- a/modules/enterprise/gui/coregui/pom.xml
+++ b/modules/enterprise/gui/coregui/pom.xml
@@ -24,7 +24,8 @@
<properties>
<!-- dependency versions -->
<gwt.version>2.0.4</gwt.version>
- <smartgwt.version>2.2.RHQ1</smartgwt.version>
+<!-- <smartgwt.version>2.2.RHQ1</smartgwt.version> -->
+ <smartgwt.version>2.2</smartgwt.version>
<!-- If this is too much memory to allocate to your gwt:debug process then override this property in
in your settings.xml -->
commit 280fdda7acf409ec8034e6ab8874844dd5557903
Merge: c68d856... 65210f0...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 17:35:55 2010 -0400
Merge branch 'master' into gwt-ldap2
commit 65210f07b8b74eb5f19d931539d97ef0c8217f97
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Nov 1 16:11:25 2010 -0400
be able to have a left-hand nav item refresh the right side. this is used today by Administration>Templates
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 e3b0450..dcc5f7e 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
@@ -158,6 +158,7 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
return new ResourceTypeTreeView(extendLocatorId(PAGE_TEMPLATES_VIEW_ID));
}
});
+ templatesItem.setRefreshRequired(true); // we always need a new page
NavigationItem downloadsItem = new NavigationItem(PAGE_DOWNLOADS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
index 74861c2..c70fccd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
@@ -190,6 +190,10 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
throw new IllegalStateException("Invalid page: " + pageName);
}
+ if (item.isRefreshRequired()) {
+ this.currentPageViewId = null;
+ }
+
// When changing sections, make sure the previous section's selection is deselected.
selectSectionPageTreeGridNode(sectionName, pageName);
@@ -231,8 +235,8 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
if (node != null) {
treeGrid.selectSingleRecord(node);
} else {
- CoreGUI.getErrorHandler().handleError("Unknown page name '" + pageName + "' for section '"
- + sectionName + "' - URL is invalid.");
+ CoreGUI.getErrorHandler().handleError(
+ "Unknown page name '" + pageName + "' for section '" + sectionName + "' - URL is invalid.");
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
index 24e04ff..90339d3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
@@ -23,10 +23,12 @@ package org.rhq.enterprise.gui.coregui.client.components.view;
* @author Ian Springer
*/
public class NavigationItem {
- private String name;
- private String icon;
- private ViewFactory viewFactory;
- private boolean enabled;
+ private final String name;
+ private final String icon;
+ private final ViewFactory viewFactory;
+ private final boolean enabled;
+
+ private boolean refreshRequired = false;
public NavigationItem(String name, String icon, ViewFactory viewFactory) {
this(name, icon, viewFactory, true);
@@ -42,7 +44,7 @@ public class NavigationItem {
public String getName() {
return name;
}
-
+
public String getIcon() {
return icon;
}
@@ -54,4 +56,22 @@ public class NavigationItem {
public boolean isEnabled() {
return enabled;
}
+
+ /**
+ * This flag indicates if the item's view must be refreshed when its main navigation item
+ * is selected within the user interface. Most times, if the navigation item's view is already
+ * created, it can just be re-displayed as it was previously - in which case this flag can
+ * be <code>false</code> (which is its default). However, if the view must be recreated due to
+ * the possibility of some dynamic data changing (where that dynamic data is needed to build
+ * the view), then this flag should be <code>true</code>.
+ *
+ * @return flag to indicate if the navigation item's view needs to be refreshed when the item is selected again
+ */
+ public boolean isRefreshRequired() {
+ return refreshRequired;
+ }
+
+ public void setRefreshRequired(boolean flag) {
+ this.refreshRequired = flag;
+ }
}
commit 992506bc757e64d10f9b0ddf0f41c6b7be9fa387
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Nov 1 16:06:13 2010 -0400
reformat to line length
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 dcd6aea..e3b0450 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
@@ -90,15 +90,13 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
}
private NavigationSection buildSecuritySection() {
- NavigationItem usersItem = new NavigationItem(UsersView.VIEW_ID, "global/User_16.png",
- new ViewFactory() {
+ NavigationItem usersItem = new NavigationItem(UsersView.VIEW_ID, "global/User_16.png", new ViewFactory() {
public Canvas createView() {
return new UsersView(extendLocatorId("Users"));
}
});
- NavigationItem rolesItem = new NavigationItem(RolesView.VIEW_ID, "global/Role_16.png",
- new ViewFactory() {
+ NavigationItem rolesItem = new NavigationItem(RolesView.VIEW_ID, "global/Role_16.png", new ViewFactory() {
public Canvas createView() {
return new RolesView(extendLocatorId("Roles"));
}
@@ -108,81 +106,74 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
}
private NavigationSection buildTopologySection() {
- NavigationItem serversItem = new NavigationItem(PAGE_SERVERS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem serversItem = new NavigationItem(PAGE_SERVERS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
- return new FullHTMLPane(extendLocatorId(PAGE_SERVERS_VIEW_ID), "/rhq/ha/listServers-plain.xhtml?nomenu=true");
+ return new FullHTMLPane(extendLocatorId(PAGE_SERVERS_VIEW_ID),
+ "/rhq/ha/listServers-plain.xhtml?nomenu=true");
}
});
- NavigationItem agentsItem = new NavigationItem(PAGE_AGENTS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem agentsItem = new NavigationItem(PAGE_AGENTS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
- return new FullHTMLPane(extendLocatorId(PAGE_AGENTS_VIEW_ID), "/rhq/ha/listAgents-plain.xhtml?nomenu=true");
+ return new FullHTMLPane(extendLocatorId(PAGE_AGENTS_VIEW_ID),
+ "/rhq/ha/listAgents-plain.xhtml?nomenu=true");
}
});
- NavigationItem affinityGroupsItem = new NavigationItem(PAGE_AFFINITY_GROUPS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem affinityGroupsItem = new NavigationItem(PAGE_AFFINITY_GROUPS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_AFFINITY_GROUPS_VIEW_ID),
"/rhq/ha/listAffinityGroups-plain.xhtml?nomenu=true");
}
});
- NavigationItem partitionEventsItem = new NavigationItem(PAGE_PARTITION_EVENTS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem partitionEventsItem = new NavigationItem(PAGE_PARTITION_EVENTS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_PARTITION_EVENTS_VIEW_ID),
"/rhq/ha/listPartitionEvents-plain.xhtml?nomenu=true");
}
});
- NavigationItem remoteAgentInstallItem = new NavigationItem(RemoteAgentInstallView.VIEW_ID, "global/Agent_16.png",
- new ViewFactory() {
- public Canvas createView() {
- return new RemoteAgentInstallView(extendLocatorId("RemoteAgentInstall"));
- }
- });
+ NavigationItem remoteAgentInstallItem = new NavigationItem(RemoteAgentInstallView.VIEW_ID,
+ "global/Agent_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return new RemoteAgentInstallView(extendLocatorId("RemoteAgentInstall"));
+ }
+ });
return new NavigationSection(SECTION_TOPOLOGY_VIEW_ID, serversItem, agentsItem, affinityGroupsItem,
partitionEventsItem, remoteAgentInstallItem);
}
private NavigationSection buildConfigurationSection() {
- NavigationItem systemSettingsItem = new NavigationItem(PAGE_SYSTEM_SETTINGS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem systemSettingsItem = new NavigationItem(PAGE_SYSTEM_SETTINGS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_SYSTEM_SETTINGS_VIEW_ID),
"/admin/config/Config.do?mode=edit&nomenu=true");
}
});
- NavigationItem templatesItem = new NavigationItem(PAGE_TEMPLATES_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem templatesItem = new NavigationItem(PAGE_TEMPLATES_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new ResourceTypeTreeView(extendLocatorId(PAGE_TEMPLATES_VIEW_ID));
}
});
- NavigationItem downloadsItem = new NavigationItem(PAGE_DOWNLOADS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem downloadsItem = new NavigationItem(PAGE_DOWNLOADS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_DOWNLOADS_VIEW_ID),
"/rhq/admin/downloads-body.xhtml?nomenu=true");
}
});
- NavigationItem licenseItem = new NavigationItem(PAGE_LICENSE_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem licenseItem = new NavigationItem(PAGE_LICENSE_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_LICENSE_VIEW_ID),
"/admin/license/LicenseAdmin.do?mode=view&nomenu=true");
}
});
- NavigationItem pluginsItem = new NavigationItem(PAGE_PLUGINS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem pluginsItem = new NavigationItem(PAGE_PLUGINS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_PLUGINS_VIEW_ID),
"/rhq/admin/plugin/plugin-list-plain.xhtml?nomenu=true");
commit 11f3d55457933831087b0d15211bc802370cb3c4
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 15:09:24 2010 -0400
re-upgrade assembly plugin from 2.2-beta-5 to 2.2, since that was not what was causing the issue in hudson
diff --git a/pom.xml b/pom.xml
index fbc99cc..3d4b50f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -473,7 +473,7 @@
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
- <version>2.2-beta-5</version>
+ <version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
commit 182d7b273c511c97d2a4155ef9dda89431480ee4
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 14:46:28 2010 -0400
another attempt to fix Hudson assembly plugin error
diff --git a/modules/enterprise/remoting/cli/pom.xml b/modules/enterprise/remoting/cli/pom.xml
index d418d82..28f56b1 100644
--- a/modules/enterprise/remoting/cli/pom.xml
+++ b/modules/enterprise/remoting/cli/pom.xml
@@ -84,28 +84,7 @@
<build>
<plugins>
-
- <plugin>
- <artifactId>maven-enforcer-plugin</artifactId>
- <executions>
- <execution>
- <id>enforce-versions</id>
- <goals>
- <!-- IMPORTANT: Use enforce goal, rather than enforce-once goal, otherwise reactor
- builds will fail due to http://jira.codehaus.org/browse/MENFORCER-11 -->
- <goal>enforce</goal>
- </goals>
- <configuration>
- <rules>
- <requireJavaVersion>
- <version>[1.6,1.8)</version> <!-- 1.6.x, 1.7.x -->
- </requireJavaVersion>
- </rules>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
+
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
@@ -206,7 +185,7 @@
<executions>
<execution>
<id>assemble-rhq-client-zip</id>
- <phase>package</phase>
+ <phase>pre-integration-test</phase>
<goals>
<goal>single</goal>
</goals>
commit 33bca7123055444a61871f3c1d2a3ac317a05f93
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 13:59:15 2010 -0400
downgrade assembly plugin from 2.2 to 2.2-beta-5 in an attempt to fix hudson build error for cli module
diff --git a/pom.xml b/pom.xml
index 3d4b50f..fbc99cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -473,7 +473,7 @@
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
- <version>2.2</version>
+ <version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
commit 89a48ed7a217921ef8cdaa3798af7882a9bd1ade
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Nov 1 13:11:40 2010 -0400
HeaderItem.setDefaultValue should be used to set the header text
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
index b808fc8..eb07c45 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
@@ -59,7 +59,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
*/
public class RemoteAgentInstallView extends LocatableVLayout {
public static final String VIEW_ID = "RemoteAgentInstall";
-
+
private RemoteInstallGWTServiceAsync remoteInstallService = GWTServiceLookup.getRemoteInstallService();
private DynamicForm connectionForm;
@@ -100,7 +100,7 @@ public class RemoteAgentInstallView extends LocatableVLayout {
connectionForm.setMargin(20);
HeaderItem connectionHeader = new HeaderItem();
- connectionHeader.setValue("Connection Information");
+ connectionHeader.setDefaultValue("Connection Information");
TextItem host = new TextItem("host", "Hostname");
host.setRequired(true);
@@ -178,7 +178,7 @@ public class RemoteAgentInstallView extends LocatableVLayout {
buttonsForm.setColWidths("10%", "30%", "30%", "30%");
HeaderItem buttonsHeader = new HeaderItem();
- buttonsHeader.setValue("Operations");
+ buttonsHeader.setDefaultValue("Operations");
SpacerItem spacerItem = new SpacerItem();
spacerItem.setStartRow(true);
commit 4f283ddf6eb0d43c2645c87283520f78bf9b2a5f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 13:08:17 2010 -0400
[maven-release-plugin] prepare for next development iteration
diff --git a/modules/helpers/pluginGen/pom.xml b/modules/helpers/pluginGen/pom.xml
index 8dd75a2..db4e85d 100644
--- a/modules/helpers/pluginGen/pom.xml
+++ b/modules/helpers/pluginGen/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginGen</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.2-SNAPSHOT</version>
<name>RHQ plugin generator</name>
<description>Helper to generate plugin skeletons</description>
commit e970bc01294b8487175328fc3c60d701a9638587
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 13:08:08 2010 -0400
[maven-release-plugin] prepare release rhq-pluginGen-3.0.1
diff --git a/modules/helpers/pluginGen/pom.xml b/modules/helpers/pluginGen/pom.xml
index af63ced..8dd75a2 100644
--- a/modules/helpers/pluginGen/pom.xml
+++ b/modules/helpers/pluginGen/pom.xml
@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
+<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
@@ -15,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginGen</artifactId>
<packaging>jar</packaging>
- <version>3.0.1-SNAPSHOT</version>
+ <version>3.0.1</version>
<name>RHQ plugin generator</name>
<description>Helper to generate plugin skeletons</description>
commit 38ccb816da590a3e69c1673047c1ab995c25e44d
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 13:01:13 2010 -0400
prep for pluginGen release
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 711243a..03fdfdb 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -47,7 +47,7 @@
</plugin>
<plugin>
- <artifactId>maven-resources-plugin</artifactId>
+ <artifactId>maven-release-plugin</artifactId>
<version>2.1</version>
</plugin>
diff --git a/modules/helpers/pluginGen/pom.xml b/modules/helpers/pluginGen/pom.xml
index 431f2e2..af63ced 100644
--- a/modules/helpers/pluginGen/pom.xml
+++ b/modules/helpers/pluginGen/pom.xml
@@ -21,12 +21,13 @@
<description>Helper to generate plugin skeletons</description>
<scm>
- <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginGen</connection>
- <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginGen</developerConnection>
- </scm>
+ <connection>scm:git:git://git.fedorahosted.org/rhq/rhq.git</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq/rhq.git</developerConnection>
+ </scm>
- <build>
- <plugins>
+
+ <build>
+ <plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
@@ -71,10 +72,17 @@
</execution>
</executions>
</plugin>
- </plugins>
+
+ <plugin>
+ <artifactId>maven-release-plugin</artifactId>
+ <version>2.1</version>
+ </plugin>
+
+ </plugins>
</build>
+
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
commit 566ca4b681023a5008df4168685ebf56628c23c3
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:54:33 2010 -0400
fix scm URLs
diff --git a/pom.xml b/pom.xml
index 82f2458..3d4b50f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,8 @@
<?xml version="1.0"?>
-<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">
+<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>
@@ -20,9 +22,9 @@
</organization>
<scm>
- <connection>scm:git:ssh://git.fedorahosted.org/git/rhq/rhq.git</connection>
+ <connection>scm:git:git://git.fedorahosted.org/rhq/rhq.git</connection>
<developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq/rhq.git</developerConnection>
- <url>http://git.fedorahosted.org/git/?p=rhq/rhq.git</url>
+ <url>http://git.fedorahosted.org/git/rhq/rhq.git</url>
</scm>
<issueManagement>
commit a68c2aa37cbc2101221b26c5ebd086166e231470
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:42:44 2010 -0400
[maven-release-plugin] prepare for next development iteration
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index d840d7a..711243a 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.2-SNAPSHOT</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 63edac95a998050dd4fac002d158f44a7f5092ed
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:42:37 2010 -0400
[maven-release-plugin] prepare release rhq-pluginAnnotations-3.0.1
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index ca5a95c..d840d7a 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1-SNAPSHOT</version>
+ <version>3.0.1</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 167510bcd2039e5edfa9f5c6c92805f58389b422
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:40:34 2010 -0400
take 7
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 2de0829..ca5a95c 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,14 +13,14 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.1-SNAPSHOT</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
<scm>
<connection>scm:git:git://git.fedorahosted.org/rhq/rhq.git</connection>
- <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git</developerConnection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq/rhq.git</developerConnection>
</scm>
<build>
commit de6ec6906def45190ed8d1da22cf8c555bd8e79d
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:38:24 2010 -0400
[maven-release-plugin] prepare release rhq-pluginAnnotations-3.0.1
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 7682703..2de0829 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1-SNAPSHOT</version>
+ <version>3.0.1</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 9adb0057d5cb5a9082b2d964a47ca787d32eb13f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:37:46 2010 -0400
back to snapshot
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 2de0829..7682703 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.1-SNAPSHOT</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 0edfed7712006f43223fcc49fd5de6c5ba931f0f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:37:04 2010 -0400
...
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 7b34c1d..2de0829 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -19,13 +19,13 @@
<description>Annotations to help generate plugin descriptors</description>
<scm>
- <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginAnno...</connection>
- <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginAnno...</developerConnection>
- </scm>
+ <connection>scm:git:git://git.fedorahosted.org/rhq/rhq.git</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git</developerConnection>
+ </scm>
- <build>
+ <build>
- <plugins>
+ <plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
commit 4a0d864a16e50e83814d66860208115511b6af28
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:29:50 2010 -0400
[maven-release-plugin] prepare release rhq-pluginAnnotations-3.0.1
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 84ba991..7b34c1d 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1-SNAPSHOT</version>
+ <version>3.0.1</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit c88ad7193eb1d3c4d2a4ce3068813e7883b9ef76
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:29:20 2010 -0400
...
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 7b34c1d..84ba991 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.1-SNAPSHOT</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit eb8909dfecdea491364cbb3ec38a65a71e3a7fb6
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:28:24 2010 -0400
[maven-release-plugin] prepare release rhq-pluginAnnotations-3.0.1
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 84ba991..7b34c1d 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1-SNAPSHOT</version>
+ <version>3.0.1</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 6263f4785753126c546f335872ecfa51ef49ded9
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:26:46 2010 -0400
upgrade to latest release plugin version
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 483e67f..84ba991 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -26,6 +26,7 @@
<build>
<plugins>
+
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
@@ -36,7 +37,6 @@
<plugin>
<artifactId>maven-jar-plugin</artifactId>
- <version>2.2</version>
<configuration>
<archive>
<manifest>
@@ -46,6 +46,11 @@
</configuration>
</plugin>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.1</version>
+ </plugin>
+
</plugins>
</build>
diff --git a/modules/helpers/pluginGen/pom.xml b/modules/helpers/pluginGen/pom.xml
index 25ddded..431f2e2 100644
--- a/modules/helpers/pluginGen/pom.xml
+++ b/modules/helpers/pluginGen/pom.xml
@@ -84,12 +84,12 @@
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
- <version>2.3.11</version>
+ <version>2.3.16</version>
</dependency>
<dependency>
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
- <version>${project.version}</version>
+ <version>3.0.1</version>
</dependency>
</dependencies>
commit 8588caefe8fa1034d9609935a639ed5513357dff
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 12:04:40 2010 -0400
bleh
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 071ac58..483e67f 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.1-SNAPSHOT</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit c68d8568cda385d086f2bcf2af956fb9a36536d0
Merge: fde139a... 7c1fb18...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 11:46:48 2010 -0400
Merge branch 'master' into gwt-ldap2
commit fde139ab95d632c9a4684eda9b6c1e6c29512671
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 11:43:22 2010 -0400
i)removed unused ldap method ii)wrapped findAvailableLdapGroups,getLdapGroupsForRole and findGroupsAssignedToRole in Manage_Security check.
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 d77b808..841d8e0 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
@@ -309,7 +309,7 @@ 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.");
+ Log.debug("Optional LDAP detail retrieval did not succeed. Registration prepopulation will not occur.");
}
});
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 3045c5d..673f3c7 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
@@ -46,11 +46,6 @@ public interface LdapGWTService extends RemoteService {
*/
Map<String, String> getLdapDetailsFor(String user);
- /**
- * Updates the role with the ldap groups selected.
- */
- void addLdapGroupsToRole(int roleId, List<String> groupIds);
-
/** In setting the LDAP groups for this role, all previous group
* assignments for this role are removed before most up to date
* list of valid LDAP groups is assigned.
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 330ed24..5969954 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
@@ -24,8 +24,10 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import com.allen_sauer.gwt.log.client.Log;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -34,6 +36,8 @@ import org.rhq.enterprise.gui.coregui.client.gwt.LdapGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -48,56 +52,71 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
private LdapGroupManagerLocal ldapManager = LookupUtil.getLdapGroupManager();
private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
private SystemManagerLocal systemManager = LookupUtil.getSystemManager();
+ private AuthorizationManagerLocal authorizationManager = LookupUtil.getAuthorizationManager();
+
+ private final Log log = LogFactory.getLog(LdapGWTServiceImpl.class);
@Override
public Set<Map<String, String>> findAvailableGroups() {
-
+ //add permissions check
+ Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(getSessionSubject());
+ Boolean accessGranted = globalPermissions.contains(Permission.MANAGE_SECURITY);
try {
- Set<Map<String, String>> results = ldapManager.findAvailableGroups();
+ Set<Map<String, String>> results = null;
+ if (accessGranted) {
+ results = ldapManager.findAvailableGroups();
+ } else {
+ String message = "User '" + getSessionSubject().getName()
+ + "' does not have sufficient permissions to query available LDAP groups.";
+ log.debug(message);
+ throw new PermissionException(message);
+ }
return SerialUtility.prepare(results, "findAvailableGroups");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
- @Override
- public void addLdapGroupsToRole(int roleId, List<String> groupIds) {
- try {
- ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
- } catch (Exception e) {
- throw new RuntimeException(ThrowableUtil.getAllMessages(e));
- }
-
- }
-
public void setLdapGroupsForRole(int roleId, List<String> groupIds) {
+ //add permissions check
+ Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(getSessionSubject());
+ Boolean accessGranted = globalPermissions.contains(Permission.MANAGE_SECURITY);
try {
- //clean out existing roles as this defines the new list of roles
- PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
- Log.trace("Removing " + existing.getTotalSize() + " groups from role '" + roleId + "'.");
- int[] groupIndices = new int[existing.size()];
- int indx = 0;
- for (LdapGroup lg : existing) {
- groupIndices[indx++] = lg.getId();
- }
- Log.trace("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
- ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
- PageList<LdapGroup> nowGroups = ldapManager
- .findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ if (accessGranted) {
+ //clean out existing roles as this defines the new list of roles
+ PageList<LdapGroup> existing = ldapManager.findLdapGroupsByRole(roleId, PageControl
+ .getUnlimitedInstance());
+ log.trace("Removing " + existing.getTotalSize() + " groups from role '" + roleId + "'.");
+ int[] groupIndices = new int[existing.size()];
+ int indx = 0;
+ for (LdapGroup lg : existing) {
+ groupIndices[indx++] = lg.getId();
+ }
+ log.trace("Removing " + groupIndices.length + " LDAP Groups." + groupIndices);
+ ldapManager.removeLdapGroupsFromRole(subjectManager.getOverlord(), roleId, groupIndices);
+ PageList<LdapGroup> nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
+ .getUnlimitedInstance());
- //from among all available groups, if group name matches then add it to the list.
- ArrayList<String> validGroupIds = new ArrayList<String>();
- Set<Map<String, String>> allAvailableLdapGroups = ldapManager.findAvailableGroups();
- for (String group : groupIds) {
- for (Map<String, String> map : allAvailableLdapGroups) {
- if (map.get("name").equals(group)) {
- validGroupIds.add(group);
+ //from among all available groups, if group name matches then add it to the list.
+ ArrayList<String> validGroupIds = new ArrayList<String>();
+ Set<Map<String, String>> allAvailableLdapGroups = ldapManager.findAvailableGroups();
+ for (String group : groupIds) {
+ for (Map<String, String> map : allAvailableLdapGroups) {
+ if (map.get("name").equals(group)) {
+ validGroupIds.add(group);
+ }
}
}
+ log.trace("Adding " + validGroupIds.size() + " ldap groups to role[" + roleId + "].");
+ ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
+ nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ } else {
+ String message = "User '" + getSessionSubject().getName()
+ + "' does not have sufficient permissions to modify LDAP group assignments for roles.";
+ log.debug(message);
+ throw new PermissionException(message);
}
- Log.trace("Adding " + validGroupIds.size() + " ldap groups to role[" + roleId + "].");
- ldapManager.addLdapGroupsToRole(subjectManager.getOverlord(), roleId, groupIds);
- nowGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
@@ -105,9 +124,20 @@ public class LdapGWTServiceImpl extends AbstractGWTServiceImpl implements LdapGW
@Override
public PageList<LdapGroup> findLdapGroupsAssignedToRole(int roleId) {
+ //add permissions check
+ Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(getSessionSubject());
+ Boolean accessGranted = globalPermissions.contains(Permission.MANAGE_SECURITY);
+
try {
- PageList<LdapGroup> allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl
- .getUnlimitedInstance());
+ PageList<LdapGroup> allAssignedLdapGroups = null;
+ if (accessGranted) {
+ allAssignedLdapGroups = ldapManager.findLdapGroupsByRole(roleId, PageControl.getUnlimitedInstance());
+ } else {
+ String message = "User '" + getSessionSubject().getName()
+ + "' does not have permissions to query LDAP group by role.";
+ log.debug(message);
+ throw new PermissionException(message);
+ }
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 4dbb7fa..1e5d316 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,6 +18,9 @@
*/
package org.rhq.enterprise.gui.coregui.server.gwt;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.util.PageList;
@@ -25,6 +28,7 @@ import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.gui.coregui.client.gwt.SubjectGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.exception.LoginException;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -36,6 +40,8 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
private static final long serialVersionUID = 1L;
private SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ private AuthorizationManagerLocal authorizationManager = LookupUtil.getAuthorizationManager();
+ private final Log log = LogFactory.getLog(SubjectGWTServiceImpl.class);
public void changePassword(String username, String password) {
try {
@@ -96,6 +102,7 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
public Subject processSubjectForLdap(Subject subjectToModify, String password) {
+ //no permissions check as embedded in the SLSB call.
try {
Subject processedSubject = subjectManager.processSubjectForLdap(subjectToModify, password);
//if sessionId has changed then need to refresh the WebUser
commit 89c6fcb34e6bd29c95e7dca3c63af3ea8d4c435f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 11:39:41 2010 -0400
[maven-release-plugin] prepare release rhq-pluginAnnotations-3.0.1
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 483e67f..071ac58 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1-SNAPSHOT</version>
+ <version>3.0.1</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 7c1fb18c49da5a1dc9258c9e238096f85eead2e4
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 11:39:03 2010 -0400
bleh
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 071ac58..483e67f 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.1-SNAPSHOT</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 3e11e975d0d521c314e72c361ff3a1d7698ebc51
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 11:36:45 2010 -0400
[maven-release-plugin] prepare release PluginAnnotations_3_0_1
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index 3579caa..071ac58 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
+<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
@@ -15,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
- <version>3.0.1-SNAPSHOT</version>
+ <version>3.0.1</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
commit 3754606f88c751ed44b1e1a326edb887d2fd2684
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 11:32:26 2010 -0400
break pluginGen and pluginAnnotations out from the RHQ reactor, so they can be released independently
diff --git a/modules/helpers/pluginAnnotations/pom.xml b/modules/helpers/pluginAnnotations/pom.xml
index e637aad..3579caa 100644
--- a/modules/helpers/pluginAnnotations/pom.xml
+++ b/modules/helpers/pluginAnnotations/pom.xml
@@ -1,29 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
+
+<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
- <groupId>org.rhq.helpers</groupId>
- <artifactId>rhq-helpers</artifactId>
- <version>4.0.0-SNAPSHOT</version>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-parent</artifactId>
+ <version>3.0.0</version>
</parent>
-
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginAnnotations</artifactId>
<packaging>jar</packaging>
+ <version>3.0.1-SNAPSHOT</version>
<name>RHQ plugin annotations</name>
<description>Annotations to help generate plugin descriptors</description>
- <version>4.0.0-SNAPSHOT</version>
<scm>
- <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginGen</connection>
- <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginGen</developerConnection>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginAnno...</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginAnno...</developerConnection>
</scm>
<build>
+
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
@@ -33,8 +36,7 @@
</configuration>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
+ <plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
@@ -46,8 +48,10 @@
</configuration>
</plugin>
- </plugins>
+ </plugins>
</build>
</project>
+
+
diff --git a/modules/helpers/pluginGen/pom.xml b/modules/helpers/pluginGen/pom.xml
index 221ae3e..25ddded 100644
--- a/modules/helpers/pluginGen/pom.xml
+++ b/modules/helpers/pluginGen/pom.xml
@@ -1,22 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
+
+<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
- <groupId>org.rhq.helpers</groupId>
- <artifactId>rhq-helpers</artifactId>
- <version>4.0.0-SNAPSHOT</version>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-parent</artifactId>
+ <version>3.0.0</version>
</parent>
-
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginGen</artifactId>
<packaging>jar</packaging>
+ <version>3.0.1-SNAPSHOT</version>
<name>RHQ plugin generator</name>
<description>Helper to generate plugin skeletons</description>
- <version>4.0.0-SNAPSHOT</version>
<scm>
<connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers/pluginGen</connection>
@@ -25,6 +27,7 @@
<build>
<plugins>
+
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
@@ -33,8 +36,7 @@
</configuration>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
+ <plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
@@ -64,7 +66,7 @@
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- append to the packaging phase. -->
<goals>
- <goal>attached</goal> <!-- goals == mojos -->
+ <goal>single</goal> <!-- goals == mojos -->
</goals>
</execution>
</executions>
@@ -77,9 +79,8 @@
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
- <version>${commons-logging.version}</version>
+ <version>1.1.0.jboss</version>
</dependency>
-
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
@@ -91,4 +92,6 @@
<version>${project.version}</version>
</dependency>
</dependencies>
+
</project>
+
diff --git a/modules/helpers/pom.xml b/modules/helpers/pom.xml
index a16c058..cb5d895 100644
--- a/modules/helpers/pom.xml
+++ b/modules/helpers/pom.xml
@@ -1,4 +1,6 @@
-<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">
+<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>
@@ -20,11 +22,13 @@
<developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/helpers</developerConnection>
</scm>
+
<properties>
<scm.module.path>modules/helpers/</scm.module.path>
</properties>
- <dependencies>
+
+ <dependencies>
<dependency>
<groupId>net.sourceforge.cobertura</groupId>
<artifactId>cobertura</artifactId>
@@ -36,16 +40,17 @@
<modules>
- <!-- plugins that are used by both enterprise and embedded -->
- <module>rtfilter</module>
- <!-- plugin generator -->
+ <module>rtfilter</module>
+<!--
<module>pluginGen</module>
<module>pluginAnnotations</module>
- <module>bundleGen</module>
- <module>perftest-support</module>
+-->
+ <module>bundleGen</module>
+ <module>perftest-support</module>
</modules>
+
<profiles>
</profiles>
commit 0c445716b27c75729209c0cff33826d1ce70c513
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 11:11:46 2010 -0400
use 'single' goal, rather than deprecated 'attached' goal, for assembly plugin execution
diff --git a/modules/enterprise/remoting/cli/pom.xml b/modules/enterprise/remoting/cli/pom.xml
index 9811869..d418d82 100644
--- a/modules/enterprise/remoting/cli/pom.xml
+++ b/modules/enterprise/remoting/cli/pom.xml
@@ -208,7 +208,7 @@
<id>assemble-rhq-client-zip</id>
<phase>package</phase>
<goals>
- <goal>attached</goal>
+ <goal>single</goal>
</goals>
</execution>
</executions>
commit 8ee2538a958122aa6d409f62c147dd950c517985
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 08:59:52 2010 -0400
upgrade SmartGWT from 2.2 to 2.2.RHQ1 (a recent build from SmartGWT HEAD)
diff --git a/modules/enterprise/gui/coregui/pom.xml b/modules/enterprise/gui/coregui/pom.xml
index 2b61393..58cdf8a 100644
--- a/modules/enterprise/gui/coregui/pom.xml
+++ b/modules/enterprise/gui/coregui/pom.xml
@@ -24,7 +24,7 @@
<properties>
<!-- dependency versions -->
<gwt.version>2.0.4</gwt.version>
- <smartgwt.version>2.2</smartgwt.version>
+ <smartgwt.version>2.2.RHQ1</smartgwt.version>
<!-- If this is too much memory to allocate to your gwt:debug process then override this property in
in your settings.xml -->
commit 78751fef7b35ad8e41a71cd7a3b5d1578457469c
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Nov 1 08:56:58 2010 -0400
i)Long standing Logout bug in ui ii)removed cookie caching/use code iii)remove userSessionMgr.setSetsionState iv)new ldap user reg, back to logout on F5 refresh v)more documentation.
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 143045c..f32842a 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
@@ -209,6 +209,7 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
// TODO: don't make LogOut a history event, just perform the logout action by responding to click event
LoginView logoutView = new LoginView();
canvas = logoutView;
+ UserSessionManager.logout();
logoutView.showLoginDialog();
} else if (breadcrumbName.equals(TaggedView.VIEW_ID)) {
canvas = new TaggedView("Tag");
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 c301bd3..d77b808 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
@@ -31,7 +31,6 @@ import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
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.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.FormErrorOrientation;
@@ -188,17 +187,9 @@ public class LoginView extends Canvas {
* @param sessionId pass in valid session id for LDAP registration steps.
* @param callback pass in callback reference to indicate success and launch of coreGUI
*/
- public void showRegistrationDialog(String user, final String sessionId, final String password,
+ public void showRegistrationDialog(final String user, final String sessionId, final String password,
final AsyncCallback<Subject> callback) {
if (!loginShowing) {
- //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;
form = new DynamicForm();
@@ -228,7 +219,7 @@ public class LoginView extends Canvas {
}
final TextItem username = new TextItem(USERNAME, "Username");
{
- username.setValue(Cookies.getCookie(USERNAME));
+ username.setValue(user);
username.setDisabled(true);
username.setWidth(fieldWidth);
@@ -260,8 +251,11 @@ public class LoginView extends Canvas {
IButton okButton = new IButton("OK");
okButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
+ //F5 refresh check? If they've reloaded the form for some reason then bail.
+ boolean credentialsEmpty = ((user == null) || (user.trim().isEmpty()) || (password == null) || (password
+ .trim().isEmpty()));
//check for session timeout
- if (UserSessionManager.isLoggedOut()) {
+ if (UserSessionManager.isLoggedOut() || (credentialsEmpty)) {
resetLogin();
return;
}
@@ -277,7 +271,7 @@ public class LoginView extends Canvas {
form.setValue(PHONE, String.valueOf(phone.getValue()));
form.setValue(DEPARTMENT, String.valueOf(department.getValue()));
form.setValue(SESSIONID, sessionId);
- form.setValue(PASSWORD, Cookies.getCookie(PASSWORD));
+ form.setValue(PASSWORD, password);
registerLdapUser(form, callback);
}
}
@@ -322,7 +316,10 @@ public class LoginView extends Canvas {
IButton resetButton = new IButton("Reset");
resetButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- if (UserSessionManager.isLoggedOut()) {
+ //F5 refresh check? If they've reloaded the form for some reason then bail.
+ boolean credentialsEmpty = ((user == null) || (user.trim().isEmpty()) || (password == null) || (password
+ .trim().isEmpty()));
+ if (UserSessionManager.isLoggedOut() || credentialsEmpty) {
resetLogin();
return;
}
@@ -349,10 +346,6 @@ 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;
}
});
@@ -387,7 +380,7 @@ public class LoginView extends Canvas {
private void resetLogin() {
window.destroy();
loginShowing = false;
- UserSessionManager.setSessionState(UserSessionManager.State.IS_LOGGED_OUT);
+ UserSessionManager.logout();
new LoginView().showLoginDialog();
}
@@ -445,7 +438,7 @@ public class LoginView extends Canvas {
newSubject.setFsystem(false);
if (proceed) {
- Log.trace("New LDAP user registration details valid for user'" + newSubject.getName() + "'.");
+ 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>() {
@@ -462,8 +455,6 @@ 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);
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 d716136..0932e6f 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,7 +19,6 @@
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;
@@ -47,7 +46,7 @@ public class SearchGUI implements EntryPoint {
return;
}
- UserSessionManager.checkLoginStatus(Cookies.getCookie("username"), null, new AsyncCallback<Subject>() {
+ UserSessionManager.checkLoginStatus(null, 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 569b00f..4e29b9e 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
@@ -73,6 +73,7 @@ public class UserSessionManager {
@Override
public void run() {
Log.info("Session timer expired.");
+ sessionState = State.IS_LOGGED_OUT;
new LoginView().showLoginDialog(); // log user out, show login dialog
}
};
@@ -87,12 +88,10 @@ public class UserSessionManager {
// static access only
}
- private static Boolean needsRegistration = false;
-
public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Subject> callback) {
BrowserUtility.forceIe6Hacks();
- RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
+ final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
try {
b.setCallback(new RequestCallback() {
public void onResponseReceived(final Request request, final Response response) {
@@ -137,9 +136,6 @@ 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
final Subject subject = new Subject();
@@ -147,10 +143,19 @@ public class UserSessionManager {
subject.setSessionId(Integer.valueOf(sessionId));
sessionSubject = subject;
- //populate the username for the subject for isUserWithPrincipal check
- subject.setName(Cookies.getCookie("username"));
+ //populate the username for the subject for isUserWithPrincipal check in ldap processing
+ subject.setName(user);
if (subject.getId() == 0) {//either i)ldap new user registration ii)ldap case sensitive match
+ if ((subject.getName() == null) || (subject.getName().trim().isEmpty())) {
+ //we've lost crucial information, probably in a browser refresh. Send them back through login
+ Log
+ .trace("Unable to locate information critical to ldap registration/account lookup. Log back in.");
+ sessionState = State.IS_LOGGED_OUT;
+ new LoginView().showLoginDialog();
+ return;
+ }
+
//BZ-586435: insert case insensitivity for usernames with ldap auth
// locate first matching subject and attach.
SubjectCriteria subjectCriteria = new SubjectCriteria();
@@ -166,23 +171,27 @@ public class UserSessionManager {
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());
+ Log.warn("Problem querying subjects by criteria during loginStatus check."
+ + caught.getMessage());
+ return;
}
//pipe through method to handle case insensitive
- public void onSuccess(PageList<Subject> result) {
- if (result.size() == 0) {//none found, launch registration
+ public void onSuccess(PageList<Subject> results) {
+ if (results.size() == 0) {//no case insensitive matches 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);
+ return;
} else {//launch case sensitive code handling
+ Subject locatedSubject = results.get(0);
Log
- .trace("Checking login and determined that ldap case insensitive login '"
- + subject.getName() + "' should be used instead of '" + user + "'");
+ .trace("Checked credentials and determined that ldap case insensitive login '"
+ + locatedSubject.getName()
+ + "' should be used instead of '"
+ + user
+ + "'");
//use the original username to pass session check.
subject.setName(user);
GWTServiceLookup.getSubjectService().processSubjectForLdap(subject,
@@ -192,15 +201,20 @@ public class UserSessionManager {
+ caught.getMessage());
//TODO: pass message to login dialog.
new LoginView().showLoginDialog();
+ return;
}
public void onSuccess(Subject checked) {
Log.trace("Proceeding with registration for ldap user '" + user
+ "'.");
sessionState = State.IS_LOGGED_IN;
+ userPreferences = new UserPreferences(checked);
+ refresh();
+
callback.onSuccess(checked);
+ return;
}
- });//end processSubjectForLdap
+ });//end processSubjectForLdap call
}
}
});//end findSubjectsByCriteria
@@ -219,48 +233,48 @@ public class UserSessionManager {
Log.info("Failed to load user's subject");
//TODO: pass message to login ui.
new LoginView().showLoginDialog();
+ return;
}
- public void onSuccess(PageList<Subject> result) {
- final Subject validSessionSubject = result.get(0);
- //include session for subject session processing with LDAP
+ public void onSuccess(PageList<Subject> results) {
+ final Subject validSessionSubject = results.get(0);
+ //update the returned subject with current session id
validSessionSubject.setSessionId(Integer.valueOf(sessionId));
+
Log.trace("Completed session check for subject '" + validSessionSubject + "'.");
//initiate ldap check for ldap authz update(wrt roles) of subject with silent update
+ //as the subject.id > 0 then only group authorization updates will occur if ldap configured.
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.
+ return;
}
public void onSuccess(Subject result) {
- Log.trace("Succesfully updated authorization for ldap subject '"
- + validSessionSubject.getName() + "'");
+ Log.trace("Succesfully processed subject '"
+ + validSessionSubject.getName() + "' for ldap.");
+ return;
}
});
- //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 = validSessionSubject;
userPreferences = new UserPreferences(sessionSubject);
refresh();
sessionState = State.IS_LOGGED_IN;
callback.onSuccess(validSessionSubject);
+ return;
}
});
- }
- } else {//invalid session. Back to login
+ }//end of server side session check;
+ } else {//invalid client session. Back to login
sessionState = State.IS_LOGGED_OUT;
- //clean out cookies if actually logged out.
- Cookies.removeCookie("username");
- Cookies.removeCookie(LoginView.PASSWORD);
- Cookies.removeCookie(LoginView.USERNAME);
new LoginView().showLoginDialog();
+ return;
}
}
@@ -277,10 +291,10 @@ public class UserSessionManager {
}
public static void login() {
- login(Cookies.getCookie("username"), null);
+ login(null, null);
}
- /**Same as login, but passes in credentials optionally needed during new LDAP user registration.
+ /**Same as login, but passes in credentials optionally needed during ldap[i)new user registration or ii)case insensitive] logins.
*
* @param user
* @param password
@@ -292,10 +306,12 @@ public class UserSessionManager {
sessionState = State.IS_LOGGED_IN;
// 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.");
+ Log.trace("A new subject and session were returned. Updating sessionSubject.");
sessionSubject = result;
+ //update savedSessionId for browser refresh
+ saveSessionId(String.valueOf(sessionSubject.getSessionId()));
}
- Cookies.setCookie("username", sessionSubject.getName());
+
CoreGUI.get().buildCoreUI();
}
@@ -342,10 +358,6 @@ 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
@@ -379,6 +391,10 @@ public class UserSessionManager {
return sessionState == State.IS_LOGGED_OUT;
}
+ public static boolean isRegistering() {
+ return sessionState == State.IS_REGISTERING;
+ }
+
public static Subject getSessionSubject() {
return sessionSubject;
}
@@ -399,8 +415,4 @@ 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/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
index 15d7464..4dbb7fa 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
@@ -97,8 +97,31 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
public Subject processSubjectForLdap(Subject subjectToModify, String password) {
try {
- return SerialUtility.prepare(subjectManager.processSubjectForLdap(subjectToModify, password),
- "SubjectManager.processSubjectForLdap");
+ Subject processedSubject = subjectManager.processSubjectForLdap(subjectToModify, password);
+ //if sessionId has changed then need to refresh the WebUser
+ // if (subjectToModify.getSessionId() != processedSubject.getSessionId()) {
+ // HttpServletRequest request = requestReference;
+ // if ((request != null) && (request.getSession() != null)) {
+ // HttpSession session = request.getSession();
+ //
+ // // //move this to the sessionAccessServlet
+ // // WebUser webUser = new WebUser(processedSubject, false);
+ // // session.invalidate();
+ // // session = request.getSession(true);
+ // // SessionUtils.setWebUser(session, webUser);
+ // // // look up the user's permissions
+ // // Set<Permission> all_permissions = LookupUtil.getAuthorizationManager()
+ // // .getExplicitGlobalPermissions(processedSubject);
+ // //
+ // // Map<String, Boolean> userGlobalPermissionsMap = new HashMap<String, Boolean>();
+ // // for (Permission permission : all_permissions) {
+ // // userGlobalPermissionsMap.put(permission.toString(), Boolean.TRUE);
+ // // }
+ // // //load all session attributes
+ // // session.setAttribute(Constants.USER_OPERATIONS_ATTR, userGlobalPermissionsMap);
+ // }
+ // }
+ return SerialUtility.prepare(processedSubject, "SubjectManager.processSubjectForLdap");
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
@@ -112,4 +135,5 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
+
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
index 6739824..037e6b9 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
@@ -49,7 +49,6 @@ public class SessionAccessServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request = (HttpServletRequest) req;
@@ -73,14 +72,12 @@ public class SessionAccessServlet extends HttpServlet {
// the web user exists, so update our SessionManager's session last-access-time
Subject subject = webUser.getSubject();
-
try {
SessionManager.getInstance().getSubject(subject.getSessionId());
long lastAccess = SessionManager.getInstance().getlastAccess(subject.getSessionId());
ServletOutputStream out = response.getOutputStream();
String output = subject.getId() + ":" + webUser.getSessionId() + ":" + lastAccess;
-
out.write(output.getBytes());
} catch (SessionNotFoundException snfe) {
session.removeAttribute(ParamConstants.USER_PARAM);
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 a9e7992..86d220b 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
@@ -293,8 +293,8 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
subject.setSessionId(sessionId);
//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.");
+ //as already logged in as regular JDBC
subject = processSubjectForLdap(subject, password);
- return subject;
} catch (SessionException se) {
// nope, no session; continue on so we can create the session
}
@@ -325,7 +325,10 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
return subject;
}
- /**This method is applied to non-null Subject instances that may require LDAP auth/authz processing.
+ /**This method is applied to Subject instances that may require LDAP auth/authz processing.
+ * Called from both SLSB and SubjectGWTServiceImpl and:
+ * -if Subject passed in has Principal(not LDAP account) then we immediately return Subject as no processing needed.
+ * -if Subject for LDAP account
*
* @param subject Authenticated subject.
* @return same or new Subject returned from LDAP processing.
@@ -333,6 +336,7 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
*/
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:"
@@ -342,17 +346,23 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
if (userHasPrincipal) {
return subject; //bail. No further checking required.
} else {//Start LDAP check.
- //retrieve configuration properties and do LDAP check
+
+ //retrieve configuration properties and do LDAP check(permissions check in SubjectGWTImpl)
Properties config = systemManager.getSystemConfiguration();
+
+ //determine if ldap configured.
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 (ldapConfigured) {//we can proceed with LDAP checking
+ //check that session is valid. RHQ auth has already occurred. Security check required to initiate following
if (!isValidSessionId(subject.getSessionId(), subject.getName(), subject.getId())) {
throw new LoginException("User session not valid. Login to proceed.");
}
- if (subject.getId() == 0) {//i)case insensitive check or ii)ldap new user registration.
+ //Subject.id == 0 then is registration or case insensitive check and subject update.
+ 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();
@@ -372,6 +382,7 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
+ ldapSubject.getName() + "]. "
+ "Attempting to authenticate with that account instead.";
log.info(msg);
+ logout(subject.getSessionId().intValue());
subject = login(ldapSubject.getName(), subjectPassword);
Integer sessionId = subject.getSessionId();
log.trace("Logged in as [" + ldapSubject.getName() + "] with session id [" + sessionId
@@ -390,22 +401,38 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
logout(subject.getSessionId().intValue());
subject = login(subject.getName(), subjectPassword);
}
+ // //either way need to refresh the WebUser
+ // if ((request != null) && (request.getSession() != null)) {
+ // HttpSession session = request.getSession();
+ // WebUser webUser = new WebUser(subject, false);
+ // session.invalidate();
+ // session = request.getSession(true);
+ // SessionUtils.setWebUser(session, webUser);
+ // // look up the user's permissions
+ // Set<Permission> all_permissions = LookupUtil.getAuthorizationManager()
+ // .getExplicitGlobalPermissions(subject);
+ //
+ // Map<String, Boolean> userGlobalPermissionsMap = new HashMap<String, Boolean>();
+ // for (Permission permission : all_permissions) {
+ // userGlobalPermissionsMap.put(permission.toString(), Boolean.TRUE);
+ // }
+ // //load all session attributes
+ // session.setAttribute(Constants.USER_OPERATIONS_ATTR, userGlobalPermissionsMap);
+ // }
}
- {//now carry out authz refresh for this Subject
- 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, "");
- 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()));
- log.trace("Updating ldap authorization data for user '" + subject.getName() + "'");
- ldapManager.assignRolesToLdapSubject(subject.getId(), groupNames);
- }
- }
+
+ //Subject.id guaranteed to be > 0 then iii)authorization updates for ldap groups necessary
+ //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()));
+ 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
+ } else {//ldap not configured. Somehow authenticated for LDAP without ldap being configured. Error. Bail
throw new LoginException("You are authenticated for LDAP, but LDAP is not configured.");
}
}
commit f362be20b579591491b59c4bfbbced1fa0394f5c
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Sat Oct 30 12:21:38 2010 -0400
provide checkbox on metric templates view that allows user to choose whether or not the new template schedules should be applied to existing Resources
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 c038076..ed6ecd4 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
@@ -36,6 +36,8 @@ import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTServiceAsync;
/**
+ * A helper class for {@link ResourceTypeTreeView}.
+ *
* @author Greg Hinkle
* @author John Mazzitelli
*/
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 43d51a2..ae4b755 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
@@ -55,6 +55,9 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
+ * A tree view of all known ResourceTypes, which includes summaries of metric schedule and alert definition templates
+ * and allows the user to edit those templates.
+ *
* @author Greg Hinkle
* @author John Mazzitelli
*/
@@ -426,8 +429,8 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
if (record instanceof TreeNode) {
if (record instanceof ResourceTypeTreeNodeBuilder.ResourceTypeTreeNode) {
- String c = record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_CATEGORY);
- switch (ResourceCategory.valueOf(c)) {
+ String categoryName = record.getAttribute(ResourceTypeTreeNodeBuilder.ATTRIB_CATEGORY);
+ switch (ResourceCategory.valueOf(categoryName)) {
case PLATFORM:
return "types/Platform_up_16.png";
case SERVER:
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java
index 8ec63ae..3812cc0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java
@@ -54,21 +54,25 @@ public class UpdateExistingSchedulesWidget extends LocatableHLayout implements T
DynamicForm form = new LocatableDynamicForm(this.getLocatorId());
form.setNumCols(3);
+
CheckboxItem checkboxItem = new CheckboxItem("updateExistingSchedules", "Update Existing Schedules");
checkboxItem.setDefaultValue(schedulesView.isUpdateExistingSchedules());
-
+ checkboxItem.setTooltip("Check this box to update the collection schedules for this metric on all existing "
+ + "Resources of this type. Otherwise, the template schedules will only be applied to Resources of this "
+ + "type that are added to inventory in the future.");
checkboxItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent changedEvent) {
boolean newValue = (Boolean)changedEvent.getValue();
schedulesView.setUpdateExistingSchedules(newValue);
}
});
+
form.setFields(checkboxItem);
addMember(form);
}
@Override
public void refresh(ListGrid listGrid) {
- return;
+ // When new data arrives, we want to keep the state of our checkbox the same, so nothing to do here.
}
}
commit 0a0aa07d0e4cdf71b1dee4a7631bd70e50715072
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 29 19:43:38 2010 -0400
add support to metric template view for specifying whether existing schedules should be updated
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java
index bad1853..6747b39 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java
@@ -39,7 +39,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasuremen
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
/**
- * A DataSource for reading and updating the default metric schedules for a particular ResourceType.
+ * A DataSource for reading and updating the default metric schedules ("metric templates") for a particular ResourceType.
*
* @author Ian Springer
*/
@@ -86,8 +86,10 @@ public class TemplateSchedulesDataSource extends AbstractMeasurementScheduleComp
@Override
protected void enableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
final int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
+ TemplateSchedulesView templateSchedulesView = (TemplateSchedulesView)measurementScheduleListView;
+ boolean updateExistingSchedules = templateSchedulesView.isUpdateExistingSchedules();
final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
- this.measurementService.enableMeasurementTemplates(measurementDefinitionIds,
+ this.measurementService.enableSchedulesForResourceType(measurementDefinitionIds, updateExistingSchedules,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable throwable) {
@@ -110,8 +112,10 @@ public class TemplateSchedulesDataSource extends AbstractMeasurementScheduleComp
@Override
protected void disableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
+ TemplateSchedulesView templateSchedulesView = (TemplateSchedulesView)measurementScheduleListView;
+ boolean updateExistingSchedules = templateSchedulesView.isUpdateExistingSchedules();
final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
- this.measurementService.disableSchedulesForCompatibleGroup(this.resourceTypeId, measurementDefinitionIds,
+ this.measurementService.disableSchedulesForResourceType(measurementDefinitionIds, updateExistingSchedules,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable throwable) {
@@ -135,9 +139,11 @@ public class TemplateSchedulesDataSource extends AbstractMeasurementScheduleComp
protected void updateSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames,
final long collectionInterval) {
+ TemplateSchedulesView templateSchedulesView = (TemplateSchedulesView)measurementScheduleListView;
+ boolean updateExistingSchedules = templateSchedulesView.isUpdateExistingSchedules();
final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
- this.measurementService.updateMeasurementTemplates(measurementDefinitionIds, collectionInterval,
- new AsyncCallback<Void>() {
+ this.measurementService.updateSchedulesForResourceType(measurementDefinitionIds, collectionInterval,
+ updateExistingSchedules, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable throwable) {
CoreGUI.getErrorHandler().handleError(
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
index 648ae40..71f2f49 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
@@ -33,6 +33,8 @@ public class TemplateSchedulesView extends AbstractMeasurementScheduleListView {
private static final String[] EXCLUDED_FIELD_NAMES = new String[] { MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID };
+ private boolean updateExistingSchedules = true;
+
public TemplateSchedulesView(String locatorId, int resourceTypeId) {
super(locatorId, TITLE, new TemplateSchedulesDataSource(resourceTypeId), createCriteria(resourceTypeId),
EXCLUDED_FIELD_NAMES);
@@ -43,4 +45,18 @@ public class TemplateSchedulesView extends AbstractMeasurementScheduleListView {
criteria.addCriteria(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID, resourceTypeId);
return criteria;
}
+
+ @Override
+ protected void configureTable() {
+ super.configureTable();
+ addExtraWidget(new UpdateExistingSchedulesWidget(this));
+ }
+
+ public boolean isUpdateExistingSchedules() {
+ return updateExistingSchedules;
+ }
+
+ public void setUpdateExistingSchedules(boolean updateExistingSchedules) {
+ this.updateExistingSchedules = updateExistingSchedules;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java
new file mode 100644
index 0000000..8ec63ae
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/UpdateExistingSchedulesWidget.java
@@ -0,0 +1,74 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.CheckboxItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import org.rhq.enterprise.gui.coregui.client.components.table.TableWidget;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
+
+/**
+ * A table widget that provides a checkbox for selecting whether or not to update existing schedules when updating
+ * metric templates.
+ *
+ * @author Ian Springer
+ */
+public class UpdateExistingSchedulesWidget extends LocatableHLayout implements TableWidget {
+ private TemplateSchedulesView schedulesView;
+
+ public UpdateExistingSchedulesWidget(TemplateSchedulesView schedulesView) {
+ super(schedulesView.extendLocatorId("UpdateExistingSchedulesWidget"));
+ this.schedulesView = schedulesView;
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ VLayout spacer = new VLayout();
+ spacer.setWidth(20);
+ addMember(spacer);
+
+ DynamicForm form = new LocatableDynamicForm(this.getLocatorId());
+ form.setNumCols(3);
+ CheckboxItem checkboxItem = new CheckboxItem("updateExistingSchedules", "Update Existing Schedules");
+ checkboxItem.setDefaultValue(schedulesView.isUpdateExistingSchedules());
+
+ checkboxItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent changedEvent) {
+ boolean newValue = (Boolean)changedEvent.getValue();
+ schedulesView.setUpdateExistingSchedules(newValue);
+ }
+ });
+ form.setFields(checkboxItem);
+ addMember(form);
+ }
+
+ @Override
+ public void refresh(ListGrid listGrid) {
+ return;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
index 422c244..bf0f629 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
@@ -22,8 +22,11 @@
*/
package org.rhq.enterprise.gui.coregui.client.dashboard;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
@@ -75,6 +78,7 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
private boolean editMode = false;
private List<Dashboard> dashboards;
+ private Map<String, Dashboard> dashboardsByName;
private DashboardView selectedDashboardView;
private Dashboard selectedDashboard;
@@ -112,6 +116,10 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
private void updateDashboards(List<Dashboard> dashboards) {
removeMembers(getMembers());
this.dashboards = dashboards;
+ this.dashboardsByName = new HashMap(dashboards.size());
+ for (Dashboard dashboard: dashboards) {
+ this.dashboardsByName.put(dashboard.getName(), dashboard);
+ }
tabSet = new LocatableTabSet(getLocatorId());
@@ -189,7 +197,7 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
protected Dashboard getDefaultDashboard() {
Dashboard dashboard = new Dashboard();
- dashboard.setName("Default Dashboard");
+ dashboard.setName("Default");
dashboard.setColumns(2);
dashboard.setColumnWidths("32%", "68%");
dashboard.getConfiguration().put(new PropertySimple(Dashboard.CFG_BACKGROUND, "#F1F2F3"));
@@ -251,22 +259,17 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
}
public void addNewDashboard() {
-
- Dashboard dashboard = new Dashboard();
- dashboard.setName("Dashboard");
-
- int i = 1;
- while (true) {
- boolean exists = false;
- for (Dashboard db : dashboards) {
- if (("Dashboard " + i).equals(db.getName()))
- exists = true;
- }
- if (!exists) {
- break;
+ int i = 0;
+ String availableDashboardName = null;
+ while (availableDashboardName == null) {
+ String candidateDashboardName = "Custom" + i++;
+ if (!this.dashboardsByName.containsKey(candidateDashboardName)) {
+ availableDashboardName = candidateDashboardName;
}
}
- dashboard.setName("Dashboard " + i);
+
+ Dashboard dashboard = new Dashboard();
+ dashboard.setName(availableDashboardName);
dashboard.setColumns(2);
dashboard.setColumnWidths("30%", "70%");
@@ -314,7 +317,7 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
}
}
} else {
- com.allen_sauer.gwt.log.client.Log.info("WARN: While rendering DashboardsView tabSet is null.");
+ Log.info("WARN: While rendering DashboardsView, tabSet is null.");
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java
index ea64488..4c145b7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java
@@ -80,11 +80,12 @@ public interface MeasurementDataGWTService extends RemoteService {
void updateSchedulesForCompatibleGroup(int resourceGroupId, int[] measurementDefinitionIds, long collectionInterval);
- void enableMeasurementTemplates(int[] measurementDefinitionIds);
+ void enableSchedulesForResourceType(int[] measurementDefinitionIds, boolean updateExistingSchedules);
- void disableMeasurementTemplates(int[] measurementDefinitionIds);
+ void disableSchedulesForResourceType(int[] measurementDefinitionIds, boolean updateExistingSchedules);
- void updateMeasurementTemplates(int[] measurementDefinitionIds, long collectionInterval);
+ void updateSchedulesForResourceType(int[] measurementDefinitionIds, long collectionInterval,
+ boolean updateExistingSchedules);
PageList<MeasurementDataTrait> findTraitsByCriteria(MeasurementDataTraitCriteria criteria);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java
index 9073af2..0a83095 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java
@@ -199,25 +199,29 @@ public class MeasurementDataGWTServiceImpl extends AbstractGWTServiceImpl implem
}
}
- public void enableMeasurementTemplates(int[] measurementDefinitionIds) {
+ public void enableSchedulesForResourceType(int[] measurementDefinitionIds, boolean updateExistingSchedules) {
try {
- scheduleManager.enableMeasurementTemplates(getSessionSubject(), measurementDefinitionIds);
+ scheduleManager.updateDefaultCollectionIntervalForMeasurementDefinitions(getSessionSubject(),
+ measurementDefinitionIds, 0, updateExistingSchedules);
} catch (RuntimeException e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
- public void disableMeasurementTemplates(int[] measurementDefinitionIds) {
+ public void disableSchedulesForResourceType(int[] measurementDefinitionIds, boolean updateExistingSchedules) {
try {
- scheduleManager.disableMeasurementTemplates(getSessionSubject(), measurementDefinitionIds);
+ scheduleManager.updateDefaultCollectionIntervalForMeasurementDefinitions(getSessionSubject(),
+ measurementDefinitionIds, -1, updateExistingSchedules);
} catch (RuntimeException e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
- public void updateMeasurementTemplates(int[] measurementDefinitionIds, long collectionInterval) {
+ public void updateSchedulesForResourceType(int[] measurementDefinitionIds, long collectionInterval,
+ boolean updateExistingSchedules) {
try {
- scheduleManager.updateMeasurementTemplates(getSessionSubject(), measurementDefinitionIds, collectionInterval);
+ scheduleManager.updateDefaultCollectionIntervalForMeasurementDefinitions(getSessionSubject(),
+ measurementDefinitionIds, collectionInterval, updateExistingSchedules);
} catch (RuntimeException e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
index ccd65bc..3dc8b05 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
@@ -332,13 +332,16 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage
}
/**
- * (Re-)Enables all collection schedules in the given measurement definition IDs and sets their collection
- * intervals. This only enables the "templates", it does not enable actual schedules unless updateExistingSchedules
- * is set to true.
+ * Updates the default enablement and/or collection intervals (i.e. metric templates) for the given measurement
+ * definitions. If updateExistingSchedules is true, the schedules for the corresponding metrics or all inventoried
+ * Resources are also updated. Otherwise, the updated templates will only affect Resources that added to
+ * inventory in the future.
*
* @param subject a valid subject that has Permission.MANAGE_SETTINGS
* @param measurementDefinitionIds The primary keys for the definitions
- * @param collectionInterval the new interval in millisconds for collection
+ * @param collectionInterval if > 0, enable the metric with this value as the the new collection
+ * interval, in milliseconds; if == 0, enable the metric with its current
+ * collection interval; if < 0, disable the metric
* @param updateExistingSchedules If true, then existing schedules for this definition will also be updated.
*/
@RequiredPermission(Permission.MANAGE_SETTINGS)
@@ -358,13 +361,13 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage
return;
}
- boolean enableDisable = (collectionInterval > 0);
+ boolean enable = (collectionInterval >= 0);
// batch the modifications to prevent the ORA error about IN clauses containing more than 1000 items
for (int batchIndex = 0; (batchIndex < measurementDefinitionIds.length); batchIndex += 1000) {
int[] batchIdArray = ArrayUtils.copyOfRange(measurementDefinitionIds, batchIndex, batchIndex + 1000);
- modifyDefaultCollectionIntervalForMeasurementDefinitions(subject, batchIdArray, enableDisable,
+ modifyDefaultCollectionIntervalForMeasurementDefinitions(subject, batchIdArray, enable,
collectionInterval, updateExistingSchedules);
}
}
commit 7155896be74b82b2a9be7b1358103a4e2182fbcf
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 29 16:52:44 2010 -0400
we need to remove the disabled resource's IDs from the callers set - removing resources from our internal resource set is useless
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 4c3b345..e483bb7 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
@@ -2449,7 +2449,7 @@ public class InventoryManager extends AgentService implements ContainerService,
Set<Resource> unknownResources = configuration.getServerServices().getDiscoveryServerService()
.getResources(unknownResourceIds, true);
- Set<Resource> toBeIgnored = new HashSet<Resource>();
+ Set<Integer> toBeIgnored = new HashSet<Integer>();
for (Resource unknownResource : unknownResources) {
ResourceType resourceType = pmm.getType(unknownResource.getResourceType());
@@ -2457,7 +2457,7 @@ public class InventoryManager extends AgentService implements ContainerService,
mergeResource(unknownResource);
syncSchedulesRecursively(unknownResource);
} else {
- toBeIgnored.add(unknownResource);
+ toBeIgnored.add(unknownResource.getId());
if (log.isDebugEnabled()) {
log.debug("During an inventory sync, the server gave us resource [" + unknownResource
+ "] but its type is disabled in the agent; ignoring it");
@@ -2465,7 +2465,7 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
- unknownResources.removeAll(toBeIgnored);
+ unknownResourceIds.removeAll(toBeIgnored);
}
return;
}
commit 6cfd66930f8cb270cca55f76d38591b01bd7776a
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 29 16:51:36 2010 -0400
reformat - no coding changes here, just reformating
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..4c3b345 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
@@ -243,19 +243,16 @@ public class InventoryManager extends AgentService implements ContainerService,
// inside EmbJopr).
if (configuration.isInsideAgent()) {
// After an initial delay (5s by default), periodically run an availability check (every 1m by default).
- availabilityThreadPoolExecutor.scheduleWithFixedDelay(availabilityExecutor,
- configuration.getAvailabilityScanInitialDelay(), configuration.getAvailabilityScanPeriod(),
- TimeUnit.SECONDS);
+ availabilityThreadPoolExecutor.scheduleWithFixedDelay(availabilityExecutor, configuration
+ .getAvailabilityScanInitialDelay(), configuration.getAvailabilityScanPeriod(), TimeUnit.SECONDS);
// After an initial delay (10s by default), periodically run a server discovery scan (every 15m by default).
- inventoryThreadPoolExecutor.scheduleWithFixedDelay(serverScanExecutor,
- configuration.getServerDiscoveryInitialDelay(), configuration.getServerDiscoveryPeriod(),
- TimeUnit.SECONDS);
+ inventoryThreadPoolExecutor.scheduleWithFixedDelay(serverScanExecutor, configuration
+ .getServerDiscoveryInitialDelay(), configuration.getServerDiscoveryPeriod(), TimeUnit.SECONDS);
// After an initial delay (20s by default), periodically run a service discovery scan (every 1d by default).
- inventoryThreadPoolExecutor.scheduleWithFixedDelay(serviceScanExecutor,
- configuration.getServiceDiscoveryInitialDelay(), configuration.getServiceDiscoveryPeriod(),
- TimeUnit.SECONDS);
+ inventoryThreadPoolExecutor.scheduleWithFixedDelay(serviceScanExecutor, configuration
+ .getServiceDiscoveryInitialDelay(), configuration.getServiceDiscoveryPeriod(), TimeUnit.SECONDS);
}
} finally {
inventoryLock.writeLock().unlock();
@@ -294,25 +291,26 @@ public class InventoryManager extends AgentService implements ContainerService,
* @throws Exception if the discovery component threw an exception
*/
public Set<DiscoveredResourceDetails> invokeDiscoveryComponent(ResourceContainer parentResourceContainer,
- ResourceDiscoveryComponent component, ResourceDiscoveryContext context) throws DiscoverySuspendedException, Exception {
+ ResourceDiscoveryComponent component, ResourceDiscoveryContext context) throws DiscoverySuspendedException,
+ Exception {
Resource parentResource = parentResourceContainer == null ? null : parentResourceContainer.getResource();
if (resourceUpgradeDelegate.hasUpgradeFailedInChildren(parentResource, context.getResourceType())) {
String message = "Discovery of [" + context.getResourceType() + "] has been suspended under "
- + (parentResource == null ? " the platform " : parentResource)
- + " because some of its siblings failed to upgrade.";
-
+ + (parentResource == null ? " the platform " : parentResource)
+ + " because some of its siblings failed to upgrade.";
+
log.debug(message);
-
+
throw new DiscoverySuspendedException(message);
}
long timeout = getDiscoveryComponentTimeout(context.getResourceType());
try {
- ResourceDiscoveryComponent proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(
- context.getResourceType(), component, timeout);
+ ResourceDiscoveryComponent proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(context
+ .getResourceType(), component, timeout);
Set<DiscoveredResourceDetails> results = proxy.discoverResources(context);
return results;
} catch (TimeoutException te) {
@@ -344,8 +342,8 @@ public class InventoryManager extends AgentService implements ContainerService,
long timeout = getDiscoveryComponentTimeout(context.getResourceType());
try {
- ManualAddFacet proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(
- context.getResourceType(), component, timeout, ManualAddFacet.class);
+ ManualAddFacet proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(context
+ .getResourceType(), component, timeout, ManualAddFacet.class);
DiscoveredResourceDetails result = proxy.discoverResource(pluginConfig, context);
return result;
} catch (TimeoutException te) {
@@ -384,8 +382,8 @@ public class InventoryManager extends AgentService implements ContainerService,
component, timeout, ClassLoaderFacet.class);
ResourceDiscoveryContext discoveryContext = new ResourceDiscoveryContext(resourceType, parentComponent,
- parentResourceContext, SystemInfoFactory.createSystemInfo(), null, null,
- this.configuration.getContainerName(), this.configuration.getPluginContainerDeployment());
+ parentResourceContext, SystemInfoFactory.createSystemInfo(), null, null, this.configuration
+ .getContainerName(), this.configuration.getPluginContainerDeployment());
// Configurations are not immutable, so clone the plugin config, so the plugin will not be able to change the
// actual PC-managed plugin config.
@@ -600,8 +598,7 @@ public class InventoryManager extends AgentService implements ContainerService,
@NotNull
// TODO (ips): Perhaps refactor this so that it shares code with AvailablityExecutor.checkInventory().
- public
- Availability getCurrentAvailability(Resource resource) {
+ public Availability getCurrentAvailability(Resource resource) {
AvailabilityType availType = null; // i.e. UNKNOWN;
ResourceContainer resourceContainer = getResourceContainer(resource);
if (resourceContainer != null) {
@@ -674,8 +671,8 @@ public class InventoryManager extends AgentService implements ContainerService,
ResourceDiscoveryContext<ResourceComponent> discoveryContext = new ResourceDiscoveryContext<ResourceComponent>(
resourceType, parentResourceComponent, parentResourceContainer.getResourceContext(),
SystemInfoFactory.createSystemInfo(), new ArrayList<ProcessScanResult>(0),
- new ArrayList<Configuration>(0), this.configuration.getContainerName(),
- this.configuration.getPluginContainerDeployment());
+ new ArrayList<Configuration>(0), this.configuration.getContainerName(), this.configuration
+ .getPluginContainerDeployment());
// Ask the plugin's discovery component to find the new resource, throwing exceptions if it cannot be
// found at all.
@@ -705,8 +702,8 @@ public class InventoryManager extends AgentService implements ContainerService,
// Ask the plugin's discovery component to find the new resource, throwing exceptions if it cannot be
// found at all.
try {
- Set<DiscoveredResourceDetails> discoveredResources = invokeDiscoveryComponent(parentResourceContainer,
- discoveryComponent, discoveryContext);
+ Set<DiscoveredResourceDetails> discoveredResources = invokeDiscoveryComponent(
+ parentResourceContainer, discoveryComponent, discoveryContext);
if ((discoveredResources == null) || discoveredResources.isEmpty()) {
log.info("Plugin Error: During manual add, discovery component method ["
+ discoveryComponent.getClass().getName() + ".discoverResources()] returned "
@@ -719,11 +716,18 @@ public class InventoryManager extends AgentService implements ContainerService,
}
discoveredResourceDetails = discoveredResources.iterator().next();
} catch (DiscoverySuspendedException e) {
- String message = "The discovery class [" + discoveryComponent.getClass().getName() + "]" +
- " uses a legacy implementation of \"manual add\" functionality. Some of the child resources" +
- " with the resource type [" + resourceType + "] under the parent resource [" + parentResourceContainer.getResource() + "]" +
- " failed to upgrade, which makes it impossible to support the legacy manual-add implementation. Either upgrade the plugin [" +
- resourceType.getPlugin() + "] to successfully upgrade all resources or consider implementing the ManuallAdd facet.";
+ String message = "The discovery class ["
+ + discoveryComponent.getClass().getName()
+ + "]"
+ + " uses a legacy implementation of \"manual add\" functionality. Some of the child resources"
+ + " with the resource type ["
+ + resourceType
+ + "] under the parent resource ["
+ + parentResourceContainer.getResource()
+ + "]"
+ + " failed to upgrade, which makes it impossible to support the legacy manual-add implementation. Either upgrade the plugin ["
+ + resourceType.getPlugin()
+ + "] to successfully upgrade all resources or consider implementing the ManuallAdd facet.";
log.info(message);
throw new PluginContainerException(message, e);
}
@@ -869,7 +873,8 @@ public class InventoryManager extends AgentService implements ContainerService,
if ((this.platform != null) && (this.platform.getInventoryStatus() == InventoryStatus.NEW)
&& newPlatformWasDeletedRecently) {
// let's make sure we are registered; its probable that our platform was deleted and we need to re-register
- log.info("No committed resources to send in our availability report - the platform/agent was deleted, let's re-register again");
+ log
+ .info("No committed resources to send in our availability report - the platform/agent was deleted, let's re-register again");
registerWithServer();
newPlatformWasDeletedRecently = false; // we've tried to recover from our platform being deleted, let's not do it again
}
@@ -909,8 +914,8 @@ public class InventoryManager extends AgentService implements ContainerService,
log.debug("Availability report content: " + report.toString(log.isTraceEnabled()));
}
- boolean ok = configuration.getServerServices().getDiscoveryServerService()
- .mergeAvailabilityReport(report);
+ boolean ok = configuration.getServerServices().getDiscoveryServerService().mergeAvailabilityReport(
+ report);
if (!ok) {
// I guess I could immediately call executeAvailabilityScanImmediately and pass its results to
// mergeAvailabilityReport again right now, but what happens if we've queued up a bunch of
@@ -959,7 +964,8 @@ public class InventoryManager extends AgentService implements ContainerService,
if ((this.platform != null) && (this.platform.getInventoryStatus() == InventoryStatus.NEW)
&& newPlatformWasDeletedRecently) {
// let's make sure we are registered; its probable that our platform was deleted and we need to re-register
- log.info("The inventory report was invalid probably because the platform/Agent was deleted; let's re-register...");
+ log
+ .info("The inventory report was invalid probably because the platform/Agent was deleted; let's re-register...");
registerWithServer();
newPlatformWasDeletedRecently = false; // we've tried to recover from our platform being deleted, let's not do it again
}
@@ -1155,8 +1161,8 @@ public class InventoryManager extends AgentService implements ContainerService,
parent.removeChildResource(resource);
}
- PluginContainer.getInstance().getMeasurementManager()
- .unscheduleCollection(Collections.singleton(resource.getId()));
+ PluginContainer.getInstance().getMeasurementManager().unscheduleCollection(
+ Collections.singleton(resource.getId()));
if (this.resourceContainers.remove(resource.getUuid()) == null) {
if (log.isDebugEnabled()) {
@@ -1261,8 +1267,8 @@ public class InventoryManager extends AgentService implements ContainerService,
logMessage.append("description, ");
}
- logMessage.replace(logMessage.length() - 1, logMessage.length(), "to become [")
- .append(existingResource.toString()).append("]");
+ logMessage.replace(logMessage.length() - 1, logMessage.length(), "to become [").append(
+ existingResource.toString()).append("]");
log.info(logMessage.toString());
} else {
@@ -1493,8 +1499,8 @@ public class InventoryManager extends AgentService implements ContainerService,
log.warn("Cannot give activated resource its discovery component. Cause: " + e);
}
- ConfigurationUtility.normalizeConfiguration(resource.getPluginConfiguration(),
- type.getPluginConfigurationDefinition());
+ ConfigurationUtility.normalizeConfiguration(resource.getPluginConfiguration(), type
+ .getPluginConfigurationDefinition());
ResourceComponent parentComponent = null;
if (resource.getParentResource() != null) {
@@ -1861,7 +1867,8 @@ public class InventoryManager extends AgentService implements ContainerService,
}
} else {
// This is very strange - there are no platform types - we should never be missing the built-in platform plugin.
- log.error("Missing platform plugin(s) - falling back to dummy platform impl; this should only occur in tests!");
+ log
+ .error("Missing platform plugin(s) - falling back to dummy platform impl; this should only occur in tests!");
// TODO: Set sysprop (e.g. rhq.test.mode=true) in integration tests,
// and throw a runtime exception here if that sysprop is not set.
return getTestPlatform();
@@ -2181,8 +2188,8 @@ public class InventoryManager extends AgentService implements ContainerService,
try {
ResourceDiscoveryContext context = new ResourceDiscoveryContext(resourceType, parentComponent,
parentResourceContext, SystemInfoFactory.createSystemInfo(), processScanResults,
- Collections.EMPTY_LIST, this.configuration.getContainerName(),
- this.configuration.getPluginContainerDeployment());
+ Collections.EMPTY_LIST, this.configuration.getContainerName(), this.configuration
+ .getPluginContainerDeployment());
newResources = new HashSet<Resource>();
try {
Set<DiscoveredResourceDetails> discoveredResources = invokeDiscoveryComponent(parentContainer,
@@ -2202,14 +2209,15 @@ public class InventoryManager extends AgentService implements ContainerService,
+ discoveredResource.getResourceType().getName() + " but should have been "
+ resourceType.getName());
}
- if (null != pluginConfigObjects
- .put(discoveredResource.getPluginConfiguration(), discoveredResource)) {
- throw new IllegalStateException("The plugin component "
- + discoveryComponent.getClass().getName()
- + " returned multiple resources that point to the same plugin configuration object on the "
- + "resource type [" + resourceType + "]. This is not allowed, please use "
- + "ResoureDiscoveryContext.getDefaultPluginConfiguration() "
- + "for each discovered resource.");
+ if (null != pluginConfigObjects.put(discoveredResource.getPluginConfiguration(),
+ discoveredResource)) {
+ throw new IllegalStateException(
+ "The plugin component "
+ + discoveryComponent.getClass().getName()
+ + " returned multiple resources that point to the same plugin configuration object on the "
+ + "resource type [" + resourceType + "]. This is not allowed, please use "
+ + "ResoureDiscoveryContext.getDefaultPluginConfiguration() "
+ + "for each discovered resource.");
}
Resource newResource = InventoryManager.createNewResource(discoveredResource);
newResources.add(newResource);
@@ -2220,7 +2228,7 @@ public class InventoryManager extends AgentService implements ContainerService,
//but we can continue the discovery in the child resource types of the existing resources.
//we can therefore pretend that the discovery returned the existing resources so that
//we can recurse into their children up in the call-chain.
- for(Resource existingResource : parentResource.getChildResources()) {
+ for (Resource existingResource : parentResource.getChildResources()) {
if (resourceType.equals(existingResource.getResourceType())) {
newResources.add(existingResource);
}
@@ -2421,8 +2429,8 @@ public class InventoryManager extends AgentService implements ContainerService,
if (log.isDebugEnabled()) {
log.debug("Merging [" + modifiedResourceIds.size() + "] modified Resources into local inventory...");
}
- Set<Resource> modifiedResources = configuration.getServerServices().getDiscoveryServerService()
- .getResources(modifiedResourceIds, false);
+ Set<Resource> modifiedResources = configuration.getServerServices().getDiscoveryServerService().getResources(
+ modifiedResourceIds, false);
syncSchedules(modifiedResources); // RHQ-792, mtime is the indicator that schedules should be sync'ed too
for (Resource modifiedResource : modifiedResources) {
mergeResource(modifiedResource);
@@ -2683,12 +2691,14 @@ public class InventoryManager extends AgentService implements ContainerService,
+ "] wasn't started while upgrading.";
if (resource.getChildResources().isEmpty()) {
- log.info(message
- + " If this is the first time the plugin container starts up and has completely empty inventory, you can ignore this message.");
+ log
+ .info(message
+ + " If this is the first time the plugin container starts up and has completely empty inventory, you can ignore this message.");
} else {
- log.error(message
- + " This can potentially cause the discovery to find resources logically equivalent to already "
- + "existing resources if the corresponding plugins support upgrade for that particular resource type.");
+ log
+ .error(message
+ + " This can potentially cause the discovery to find resources logically equivalent to already "
+ + "existing resources if the corresponding plugins support upgrade for that particular resource type.");
}
}
} else {
commit 619a4932fbe348057905cff266f70fe1de476e77
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Oct 29 16:08:27 2010 -0400
The assembly plugin now requires a non-empty <id>someId</id> element in
the assembly XML. But that value will, by default, be tacked on to the
final artifact name. In general we don't want that to happen because we
already specifiy <finalName> in the pom config. So, in the root pom change
the default to avoid tacking on the <id> value.
diff --git a/etc/samples/provisioning/sample-bundle/pom.xml b/etc/samples/provisioning/sample-bundle/pom.xml
index 6bd4a88..697b6c4 100644
--- a/etc/samples/provisioning/sample-bundle/pom.xml
+++ b/etc/samples/provisioning/sample-bundle/pom.xml
@@ -73,6 +73,7 @@
<descriptor>src/main/scripts/assembly.xml</descriptor>
</descriptors>
<finalName>${project.build.finalName}</finalName>
+ <appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
<execution>
diff --git a/pom.xml b/pom.xml
index 06be211..82f2458 100644
--- a/pom.xml
+++ b/pom.xml
@@ -792,6 +792,13 @@
</configuration>
</plugin>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ </configuration>
+ </plugin>
+
</plugins>
</build>
commit ad1e25d6f625101ee196cb2aafaede67440d8315
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 29 11:38:25 2010 -0400
clear up a bunch of mvn 3.0 warnings
diff --git a/pom.xml b/pom.xml
index aa3c441..06be211 100644
--- a/pom.xml
+++ b/pom.xml
@@ -252,13 +252,6 @@
</dependency>
<dependency>
- <groupId>org.jboss.jbossws</groupId>
- <artifactId>jbossws-native-dist</artifactId>
- <version>${jbossws-native-dist.version}</version>
- <type>zip</type>
- </dependency>
-
- <dependency>
<groupId>org.jboss.transaction</groupId>
<artifactId>jboss-jta</artifactId>
<version>${jboss-jta.version}</version>
@@ -1112,11 +1105,14 @@
<reporting>
<plugins>
+
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
+ <version>2.2</version>
<inherited>true</inherited>
</plugin>
+
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
@@ -1129,14 +1125,17 @@
</configuration>
<inherited>true</inherited>
</plugin>
+
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jdepend-maven-plugin</artifactId>
+ <version>2.0-beta-2</version>
</plugin>
<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.7</version>
<configuration>
<aggregate>true</aggregate>
<additionalJOption>-J-Xmx768m</additionalJOption>
@@ -1146,6 +1145,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
+ <version>2.6</version>
</plugin>
<!--
<plugin>
@@ -1159,6 +1159,7 @@
<!-- must be last plugin in the list -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>dashboard-maven-plugin</artifactId>
+ <version>1.0.0-beta-1</version>
</plugin>
</plugins>
</reporting>
commit 669e236c9c60e94e4f52c6597bb103188d4a4921
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 29 10:49:00 2010 -0400
downgrade Maven exec plugin from v1.2 to v1.1, since v1.2 appears to not work correctly
diff --git a/pom.xml b/pom.xml
index 5270296..aa3c441 100644
--- a/pom.xml
+++ b/pom.xml
@@ -575,8 +575,10 @@
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
- <artifactId>exec-maven-plugin</artifactId>
- <version>1.2</version>
+ <artifactId>exec-maven-plugin</artifactId>
+ <!-- NOTE: Version 1.2 of this plugin appears to be broken, so do not
+ upgrade to that version. -->
+ <version>1.1</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
commit 503d56b32b819e099a451c1d26298760ec021330
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 29 10:40:54 2010 -0400
looks like mvn requires a non-empty <id> field now in assembly.xml files
diff --git a/etc/samples/provisioning/sample-bundle/src/main/scripts/assembly.xml b/etc/samples/provisioning/sample-bundle/src/main/scripts/assembly.xml
index 942e5f9..f778b20 100644
--- a/etc/samples/provisioning/sample-bundle/src/main/scripts/assembly.xml
+++ b/etc/samples/provisioning/sample-bundle/src/main/scripts/assembly.xml
@@ -5,7 +5,7 @@
<assembly>
<!-- The id gets appended to the end of the zipfile name unless
it's an empty string, so make it an empty string. -->
- <id></id>
+ <id>sample-bundle</id>
<formats>
<format>zip</format>
</formats>
diff --git a/modules/enterprise/remoting/cli/src/main/scripts/rhq-client.assembly.xml b/modules/enterprise/remoting/cli/src/main/scripts/rhq-client.assembly.xml
index 5407e4d..eedf6ae 100644
--- a/modules/enterprise/remoting/cli/src/main/scripts/rhq-client.assembly.xml
+++ b/modules/enterprise/remoting/cli/src/main/scripts/rhq-client.assembly.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<assembly>
- <id></id>
+ <id>rhq-client</id>
<formats>
<format>zip</format>
</formats>
diff --git a/modules/enterprise/server/container/src/main/scripts/rhq-container.assembly.xml b/modules/enterprise/server/container/src/main/scripts/rhq-container.assembly.xml
index 82c7e1e..a6dbf98 100644
--- a/modules/enterprise/server/container/src/main/scripts/rhq-container.assembly.xml
+++ b/modules/enterprise/server/container/src/main/scripts/rhq-container.assembly.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<assembly>
- <id></id>
+ <id>rhq-container</id>
<formats>
<format>zip</format>
</formats>
diff --git a/modules/jopr/dist/agent/src/main/scripts/jopr-agent.assembly.xml b/modules/jopr/dist/agent/src/main/scripts/jopr-agent.assembly.xml
index 36242d2..a77b0f9 100644
--- a/modules/jopr/dist/agent/src/main/scripts/jopr-agent.assembly.xml
+++ b/modules/jopr/dist/agent/src/main/scripts/jopr-agent.assembly.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<assembly>
- <id></id>
+ <id>jopr-agent</id>
<formats>
<format>zip</format>
</formats>
diff --git a/modules/jopr/dist/server/src/main/scripts/jopr-server.assembly.xml b/modules/jopr/dist/server/src/main/scripts/jopr-server.assembly.xml
index 8fb4063..d6d0506 100644
--- a/modules/jopr/dist/server/src/main/scripts/jopr-server.assembly.xml
+++ b/modules/jopr/dist/server/src/main/scripts/jopr-server.assembly.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<assembly>
- <id></id>
+ <id>jopr-server</id>
<formats>
<format>zip</format>
</formats>
commit c58abc18d85bf56f89bd01043c26216ad56fa66a
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Oct 29 10:32:59 2010 -0400
looks like mvn requires a non-empty <id> field now.
diff --git a/modules/common/ant-bundle/src/main/scripts/assembly.xml b/modules/common/ant-bundle/src/main/scripts/assembly.xml
index cc7871a..d7c9af7 100644
--- a/modules/common/ant-bundle/src/main/scripts/assembly.xml
+++ b/modules/common/ant-bundle/src/main/scripts/assembly.xml
@@ -4,7 +4,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
- <id></id>
+ <id>ant bundle</id>
<formats>
<format>zip</format>
</formats>
commit 5001f4690dab865ff9f796064000770b7015798f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 29 00:20:03 2010 -0400
upgrade all Maven plugins to latest versions
diff --git a/pom.xml b/pom.xml
index 7538bae..5270296 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
<commons-logging.version>1.1.0.jboss</commons-logging.version>
<concurrent.version>1.3.4-jboss-update1</concurrent.version> <!-- oswego-concurrent compatible with 4.2.3.GA -->
- <findbugs.version>2.3</findbugs.version>
+ <findbugs.version>2.3.1</findbugs.version>
<getopt.version>1.0.13</getopt.version>
<hibernate3.version>3.2.r14201-2</hibernate3.version>
<hibernate-annotations.version>3.2.1.GA</hibernate-annotations.version>
@@ -478,7 +478,7 @@
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
- <version>2.2-beta-5</version>
+ <version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
@@ -486,7 +486,7 @@
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
- <version>2.3.1</version>
+ <version>2.3.2</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
@@ -498,7 +498,7 @@
</plugin>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
- <version>2.4</version>
+ <version>2.4.2</version>
</plugin>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
@@ -506,7 +506,7 @@
</plugin>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
- <version>2.2</version>
+ <version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-idea-plugin</artifactId>
@@ -514,19 +514,19 @@
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
- <version>2.3</version>
+ <version>2.3.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
- <version>2.3</version>
+ <version>2.3.1</version>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
- <version>2.6.1</version>
+ <version>2.7</version>
</plugin>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
- <version>2.5.1</version>
+ <version>2.6</version>
</plugin>
<plugin>
<artifactId>maven-rar-plugin</artifactId>
@@ -534,39 +534,39 @@
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
- <version>2.0</version>
+ <version>2.1</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
- <version>2.4.2</version>
+ <version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-scm-plugin</artifactId>
- <version>1.3</version>
+ <version>1.4</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
- <version>2.0.1</version>
+ <version>2.1.1</version>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
- <version>2.1.1</version>
+ <version>2.1.2</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
- <version>2.5</version>
+ <version>2.6</version>
<configuration>
<argLine>-Xms16M -Xmx256M</argLine>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
- <version>2.1-beta-1</version>
+ <version>2.1</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
- <version>1.4</version>
+ <version>1.5</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
@@ -576,7 +576,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
- <version>1.1</version>
+ <version>1.2</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
commit 88a5f718f5e677e83e2c640d89d40fbac83b5f75
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Oct 29 00:10:08 2010 -0400
change initial heap size from 128M to 64M for compiler plugin
diff --git a/pom.xml b/pom.xml
index f95c754..7538bae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -629,7 +629,7 @@
<configuration>
<!-- invocation options -->
<fork>true</fork>
- <meminitial>128M</meminitial>
+ <meminitial>64M</meminitial>
<maxmem>512M</maxmem>
<!-- compiler options -->
commit f637fd4e1ad7bd66228164727b8666f602317bd0
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Oct 28 23:18:27 2010 -0400
add JBOSS_HOME/lib/jboss-reflect.jar to list of client jars added to instance/connection classloader, since it's needed by some Profile Service calls (used by MetaValueFactorys to unwrap certain managed property values)
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
index 1eb9df6..3bf3b09 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
@@ -109,6 +109,7 @@ public class ApplicationServerDiscoveryComponent implements ResourceDiscoveryCom
"%libUrl%/jboss-managed.jar", //
"%libUrl%/jboss-metatype.jar", //
"%libUrl%/jboss-dependency.jar", //
+ "%libUrl%/jboss-reflect.jar", //
// AS 6.0 M1 and later
"%libUrl%/jboss-classpool.jar", //
"%libUrl%/jboss-classpool-scoped.jar", //
@@ -136,9 +137,6 @@ public class ApplicationServerDiscoveryComponent implements ResourceDiscoveryCom
public DiscoveredResourceDetails discoverResource(Configuration pluginConfig,
ResourceDiscoveryContext discoveryContext) throws InvalidPluginConfigurationException {
- // Set default values on any props that are not set.
- //setPluginConfigurationDefaults(pluginConfiguration);
-
ProcessInfo processInfo = null;
String jbossHomeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR)
.getStringValue();
@@ -296,9 +294,6 @@ public class ApplicationServerDiscoveryComponent implements ResourceDiscoveryCom
initLogEventSourcesConfigProp(configDir, pluginConfiguration);
- // TODO: Init props that have static defaults.
- //setPluginConfigurationDefaults(pluginConfiguration);
-
DiscoveredResourceDetails resourceDetails = createResourceDetails(discoveryContext, pluginConfiguration,
processInfo, installInfo);
resources.add(resourceDetails);
commit 73bff1bdd0a1ea3c5efca7af2f6b886c235d53a9
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Oct 28 18:58:38 2010 -0400
implement Metric Templates view and hook into the new Resource Types view; still need to add the "Update Existing Resources" checkbox
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 d7c2180..43d51a2 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
@@ -47,7 +47,6 @@ 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.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.TypesLoadedCallback;
@@ -221,13 +220,11 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
});
}
- private void editMetricTemplate(int resourceTypeId) {
- // TODO: convert this to GWT
+ private void editMetricTemplate(int resourceTypeId) {
Layout metricCanvas = getMetricTemplateCanvas();
- FullHTMLPane jspPage = new FullHTMLPane(extendLocatorId("MetricTemplate"),
- "/admin/platform/monitor/Config.do?nomenu=true&mode=configure&id="
- + resourceTypeId + "&type=" + resourceTypeId);
- prepareSubCanvas(metricCanvas, jspPage, true);
+ TemplateSchedulesView templateSchedulesView = new TemplateSchedulesView(extendLocatorId("MetricTemplate"),
+ resourceTypeId);
+ prepareSubCanvas(metricCanvas, templateSchedulesView, true);
switchToCanvas(ResourceTypeTreeView.this, metricCanvas);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java
new file mode 100644
index 0000000..bad1853
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java
@@ -0,0 +1,160 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.admin.templates;
+
+import java.util.List;
+
+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.DataSourceField;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
+import org.rhq.core.domain.measurement.composite.MeasurementScheduleComposite;
+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.MeasurementDataGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleCompositeDataSource;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleListView;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+
+/**
+ * A DataSource for reading and updating the default metric schedules for a particular ResourceType.
+ *
+ * @author Ian Springer
+ */
+public class TemplateSchedulesDataSource extends AbstractMeasurementScheduleCompositeDataSource {
+ private MeasurementDataGWTServiceAsync measurementService = GWTServiceLookup.getMeasurementDataService();
+ private int resourceTypeId;
+
+ public TemplateSchedulesDataSource(int resourceTypeId) {
+ this.resourceTypeId = resourceTypeId;
+ }
+
+ @Override
+ protected List<DataSourceField> addDataSourceFields() {
+ List<DataSourceField> fields = super.addDataSourceFields();
+
+ DataSourceField resourceGroupIdField = new DataSourceIntegerField(
+ MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID, "Resource Type Id");
+ resourceGroupIdField.setHidden(true);
+ fields.add(resourceGroupIdField);
+
+ return fields;
+ }
+
+ @Override
+ protected void executeFetch(DSRequest request, DSResponse response) {
+ super.executeFetch(request, response);
+
+ }
+
+ @Override
+ protected EntityContext getEntityContext(DSRequest request) {
+ Criteria requestCriteria = request.getCriteria();
+ Integer typeId = requestCriteria.getAttributeAsInt(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID);
+ return EntityContext.forTemplate(typeId);
+ }
+
+ @Override
+ public ListGridRecord copyValues(MeasurementScheduleComposite from) {
+ ListGridRecord record = super.copyValues(from);
+ record.setAttribute(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID, this.resourceTypeId);
+ return record;
+ }
+
+ @Override
+ protected void enableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
+ final int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
+ final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
+ this.measurementService.enableMeasurementTemplates(measurementDefinitionIds,
+ new AsyncCallback<Void>() {
+ @Override
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to enable collection of metric" + s + " " + measurementDefinitionDisplayNames
+ + " by default for ResourceType with id [" + resourceTypeId + "].", throwable);
+ }
+
+ @Override
+ public void onSuccess(Void aVoid) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Enabled collection of selected metric" + s + ".", "Enabled collection of metric"
+ + s + " " + measurementDefinitionDisplayNames + " by default for ResourceType with id ["
+ + resourceTypeId + "].", Message.Severity.Info));
+ measurementScheduleListView.refresh();
+ }
+ });
+ }
+
+ @Override
+ protected void disableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
+ int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
+ final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
+ this.measurementService.disableSchedulesForCompatibleGroup(this.resourceTypeId, measurementDefinitionIds,
+ new AsyncCallback<Void>() {
+ @Override
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to disable collection of metric" + s + " " + measurementDefinitionDisplayNames
+ + " by default for ResourceType with id [" + resourceTypeId + "].", throwable);
+ }
+
+ @Override
+ public void onSuccess(Void aVoid) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Disabled collection of selected metric" + s + ".", "Disabled collection of metric"
+ + s + " " + measurementDefinitionDisplayNames + " by default for ResourceType with id ["
+ + resourceTypeId + "].", Message.Severity.Info));
+ measurementScheduleListView.refresh();
+ }
+ });
+ }
+
+ @Override
+ protected void updateSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
+ int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames,
+ final long collectionInterval) {
+ final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
+ this.measurementService.updateMeasurementTemplates(measurementDefinitionIds, collectionInterval,
+ new AsyncCallback<Void>() {
+ @Override
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to set collection interval to " + (collectionInterval / 1000) + " seconds for metric"
+ + s + " " + measurementDefinitionDisplayNames + " by default for ResourceType with id ["
+ + resourceTypeId + "].", throwable);
+ }
+
+ @Override
+ public void onSuccess(Void aVoid) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Updated collection intervals of selected metric" + s + ".",
+ "Collection interval for metric" + s + " " + measurementDefinitionDisplayNames
+ + " by default for ResourceType with id [" + resourceTypeId + "] set to "
+ + (collectionInterval / 1000) + " seconds.", Message.Severity.Info));
+ measurementScheduleListView.refresh();
+ }
+ });
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
new file mode 100644
index 0000000..648ae40
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
@@ -0,0 +1,46 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.admin.templates;
+
+import com.smartgwt.client.data.Criteria;
+
+import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleListView;
+
+/**
+ * A view for viewing and updating the default metric schedules ("metric templates") for a particular ResourceType.
+ *
+ * @author Ian Springer
+ */
+public class TemplateSchedulesView extends AbstractMeasurementScheduleListView {
+ private static final String TITLE = "Template Metric Collection Schedules";
+
+ private static final String[] EXCLUDED_FIELD_NAMES = new String[] { MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID };
+
+ public TemplateSchedulesView(String locatorId, int resourceTypeId) {
+ super(locatorId, TITLE, new TemplateSchedulesDataSource(resourceTypeId), createCriteria(resourceTypeId),
+ EXCLUDED_FIELD_NAMES);
+ }
+
+ private static Criteria createCriteria(int resourceTypeId) {
+ Criteria criteria = new Criteria();
+ criteria.addCriteria(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID, resourceTypeId);
+ return criteria;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java
index c6c44d8..ea64488 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java
@@ -80,6 +80,12 @@ public interface MeasurementDataGWTService extends RemoteService {
void updateSchedulesForCompatibleGroup(int resourceGroupId, int[] measurementDefinitionIds, long collectionInterval);
+ void enableMeasurementTemplates(int[] measurementDefinitionIds);
+
+ void disableMeasurementTemplates(int[] measurementDefinitionIds);
+
+ void updateMeasurementTemplates(int[] measurementDefinitionIds, long collectionInterval);
+
PageList<MeasurementDataTrait> findTraitsByCriteria(MeasurementDataTraitCriteria criteria);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java
index 1f7da77..cac8051 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java
@@ -20,10 +20,8 @@ package org.rhq.enterprise.gui.coregui.client.inventory.common;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
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.DataSourceField;
@@ -116,31 +114,7 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends
});
}
- protected EntityContext getEntityContext(DSRequest request) {
- EntityContext entityContext = null;
-
- Criteria requestCriteria = request.getCriteria();
- if (requestCriteria != null) {
- Map values = requestCriteria.getValues();
- for (Object key : values.keySet()) {
- String fieldName = (String) key;
- if (fieldName.equals(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_ID)) {
- Integer resourceId = (Integer) values.get(fieldName);
- entityContext = EntityContext.forResource(resourceId);
- } else if (fieldName.equals(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_GROUP_ID)) {
- Integer groupId = (Integer) values.get(fieldName);
- entityContext = EntityContext.forGroup(groupId);
- }
- // TODO: Add support for other fields we need to filter by (e.g. resourceTypeId for metric templates).
- }
- }
-
- if (entityContext == null) {
- throw new IllegalStateException("No support criteria fields were found.");
- }
-
- return entityContext;
- }
+ protected abstract EntityContext getEntityContext(DSRequest request);
@Override
public MeasurementScheduleComposite copyValues(ListGridRecord from) {
@@ -161,8 +135,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends
record.setAttribute(MeasurementScheduleCriteria.SORT_FIELD_ENABLED, from.getCollectionEnabled());
record.setAttribute(MeasurementScheduleCriteria.SORT_FIELD_INTERVAL, from.getCollectionInterval());
- // TODO: resourceId and resourceGroupId (in subclasses)
-
return record;
}
@@ -170,7 +142,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends
int[] ids = getMeasurementDefinitionIds(measurementScheduleListView);
List<String> displayNames = getMeasurementDefinitionDisplayNames(measurementScheduleListView);
enableSchedules(measurementScheduleListView, ids, displayNames);
- measurementScheduleListView.refresh();
}
protected abstract void enableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
@@ -180,7 +151,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends
int[] ids = getMeasurementDefinitionIds(measurementScheduleListView);
List<String> displayNames = getMeasurementDefinitionDisplayNames(measurementScheduleListView);
disableSchedules(measurementScheduleListView, ids, displayNames);
- measurementScheduleListView.refresh();
}
protected abstract void disableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
@@ -190,7 +160,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends
int[] ids = getMeasurementDefinitionIds(measurementScheduleListView);
List<String> displayNames = getMeasurementDefinitionDisplayNames(measurementScheduleListView);
updateSchedules(measurementScheduleListView, ids, displayNames, interval);
- measurementScheduleListView.refresh();
}
private int[] getMeasurementDefinitionIds(AbstractMeasurementScheduleListView measurementScheduleListView) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java
index 79a9b2a..0ba35d0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java
@@ -84,7 +84,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
}
@Override
- protected void enableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
+ protected void enableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
final int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
this.measurementService.enableSchedulesForCompatibleGroup(this.resourceGroupId, measurementDefinitionIds,
@@ -102,13 +102,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
new Message("Enabled collection of selected metric" + s + ".", "Enabled collection of metric"
+ s + " " + measurementDefinitionDisplayNames + " for Resource group with id ["
+ resourceGroupId + "].", Message.Severity.Info));
-
+ measurementScheduleListView.refresh();
}
});
}
@Override
- protected void disableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
+ protected void disableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
this.measurementService.disableSchedulesForCompatibleGroup(this.resourceGroupId, measurementDefinitionIds,
@@ -126,13 +126,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
new Message("Disabled collection of selected metric" + s + ".", "Disabled collection of metric"
+ s + " " + measurementDefinitionDisplayNames + " for Resource group with id ["
+ resourceGroupId + "].", Message.Severity.Info));
-
+ measurementScheduleListView.refresh();
}
});
}
@Override
- protected void updateSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
+ protected void updateSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames,
final long collectionInterval) {
final String s = (measurementDefinitionIds.length > 1) ? "s" : "";
@@ -153,7 +153,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
"Collection interval for metric" + s + " " + measurementDefinitionDisplayNames
+ " for Resource group with id [" + resourceGroupId + "] set to "
+ (collectionInterval / 1000) + " seconds.", Message.Severity.Info));
-
+ measurementScheduleListView.refresh();
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java
index ac7c8dd..7d631ba 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java
@@ -77,7 +77,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
}
@Override
- protected void enableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
+ protected void enableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
this.measurementService.enableSchedulesForResource(this.resourceId, measurementDefinitionIds,
new AsyncCallback<Void>() {
@@ -93,13 +93,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
CoreGUI.getMessageCenter().notify(
new Message("Enabled collection of metrics " + measurementDefinitionDisplayNames
+ " for Resource with id [" + resourceId + "].", Message.Severity.Info));
-
+ measurementScheduleListView.refresh();
}
});
}
@Override
- protected void disableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
+ protected void disableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) {
this.measurementService.disableSchedulesForResource(this.resourceId, measurementDefinitionIds,
new AsyncCallback<Void>() {
@@ -115,13 +115,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
CoreGUI.getMessageCenter().notify(
new Message("Disabled collection of metrics " + measurementDefinitionDisplayNames
+ " for Resource with id [" + resourceId + "].", Message.Severity.Info));
-
+ measurementScheduleListView.refresh();
}
});
}
@Override
- protected void updateSchedules(AbstractMeasurementScheduleListView measurementScheduleListView,
+ protected void updateSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView,
int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames,
final long collectionInterval) {
this.measurementService.updateSchedulesForResource(this.resourceId, measurementDefinitionIds,
@@ -140,7 +140,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat
new Message("Collection interval for metrics " + measurementDefinitionDisplayNames
+ " for Resource with id [" + resourceId + "] set to " + (collectionInterval / 1000)
+ " seconds.", Message.Severity.Info));
-
+ measurementScheduleListView.refresh();
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java
index 8f5c9be..9073af2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java
@@ -199,6 +199,30 @@ public class MeasurementDataGWTServiceImpl extends AbstractGWTServiceImpl implem
}
}
+ public void enableMeasurementTemplates(int[] measurementDefinitionIds) {
+ try {
+ scheduleManager.enableMeasurementTemplates(getSessionSubject(), measurementDefinitionIds);
+ } catch (RuntimeException e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ public void disableMeasurementTemplates(int[] measurementDefinitionIds) {
+ try {
+ scheduleManager.disableMeasurementTemplates(getSessionSubject(), measurementDefinitionIds);
+ } catch (RuntimeException e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
+ public void updateMeasurementTemplates(int[] measurementDefinitionIds, long collectionInterval) {
+ try {
+ scheduleManager.updateMeasurementTemplates(getSessionSubject(), measurementDefinitionIds, collectionInterval);
+ } catch (RuntimeException e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public PageList<MeasurementDataTrait> findTraitsByCriteria(MeasurementDataTraitCriteria criteria) {
try {
return SerialUtility.prepare(dataManager.findTraitsByCriteria(getSessionSubject(), criteria),
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
index 4053a25..ccd65bc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.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
@@ -53,6 +53,7 @@ import org.rhq.core.db.SQLServerDatabaseType;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.criteria.MeasurementDefinitionCriteria;
import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.measurement.DataType;
@@ -173,7 +174,7 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage
/**
* Return a list of MeasurementSchedules for the given ids
*
- * @param ids PrimaryKeys of the schedules searched
+ * @param scheduleIds PrimaryKeys of the schedules searched
*
* @return a list of Schedules
*/
@@ -1179,92 +1180,117 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage
pc.addDefaultOrderingField("definition.displayName");
// check authorization up front, so that criteria-based queries can run without authz checks
- if (context.type == EntityContext.Type.Resource) {
- if (authorizationManager.canViewResource(subject, context.resourceId) == false) {
- throw new PermissionException("User [" + subject.getName()
- + "] does not have permission to view measurement schedules for resource[id=" + context.resourceId
- + "]");
- }
- } else if (context.type == EntityContext.Type.ResourceGroup) {
- if (authorizationManager.canViewGroup(subject, context.groupId) == false) {
- throw new PermissionException("User [" + subject.getName()
- + "] does not have permission to view measurement schedules for resourceGroup[id="
- + context.groupId + "]");
- }
- } else if (context.type == EntityContext.Type.AutoGroup) {
- if (authorizationManager.canViewAutoGroup(subject, context.parentResourceId, context.resourceTypeId) == false) {
- throw new PermissionException("User [" + subject.getName()
- + "] does not have permission to view measurement schedules for autoGroup[parentResourceId="
- + context.parentResourceId + ", resourceTypeId=" + context.resourceTypeId + "]");
- }
- }
-
- // general criteria setup
- MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria();
- //criteria.addFilterDefinitionIds(measurementDefinitionIds);
- if (context.type == EntityContext.Type.Resource) {
- criteria.addFilterResourceId(context.resourceId);
- } else if (context.type == EntityContext.Type.ResourceGroup) {
- criteria.addFilterResourceGroupId(context.groupId);
- } else if (context.type == EntityContext.Type.AutoGroup) {
- criteria.addFilterAutoGroupParentResourceId(context.parentResourceId);
- criteria.addFilterAutoGroupResourceTypeId(context.resourceTypeId);
+ switch (context.type) {
+ case Resource:
+ if (authorizationManager.canViewResource(subject, context.resourceId) == false) {
+ throw new PermissionException("User [" + subject.getName()
+ + "] does not have permission to view measurement schedules for resource[id=" +
+ context.resourceId
+ + "]");
+ }
+ break;
+ case ResourceGroup:
+ if (authorizationManager.canViewGroup(subject, context.groupId) == false) {
+ throw new PermissionException("User [" + subject.getName()
+ + "] does not have permission to view measurement schedules for resourceGroup[id="
+ + context.groupId + "]");
+ }
+ break;
+ case AutoGroup:
+ if (authorizationManager.canViewAutoGroup(subject, context.parentResourceId, context.resourceTypeId) ==
+ false) {
+ throw new PermissionException("User [" + subject.getName()
+ + "] does not have permission to view measurement schedules for autoGroup[parentResourceId="
+ + context.parentResourceId + ", resourceTypeId=" + context.resourceTypeId + "]");
+ }
+ break;
}
- criteria.setPageControl(pc); // for primary return list, use passed PageControl
- // get the core definitions
- CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
- ;
- generator.alterProjection(" distinct measurementschedule.definition ");
- CriteriaQueryRunner<MeasurementDefinition> queryRunner = new CriteriaQueryRunner(criteria, generator,
- entityManager);
- PageList<MeasurementDefinition> definitions = queryRunner.execute();
-
- // reset paging -- remove ordering, add group by
- criteria.setPageControl(PageControl.getUnlimitedInstance());
- generator.setGroupByClause(" measurementschedule.definition.id ");
-
- // get the interval results
- generator.alterProjection("" //
- + " measurementschedule.definition.id, " //
- + " min(measurementschedule.interval), " //
- + " max(measurementschedule.interval) ");
- Query query = generator.getQuery(entityManager);
- List<Object[]> definitionIntervalResults = query.getResultList();
-
- // get the enabled results
- criteria.addFilterEnabled(true);
- generator.alterProjection(" measurementschedule.definition.id, count(measurementschedule.id) ");
- query = generator.getQuery(entityManager);
- List<Object[]> definitionEnabledResults = query.getResultList();
-
- // generate intermediate maps
+ PageList<MeasurementDefinition> definitions;
Map<Integer, Long> definitionIntervalMap = new HashMap<Integer, Long>();
- for (Object[] nextInterval : definitionIntervalResults) {
- int definitionId = (Integer) nextInterval[0];
- long minInterval = (Long) nextInterval[1];
- long maxInterval = (Long) nextInterval[2];
-
- long interval = (minInterval != maxInterval) ? 0 : minInterval;
- definitionIntervalMap.put(definitionId, interval);
- }
- int size = getResourceCount(context);
Map<Integer, Boolean> definitionEnabledMap = new HashMap<Integer, Boolean>();
- for (Object[] nextEnabled : definitionEnabledResults) {
- int definitionId = (Integer) nextEnabled[0];
- long enabledCount = (Long) nextEnabled[1];
-
- Boolean enabled = null;
- if (enabledCount == size) {
- enabled = true;
- } else if (enabledCount == 0) {
- enabled = false;
+ if (context.type == EntityContext.Type.ResourceTemplate) {
+ MeasurementDefinitionCriteria criteria = new MeasurementDefinitionCriteria();
+ criteria.addFilterResourceTypeId(context.resourceTypeId);
+
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
+ CriteriaQueryRunner<MeasurementDefinition> queryRunner = new CriteriaQueryRunner(criteria, generator,
+ entityManager);
+ definitions = queryRunner.execute();
+ for (MeasurementDefinition definition : definitions) {
+ definitionIntervalMap.put(definition.getId(), definition.getDefaultInterval());
+ definitionEnabledMap.put(definition.getId(), definition.isDefaultOn());
}
+ } else {
+ // Do general criteria setup.
+ MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria();
+ //criteria.addFilterDefinitionIds(measurementDefinitionIds);
+ switch (context.type) {
+ case Resource:
+ criteria.addFilterResourceId(context.resourceId);
+ break;
+ case ResourceGroup:
+ criteria.addFilterResourceGroupId(context.groupId);
+ break;
+ case AutoGroup:
+ criteria.addFilterAutoGroupParentResourceId(context.parentResourceId);
+ criteria.addFilterAutoGroupResourceTypeId(context.resourceTypeId);
+ break;
+ }
+ criteria.setPageControl(pc); // for primary return list, use passed PageControl
+
+ // Get the core definitions.
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
+
+ generator.alterProjection(" distinct measurementschedule.definition ");
+ CriteriaQueryRunner<MeasurementDefinition> queryRunner = new CriteriaQueryRunner(criteria, generator,
+ entityManager);
+ definitions = queryRunner.execute();
+
+ // Reset paging -- remove ordering, add group by.
+ criteria.setPageControl(PageControl.getUnlimitedInstance());
+ generator.setGroupByClause(" measurementschedule.definition.id ");
+
+ // Get the interval results.
+ generator.alterProjection("" //
+ + " measurementschedule.definition.id, " //
+ + " min(measurementschedule.interval), " //
+ + " max(measurementschedule.interval) ");
+ Query query = generator.getQuery(entityManager);
+ List<Object[]> definitionIntervalResults = query.getResultList();
+
+ // Get the enabled results.
+ criteria.addFilterEnabled(true);
+ generator.alterProjection(" measurementschedule.definition.id, count(measurementschedule.id) ");
+ query = generator.getQuery(entityManager);
+ List<Object[]> definitionEnabledResults = query.getResultList();
+
+ // Generate intermediate maps for intervals and enabled values.
+ for (Object[] nextInterval : definitionIntervalResults) {
+ int definitionId = (Integer) nextInterval[0];
+ long minInterval = (Long) nextInterval[1];
+ long maxInterval = (Long) nextInterval[2];
+
+ long interval = (minInterval != maxInterval) ? 0 : minInterval;
+ definitionIntervalMap.put(definitionId, interval);
+ }
+ int size = getResourceCount(context);
+ for (Object[] nextEnabled : definitionEnabledResults) {
+ int definitionId = (Integer) nextEnabled[0];
+ long enabledCount = (Long) nextEnabled[1];
+
+ Boolean enabled = null;
+ if (enabledCount == size) {
+ enabled = true;
+ } else if (enabledCount == 0) {
+ enabled = false;
+ }
- definitionEnabledMap.put(definitionId, enabled);
+ definitionEnabledMap.put(definitionId, enabled);
+ }
}
- // finally merge everything together
+ // Finally, merge everything together.
List<MeasurementScheduleComposite> composites = new ArrayList<MeasurementScheduleComposite>();
for (MeasurementDefinition next : definitions) {
int definitionId = next.getId();
commit f8f501532d2658d814048ecf3879685ddfdff984
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Oct 28 13:07:04 2010 -0500
Perf Work on the AS-5 Plugin to try and reduce avail and metric gathering
times. In general trying to reduce interaction with Profile Service.
1) Cache ManagedComponent in ManagedComponentComponent
This is the base class for resources managed by a profile service
ManagedComponent. It seems that for "runtime" properties gettingthe prop
value returns the live value, so we dont have to get the re-fetch the
ManagedComponent object from the ManagementView. This greatly helps avail checking
Since RunState is a runtime value. It also helps metric collection if all
of the requested metrics are runtime values.
2) Cache whether metrics are runtime or not runtime
Instead of figuring out every time whether requested metrics are runtime
properties, cache this info to save time. This is a static cache so all
instances of the type can share the info.
3) Remove use of ManagedComponentUtils.getManagedComponent()
The PS API added ManagementView.getComponent(name, type), which is more
efficient.
4) Avoid load() when checking avail for ManagedDeployment components (EAR/WAR)
Although it is necessary to re-fetch the ManagedDeployment to get an
updated deployment state, a load of the management view is not necessary.
Conflicts:
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java
index bd78958..e925148 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java
@@ -106,7 +106,7 @@ public abstract class AbstractManagedDeploymentComponent extends AbstractManaged
public AvailabilityType getAvailability() {
DeploymentState deploymentState = null;
try {
- deploymentState = getManagedDeployment().getDeploymentState();
+ deploymentState = getManagedDeployment(false).getDeploymentState();
} catch (NoSuchDeploymentException e) {
log.warn(this.deploymentType + " deployment '" + this.deploymentName + "' not found. Cause: "
+ e.getLocalizedMessage());
@@ -186,8 +186,14 @@ public abstract class AbstractManagedDeploymentComponent extends AbstractManaged
}
protected ManagedDeployment getManagedDeployment() throws NoSuchDeploymentException {
+ return getManagedDeployment(true);
+ }
+
+ protected ManagedDeployment getManagedDeployment(boolean forceLoad) throws NoSuchDeploymentException {
ManagementView managementView = getConnection().getManagementView();
- managementView.load();
+ if (forceLoad) {
+ managementView.load();
+ }
return managementView.getDeployment(this.deploymentName);
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
index 855791a..5bacccb 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
@@ -35,9 +35,15 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import com.jboss.jbossnetwork.product.jbpm.handlers.ControlActionFacade;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.mc4j.ems.connection.EmsConnection;
+import org.mc4j.ems.connection.support.metadata.InternalVMTypeDescriptor;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.deployers.spi.management.deploy.ProgressEvent;
@@ -49,17 +55,12 @@ import org.jboss.on.common.jbossas.JBPMWorkflowManager;
import org.jboss.on.common.jbossas.JBossASPaths;
import org.jboss.on.common.jbossas.JmxConnectionHelper;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.mc4j.ems.connection.EmsConnection;
-import org.mc4j.ems.connection.support.metadata.InternalVMTypeDescriptor;
-
-import org.rhq.core.domain.content.transfer.DeployPackagesResponse;
-import org.rhq.core.domain.content.transfer.RemovePackagesResponse;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.transfer.DeployPackageStep;
+import org.rhq.core.domain.content.transfer.DeployPackagesResponse;
+import org.rhq.core.domain.content.transfer.RemovePackagesResponse;
import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
@@ -88,12 +89,10 @@ import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnectionProvider;
import org.rhq.plugins.jbossas5.connection.RemoteProfileServiceConnectionProvider;
import org.rhq.plugins.jbossas5.helper.CreateChildResourceFacetDelegate;
-import org.rhq.plugins.jbossas5.helper.JBossAS5ConnectionTypeDescriptor;
import org.rhq.plugins.jbossas5.helper.InPluginControlActionFacade;
+import org.rhq.plugins.jbossas5.helper.JBossAS5ConnectionTypeDescriptor;
import org.rhq.plugins.jbossas5.util.ManagedComponentUtils;
-import com.jboss.jbossnetwork.product.jbpm.handlers.ControlActionFacade;
-
/**
* ResourceComponent for a JBoss AS, 5.1.0.CR1 or later, Server.
*
@@ -144,25 +143,26 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
try {
ManagementView managementView = this.connection.getManagementView();
managementView.load();
-
+
//let's see if the connection corresponds to the server
//this component represents. This is to prevent 2 servers
//with the same JNP URL to be reported as UP when just one
//of them can be up at a time.
- ManagedComponent serverConfig = managementView.getComponentsForType(new ComponentType("MCBean", "ServerConfig")).iterator().next();
-
- String reportedServerHomeDirPath = (String)((SimpleValue)serverConfig.getProperty("serverHomeDir").getValue()).getValue();
-
- String configuredServerHomeDirPath = resourceContext.getPluginConfiguration()
- .getSimpleValue(ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR, null);
-
+ ManagedComponent serverConfig = managementView.getComponentsForType(
+ new ComponentType("MCBean", "ServerConfig")).iterator().next();
+
+ String reportedServerHomeDirPath = (String) ((SimpleValue) serverConfig.getProperty("serverHomeDir")
+ .getValue()).getValue();
+
+ String configuredServerHomeDirPath = resourceContext.getPluginConfiguration().getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR, null);
+
//the paths might be symlinked
File reportedServerHomeDir = new File(reportedServerHomeDirPath);
File configuredServerHomeDir = new File(configuredServerHomeDirPath);
-
- availability = reportedServerHomeDir.getCanonicalPath().equals(configuredServerHomeDir.getCanonicalPath())
- ? AvailabilityType.UP
- : AvailabilityType.DOWN;
+
+ availability = reportedServerHomeDir.getCanonicalPath().equals(
+ configuredServerHomeDir.getCanonicalPath()) ? AvailabilityType.UP : AvailabilityType.DOWN;
} catch (Exception e) {
availability = AvailabilityType.DOWN;
}
@@ -193,7 +193,8 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
// prepare to perform async avail checking
Configuration pc = resourceContext.getPluginConfiguration();
- String availCheckPeriodProp = pc.getSimpleValue(ApplicationServerPluginConfigurationProperties.AVAIL_CHECK_PERIOD_CONFIG_PROP, null);
+ String availCheckPeriodProp = pc.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.AVAIL_CHECK_PERIOD_CONFIG_PROP, null);
if (availCheckPeriodProp != null) {
try {
long availCheckMillis = Integer.parseInt(availCheckPeriodProp) * 1000L;
@@ -260,7 +261,7 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
propertyNames.add(ALTERNATE_METRIC_NAMES.get(requestName));
}
throw new IllegalStateException("A property was not found with any of the following names: "
- + propertyNames);
+ + propertyNames);
}
if (value != null) {
@@ -350,10 +351,13 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
connectionProvider = new LocalProfileServiceConnectionProvider();
} else {
Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
- String namingURL = pluginConfig.getSimpleValue(ApplicationServerPluginConfigurationProperties.NAMING_URL, null);
+ String namingURL = pluginConfig.getSimpleValue(ApplicationServerPluginConfigurationProperties.NAMING_URL,
+ null);
validateNamingURL(namingURL);
- String principal = pluginConfig.getSimpleValue(ApplicationServerPluginConfigurationProperties.PRINCIPAL, null);
- String credentials = pluginConfig.getSimpleValue(ApplicationServerPluginConfigurationProperties.CREDENTIALS, null);
+ String principal = pluginConfig.getSimpleValue(ApplicationServerPluginConfigurationProperties.PRINCIPAL,
+ null);
+ String credentials = pluginConfig.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.CREDENTIALS, null);
connectionProvider = new RemoteProfileServiceConnectionProvider(namingURL, principal, credentials);
}
if (Thread.interrupted()) {
@@ -373,7 +377,7 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
log.warn("Failed to connect to Profile Service - cause: " + rootCause);
}
throw new InvalidPluginConfigurationException(
- "Values of 'principal' and/or 'credentials' connection properties are invalid.", rootCause);
+ "Values of 'principal' and/or 'credentials' connection properties are invalid.", rootCause);
}
log.debug("Failed to connect to Profile Service.", e);
}
@@ -395,15 +399,18 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
private JBossASPaths getJBossASPaths() {
Configuration pluginConfiguration = this.resourceContext.getPluginConfiguration();
- String homeDir = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.HOME_DIR, null);
- String serverHomeDir = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR, null);
+ String homeDir = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.HOME_DIR,
+ null);
+ String serverHomeDir = pluginConfiguration.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR, null);
return new JBossASPaths(homeDir, serverHomeDir);
}
private boolean runningEmbedded() {
Configuration pluginConfiguration = this.resourceContext.getPluginConfiguration();
- String namingUrl = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.NAMING_URL, null);
+ String namingUrl = pluginConfiguration.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.NAMING_URL, null);
return namingUrl == null;
}
@@ -412,7 +419,8 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
File configDir = new File(path);
if (!configDir.isAbsolute()) {
Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
- String homeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR).getStringValue();
+ String homeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR)
+ .getStringValue();
configDir = new File(homeDir, path);
}
return configDir;
@@ -455,7 +463,7 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
public OperationResult invokeOperation(String name, Configuration parameters) throws InterruptedException,
Exception {
-
+
ApplicationServerSupportedOperations operation = Enum.valueOf(ApplicationServerSupportedOperations.class, name
.toUpperCase());
return this.operationDelegate.invoke(operation, parameters);
@@ -466,16 +474,20 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
Configuration jmxConfig = new Configuration();
- String jbossHomeDir = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.HOME_DIR, null);
+ String jbossHomeDir = pluginConfiguration.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.HOME_DIR, null);
String connectorDescriptorType;
boolean runningEmbedded = runningEmbedded();
if (runningEmbedded) {
connectorDescriptorType = InternalVMTypeDescriptor.class.getName();
} else {
- String connectorAddress = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.NAMING_URL, null);
- String connectorPrincipal = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.PRINCIPAL, null);
- String connectorCredentials = pluginConfiguration.getSimpleValue(ApplicationServerPluginConfigurationProperties.CREDENTIALS, null);
+ String connectorAddress = pluginConfiguration.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.NAMING_URL, null);
+ String connectorPrincipal = pluginConfiguration.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.PRINCIPAL, null);
+ String connectorCredentials = pluginConfiguration.getSimpleValue(
+ ApplicationServerPluginConfigurationProperties.CREDENTIALS, null);
connectorDescriptorType = JBossAS5ConnectionTypeDescriptor.class.getName();
@@ -512,7 +524,7 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
private File getConfigurationPath() {
Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
String serverHomeDir = getRequiredPropertyValue(pluginConfig,
- ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR);
+ ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR);
File configPath = resolvePathRelativeToHomeDir(serverHomeDir);
if (!configPath.isDirectory()) {
throw new InvalidPluginConfigurationException("Configuration path '" + configPath + "' does not exist.");
@@ -527,7 +539,7 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
Matcher matcher = METRIC_NAME_PATTERN.matcher(metricName);
if (!matcher.matches()) {
throw new IllegalStateException("Metric name '" + metricName + "' does not match pattern '"
- + METRIC_NAME_PATTERN + "'.");
+ + METRIC_NAME_PATTERN + "'.");
}
String componentCategory = matcher.group(1);
String componentSubType = matcher.group(2);
@@ -538,7 +550,13 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
if (componentName.equals("*")) {
component = ManagedComponentUtils.getSingletonManagedComponent(managementView, componentType);
} else {
- component = ManagedComponentUtils.getManagedComponent(managementView, componentType, componentName);
+ //component = ManagedComponentUtils.getManagedComponent(managementView, componentType, componentName);
+ try {
+ component = managementView.getComponent(componentName, componentType);
+ } catch (Exception e) {
+ throw new IllegalStateException("Error fetching component " + componentName + "of type "
+ + componentType);
+ }
}
return ManagedComponentUtils.getSimplePropertyValue(component, propertyName);
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java
index 1eb2219..15ffea3 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/Ejb2BeanComponent.java
@@ -24,8 +24,9 @@ package org.rhq.plugins.jbossas5;
import java.util.Set;
-import org.jboss.managed.api.ManagedComponent;
+import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ComponentType;
+import org.jboss.managed.api.ManagedComponent;
import org.rhq.plugins.jbossas5.util.Ejb2BeanUtils;
@@ -38,26 +39,27 @@ public class Ejb2BeanComponent extends AbstractEjbBeanComponent {
private static final ComponentType MDB_COMPONENT_TYPE = new ComponentType("EJB", "MDB");
@Override
- protected ManagedComponent getManagedComponent() {
+ protected ManagedComponent getManagedComponent(boolean forceRefresh) {
if (MDB_COMPONENT_TYPE.equals(getComponentType())) {
try {
//we need to reload the management view here, because the MDBs might have changed since
//the last call, because the @object-id is part of their names.
- getConnection().getManagementView().load();
+ ManagementView mv = getConnection().getManagementView();
+ mv.load();
- Set<ManagedComponent> mdbs = getConnection().getManagementView().getComponentsForType(
- MDB_COMPONENT_TYPE);
+ Set<ManagedComponent> mdbs = mv.getComponentsForType(MDB_COMPONENT_TYPE);
for (ManagedComponent mdb : mdbs) {
if (getComponentName().equals(Ejb2BeanUtils.getUniqueBeanIdentificator(mdb))) {
return mdb;
}
}
+
} catch (Exception e) {
throw new IllegalStateException(e);
}
} else {
- return super.getManagedComponent();
+ return super.getManagedComponent(forceRefresh);
}
return null;
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
index 7c70bc7..6d564ee 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
@@ -24,12 +24,16 @@ package org.rhq.plugins.jbossas5;
import java.lang.reflect.Array;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.deployers.spi.management.deploy.DeploymentManager;
import org.jboss.deployers.spi.management.deploy.DeploymentProgress;
@@ -40,20 +44,17 @@ import org.jboss.managed.api.ManagedDeployment;
import org.jboss.managed.api.ManagedOperation;
import org.jboss.managed.api.ManagedProperty;
import org.jboss.managed.api.RunState;
+import org.jboss.managed.api.annotation.ViewUse;
import org.jboss.metatype.api.values.ArrayValue;
import org.jboss.metatype.api.values.CollectionValue;
import org.jboss.metatype.api.values.CompositeValue;
import org.jboss.metatype.api.values.EnumValue;
import org.jboss.metatype.api.values.MetaValue;
import org.jboss.metatype.api.values.SimpleValue;
-import org.jboss.remoting.CannotConnectException;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
@@ -72,11 +73,10 @@ import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.plugins.jbossas5.util.ConversionUtils;
+import org.rhq.plugins.jbossas5.util.DebugUtils;
import org.rhq.plugins.jbossas5.util.DeploymentUtils;
-import org.rhq.plugins.jbossas5.util.ManagedComponentUtils;
-import org.rhq.plugins.jbossas5.util.ResourceTypeUtils;
import org.rhq.plugins.jbossas5.util.ResourceComponentUtils;
-import org.rhq.plugins.jbossas5.util.DebugUtils;
+import org.rhq.plugins.jbossas5.util.ResourceTypeUtils;
/**
* Service ResourceComponent for all {@link ManagedComponent}s in a Profile.
@@ -93,12 +93,19 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
String COMPONENT_NAME = "componentName";
String TEMPLATE_NAME = "templateName";
String COMPONENT_NAME_PROPERTY = "componentNameProperty";
- }
+ }
protected static final char PREFIX_DELIMITER = '|';
+ // Map the managedComponentComponent class name to a map of metricName to "isRuntimeProp". So, for a given
+ // component we can quickly determine whether requested metrics need to refresh the managedComponent, or not.
+ private static final Map<String, Map<String, Boolean>> runtimeMetricMaps = new HashMap<String, Map<String, Boolean>>();
+
private final Log log = LogFactory.getLog(this.getClass());
+ // Cache the ManagedComponent since it can be re-used to request any ViewUse.RUNTIME property values
+ private ManagedComponent managedComponent = null;
+
private String componentName;
private ComponentType componentType;
@@ -109,15 +116,15 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
try {
runState = getManagedComponent().getRunState();
} catch (Throwable t) {
- log.debug("Could not get component state for " + this.componentType + " component '"
- + this.componentName + "', cause: ", t);
+ log.debug("Could not get component state for " + this.componentType + " component '" + this.componentName
+ + "', cause: ", t);
return AvailabilityType.DOWN;
}
if (runState == RunState.RUNNING) {
return AvailabilityType.UP;
} else {
- log.debug(this.componentType + " component '" + this.componentName + "' was not running, state" +
- " was: " + runState);
+ log.debug(this.componentType + " component '" + this.componentName + "' was not running, state" + " was: "
+ + runState);
return AvailabilityType.DOWN;
}
}
@@ -132,58 +139,51 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
}
public void stop() {
- return;
+ managedComponent = null;
+ super.stop();
}
// ConfigurationComponent Implementation --------------------------------------------
- public Configuration loadResourceConfiguration()
- {
+ public Configuration loadResourceConfiguration() {
Configuration resourceConfig;
- try
- {
+ try {
Map<String, ManagedProperty> managedProperties = getManagedComponent().getProperties();
- Map<String, PropertySimple> customProps =
- ResourceComponentUtils.getCustomProperties(getResourceContext().getPluginConfiguration());
- if (this.log.isDebugEnabled()) this.log.debug("*** AFTER LOAD:\n"
- + DebugUtils.convertPropertiesToString(managedProperties));
- resourceConfig = ConversionUtils.convertManagedObjectToConfiguration(managedProperties,
- customProps, getResourceContext().getResourceType());
- }
- catch (Exception e)
- {
+ Map<String, PropertySimple> customProps = ResourceComponentUtils.getCustomProperties(getResourceContext()
+ .getPluginConfiguration());
+ if (this.log.isDebugEnabled())
+ this.log.debug("*** AFTER LOAD:\n" + DebugUtils.convertPropertiesToString(managedProperties));
+ resourceConfig = ConversionUtils.convertManagedObjectToConfiguration(managedProperties, customProps,
+ getResourceContext().getResourceType());
+ } catch (Exception e) {
RunState runState = getManagedComponent().getRunState();
if (runState == RunState.RUNNING) {
- this.log.error("Failed to load configuration for " + getResourceDescription() + ".", e);
+ this.log.error("Failed to load configuration for " + getResourceDescription() + ".", e);
} else {
- this.log.debug("Failed to load configuration for " + getResourceDescription()
- + ", but managed component is not in the RUNNING state.", e);
+ this.log.debug("Failed to load configuration for " + getResourceDescription()
+ + ", but managed component is not in the RUNNING state.", e);
}
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
return resourceConfig;
}
- public void updateResourceConfiguration(ConfigurationUpdateReport configurationUpdateReport)
- {
+ public void updateResourceConfiguration(ConfigurationUpdateReport configurationUpdateReport) {
Configuration resourceConfig = configurationUpdateReport.getConfiguration();
Configuration pluginConfig = getResourceContext().getPluginConfiguration();
- try
- {
+ try {
ManagedComponent managedComponent = getManagedComponent();
Map<String, ManagedProperty> managedProperties = managedComponent.getProperties();
Map<String, PropertySimple> customProps = ResourceComponentUtils.getCustomProperties(pluginConfig);
- if (this.log.isDebugEnabled()) this.log.debug("*** BEFORE UPDATE:\n"
- + DebugUtils.convertPropertiesToString(managedProperties));
+ if (this.log.isDebugEnabled())
+ this.log.debug("*** BEFORE UPDATE:\n" + DebugUtils.convertPropertiesToString(managedProperties));
ConversionUtils.convertConfigurationToManagedProperties(managedProperties, resourceConfig,
- getResourceContext().getResourceType(), customProps);
- if (this.log.isDebugEnabled()) this.log.debug("*** AFTER UPDATE:\n"
- + DebugUtils.convertPropertiesToString(managedProperties));
+ getResourceContext().getResourceType(), customProps);
+ if (this.log.isDebugEnabled())
+ this.log.debug("*** AFTER UPDATE:\n" + DebugUtils.convertPropertiesToString(managedProperties));
updateComponent(managedComponent);
configurationUpdateReport.setStatus(ConfigurationUpdateStatus.SUCCESS);
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
this.log.error("Failed to update configuration for " + getResourceDescription() + ".", e);
configurationUpdateReport.setStatus(ConfigurationUpdateStatus.FAILURE);
configurationUpdateReport.setErrorMessage(ThrowableUtil.getAllMessages(e));
@@ -234,7 +234,36 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
// MeasurementFacet Implementation --------------------------------------------
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
- ManagedComponent managedComponent = getManagedComponent();
+ // this bit could be synchronized but I don't think it really hurts to perhaps go through this logic more
+ // than once, it will settle down near immediately
+ Map<String, Boolean> runtimeMetricMap = runtimeMetricMaps.get(this.getClass().getName());
+ if (null == runtimeMetricMap) {
+ //log.info("\nADDING MAP FOR CLASS=" + this.getClass().getName());
+ runtimeMetricMap = new HashMap<String, Boolean>();
+ runtimeMetricMaps.put(this.getClass().getName(), runtimeMetricMap);
+ }
+
+ // determine whether we can use the cachedComponent or if we need to force a component fetch to
+ // gather the requested metrics.
+ boolean forceRefresh = false;
+ for (MeasurementScheduleRequest request : metrics) {
+ Boolean isRuntimeMetric = runtimeMetricMap.get(request.getName());
+ // if this is the first time we've seen this metric find out if it's a runtime prop
+ if (null == isRuntimeMetric) {
+ //log.info("\nADDING MAP ENTRY FOR METRIC=" + request.getName());
+ ManagedProperty managedProp = getManagedProperty(managedComponent, request);
+ runtimeMetricMap.put(request.getName(), Boolean.valueOf((null == managedProp || managedProp
+ .hasViewUse(ViewUse.RUNTIME))));
+ }
+
+ if (Boolean.FALSE.equals(runtimeMetricMap.get(request.getName()))) {
+ //log.info("\nFORCING COMPONENT REFRESH DUE TO NON-RUNTIME PROP: " + request.getName());
+ forceRefresh = true;
+ break;
+ }
+ }
+
+ ManagedComponent managedComponent = getManagedComponent(forceRefresh);
RunState runState = managedComponent.getRunState();
for (MeasurementScheduleRequest request : metrics) {
try {
@@ -249,7 +278,7 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
log.error("Failed to collect metric for " + request, e);
} else {
log.debug("Failed to collect metric for " + request
- + ", but managed component is not in the RUNNING state.", e);
+ + ", but managed component is not in the RUNNING state.", e);
}
}
}
@@ -297,6 +326,29 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
return getInnerValue(metaValue);
}
+ /**
+ * The name of the measurement schedule request (i.e. the metric name) can be in one of two forms:
+ * <p/>
+ * [prefix'|']simplePropertyName (e.g. "maxTime" or "ThreadPool|currentThreadCount")
+ * [prefix'|']compositePropertyName'.'key (e.g. "consumerCount" or "messageStatistics.count")
+ *
+ * @param managedComponent a managed component
+ * @param request a measurement schedule request
+ * @return the metric value
+ */
+ @Nullable
+ protected ManagedProperty getManagedProperty(ManagedComponent managedComponent, MeasurementScheduleRequest request) {
+ String metricName = request.getName();
+ int pipeIndex = metricName.indexOf(PREFIX_DELIMITER);
+ // Remove the prefix if there is one (e.g. "ThreadPool|currentThreadCount" -> "currentThreadCount").
+ String compositePropName = (pipeIndex == -1) ? metricName : metricName.substring(pipeIndex + 1);
+ int dotIndex = compositePropName.indexOf('.');
+ String metricPropName = (dotIndex == -1) ? compositePropName : compositePropName.substring(0, dotIndex);
+ ManagedProperty metricProp = managedComponent.getProperty(metricPropName);
+
+ return metricProp;
+ }
+
// TODO: Move this to a utility class.
@Nullable
private static Object getInnerValue(MetaValue metaValue) {
@@ -362,11 +414,18 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
}
protected ManagedComponent getManagedComponent() {
- ManagedComponent managedComponent;
+ return getManagedComponent(false);
+ }
+
+ protected ManagedComponent getManagedComponent(boolean forceRefresh) {
+
+ if (!forceRefresh && null != this.managedComponent) {
+ return this.managedComponent;
+ }
+
try {
ManagementView managementView = getConnection().getManagementView();
- managedComponent = ManagedComponentUtils.getManagedComponent(managementView, this.componentType,
- this.componentName);
+ managedComponent = managementView.getComponent(this.componentName, this.componentType);
} catch (Exception e) {
throw new RuntimeException("Failed to load [" + this.componentType + "] ManagedComponent ["
+ this.componentName + "].", e);
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/TxConnectionFactoryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/TxConnectionFactoryComponent.java
index 07f4462..cdfa98b 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/TxConnectionFactoryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/TxConnectionFactoryComponent.java
@@ -27,47 +27,41 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.core.domain.measurement.MeasurementDataTrait;
-import org.rhq.core.domain.measurement.MeasurementReport;
-import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedProperty;
import org.jboss.metatype.api.values.SimpleValue;
+import org.rhq.core.domain.measurement.MeasurementDataTrait;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+
/**
* A Resource component for JBoss AS 5 Tx Connection Factories.
*
* @author Ian Springer
*/
-public class TxConnectionFactoryComponent extends ManagedComponentComponent
-{
+public class TxConnectionFactoryComponent extends ManagedComponentComponent {
private final Log log = LogFactory.getLog(this.getClass());
@Override
- public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception
- {
- Set<MeasurementScheduleRequest> uncollectedMetrics = new HashSet();
- for (MeasurementScheduleRequest request : metrics)
- {
- try
- {
- if (request.getName().equals("custom.transactionType"))
- {
- ManagedProperty xaTransactionProp = getManagedComponent().getProperty("xa-transaction");
- SimpleValue xaTransactionMetaValue = (SimpleValue)xaTransactionProp.getValue();
- Boolean xaTransactionValue = (xaTransactionMetaValue != null)
- ? (Boolean)xaTransactionMetaValue.getValue() : null;
+ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+ ManagedComponent mc = getManagedComponent(true);
+ Set<MeasurementScheduleRequest> uncollectedMetrics = new HashSet<MeasurementScheduleRequest>();
+ for (MeasurementScheduleRequest request : metrics) {
+ try {
+ if (request.getName().equals("custom.transactionType")) {
+ ManagedProperty xaTransactionProp = mc.getProperty("xa-transaction");
+ SimpleValue xaTransactionMetaValue = (SimpleValue) xaTransactionProp.getValue();
+ Boolean xaTransactionValue = (xaTransactionMetaValue != null) ? (Boolean) xaTransactionMetaValue
+ .getValue() : null;
boolean isXa = (xaTransactionValue != null && xaTransactionValue);
String transactionType = (isXa) ? "XA" : "Local";
report.addData(new MeasurementDataTrait(request, transactionType));
- }
- else
- {
+ } else {
uncollectedMetrics.add(request);
}
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
log.error("Failed to collect metric for " + request, e);
}
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/ManagedComponentUtils.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/ManagedComponentUtils.java
index b928584..a08a043 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/ManagedComponentUtils.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/ManagedComponentUtils.java
@@ -23,12 +23,13 @@
package org.rhq.plugins.jbossas5.util;
import java.io.Serializable;
+import java.util.Comparator;
import java.util.EnumSet;
-import java.util.Set;
import java.util.HashSet;
-import java.util.Comparator;
+import java.util.Set;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.deployers.spi.management.NameMatcher;
@@ -39,78 +40,53 @@ import org.jboss.managed.api.annotation.ViewUse;
import org.jboss.metatype.api.types.MetaType;
import org.jboss.metatype.api.values.EnumValue;
import org.jboss.metatype.api.values.SimpleValue;
-import org.jetbrains.annotations.Nullable;
/**
* A collection of utility methods for working with Profile Service {@link ManagedComponent}s.
*
* @author Ian Springer
*/
-public class ManagedComponentUtils
-{
+public class ManagedComponentUtils {
private static final Comparator<ComponentType> COMPONENT_TYPE_COMPARATOR = new ComponentTypeComparator();
@Nullable
- public static ManagedComponent getManagedComponent(ManagementView managementView, ComponentType componentType,
- String componentName)
- {
- Set<ManagedComponent> components = getManagedComponents(managementView, componentType);
- for (ManagedComponent component : components)
- {
- if (component.getName().equals(componentName))
- return component;
- }
- return null;
- }
-
- @Nullable
public static ManagedComponent getSingletonManagedComponent(ManagementView managementView,
- ComponentType componentType)
- {
+ ComponentType componentType) {
Set<ManagedComponent> components = getManagedComponents(managementView, componentType);
- if (components.size() > 1)
- {
+ if (components.size() > 1) {
throw new IllegalStateException("Found more than one component of type " + componentType + ": "
- + components);
+ + components);
}
- @SuppressWarnings({"UnnecessaryLocalVariable"})
+ @SuppressWarnings( { "UnnecessaryLocalVariable" })
ManagedComponent component = (components.size() == 1) ? components.iterator().next() : null;
return component;
}
public static Serializable getSimplePropertyValue(ManagedComponent component, String propertyName)
- throws PropertyNotFoundException {
+ throws PropertyNotFoundException {
ManagedProperty property = component.getProperty(propertyName);
- if (property == null)
- {
- throw new PropertyNotFoundException("Property named '" + propertyName + "' not found for ManagedComponent ["
- + component + "].");
+ if (property == null) {
+ throw new PropertyNotFoundException("Property named '" + propertyName
+ + "' not found for ManagedComponent [" + component + "].");
}
MetaType metaType = property.getMetaType();
Serializable value;
- if (metaType.isSimple())
- {
- SimpleValue simpleValue = (SimpleValue)property.getValue();
+ if (metaType.isSimple()) {
+ SimpleValue simpleValue = (SimpleValue) property.getValue();
value = (simpleValue != null) ? simpleValue.getValue() : null;
- }
- else if (metaType.isEnum())
- {
- EnumValue enumValue = (EnumValue)property.getValue();
+ } else if (metaType.isEnum()) {
+ EnumValue enumValue = (EnumValue) property.getValue();
value = (enumValue != null) ? enumValue.getValue() : null;
- }
- else
- {
+ } else {
throw new IllegalStateException("Type of [" + property + "] is not simple or enum.");
}
return value;
}
@NotNull
- public static EnumSet<ViewUse> getViewUses(ManagedProperty managedProperty)
- {
+ public static EnumSet<ViewUse> getViewUses(ManagedProperty managedProperty) {
EnumSet<ViewUse> viewUses = EnumSet.noneOf(ViewUse.class);
- for (ViewUse viewUse : ViewUse.values())
- {
+ for (ViewUse viewUse : ViewUse.values()) {
if (managedProperty.hasViewUse(viewUse))
viewUses.add(viewUse);
}
@@ -120,19 +96,15 @@ public class ManagedComponentUtils
/**
* TODO
*/
- public static boolean isManagedComponent(ManagementView managementView, String name, ComponentType componentType)
- {
+ public static boolean isManagedComponent(ManagementView managementView, String name, ComponentType componentType) {
boolean isDeployed = false;
- if (name != null)
- {
- try
- {
- ManagedComponent component = getManagedComponent(managementView, componentType, name);
+ if (name != null) {
+ try {
+ //ManagedComponent component = getManagedComponent(managementView, componentType, name);
+ ManagedComponent component = managementView.getComponent(name, componentType);
if (component != null)
isDeployed = true;
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
// Setting it to true to be safe than sorry, since there might be a component
// already deployed in the AS. TODO (ips): I don't think I like this.
isDeployed = true;
@@ -142,9 +114,8 @@ public class ManagedComponentUtils
}
@NotNull
- public static Set<ManagedComponent> getManagedComponents(ManagementView managementView, ComponentType componentType,
- String name, NameMatcher<ManagedComponent> nameMatcher)
- {
+ public static Set<ManagedComponent> getManagedComponents(ManagementView managementView,
+ ComponentType componentType, String name, NameMatcher<ManagedComponent> nameMatcher) {
Set<ManagedComponent> matchingComponents = new HashSet<ManagedComponent>();
Set<ManagedComponent> allComponents = getManagedComponents(managementView, componentType);
for (ManagedComponent component : allComponents) {
@@ -160,24 +131,18 @@ public class ManagedComponentUtils
}
@NotNull
- private static Set<ManagedComponent> getManagedComponents(ManagementView managementView, ComponentType componentType)
- {
+ private static Set<ManagedComponent> getManagedComponents(ManagementView managementView, ComponentType componentType) {
Set<ManagedComponent> components;
- try
- {
+ try {
components = managementView.getComponentsForType(componentType);
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
throw new IllegalStateException(e);
}
return components;
}
- private static class ComponentTypeComparator implements Comparator<ComponentType>
- {
- public int compare(ComponentType type1, ComponentType type2)
- {
+ private static class ComponentTypeComparator implements Comparator<ComponentType> {
+ public int compare(ComponentType type1, ComponentType type2) {
int value = type1.getType().compareTo(type2.getType());
// If the categories (e.g. JMSDestination) were equal, do a secondary sort by subtype (e.g. Queue).
return (value != 0) ? value : type1.getSubtype().compareTo(type2.getSubtype());
commit 30ed07c50505da3915d8fdcf17d4a498ca297038
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Oct 28 14:26:36 2010 -0400
merge DemoCanvas (#Demo) into new TestTopView (#Test); use constants for view IDs in MenuBarView
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 a8bdeba..17b37cb 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
@@ -195,8 +195,6 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
if (breadcrumbName.equals(AdministrationView.VIEW_ID)) {
canvas = new AdministrationView();
- } else if (breadcrumbName.equals(DemoCanvas.VIEW_ID)) {
- canvas = new DemoCanvas();
} else if (breadcrumbName.equals(InventoryView.VIEW_ID)) {
canvas = new InventoryView();
} else if (breadcrumbName.equals(ResourceTopView.VIEW_ID)) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java
deleted file mode 100644
index d252fb8..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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;
-
-import com.smartgwt.client.types.Side;
-import com.smartgwt.client.types.TabBarControls;
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.menu.Menu;
-import com.smartgwt.client.widgets.menu.MenuButton;
-import com.smartgwt.client.widgets.menu.MenuItem;
-import com.smartgwt.client.widgets.menu.events.ItemClickEvent;
-import com.smartgwt.client.widgets.menu.events.ItemClickHandler;
-import com.smartgwt.client.widgets.tab.Tab;
-import com.smartgwt.client.widgets.tab.TabSet;
-
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceSelector;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeTreeView;
-import org.rhq.enterprise.gui.coregui.client.report.tag.TagCloudView;
-
-/**
- * @author Greg Hinkle
- */
-public class DemoCanvas extends Canvas {
- public static final String VIEW_ID = "Demo";
-
- @Override
- protected void onInit() {
-
- setWidth100();
- setHeight100();
-
- final TabSet topTabSet = new TabSet();
- topTabSet.setTabBarPosition(Side.TOP);
- topTabSet.setWidth100();//(1200);
- topTabSet.setHeight100(); //(900);
-
- // topTabSet.setTop(50);
-
- Tab tagTab = new Tab("Tag Cloud");
- Tab selectorTab = new Tab("Selector");
- Tab typeTree = new Tab("Type Tree");
- Tab treeTab = new Tab("Resource Tree");
- final Tab configTab = new Tab("Configuration Editor");
- //Tab alertHistoryTab = new Tab("Alert History");
-
- tagTab.setPane(new TagCloudView("TagTabTagCloud"));
-
- selectorTab.setPane(new ResourceSelector("Demo Resource Selector"));
-
- // Agent: resource (10005) type (10060)
- // Raw: 10003 / 10023
- // both: 10002 / 10022
-
- //configTab.setPane(new ConfigurationEditor(10005, 10060, ConfigurationEditor.ConfigType.plugin));
- //treeTab.setPane(new ResourceTreeView(new Resource(10001)));
- typeTree.setPane(new ResourceTypeTreeView("DemoTypeTree"));
- //alertHistoryTab.setPane(new AbstractAlertsView());
-
- topTabSet.addTab(tagTab);
- topTabSet.addTab(selectorTab);
- topTabSet.addTab(typeTree);
- topTabSet.addTab(configTab);
- topTabSet.addTab(treeTab);
- //topTabSet.addTab(alertHistoryTab);
- //topTabSet.selectSubTabByTitle(alertHistoryTab);
-
- final Menu configSelectMenu = new Menu();
- configSelectMenu.addItem(new MenuItem("Agent"));
- configSelectMenu.addItem(new MenuItem("Raw Only"));
- configSelectMenu.addItem(new MenuItem("Structured and Raw"));
- configSelectMenu.addItem(new MenuItem("List Of Maps"));
- configSelectMenu.addItemClickHandler(new ItemClickHandler() {
- public void onItemClick(ItemClickEvent itemClickEvent) {
- int x = configSelectMenu.getItemNum(itemClickEvent.getItem());
- com.allen_sauer.gwt.log.client.Log.info("Loading: " + x);
- topTabSet.removeTab(configTab);
- switch (x) {
- case 0:
- configTab.setPane(new ConfigurationEditor("Case0", 10005, 10060));
- break;
- case 1:
- configTab.setPane(new ConfigurationEditor("Case1", 10003, 10023));
- break;
- case 2:
- configTab.setPane(new ConfigurationEditor("Case2", 10002, 10022));
- break;
- case 3:
- configTab.setPane(new ConfigurationEditor("Case3", 10149, 10134));
- break;
- }
- topTabSet.addTab(configTab, 0);
- topTabSet.selectTab(0);
- topTabSet.redraw();
-
- }
- });
-
- topTabSet.setTabBarControls(TabBarControls.TAB_SCROLLER, TabBarControls.TAB_PICKER, new MenuButton(
- "Config Resource", configSelectMenu));
-
- addChild(topTabSet);
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
index ca5a929..ddf9c4c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.gui.coregui.client.dashboard;
import java.util.HashSet;
+import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
@@ -53,7 +54,6 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
* @author Greg Hinkle
*/
public class DashboardView extends LocatableVLayout {
-
private DashboardsView dashboardsView;
private Dashboard storedDashboard;
@@ -63,7 +63,7 @@ public class DashboardView extends LocatableVLayout {
DynamicForm editForm;
IMenuButton addPortlet;
- HashSet<PortletWindow> portlets = new HashSet<PortletWindow>();
+ Set<PortletWindow> portlets = new HashSet<PortletWindow>();
public DashboardView(String locatorId, DashboardsView dashboardsView, Dashboard storedDashboard) {
super(locatorId);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
index 2aa22ce..453d231 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
@@ -31,7 +31,12 @@ import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
+import org.rhq.enterprise.gui.coregui.client.admin.AdministrationView;
+import org.rhq.enterprise.gui.coregui.client.bundle.BundleTopView;
import org.rhq.enterprise.gui.coregui.client.components.AboutModalWindow;
+import org.rhq.enterprise.gui.coregui.client.dashboard.DashboardsView;
+import org.rhq.enterprise.gui.coregui.client.inventory.InventoryView;
+import org.rhq.enterprise.gui.coregui.client.report.ReportTopView;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableImg;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
@@ -42,9 +47,10 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
*/
public class MenuBarView extends LocatableVLayout {
- public static final String[] SECTIONS = { "Dashboard", "Inventory", "Reports", "Bundles", "Administration" };
+ public static final String[] SECTIONS = {DashboardsView.VIEW_ID, InventoryView.VIEW_ID, ReportTopView.VIEW_ID,
+ BundleTopView.VIEW_ID, AdministrationView.VIEW_ID};
- private String currentlySelectedSection = "Dashboard";
+ private String currentlySelectedSection = DashboardsView.VIEW_ID;
public MenuBarView(String locatorId) {
super(locatorId);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
index fa345bf..3714034 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
@@ -28,6 +28,8 @@ import org.rhq.enterprise.gui.coregui.client.components.view.AbstractSectionedLe
import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceSelector;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeTreeView;
import org.rhq.enterprise.gui.coregui.client.test.configuration.TestConfigurationView;
import org.rhq.enterprise.gui.coregui.client.test.configuration.TestGroupConfigurationView;
@@ -40,6 +42,12 @@ import org.rhq.enterprise.gui.coregui.client.test.configuration.TestGroupConfigu
public class TestTopView extends AbstractSectionedLeftNavigationView {
public static final String VIEW_ID = "Test";
+ // view IDs for Inventory section
+ private static final String INVENTORY_SECTION_VIEW_ID = "Inventory";
+
+ private static final String PAGE_RESOURCE_SELECTOR = "ResourceSelector";
+ private static final String PAGE_TYPE_TREE = "TypeTree";
+
// view IDs for Configuration section
private static final String CONFIGURATION_SECTION_VIEW_ID = "Configuration";
@@ -63,12 +71,32 @@ public class TestTopView extends AbstractSectionedLeftNavigationView {
protected List<NavigationSection> getNavigationSections() {
List<NavigationSection> sections = new ArrayList<NavigationSection>();
+ NavigationSection inventorySection = buildInventorySection();
+ sections.add(inventorySection);
+
NavigationSection configurationSection = buildConfigurationSection();
sections.add(configurationSection);
return sections;
}
+ private NavigationSection buildInventorySection() {
+ NavigationItem resourceSelectorItem = new NavigationItem(PAGE_RESOURCE_SELECTOR, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceSelector(extendLocatorId(PAGE_RESOURCE_SELECTOR));
+ }
+ });
+
+ NavigationItem typeTreeItem = new NavigationItem(PAGE_TYPE_TREE, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceTypeTreeView(extendLocatorId(PAGE_TYPE_TREE));
+ }
+ });
+
+ return new NavigationSection(INVENTORY_SECTION_VIEW_ID, resourceSelectorItem, typeTreeItem);
+ }
private NavigationSection buildConfigurationSection() {
NavigationItem configEditorItem = new NavigationItem(PAGE_CONFIG_EDITOR, null,
commit 4579fa892ccb4d8c57f55cae84714ae7a009e764
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Oct 28 14:00:47 2010 -0400
fix Inventory Summary portlet (counts were not 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 90c8bc1..e012146 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
@@ -122,7 +122,7 @@ public class InventorySummaryView extends LocatableVLayout implements Portlet {
}
item.setTitle(label);
- item.setValue(value);
+ item.setDefaultValue(value);
return item;
}
commit 57d628569b292363733e835dc0134072090f2555
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Oct 12 18:51:37 2010 -0400
replace missing Config properties file.
(cherry picked from commit 7158ea3bfd76b3041ed656660c57e206eb6148f2)
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/GeneralPropertiesConfigForm.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/GeneralPropertiesConfigForm.jsp
new file mode 100644
index 0000000..2c8a8a2
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/GeneralPropertiesConfigForm.jsp
@@ -0,0 +1,121 @@
+<%@ page language="java" %>
+<%@ page errorPage="/common/Error.jsp" %>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="/WEB-INF/tld/hq.tld" prefix="hq" %>
+
+<script src="<html:rewrite page="/js/"/>functions.js" type="text/javascript"></script>
+<link rel=stylesheet href="<html:rewrite page="/css/"/>win.css" type="text/css">
+
+<hq:constant
+ classname="org.rhq.enterprise.gui.legacy.Constants"
+ symbol="MINUTES_LABEL" var="CONST_MINUTES" />
+<hq:constant
+ classname="org.rhq.enterprise.gui.legacy.Constants"
+ symbol="HOURS_LABEL" var="CONST_HOURS" />
+<hq:constant
+ classname="org.rhq.enterprise.gui.legacy.Constants"
+ symbol="DAYS_LABEL" var="CONST_DAYS" />
+
+<!-- BASE SERVER CONFIG TITLE -->
+<tiles:insert definition=".header.tab">
+ <tiles:put name="tabKey" value="admin.settings.BaseConfigTab"/>
+</tiles:insert>
+<!-- / -->
+
+<!-- BASE SERVER CONFIG CONTENTS -->
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td width="45%" class="BlockLabel"><fmt:message key="admin.settings.BaseURL"/></td>
+ <td width="55%" class="BlockContent"><html:text size="31" property="baseUrl" /></td>
+ </tr>
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.AgentMaxQuietTimeAllowed"/></td>
+ <td class="BlockContent">
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+<logic:messagesPresent property="agentMaxQuietTimeAllowedVal">
+ <td class="ErrorField">
+ <html:text size="2" property="agentMaxQuietTimeAllowedVal" />
+ </td>
+ <td class="ErrorField" width="100%">
+ <html:select property="agentMaxQuietTimeAllowed">
+ <html:option value="${CONST_MINUTES}"><fmt:message key="admin.settings.Minutes"/></html:option>
+ </html:select>
+ </td>
+</logic:messagesPresent>
+<logic:messagesNotPresent property="agentMaxQuietTimeAllowedVal">
+ <td class="BlockContent">
+ <html:text size="2" property="agentMaxQuietTimeAllowedVal" />
+ </td>
+ <td class="BlockContent" width="100%">
+ <html:select property="agentMaxQuietTimeAllowed">
+ <html:option value="${CONST_MINUTES}"><fmt:message key="admin.settings.Minutes"/></html:option>
+ </html:select>
+ </td>
+</logic:messagesNotPresent>
+ </tr>
+<logic:messagesPresent property="agentMaxQuietTimeAllowedVal">
+ <tr>
+ <td class="ErrorField" colspan="2">
+ <span class="ErrorFieldContent"> <html:errors property="agentMaxQuietTimeAllowedVal"/></span>
+ </td>
+ </tr>
+</logic:messagesPresent>
+<logic:messagesNotPresent property="agentMaxQuietTimeAllowedVal">
+ <tr>
+ <td class="BlockContent" colspan="2">
+ </td>
+ </tr>
+</logic:messagesNotPresent>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.EnableAgentAutoUpdate"/></td>
+ <td class="BlockContent">
+ <table cellpadding="0" cellspacing="4" border="0">
+ <tr>
+ <td align="left"><html:radio property="enableAgentAutoUpdate" value="true"/><fmt:message key="yesno.true"/></td>
+ <td align="left"><html:radio property="enableAgentAutoUpdate" value="false"/><fmt:message key="yesno.false"/></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+<hq:authorization permission="superuser">
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.EnableDebugMode"/></td>
+ <td class="BlockContent">
+ <table cellpadding="0" cellspacing="4" border="0">
+ <tr>
+ <td align="left"><html:radio property="enableDebugMode" value="true"/><fmt:message key="yesno.true"/></td>
+ <td align="left"><html:radio property="enableDebugMode" value="false"/><fmt:message key="yesno.false"/></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</hq:authorization>
+
+<fmt:message var="productName" key="product.shortName" />
+<c:if test="${productName eq 'RHQ'}">
+<hq:authorization permission="superuser">
+ <tr>
+ <td class="BlockLabel"><fmt:message key="admin.settings.EnableExperimentalFeatures"/></td>
+ <td class="BlockContent">
+ <table cellpadding="0" cellspacing="4" border="0">
+ <tr>
+ <td align="left"><html:radio property="enableExperimentalFeatures" value="true"/><fmt:message key="yesno.true"/></td>
+ <td align="left"><html:radio property="enableExperimentalFeatures" value="false"/><fmt:message key="yesno.false"/></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</hq:authorization>
+</c:if>
+
+</table>
commit a943bf97ac60d3e8158b549d0e7abe19373e6e6f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Oct 28 13:51:16 2010 -0400
refactor AdministrationView and InventoryView to extend the new AbstractSectionedLeftNavigationView base class; add a new Test top view for lumping together various test views
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 dccab2c..a8bdeba 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
@@ -27,6 +27,7 @@ import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.History;
+import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window.Location;
import com.smartgwt.client.core.KeyIdentifier;
import com.smartgwt.client.types.Overflow;
@@ -47,8 +48,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.ResourceT
import org.rhq.enterprise.gui.coregui.client.menu.MenuBarView;
import org.rhq.enterprise.gui.coregui.client.report.ReportTopView;
import org.rhq.enterprise.gui.coregui.client.report.tag.TaggedView;
-import org.rhq.enterprise.gui.coregui.client.test.TestConfigurationView;
-import org.rhq.enterprise.gui.coregui.client.test.TestGroupConfigurationView;
+import org.rhq.enterprise.gui.coregui.client.test.TestTopView;
import org.rhq.enterprise.gui.coregui.client.util.ErrorHandler;
import org.rhq.enterprise.gui.coregui.client.util.WidgetUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.MessageBar;
@@ -56,6 +56,8 @@ import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
+ * The GWT {@link EntryPoint entry point} to the RHQ GUI.
+ *
* @author Greg Hinkle
* @author Ian Springer
*/
@@ -192,11 +194,11 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
Canvas canvas;
if (breadcrumbName.equals(AdministrationView.VIEW_ID)) {
- canvas = new AdministrationView("Admin");
+ canvas = new AdministrationView();
} else if (breadcrumbName.equals(DemoCanvas.VIEW_ID)) {
canvas = new DemoCanvas();
} else if (breadcrumbName.equals(InventoryView.VIEW_ID)) {
- canvas = new InventoryView("Inventory");
+ canvas = new InventoryView();
} else if (breadcrumbName.equals(ResourceTopView.VIEW_ID)) {
canvas = new ResourceTopView("Resource");
} else if (breadcrumbName.equals(ResourceGroupTopView.VIEW_ID)) {
@@ -215,11 +217,9 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
} else if (breadcrumbName.equals("Subsystems")) {
canvas = new AlertHistoryView("Alert");
} else if (breadcrumbName.equals(ReportTopView.VIEW_ID)) {
- canvas = new ReportTopView("Report");
- } else if (breadcrumbName.equals(TestConfigurationView.VIEW_ID)) {
- canvas = new TestConfigurationView("TestConfig");
- } else if (breadcrumbName.equals(TestGroupConfigurationView.VIEW_ID)) {
- canvas = new TestGroupConfigurationView("TestGroupConfig");
+ canvas = new ReportTopView();
+ } else if (breadcrumbName.equals(TestTopView.VIEW_ID)) {
+ canvas = new TestTopView();
} else {
canvas = null;
}
@@ -306,7 +306,7 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
setHeight100();
}
- public void renderView(ViewPath viewPath) {
+ public void renderView(final ViewPath viewPath) {
if (viewPath.isEnd()) {
// default view
History.newItem(DEFAULT_VIEW_PATH);
@@ -321,19 +321,32 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
}
if (this.currentCanvas instanceof BookmarkableView) {
- ((BookmarkableView) this.currentCanvas).renderView(viewPath.next());
+ if (this.currentCanvas instanceof InitializableView) {
+ final InitializableView initializableView = (InitializableView)this.currentCanvas;
+ final long startTime = System.currentTimeMillis();
+ final Timer timer = new Timer() {
+ public void run() {
+ if (initializableView.isInitialized()) {
+ ((BookmarkableView)currentCanvas).renderView(viewPath.next());
+ } else {
+ long elapsedMillis = System.currentTimeMillis() - startTime;
+ if (elapsedMillis < 5000) {
+ // Reschedule the timer.
+ schedule(100);
+ }
+ }
+ }
+ };
+ if (initializableView.isInitialized()) {
+ ((BookmarkableView)currentCanvas).renderView(viewPath.next());
+ } else {
+ timer.schedule(100);
+ }
+ } else {
+ ((BookmarkableView)currentCanvas).renderView(viewPath.next());
+ }
}
- // reverting this is as it breaks rendering of single-element paths (like "#Bundles or
- // #Reports. the BookmarkableView's renderView needs to be invoked.
- //
- //if (this.currentCanvas instanceof BookmarkableView) {
- // viewPath.next();
- // if (!viewPath.isEnd()) {
- // ((BookmarkableView) this.currentCanvas).renderView(viewPath);
- // }
- //}
-
refreshBreadCrumbTrail();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/InitializableView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/InitializableView.java
new file mode 100644
index 0000000..2420649
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/InitializableView.java
@@ -0,0 +1,29 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client;
+
+/**
+ * The SmartGWT BaseWidget class provides no way to check if the widget has completed its init()/onInit(), so
+ * components that wish to provide that information can implement this interface.
+ *
+ * @author Ian Springer
+ */
+public interface InitializableView {
+ boolean isInitialized();
+}
\ No newline at end of file
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 f622596..dcd6aea 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
@@ -18,39 +18,29 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
-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.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;
-import com.smartgwt.client.widgets.tree.TreeGrid;
-import com.smartgwt.client.widgets.tree.TreeNode;
-import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-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;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
+import org.rhq.enterprise.gui.coregui.client.components.view.AbstractSectionedLeftNavigationView;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
+import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
/**
+ * The Administration top-level view.
+ *
* @author Greg Hinkle
+ * @author Ian Springer
*/
-// TODO (ips, 10/28/10): Refactor this class to extend AbstractSectionedLeftNavigationView.
-public class AdministrationView extends LocatableHLayout implements BookmarkableView {
+public class AdministrationView extends AbstractSectionedLeftNavigationView {
public static final String VIEW_ID = "Administration";
private static final String SECTION_SECURITY_VIEW_ID = "Security";
@@ -69,258 +59,137 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
private static final String PAGE_LICENSE_VIEW_ID = "License";
private static final String PAGE_PLUGINS_VIEW_ID = "Plugins";
- private ViewId currentSectionViewId;
- private ViewId currentPageViewId;
-
- private SectionStack sectionStack;
-
- private Canvas contentCanvas;
- private Canvas currentContent;
- private Map<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
-
- public AdministrationView(String locatorId) {
- super(locatorId);
+ public AdministrationView() {
+ // This is a top level view, so our locator id can simply be our view id.
+ super(VIEW_ID);
}
@Override
- protected void onInit() {
- super.onInit();
+ protected List<NavigationSection> getNavigationSections() {
+ List<NavigationSection> sections = new ArrayList<NavigationSection>();
- setWidth100();
- setHeight100();
+ NavigationSection securitySection = buildSecuritySection();
+ sections.add(securitySection);
- contentCanvas = new Canvas();
- contentCanvas.setWidth("*");
- contentCanvas.setHeight100();
+ NavigationSection topologySection = buildTopologySection();
+ sections.add(topologySection);
- sectionStack = new LocatableSectionStack(this.getLocatorId());
- sectionStack.setShowResizeBar(true);
- sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
- sectionStack.setWidth(250);
- sectionStack.setHeight100();
+ NavigationSection configurationSection = buildConfigurationSection();
+ sections.add(configurationSection);
- addSection(buildSecuritySection());
- addSection(buildSystemConfigurationSection());
- addSection(buildTopologySection());
-
- addMember(sectionStack);
- addMember(contentCanvas);
+ return sections;
}
- private void addSection(final TreeGrid treeGrid) {
- final String sectionName = treeGrid.getTree().getRoot().getName();
- this.treeGrids.put(sectionName, treeGrid);
-
- 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;
- CoreGUI.goToView(viewPath);
- }
- }
- });
-
- SectionStackSection section = new SectionStackSection(sectionName);
- section.setExpanded(true);
- section.addItem(treeGrid);
-
- this.sectionStack.addSection(section);
- }
-
- private HTMLFlow defaultView() {
+ protected HTMLFlow defaultView() {
String contents = "<h1>Administration</h1>\n"
+ "From this section, the RHQ global settings can be administered. This includes configuring \n"
- + "<a href=\"\">Security</a>, setting up <a href=\"\">Plugins</a> and other stuff.";
+ + "<a href=\"\">Security</a>, setting up <a href=\"\">Plugins</a> and various other stuff.";
HTMLFlow flow = new HTMLFlow(contents);
flow.setPadding(20);
return flow;
}
- private TreeGrid buildSecuritySection() {
-
- final TreeGrid securityTreeGrid = new LocatableTreeGrid(SECTION_SECURITY_VIEW_ID);
- securityTreeGrid.setLeaveScrollbarGap(false);
- securityTreeGrid.setShowHeader(false);
-
- Tree tree = new Tree();
- final TreeNode manageUsersNode = new EnhancedTreeNode(UsersView.VIEW_ID);
- manageUsersNode.setIcon("global/User_16.png");
-
- final TreeNode manageRolesNode = new EnhancedTreeNode(RolesView.VIEW_ID);
- manageRolesNode.setIcon("global/Role_16.png");
-
- final TreeNode remoteAgentInstall = new EnhancedTreeNode(RemoteAgentInstallView.VIEW_ID);
- remoteAgentInstall.setIcon("global/Agent_16.png");
-
- TreeNode rootNode = new EnhancedTreeNode(SECTION_SECURITY_VIEW_ID, manageUsersNode, manageRolesNode,
- remoteAgentInstall);
- tree.setRoot(rootNode);
-
- securityTreeGrid.setData(tree);
-
- return securityTreeGrid;
- }
-
- private TreeGrid buildTopologySection() {
-
- final TreeGrid mgmtClusterTreeGrid = new LocatableTreeGrid(SECTION_TOPOLOGY_VIEW_ID);
- mgmtClusterTreeGrid.setLeaveScrollbarGap(false);
- mgmtClusterTreeGrid.setShowHeader(false);
-
- Tree tree = new Tree();
- final TreeNode manageServersNode = new EnhancedTreeNode(PAGE_SERVERS_VIEW_ID);
- final TreeNode manageAgentsNode = new EnhancedTreeNode(PAGE_AGENTS_VIEW_ID);
- final TreeNode manageAffinityGroupsNode = new EnhancedTreeNode(PAGE_AFFINITY_GROUPS_VIEW_ID);
- final TreeNode managePartitionEventsNode = new EnhancedTreeNode(PAGE_PARTITION_EVENTS_VIEW_ID);
-
- TreeNode rootNode = new EnhancedTreeNode(SECTION_TOPOLOGY_VIEW_ID, manageServersNode, manageAgentsNode,
- manageAffinityGroupsNode, managePartitionEventsNode);
- tree.setRoot(rootNode);
+ private NavigationSection buildSecuritySection() {
+ NavigationItem usersItem = new NavigationItem(UsersView.VIEW_ID, "global/User_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new UsersView(extendLocatorId("Users"));
+ }
+ });
- mgmtClusterTreeGrid.setData(tree);
+ NavigationItem rolesItem = new NavigationItem(RolesView.VIEW_ID, "global/Role_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new RolesView(extendLocatorId("Roles"));
+ }
+ });
- return mgmtClusterTreeGrid;
+ return new NavigationSection(SECTION_SECURITY_VIEW_ID, usersItem, rolesItem);
}
- private TreeGrid buildSystemConfigurationSection() {
-
- final TreeGrid systemConfigTreeGrid = new LocatableTreeGrid(SECTION_CONFIGURATION_VIEW_ID);
- systemConfigTreeGrid.setLeaveScrollbarGap(false);
- systemConfigTreeGrid.setShowHeader(false);
-
- Tree tree = new Tree();
- final TreeNode manageSettings = new EnhancedTreeNode(PAGE_SYSTEM_SETTINGS_VIEW_ID);
- final TreeNode manageTemplates = new EnhancedTreeNode(PAGE_TEMPLATES_VIEW_ID);
- final TreeNode manageDownloads = new EnhancedTreeNode(PAGE_DOWNLOADS_VIEW_ID);
- final TreeNode manageLicense = new EnhancedTreeNode(PAGE_LICENSE_VIEW_ID);
- final TreeNode managePlugins = new EnhancedTreeNode(PAGE_PLUGINS_VIEW_ID);
-
- TreeNode rootNode = new EnhancedTreeNode(SECTION_CONFIGURATION_VIEW_ID, manageSettings, manageTemplates,
- manageDownloads, manageLicense, managePlugins);
- tree.setRoot(rootNode);
+ private NavigationSection buildTopologySection() {
+ NavigationItem serversItem = new NavigationItem(PAGE_SERVERS_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_SERVERS_VIEW_ID), "/rhq/ha/listServers-plain.xhtml?nomenu=true");
+ }
+ });
- systemConfigTreeGrid.setData(tree);
+ NavigationItem agentsItem = new NavigationItem(PAGE_AGENTS_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_AGENTS_VIEW_ID), "/rhq/ha/listAgents-plain.xhtml?nomenu=true");
+ }
+ });
- return systemConfigTreeGrid;
- }
+ NavigationItem affinityGroupsItem = new NavigationItem(PAGE_AFFINITY_GROUPS_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_AFFINITY_GROUPS_VIEW_ID),
+ "/rhq/ha/listAffinityGroups-plain.xhtml?nomenu=true");
+ }
+ });
- public void setContent(Canvas newContent) {
+ NavigationItem partitionEventsItem = new NavigationItem(PAGE_PARTITION_EVENTS_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_PARTITION_EVENTS_VIEW_ID),
+ "/rhq/ha/listPartitionEvents-plain.xhtml?nomenu=true");
+ }
+ });
- // A call to destroy (e.g. certain IFrames/FullHTMLPane) can actually remove multiple children of the
- // contentCanvas. As such, we need to query for the children after each destroy to ensure only valid children
- // are in the array.
- Canvas[] children;
- while ((children = contentCanvas.getChildren()).length > 0) {
- children[0].destroy();
- }
+ NavigationItem remoteAgentInstallItem = new NavigationItem(RemoteAgentInstallView.VIEW_ID, "global/Agent_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new RemoteAgentInstallView(extendLocatorId("RemoteAgentInstall"));
+ }
+ });
- contentCanvas.addChild(newContent);
- contentCanvas.markForRedraw();
- currentContent = newContent;
+ return new NavigationSection(SECTION_TOPOLOGY_VIEW_ID, serversItem, agentsItem, affinityGroupsItem,
+ partitionEventsItem, remoteAgentInstallItem);
}
- private void renderContentView(ViewPath viewPath) {
- currentSectionViewId = viewPath.getCurrent();
- currentPageViewId = viewPath.getNext();
-
- String sectionName = currentSectionViewId.getPath();
- String pageName = currentPageViewId.getPath();
-
- Canvas content = null;
- if (SECTION_SECURITY_VIEW_ID.equals(sectionName)) {
-
- if (UsersView.VIEW_ID.equals(pageName)) {
- content = new UsersView(this.extendLocatorId("Users"));
- } else if (RolesView.VIEW_ID.equals(pageName)) {
- content = new RolesView(this.extendLocatorId("Roles"));
- } else if (RemoteAgentInstallView.VIEW_ID.equals(pageName)) {
- content = new RemoteAgentInstallView(this.extendLocatorId("RemoteAgentInstall"));
- }
- } else if (SECTION_CONFIGURATION_VIEW_ID.equals(sectionName)) {
- String url = null;
- if (PAGE_SYSTEM_SETTINGS_VIEW_ID.equals(pageName)) {
- 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)) {
- url = "/admin/license/LicenseAdmin.do?mode=view";
- } else if (PAGE_PLUGINS_VIEW_ID.equals(pageName)) {
- url = "/rhq/admin/plugin/plugin-list-plain.xhtml";
- }
- if (url != null) {
- url = addQueryStringParam(url, "nomenu=true");
- content = new FullHTMLPane(this.extendLocatorId(pageName), url);
+ private NavigationSection buildConfigurationSection() {
+ NavigationItem systemSettingsItem = new NavigationItem(PAGE_SYSTEM_SETTINGS_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_SYSTEM_SETTINGS_VIEW_ID),
+ "/admin/config/Config.do?mode=edit&nomenu=true");
}
+ });
- } else if (SECTION_TOPOLOGY_VIEW_ID.equals(sectionName)) {
- String url = null;
- if (PAGE_SERVERS_VIEW_ID.equals(pageName)) {
- url = "/rhq/ha/listServers-plain.xhtml";
- } else if (PAGE_AGENTS_VIEW_ID.equals(pageName)) {
- url = "/rhq/ha/listAgents-plain.xhtml";
- } else if (PAGE_AFFINITY_GROUPS_VIEW_ID.equals(pageName)) {
- url = "/rhq/ha/listAffinityGroups-plain.xhtml";
- } else if (PAGE_PARTITION_EVENTS_VIEW_ID.equals(pageName)) {
- url = "/rhq/ha/listPartitionEvents-plain.xhtml";
+ NavigationItem templatesItem = new NavigationItem(PAGE_TEMPLATES_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceTypeTreeView(extendLocatorId(PAGE_TEMPLATES_VIEW_ID));
}
- content = new FullHTMLPane(this.extendLocatorId(pageName), url);
- }
-
- // when changing sections make sure the previous section's selection is deselected
- selectSectionPageTreeGridNode(sectionName, pageName);
-
- // ignore clicks on subsection folder nodes
- if (null != content) {
- setContent(content);
+ });
- if (content instanceof BookmarkableView) {
- ((BookmarkableView) content).renderView(viewPath.next().next());
+ NavigationItem downloadsItem = new NavigationItem(PAGE_DOWNLOADS_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_DOWNLOADS_VIEW_ID),
+ "/rhq/admin/downloads-body.xhtml?nomenu=true");
}
- }
- }
+ });
- public void renderView(ViewPath viewPath) {
- if (!viewPath.isCurrent(currentSectionViewId) || !viewPath.isNext(currentPageViewId)) {
- if (viewPath.isEnd()) {
- // Display default view
- setContent(defaultView());
- } else {
- renderContentView(viewPath);
+ NavigationItem licenseItem = new NavigationItem(PAGE_LICENSE_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_LICENSE_VIEW_ID),
+ "/admin/license/LicenseAdmin.do?mode=view&nomenu=true");
}
- } else {
- if (this.currentContent instanceof BookmarkableView) {
- ((BookmarkableView) this.currentContent).renderView(viewPath.next().next());
- }
- }
- }
+ });
- 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");
- }
+ NavigationItem pluginsItem = new NavigationItem(PAGE_PLUGINS_VIEW_ID, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId(PAGE_PLUGINS_VIEW_ID),
+ "/rhq/admin/plugin/plugin-list-plain.xhtml?nomenu=true");
}
- }
- }
+ });
- private static String addQueryStringParam(String url, String param) {
- char separatorChar = (url.indexOf('?') == -1) ? '?' : '&';
- return url + separatorChar + param;
+ return new NavigationSection(SECTION_CONFIGURATION_VIEW_ID, systemSettingsItem, templatesItem, downloadsItem,
+ licenseItem, pluginsItem);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
index 94b957f..74861c2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
@@ -35,6 +35,7 @@ import com.smartgwt.client.widgets.tree.TreeNode;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.InitializableView;
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;
@@ -50,8 +51,10 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
* @author Ian Springer
* @author Jay Shaughnessy
*/
-public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayout implements BookmarkableView {
+public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayout implements BookmarkableView,
+ InitializableView {
private String viewId;
+ private boolean initialized;
private ViewId currentSectionViewId;
private ViewId currentPageViewId;
@@ -62,12 +65,8 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
private Map<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
private Map<String, NavigationSection> sectionsByName;
- public AbstractSectionedLeftNavigationView(String locatorId) {
- this(locatorId, locatorId);
- }
-
- public AbstractSectionedLeftNavigationView(String locatorId, String viewId) {
- super(locatorId);
+ public AbstractSectionedLeftNavigationView(String viewId) {
+ super(viewId);
this.viewId = viewId;
}
@@ -93,11 +92,19 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
for (NavigationSection section : sections) {
TreeGrid treeGrid = buildTreeGridForSection(section);
addSection(treeGrid);
+ treeGrid.getTree().openAll();
this.sectionsByName.put(section.getName(), section);
}
addMember(sectionStack);
addMember(contentCanvas);
+
+ this.initialized = true;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return this.initialized;
}
protected abstract Canvas defaultView();
@@ -115,6 +122,7 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
NavigationItem item = navigationItems.get(i);
final TreeNode treeNode = new EnhancedTreeNode(item.getName());
treeNode.setIcon(item.getIcon());
+ treeNode.setEnabled(item.isEnabled());
treeNodes[i] = treeNode;
}
@@ -167,23 +175,28 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
}
private void renderContentView(ViewPath viewPath) {
- currentSectionViewId = viewPath.getCurrent();
- currentPageViewId = viewPath.getNext();
+ this.currentSectionViewId = viewPath.getCurrent();
+ this.currentPageViewId = viewPath.getNext();
- String sectionName = currentSectionViewId.getPath();
- String pageName = currentPageViewId.getPath();
+ String sectionName = this.currentSectionViewId.getPath();
+ String pageName = this.currentPageViewId.getPath();
NavigationSection section = this.sectionsByName.get(sectionName);
+ if (section == null) {
+ throw new IllegalStateException("Invalid section: " + sectionName);
+ }
NavigationItem item = section.getNavigationItem(pageName);
- // TODO: null checks for section and item.
- ViewFactory viewFactory = item.getViewFactory();
- Canvas content = viewFactory.createView();
+ if (item == null) {
+ throw new IllegalStateException("Invalid page: " + pageName);
+ }
- // When changing sections make sure the previous section's selection is deselected.
+ // When changing sections, make sure the previous section's selection is deselected.
selectSectionPageTreeGridNode(sectionName, pageName);
- // Ignore clicks on subsection folder nodes.
- if (null != content) {
+ // Only update the content pane if the item has an associated view factory.
+ ViewFactory viewFactory = item.getViewFactory();
+ Canvas content = (viewFactory != null) ? viewFactory.createView() : null;
+ if (content != null) {
setContent(content);
if (content instanceof BookmarkableView) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
index ee64e84..24e04ff 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
@@ -26,11 +26,17 @@ public class NavigationItem {
private String name;
private String icon;
private ViewFactory viewFactory;
+ private boolean enabled;
public NavigationItem(String name, String icon, ViewFactory viewFactory) {
+ this(name, icon, viewFactory, true);
+ }
+
+ public NavigationItem(String name, String icon, ViewFactory viewFactory, boolean enabled) {
this.icon = icon;
this.name = name;
this.viewFactory = viewFactory;
+ this.enabled = enabled;
}
public String getName() {
@@ -44,4 +50,8 @@ public class NavigationItem {
public ViewFactory getViewFactory() {
return viewFactory;
}
+
+ public boolean isEnabled() {
+ return enabled;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
index ca23a16..ac2890d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
@@ -18,33 +18,25 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory;
+import java.util.ArrayList;
import java.util.EnumSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.List;
import java.util.Set;
-import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
-import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
-import com.smartgwt.client.widgets.grid.events.SelectionEvent;
-import com.smartgwt.client.widgets.layout.SectionStack;
-import com.smartgwt.client.widgets.layout.SectionStackSection;
-import com.smartgwt.client.widgets.tree.Tree;
-import com.smartgwt.client.widgets.tree.TreeGrid;
-import com.smartgwt.client.widgets.tree.TreeNode;
+import com.smartgwt.client.widgets.HTMLFlow;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.group.GroupCategory;
-import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-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.components.view.AbstractSectionedLeftNavigationView;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
+import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
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;
@@ -52,293 +44,189 @@ import org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions.GroupD
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.ResourceAutodiscoveryView;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
/**
+ * The Inventory top-level view.
+ *
* @author Greg Hinkle
* @author Joseph Marques
+ * @author Ian Springer
*/
-// TODO (ips, 10/28/10): Refactor this class to extend AbstractSectionedLeftNavigationView.
-public class InventoryView extends LocatableHLayout implements BookmarkableView {
+public class InventoryView extends AbstractSectionedLeftNavigationView {
public static final String VIEW_ID = "Inventory";
- private static final String GROUPS_SECTION_VIEW_ID = "Groups";
+ // view IDs for Resources section
private static final String RESOURCES_SECTION_VIEW_ID = "Resources";
- private static final String SUBSECTION_RESOURCE_INVENTORY = "Resources";
- private static final String SUBSECTION_GROUP_INVENTORY = "Groups";
- private static final String SUBSECTION_SAVED_SEARCHES = "SavedSearches";
-
- private static final String PAGE_ADQ = "DiscoveryManager";
- private static final String PAGE_COMPATIBLE_GROUPS = "CompatibleGroups";
- private static final String PAGE_DOWN = "DownServers";
- private static final String PAGE_GROUPS = "AllGroups";
- private static final String PAGE_GROUP_DEFINITIONS = "DynagroupManager";
- private static final String PAGE_MIXED_GROUPS = "MixedGroups";
+ private static final String PAGE_AUTODISCOVERY_QUEUE = "AutodiscoveryQueue";
+ private static final String PAGE_ALL_RESOURCES = "AllResources";
private static final String PAGE_PLATFORMS = "Platforms";
- private static final String PAGE_PROBLEM_GROUPS = "ProblemGroups";
- private static final String PAGE_RESOURCES = "AllResources";
private static final String PAGE_SERVERS = "Servers";
private static final String PAGE_SERVICES = "Services";
+ private static final String PAGE_DOWN_SERVERS = "DownServers";
- private ViewId currentSectionViewId;
- private ViewId currentPageViewId;
+ // view IDs for Groups section
+ private static final String GROUPS_SECTION_VIEW_ID = "Groups";
- private Canvas contentCanvas;
- private Canvas currentContent;
- private Map<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
+ private static final String PAGE_DYNAGROUP_DEFINITIONS = "DynagroupDefinitions";
+ private static final String PAGE_ALL_GROUPS = "AllGroups";
+ private static final String PAGE_COMPATIBLE_GROUPS = "CompatibleGroups";
+ private static final String PAGE_MIXED_GROUPS = "MixedGroups";
+ private static final String PAGE_PROBLEM_GROUPS = "ProblemGroups";
- private SectionStack sectionStack;
+ private Set<Permission> globalPermissions;
- public InventoryView(String locatorId) {
- super(locatorId);
+ public InventoryView() {
+ // This is a top level view, so our locator id can simply be our view id.
+ super(VIEW_ID);
}
@Override
protected void onInit() {
- super.onInit();
-
- setWidth100();
- setHeight100();
-
- contentCanvas = new Canvas();
- contentCanvas.setWidth("*");
- contentCanvas.setHeight100();
-
- sectionStack = new LocatableSectionStack(getLocatorId());
- sectionStack.setShowResizeBar(true);
- sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
- sectionStack.setWidth(250);
- sectionStack.setHeight100();
-
GWTServiceLookup.getAuthorizationService().getExplicitGlobalPermissions(new AsyncCallback<Set<Permission>>() {
@Override
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError("Could not determine user's global permissions - assuming none.",
caught);
- finishOnInit(EnumSet.noneOf(Permission.class));
+ globalPermissions = EnumSet.noneOf(Permission.class);
+ InventoryView.super.onInit();
}
@Override
public void onSuccess(Set<Permission> result) {
- finishOnInit(result);
- }
- });
- }
-
- private void finishOnInit(Set<Permission> globalPermissions) {
- addSection(buildResourcesSection(globalPermissions));
- addSection(buildGroupsSection(globalPermissions));
-
- addMember(sectionStack);
- addMember(contentCanvas);
- }
-
- private void addSection(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();
- String viewPath = InventoryView.VIEW_ID + "/" + sectionName + "/" + pageName;
- String currentViewPath = History.getToken();
- if (!currentViewPath.startsWith(viewPath)) {
- CoreGUI.goToView(viewPath);
- }
- }
+ globalPermissions = result;
+ InventoryView.super.onInit();
}
});
-
- SectionStackSection section = new SectionStackSection(sectionName);
- section.setExpanded(true);
- section.addItem(treeGrid);
-
- this.sectionStack.addSection(section);
}
- private TreeGrid buildResourcesSection(Set<Permission> globalPermissions) {
- final TreeNode discoveryQueue = new EnhancedTreeNode(PAGE_ADQ);
- discoveryQueue.setEnabled(globalPermissions.contains(Permission.MANAGE_INVENTORY));
- discoveryQueue.setIcon("global/Recent_16.png");
-
- final TreeNode onlyPlatforms = new EnhancedTreeNode(PAGE_PLATFORMS);
- onlyPlatforms.setIcon("types/Platform_up_16.png");
-
- final TreeNode onlyServers = new EnhancedTreeNode(PAGE_SERVERS);
- onlyServers.setIcon("types/Server_up_16.png");
-
- final TreeNode onlyServices = new EnhancedTreeNode(PAGE_SERVICES);
- onlyServices.setIcon("types/Service_up_16.png");
-
- final TreeNode inventory = new EnhancedTreeNode(SUBSECTION_RESOURCE_INVENTORY, onlyPlatforms, onlyServers,
- onlyServices);
-
- final TreeNode downServers = new EnhancedTreeNode(PAGE_DOWN);
- downServers.setIcon("types/Server_down_16.png");
-
- final TreeNode savedSearches = new EnhancedTreeNode(SUBSECTION_SAVED_SEARCHES, downServers);
-
- TreeGrid treeGrid = new LocatableTreeGrid(RESOURCES_SECTION_VIEW_ID);
- treeGrid.setShowHeader(false);
- Tree tree = new Tree();
- TreeNode rootNode = new TreeNode(RESOURCES_SECTION_VIEW_ID, discoveryQueue, inventory, savedSearches);
- tree.setRoot(rootNode);
- treeGrid.setData(tree);
-
- treeGrid.getTree().openAll();
- treeGrids.put(RESOURCES_SECTION_VIEW_ID, treeGrid);
-
- return treeGrid;
+ protected Canvas defaultView() {
+ String contents = "<h1>Inventory</h1>\n"
+ + "From this section, newly discovered Resources, inventoried Resources, and Groups can be viewed and managed.";
+ HTMLFlow flow = new HTMLFlow(contents);
+ flow.setPadding(20);
+ return flow;
}
- private TreeGrid buildGroupsSection(Set<Permission> globalPermissions) {
- final TreeNode groupGroupDefinitions = new EnhancedTreeNode(PAGE_GROUP_DEFINITIONS);
- groupGroupDefinitions.setEnabled(globalPermissions.contains(Permission.MANAGE_INVENTORY));
- groupGroupDefinitions.setIcon("types/GroupDefinition_16.png");
-
- final TreeNode onlyCompatible = new EnhancedTreeNode(PAGE_COMPATIBLE_GROUPS);
- onlyCompatible.setIcon("types/Cluster_up_16.png");
- final TreeNode onlyMixed = new EnhancedTreeNode(PAGE_MIXED_GROUPS);
- onlyMixed.setIcon("types/Group_up_16.png");
-
- final TreeNode inventory = new EnhancedTreeNode(SUBSECTION_GROUP_INVENTORY, onlyCompatible, onlyMixed);
-
- final TreeNode problemGroups = new EnhancedTreeNode(PAGE_PROBLEM_GROUPS);
- problemGroups.setIcon("types/Cluster_down_16.png");
- final TreeNode savedSearches = new EnhancedTreeNode(SUBSECTION_SAVED_SEARCHES, problemGroups);
+ @Override
+ protected List<NavigationSection> getNavigationSections() {
+ List<NavigationSection> sections = new ArrayList<NavigationSection>();
- TreeGrid treeGrid = new LocatableTreeGrid(GROUPS_SECTION_VIEW_ID);
- treeGrid.setShowHeader(false);
- Tree tree = new Tree();
- TreeNode rootNode = new EnhancedTreeNode(GROUPS_SECTION_VIEW_ID, groupGroupDefinitions, inventory,
- savedSearches);
- tree.setRoot(rootNode);
- treeGrid.setData(tree);
+ NavigationSection resourcesSection = buildResourcesSection();
+ sections.add(resourcesSection);
- treeGrid.getTree().openAll();
- treeGrids.put(GROUPS_SECTION_VIEW_ID, treeGrid);
+ NavigationSection groupsSection = buildGroupsSection();
+ sections.add(groupsSection);
- return treeGrid;
+ return sections;
}
- public void setContent(Canvas newContent) {
- for (Canvas child : this.contentCanvas.getChildren()) {
- child.destroy();
- }
- this.contentCanvas.addChild(newContent);
- this.contentCanvas.markForRedraw();
- this.currentContent = newContent;
- }
- private void renderContentView(ViewPath viewPath) {
- currentSectionViewId = viewPath.getCurrent();
- currentPageViewId = viewPath.getNext();
+ private NavigationSection buildResourcesSection() {
+ NavigationItem autodiscoveryQueueItem = new NavigationItem(PAGE_AUTODISCOVERY_QUEUE, "global/Recent_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceAutodiscoveryView(extendLocatorId(PAGE_AUTODISCOVERY_QUEUE));
+ }
+ }, this.globalPermissions.contains(Permission.MANAGE_INVENTORY));
- String sectionName = currentSectionViewId.getPath();
- String pageName = currentPageViewId.getPath();
+ // TODO: Specify an icon for this item.
+ NavigationItem allResourcesItem = new NavigationItem(PAGE_ALL_RESOURCES, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceSearchView(extendLocatorId(PAGE_ALL_RESOURCES), null, PAGE_ALL_RESOURCES,
+ "types/Platform_up_24.png", "types/Server_up_24.png", "types/Service_up_24.png");
+ }
+ });
- Canvas content = null;
- if (RESOURCES_SECTION_VIEW_ID.equals(sectionName)) {
- if (PAGE_PLATFORMS.equals(pageName)) {
- content = new ResourceSearchView(extendLocatorId("Platforms"), new Criteria(
+ NavigationItem platformsItem = new NavigationItem(PAGE_PLATFORMS, "types/Platform_up_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceSearchView(extendLocatorId(PAGE_PLATFORMS), new Criteria(
ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.PLATFORM.name()), PAGE_PLATFORMS,
"types/Platform_up_24.png");
- } else if (PAGE_SERVERS.equals(pageName)) {
- content = new ResourceSearchView(extendLocatorId("Servers"), new Criteria(
+ }
+ });
+
+ NavigationItem serversItem = new NavigationItem(PAGE_SERVERS, "types/Server_up_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceSearchView(extendLocatorId(PAGE_SERVERS), new Criteria(
ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVER.name()), PAGE_SERVERS,
"types/Server_up_24.png");
- } else if (PAGE_SERVICES.equals(pageName)) {
- content = new ResourceSearchView(extendLocatorId("Services"), new Criteria(
+ }
+ });
+
+ NavigationItem servicesItem = new NavigationItem(PAGE_SERVICES, "types/Service_up_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceSearchView(extendLocatorId(PAGE_SERVICES), new Criteria(
ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVICE.name()), PAGE_SERVICES,
"types/Service_up_24.png");
- } else if (PAGE_ADQ.equals(pageName)) {
- content = new ResourceAutodiscoveryView(this.extendLocatorId("ADQ"));
- } else if (PAGE_DOWN.equals(pageName)) {
+ }
+ });
+
+ NavigationItem downServersItem = new NavigationItem(PAGE_DOWN_SERVERS, "types/Server_down_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
Criteria criteria = new Criteria(ResourceDataSourceField.AVAILABILITY.propertyName(),
AvailabilityType.DOWN.name());
criteria.addCriteria(ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVER.name());
- content = new ResourceSearchView(extendLocatorId("DownResources"), criteria, PAGE_DOWN);
- } else { // selected the Inventory node itself
- content = new ResourceSearchView(extendLocatorId("AllResources"), null, PAGE_RESOURCES,
- "types/Platform_up_24.png", "types/Server_up_24.png", "types/Service_up_24.png");
- }
- } else if (GROUPS_SECTION_VIEW_ID.equals(sectionName)) {
- if (PAGE_COMPATIBLE_GROUPS.equals(pageName)) {
- 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(
- 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)) {
- //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"), "Problem Groups", "types/Cluster_down_16.png");
- } else { // selected the Inventory node itself
- content = new ResourceGroupListView(extendLocatorId("AllGroups"), null, "All Groups",
- "types/Cluster_up_24.png", "types/Group_up_24.png");
+ // TODO (ips, 10/28/10): Should we include down platforms too?
+ return new ResourceSearchView(extendLocatorId(PAGE_DOWN_SERVERS), criteria, "Down Servers");
}
- }
+ });
- // when changing sections make sure the previous section's selection is deselected
- selectSectionPageTreeGridNode(sectionName, pageName);
+ return new NavigationSection(RESOURCES_SECTION_VIEW_ID, autodiscoveryQueueItem, allResourcesItem, platformsItem,
+ serversItem, servicesItem, downServersItem);
+ }
- // ignore clicks on subsection folder nodes
- if (null != content) {
- setContent(content);
+ private NavigationSection buildGroupsSection() {
+ NavigationItem dynagroupDefinitionsItem = new NavigationItem(PAGE_DYNAGROUP_DEFINITIONS, "types/GroupDefinition_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ // TODO: Do we have a 24x24 groupdef icon?
+ return new GroupDefinitionListView(extendLocatorId(PAGE_DYNAGROUP_DEFINITIONS), "types/GroupDefinition_16.png");
+ }
+ }, this.globalPermissions.contains(Permission.MANAGE_INVENTORY));
- if (content instanceof BookmarkableView) {
- ((BookmarkableView) content).renderView(viewPath.next().next());
+ NavigationItem allGroupsItem = new NavigationItem(PAGE_ALL_GROUPS, "types/Group_up_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceGroupListView(extendLocatorId(PAGE_ALL_GROUPS), null, "All Groups",
+ "types/Cluster_up_24.png", "types/Group_up_24.png");
}
- }
- }
+ });
- 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");
- }
+ NavigationItem compatibleGroupsItem = new NavigationItem(PAGE_COMPATIBLE_GROUPS, "types/Cluster_up_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceGroupListView(extendLocatorId(PAGE_COMPATIBLE_GROUPS), new Criteria(
+ ResourceGroupDataSourceField.CATEGORY.propertyName(), GroupCategory.COMPATIBLE.name()),
+ "Compatible Groups", "types/Cluster_up_24.png");
}
- }
- }
+ });
- public void renderView(ViewPath viewPath) {
- if (!viewPath.isCurrent(currentSectionViewId) || !viewPath.isNext(currentPageViewId)) {
- if (viewPath.isEnd()) {
- // i.e. "Inventory"
- // Currently, leave content empty until the user selects something from section stack. To default
- // to platform list uncomment following line.
- // History.newItem("Inventory/Resources/Platforms", true);
- } else {
- // e.g. Inventory/Administration"
- renderContentView(viewPath);
+ NavigationItem mixedGroupsItem = new NavigationItem(PAGE_MIXED_GROUPS, "types/Group_up_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new ResourceGroupListView(extendLocatorId(PAGE_MIXED_GROUPS), new Criteria(
+ ResourceGroupDataSourceField.CATEGORY.propertyName(), GroupCategory.MIXED.name()), "Mixed Groups",
+ "types/Group_up_24.png");
}
- } else {
- if (this.currentContent instanceof BookmarkableView) {
- ((BookmarkableView) this.currentContent).renderView(viewPath.next().next());
+ });
+
+ NavigationItem problemGroupsItem = new NavigationItem(PAGE_PROBLEM_GROUPS, "types/Cluster_down_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ // TODO: There is no underlying support for this criteria. Also, there should not be an active New
+ // button on this page.
+ return new ResourceGroupListView(extendLocatorId(PAGE_PROBLEM_GROUPS),
+ new Criteria("availability", "down"), "Problem Groups", "types/Cluster_down_16.png");
}
- }
+ });
+
+ return new NavigationSection(GROUPS_SECTION_VIEW_ID, dynagroupDefinitionsItem, allGroupsItem,
+ compatibleGroupsItem, mixedGroupsItem, problemGroupsItem);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
index f7c37ee..ea2eb8c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
@@ -45,9 +45,10 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
* @author Joseph Marques
*/
public class GroupDefinitionListView extends TableSection {
+ private static final String TITLE = "Dynagroup Definitions";
public GroupDefinitionListView(String locatorId, String headerIcon) {
- super(locatorId, "Dynamic Group Definitions");
+ super(locatorId, TITLE);
setHeaderIcon(headerIcon);
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 70126e3..0b954fc 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
@@ -59,12 +59,13 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
* @author Greg Hinkle
*/
public class ResourceAutodiscoveryView extends LocatableVLayout {
+ private static final String TITLE = "Autodiscovery Queue";
+ private static final String HEADER_ICON = "global/Recent_16.png";
- private boolean simple = false;
+ private boolean simple;
private TreeGrid treeGrid;
private ToolStrip footer;
- private DataSource dataSource = null;
- private String headerIcon = "global/Recent_16.png";
+ private DataSource dataSource;
private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
@@ -85,13 +86,13 @@ public class ResourceAutodiscoveryView extends LocatableVLayout {
super.onInit();
if (!simple) {
- Img img = new Img(headerIcon, 24, 24);
+ Img img = new Img(HEADER_ICON, 24, 24);
img.setPadding(4);
HTMLFlow title = new HTMLFlow();
title.setWidth100();
title.setHeight(35);
- title.setContents("Discovery Manager");
+ title.setContents(TITLE);
title.setPadding(4);
title.setStyleName("HeaderLabel");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
index d5cd465..6828ef8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
@@ -41,7 +41,10 @@ import org.rhq.enterprise.gui.coregui.client.report.measurement.MeasurementOOBVi
import org.rhq.enterprise.gui.coregui.client.report.tag.TaggedView;
/**
+ * The Reports top-level view.
+ *
* @author Greg Hinkle
+ * @author Ian Springer
*/
public class ReportTopView extends AbstractSectionedLeftNavigationView {
public static final String VIEW_ID = "Reports";
@@ -49,8 +52,9 @@ public class ReportTopView extends AbstractSectionedLeftNavigationView {
private static final String SUBSYSTEMS_SECTION_VIEW_ID = "Subsystems";
private static final String INVENTORY_SECTION_VIEW_ID = "Inventory";
- public ReportTopView(String locatorId) {
- super(locatorId, VIEW_ID);
+ public ReportTopView() {
+ // This is a top level view, so our locator id can simply be our view id.
+ super(VIEW_ID);
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java
deleted file mode 100644
index 89d7d53..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.test;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertyList;
-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.ConfigurationTemplate;
-import org.rhq.core.domain.configuration.definition.PropertyDefinition;
-import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration;
-import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
-import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
-import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
-import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition;
-import org.rhq.core.domain.configuration.definition.PropertySimpleType;
-
-/**
- * A utility class that provides methods for creating a test {@link ConfigurationDefinition} and a
- * {@link Configuration} that conforms to that definition.
- *
- * @author Ian Springer
- */
-public abstract class TestConfigurationFactory {
- public static ConfigurationDefinition createConfigurationDefinition() {
- ConfigurationDefinition configDef = new ConfigurationDefinition("TestConfig", "a test config");
-
- ConfigurationTemplate defaultTemplate = new ConfigurationTemplate(ConfigurationTemplate.DEFAULT_TEMPLATE_NAME, "default template");
- configDef.putTemplate(defaultTemplate);
- Configuration defaultConfiguration = new Configuration();
- defaultTemplate.setConfiguration(defaultConfiguration);
-
- Map<String, PropertyDefinition> propertyDefinitions = new HashMap<String, PropertyDefinition>();
- configDef.setPropertyDefinitions(propertyDefinitions);
-
- int orderIndex = 0;
-
- PropertyDefinitionSimple simplePropDef;
-
- simplePropDef = createStringPropDef1();
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- simplePropDef = createStringPropDef2();
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- simplePropDef = new PropertyDefinitionSimple("LongString", "a Long String simple prop", false,
- PropertySimpleType.LONG_STRING);
- simplePropDef.setDisplayName(simplePropDef.getName());
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- simplePropDef = new PropertyDefinitionSimple("Password", "a Password simple prop", false,
- PropertySimpleType.PASSWORD);
- simplePropDef.setDisplayName(simplePropDef.getName());
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- simplePropDef = new PropertyDefinitionSimple("Boolean", "a required Boolean simple prop", true,
- PropertySimpleType.BOOLEAN);
- simplePropDef.setDisplayName(simplePropDef.getName());
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
- simplePropDef.setRequired(true);
-
- simplePropDef = createIntegerPropDef();
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- simplePropDef = new PropertyDefinitionSimple("Float", "a Float simple prop", false, PropertySimpleType.FLOAT);
- simplePropDef.setDisplayName(simplePropDef.getName());
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- simplePropDef = new PropertyDefinitionSimple("StringEnum1",
- "a String enum prop with <=5 items - should be rendered as radio buttons", false,
- PropertySimpleType.STRING);
- simplePropDef.setDisplayName(simplePropDef.getName());
- defaultConfiguration.put(new PropertySimple("StringEnum1", "NJ"));
- ArrayList<PropertyDefinitionEnumeration> propDefEnums = new ArrayList<PropertyDefinitionEnumeration>();
- propDefEnums.add(new PropertyDefinitionEnumeration("NY", "NY"));
- propDefEnums.add(new PropertyDefinitionEnumeration("NJ", "NJ"));
- propDefEnums.add(new PropertyDefinitionEnumeration("PA", "PA"));
- simplePropDef.setEnumeratedValues(propDefEnums, false);
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- simplePropDef = new PropertyDefinitionSimple("StringEnum2",
- "a String enum prop with >5 items - should be rendered as a popup menu", false, PropertySimpleType.STRING);
- simplePropDef.setDisplayName(simplePropDef.getName());
- defaultConfiguration.put(new PropertySimple("StringEnum2", "blue"));
- propDefEnums = new ArrayList<PropertyDefinitionEnumeration>();
- propDefEnums.add(new PropertyDefinitionEnumeration("red", "red"));
- propDefEnums.add(new PropertyDefinitionEnumeration("orange", "orange"));
- propDefEnums.add(new PropertyDefinitionEnumeration("yellow", "yellow"));
- propDefEnums.add(new PropertyDefinitionEnumeration("green", "green"));
- propDefEnums.add(new PropertyDefinitionEnumeration("blue", "blue"));
- propDefEnums.add(new PropertyDefinitionEnumeration("purple", "purple"));
- simplePropDef.setEnumeratedValues(propDefEnums, false);
- addPropertyDefinition(configDef, simplePropDef, orderIndex++);
-
- PropertyDefinitionMap mapPropDef = new PropertyDefinitionMap("MapOfSimples", "a map of simples", false);
- mapPropDef.put(createStringPropDef1());
- mapPropDef.put(createStringPropDef2());
- mapPropDef.put(createIntegerPropDef());
- mapPropDef.setDisplayName(mapPropDef.getName());
- addPropertyDefinition(configDef, mapPropDef, orderIndex++);
-
- PropertyDefinitionMap openMapPropDef = new PropertyDefinitionMap("OpenMapOfSimples", "an open map of simples",
- false);
- openMapPropDef.setDisplayName(openMapPropDef.getName());
- addPropertyDefinition(configDef, openMapPropDef, orderIndex++);
-
- PropertyDefinitionMap readOnlyOpenMapPropDef = new PropertyDefinitionMap("ReadOnlyOpenMapOfSimples",
- "a read-only open map of simples", false);
- readOnlyOpenMapPropDef.setDisplayName(readOnlyOpenMapPropDef.getName());
- readOnlyOpenMapPropDef.setReadOnly(true);
- addPropertyDefinition(configDef, readOnlyOpenMapPropDef, orderIndex++);
-
- PropertyDefinitionList listOfSimplesPropDef = new PropertyDefinitionList("ListOfSimples",
- "a list of Integer simples", true, new PropertyDefinitionSimple("integer", "an integer", false,
- PropertySimpleType.INTEGER));
- listOfSimplesPropDef.setDisplayName(listOfSimplesPropDef.getName());
- addPropertyDefinition(configDef, listOfSimplesPropDef, orderIndex++);
-
- PropertyDefinitionMap mapInListPropDef =
- new PropertyDefinitionMap("MapOfSimplesInList", "a map of simples in a list", false);
- mapInListPropDef.put(createStringPropDef1());
- mapInListPropDef.put(createStringPropDef2());
- mapInListPropDef.put(createIntegerPropDef());
- mapInListPropDef.setDisplayName(mapInListPropDef.getName());
-
- PropertyDefinitionList listPropDef = new PropertyDefinitionList("ListOfMaps", "a list of maps", true,
- mapInListPropDef);
- listPropDef.setDisplayName(listPropDef.getName());
- addPropertyDefinition(configDef, listPropDef, orderIndex++);
-
- PropertyDefinitionMap mapInReadOnlyListPropDef =
- new PropertyDefinitionMap("MapOfSimplesInReadOnlyList", "a map of simples in a list", false);
- mapInReadOnlyListPropDef.put(createStringPropDef1());
- mapInReadOnlyListPropDef.put(createStringPropDef2());
- mapInReadOnlyListPropDef.put(createIntegerPropDef());
- mapInReadOnlyListPropDef.setDisplayName(mapInReadOnlyListPropDef.getName());
-
- PropertyDefinitionList readOnlyListPropDef = new PropertyDefinitionList("ReadOnlyListOfMaps",
- "a read-only list of maps", true, mapInReadOnlyListPropDef);
- readOnlyListPropDef.setDisplayName(readOnlyListPropDef.getName());
- readOnlyListPropDef.setReadOnly(true);
- addPropertyDefinition(configDef, readOnlyListPropDef, orderIndex++);
-
- PropertyGroupDefinition propertyGroupDefinition = new PropertyGroupDefinition("myGroup");
- propertyGroupDefinition.setDisplayName(propertyGroupDefinition.getName());
- propertyGroupDefinition.setDescription("this is an example group");
-
- PropertyDefinitionSimple myString = new PropertyDefinitionSimple("myString1", "my little string", true,
- PropertySimpleType.STRING);
- myString.setDisplayName(myString.getName());
- myString.setSummary(true);
- addPropertyDefinition(configDef, myString, orderIndex++);
- myString.setPropertyGroupDefinition(propertyGroupDefinition);
-
- PropertyDefinitionSimple myString2 = new PropertyDefinitionSimple("myString2", "my other little string", true,
- PropertySimpleType.STRING);
- myString2.setDisplayName(myString2.getName());
- myString2.setSummary(true);
- addPropertyDefinition(configDef, myString2, orderIndex++);
- myString2.setPropertyGroupDefinition(propertyGroupDefinition);
-
- PropertyGroupDefinition propertyGroupDefinition2 = new PropertyGroupDefinition("myGroup2");
- propertyGroupDefinition2.setDisplayName(propertyGroupDefinition2.getName());
- propertyGroupDefinition2.setDescription("this is another example group");
-
- PropertyDefinitionSimple myString3 = new PropertyDefinitionSimple("myString3", "my third string", true,
- PropertySimpleType.STRING);
- myString3.setDisplayName((myString3.getName()));
- myString3.setSummary(true);
- addPropertyDefinition(configDef, myString3, orderIndex++);
- myString3.setPropertyGroupDefinition(propertyGroupDefinition2);
-
- PropertyDefinitionSimple enumExample = new PropertyDefinitionSimple("myEnum",
- "a grouped enum prop with <=5 items", false, PropertySimpleType.STRING);
- enumExample.setDisplayName(enumExample.getName());
- defaultConfiguration.put(new PropertySimple("myEnum", "Burlington"));
- ArrayList<PropertyDefinitionEnumeration> myEnums = new ArrayList<PropertyDefinitionEnumeration>();
- myEnums.add(new PropertyDefinitionEnumeration("Burlington", "Burlington"));
- myEnums.add(new PropertyDefinitionEnumeration("Camden", "Camden"));
- myEnums.add(new PropertyDefinitionEnumeration("Gloucester", "Gloucester"));
- enumExample.setEnumeratedValues(myEnums, false);
- addPropertyDefinition(configDef, enumExample, orderIndex++);
- enumExample.setPropertyGroupDefinition(propertyGroupDefinition2);
-
- return configDef;
- }
-
- private static void addPropertyDefinition(ConfigurationDefinition configDef,
- PropertyDefinition propDef, int orderIndex) {
- propDef.setOrder(orderIndex);
- configDef.put(propDef);
- }
-
- public static Configuration createConfiguration() {
- Configuration configuration = new Configuration();
- configuration.setNotes("a test config");
- configuration.setVersion(1);
-
- configuration.put(new PropertySimple("String1", "blah"));
- configuration.put(new PropertySimple("String2",
- "a really, really, really, really, really long value that won't fit in the text input box"));
- configuration.put(new PropertySimple("LongString", "blah blah blah\nblah blah blah"));
- configuration.put(new PropertySimple("Password", null));
- configuration.put(new PropertySimple("Boolean", false));
- configuration.put(new PropertySimple("Integer", 666));
- configuration.put(new PropertySimple("Float", Math.PI));
-
- configuration.put(new PropertySimple("StringEnum1", "PA"));
- configuration.put(new PropertySimple("StringEnum2", "blue"));
-
- PropertyMap propMap1 = new PropertyMap("MapOfSimples");
- propMap1.put(new PropertySimple("String1", "One"));
- propMap1.put(new PropertySimple("String2", "Two"));
- propMap1.put(new PropertySimple("Integer", 11));
- configuration.put(propMap1);
-
- PropertyMap openPropMap1 = new PropertyMap("OpenMapOfSimples");
- openPropMap1.put(new PropertySimple("PROCESSOR_ARCHITECTURE", "x86"));
- openPropMap1.put(new PropertySimple("PROCESSOR_IDENTIFIER", "x86 Family 6 Model 15 Stepping 6, GenuineIntel"));
- openPropMap1.put(new PropertySimple("PROCESSOR_LEVEL", "6"));
- openPropMap1.put(new PropertySimple("PROCESSOR_REVISION", "0f06"));
- configuration.put(openPropMap1);
-
- PropertyMap openPropMap2 = new PropertyMap("ReadOnlyOpenMapOfSimples");
- openPropMap2.put(new PropertySimple("ANT_HOME", "C:\\opt\\ant-1.6.5"));
- openPropMap2.put(new PropertySimple("ANT_OPTS", "-Xms128M -Xmx256M"));
- configuration.put(openPropMap2);
-
- configuration.put(new PropertyList("ListOfSimples", new PropertySimple("integer", "18"), new PropertySimple(
- "integer", "127"), new PropertySimple("integer", "311"), new PropertySimple("integer", "2"), new PropertySimple(
- "integer", "301"), new PropertySimple("integer", "79"), new PropertySimple("integer", "62")));
-
- PropertyMap propMap2 = new PropertyMap("MapOfSimplesInList");
- propMap2.put(new PropertySimple("String1", "Uno"));
- propMap2.put(new PropertySimple("String2", "Dos"));
- propMap2.put(new PropertySimple("Integer", Integer.MIN_VALUE));
- PropertyMap propMap3 = new PropertyMap("MapOfSimplesInList");
- propMap3.put(new PropertySimple("String1", "Un"));
- propMap3.put(new PropertySimple("String2", "Deux"));
- propMap3.put(new PropertySimple("Integer", Integer.MAX_VALUE));
- configuration.put(new PropertyList("ListOfMaps", propMap2, propMap3));
-
- PropertyMap propMap4 = new PropertyMap("MapOfSimplesInReadOnlyList");
- propMap4.put(new PropertySimple("String1", "A"));
- propMap4.put(new PropertySimple("String2", "B"));
- propMap4.put(new PropertySimple("Integer", 999));
- PropertyMap propMap5 = new PropertyMap("MapOfSimplesInReadOnlyList");
- propMap5.put(new PropertySimple("String1", "a"));
- propMap5.put(new PropertySimple("String2", "b"));
- propMap5.put(new PropertySimple("Integer", 0));
- configuration.put(new PropertyList("ReadOnlyListOfMaps", propMap4, propMap5));
-
- configuration.put(new PropertySimple("myString1", "grouped String 1"));
- configuration.put(new PropertySimple("myString2", "grouped String 2"));
- configuration.put(new PropertySimple("myString3", "strings are cool"));
- configuration.put(new PropertySimple("myEnum", "Burlington"));
-
- return configuration;
- }
-
- private static PropertyDefinitionSimple createStringPropDef1() {
- PropertyDefinitionSimple stringPropDef1;
- stringPropDef1 = new PropertyDefinitionSimple("String1",
- "an optional String simple prop", false, PropertySimpleType.STRING);
- stringPropDef1.setDisplayName(stringPropDef1.getName());
- return stringPropDef1;
- }
-
- private static PropertyDefinitionSimple createStringPropDef2() {
- PropertyDefinitionSimple stringPropDef2;
- stringPropDef2 = new PropertyDefinitionSimple("String2",
- "a read-only String simple prop", false, PropertySimpleType.STRING);
- stringPropDef2.setDisplayName(stringPropDef2.getName());
- stringPropDef2.setReadOnly(true);
- return stringPropDef2;
- }
-
- private static PropertyDefinitionSimple createIntegerPropDef() {
- PropertyDefinitionSimple integerPropDef;
- integerPropDef = new PropertyDefinitionSimple("Integer",
- "a required summary Integer simple prop", true, PropertySimpleType.INTEGER);
- integerPropDef.setDisplayName(integerPropDef.getName());
- integerPropDef.setSummary(true);
- return integerPropDef;
- }
-
- private TestConfigurationFactory() {
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationView.java
deleted file mode 100644
index 9d94650..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationView.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.test;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-import com.smartgwt.client.widgets.layout.LayoutSpacer;
-import com.smartgwt.client.widgets.toolbar.ToolStrip;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeEvent;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeListener;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-
-/**
- * @author Ian Springer
- */
-public class TestConfigurationView
- extends LocatableVLayout implements PropertyValueChangeListener {
- public static final String VIEW_ID = "TestConfig";
-
- private ConfigurationEditor editor;
- private LocatableIButton saveButton;
- private ConfigurationDefinition configurationDefinition;
- private Configuration configuration;
-
- public TestConfigurationView(String locatorId) {
- super(locatorId);
- }
-
- @Override
- protected void onDraw() {
- super.onDraw();
- build();
- }
-
- public void build() {
- setWidth100();
- setHeight100();
-
- ToolStrip toolStrip = new ToolStrip();
- toolStrip.setWidth100();
-
- toolStrip.addMember(new LayoutSpacer());
-
- this.saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save");
- this.saveButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- save();
- }
- });
- this.saveButton.disable();
- toolStrip.addMember(this.saveButton);
-
- addMember(toolStrip);
-
- this.configurationDefinition = TestConfigurationFactory.createConfigurationDefinition();
- this.configuration = TestConfigurationFactory.createConfiguration();
-
- reloadConfiguration();
- }
-
- @Override
- public void propertyValueChanged(PropertyValueChangeEvent event) {
- MessageCenter messageCenter = CoreGUI.getMessageCenter();
- Message message;
- if (event.isValidationStateChanged()) {
- Set<String> invalidPropertyNames = event.getInvalidPropertyNames();
- if (invalidPropertyNames.isEmpty()) {
- this.saveButton.enable();
- message = new Message("All properties now have valid values, so the configuration can now be saved.",
- Message.Severity.Info, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
- }
- else {
- this.saveButton.disable();
- message = new Message(
- "The following properties have invalid values: " + invalidPropertyNames
- + " - the values must be corrected before the configuration can be saved.",
- Message.Severity.Error, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
- }
- messageCenter.notify(message);
- }
- else {
- this.saveButton.enable();
- }
- }
-
- private void reloadConfiguration() {
- this.saveButton.disable();
- if (editor != null) {
- editor.destroy();
- removeMember(editor);
- }
-
- editor = new ConfigurationEditor(extendLocatorId("Editor"), this.configurationDefinition, this.configuration);
- editor.setOverflow(Overflow.AUTO);
- editor.addPropertyValueChangeListener(this);
- addMember(editor);
- }
-
- private void save() {
- CoreGUI.getMessageCenter().notify(
- new Message("Configuration updated.", "Test configuration updated."));
- reloadConfiguration();
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java
deleted file mode 100644
index f54bb01..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.test;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Set;
-
-import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-import com.smartgwt.client.widgets.layout.LayoutSpacer;
-import com.smartgwt.client.widgets.toolbar.ToolStrip;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.GroupConfigurationEditor;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.GroupMemberConfiguration;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeEvent;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeListener;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-
-/**
- * @author Ian Springer
- */
-public class TestGroupConfigurationView
- extends LocatableVLayout implements PropertyValueChangeListener {
- public static final String VIEW_ID = "TestGroupConfig";
-
- private static final int GROUP_SIZE = 2;
-
- private ConfigurationEditor editor;
- private LocatableIButton saveButton;
- private ConfigurationDefinition configurationDefinition;
- private List<GroupMemberConfiguration> memberConfigurations;
-
- public TestGroupConfigurationView(String locatorId) {
- super(locatorId);
- }
-
- @Override
- protected void onDraw() {
- super.onDraw();
-
- setWidth100();
- setHeight100();
-
- ToolStrip toolStrip = new ToolStrip();
- toolStrip.setWidth100();
-
- toolStrip.addMember(new LayoutSpacer());
-
- this.saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save");
- this.saveButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- save();
- }
- });
- this.saveButton.disable();
- toolStrip.addMember(this.saveButton);
-
- addMember(toolStrip);
-
- this.configurationDefinition = TestConfigurationFactory.createConfigurationDefinition();
- this.memberConfigurations = new ArrayList<GroupMemberConfiguration>(GROUP_SIZE);
- for (int i = 0; i < GROUP_SIZE; i++) {
- Configuration configuration = TestConfigurationFactory.createConfiguration();
- GroupMemberConfiguration memberConfiguration = new GroupMemberConfiguration(i, "Member #" + i,
- configuration);
- this.memberConfigurations.add(memberConfiguration);
- }
-
- reloadConfiguration();
- }
-
- @Override
- public void propertyValueChanged(PropertyValueChangeEvent event) {
- MessageCenter messageCenter = CoreGUI.getMessageCenter();
- Message message;
- if (event.isValidationStateChanged()) {
- Set<String> invalidPropertyNames = event.getInvalidPropertyNames();
- if (invalidPropertyNames.isEmpty()) {
- this.saveButton.enable();
- message = new Message("All properties now have valid values, so the configuration can now be saved.",
- Message.Severity.Info, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
- }
- else {
- this.saveButton.disable();
- message = new Message(
- "The following properties have invalid values: " + invalidPropertyNames
- + " - the values must be corrected before the configuration can be saved.",
- Message.Severity.Error, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
- }
- messageCenter.notify(message);
- } else {
- this.saveButton.enable();
- }
- }
-
- private void reloadConfiguration() {
- this.saveButton.disable();
- if (editor != null) {
- editor.destroy();
- removeMember(editor);
- }
-
- editor = new GroupConfigurationEditor(extendLocatorId("Editor"), this.configurationDefinition,
- this.memberConfigurations);
- editor.setOverflow(Overflow.AUTO);
- editor.addPropertyValueChangeListener(this);
- addMember(editor);
- }
-
- private void save() {
- CoreGUI.getMessageCenter().notify(
- new Message("Member configurations updated.", "Member configurations updated."));
- reloadConfiguration();
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
new file mode 100644
index 0000000..fa345bf
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
@@ -0,0 +1,90 @@
+/*
+ * 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.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.HTMLFlow;
+
+import org.rhq.enterprise.gui.coregui.client.components.view.AbstractSectionedLeftNavigationView;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
+import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
+import org.rhq.enterprise.gui.coregui.client.test.configuration.TestConfigurationView;
+import org.rhq.enterprise.gui.coregui.client.test.configuration.TestGroupConfigurationView;
+
+/**
+ * The Test top-level view. This view is "hidden", i.e. there are no links to it, so the user must go to the URL
+ * directly using their browser.
+ *
+ * @author Ian Springer
+ */
+public class TestTopView extends AbstractSectionedLeftNavigationView {
+ public static final String VIEW_ID = "Test";
+
+ // view IDs for Configuration section
+ private static final String CONFIGURATION_SECTION_VIEW_ID = "Configuration";
+
+ private static final String PAGE_CONFIG_EDITOR = "ConfigEditor";
+ private static final String PAGE_GROUP_CONFIG_EDITOR = "GroupConfigEditor";
+
+ public TestTopView() {
+ // This is a top level view, so our locator id can simply be our view id.
+ super(VIEW_ID);
+ }
+
+ protected Canvas defaultView() {
+ String contents = "<h1>Test</h1>\n"
+ + "This section contains pages for testing various GUI components.";
+ HTMLFlow flow = new HTMLFlow(contents);
+ flow.setPadding(20);
+ return flow;
+ }
+
+ @Override
+ protected List<NavigationSection> getNavigationSections() {
+ List<NavigationSection> sections = new ArrayList<NavigationSection>();
+
+ NavigationSection configurationSection = buildConfigurationSection();
+ sections.add(configurationSection);
+
+ return sections;
+ }
+
+
+ private NavigationSection buildConfigurationSection() {
+ NavigationItem configEditorItem = new NavigationItem(PAGE_CONFIG_EDITOR, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new TestConfigurationView(extendLocatorId(PAGE_CONFIG_EDITOR));
+ }
+ });
+
+ NavigationItem groupConfigEditorItem = new NavigationItem(PAGE_GROUP_CONFIG_EDITOR, null,
+ new ViewFactory() {
+ public Canvas createView() {
+ return new TestGroupConfigurationView(extendLocatorId(PAGE_GROUP_CONFIG_EDITOR));
+ }
+ });
+
+ return new NavigationSection(CONFIGURATION_SECTION_VIEW_ID, configEditorItem, groupConfigEditorItem);
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationFactory.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationFactory.java
new file mode 100644
index 0000000..e786a36
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationFactory.java
@@ -0,0 +1,311 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.test.configuration;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertyList;
+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.ConfigurationTemplate;
+import org.rhq.core.domain.configuration.definition.PropertyDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition;
+import org.rhq.core.domain.configuration.definition.PropertySimpleType;
+
+/**
+ * A utility class that provides methods for creating a test {@link ConfigurationDefinition} and a
+ * {@link Configuration} that conforms to that definition.
+ *
+ * @author Ian Springer
+ */
+public abstract class TestConfigurationFactory {
+ public static ConfigurationDefinition createConfigurationDefinition() {
+ ConfigurationDefinition configDef = new ConfigurationDefinition("TestConfig", "a test config");
+
+ ConfigurationTemplate defaultTemplate = new ConfigurationTemplate(ConfigurationTemplate.DEFAULT_TEMPLATE_NAME, "default template");
+ configDef.putTemplate(defaultTemplate);
+ Configuration defaultConfiguration = new Configuration();
+ defaultTemplate.setConfiguration(defaultConfiguration);
+
+ Map<String, PropertyDefinition> propertyDefinitions = new HashMap<String, PropertyDefinition>();
+ configDef.setPropertyDefinitions(propertyDefinitions);
+
+ int orderIndex = 0;
+
+ PropertyDefinitionSimple simplePropDef;
+
+ simplePropDef = createStringPropDef1();
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ simplePropDef = createStringPropDef2();
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ simplePropDef = new PropertyDefinitionSimple("LongString", "a Long String simple prop", false,
+ PropertySimpleType.LONG_STRING);
+ simplePropDef.setDisplayName(simplePropDef.getName());
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ simplePropDef = new PropertyDefinitionSimple("Password", "a Password simple prop", false,
+ PropertySimpleType.PASSWORD);
+ simplePropDef.setDisplayName(simplePropDef.getName());
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ simplePropDef = new PropertyDefinitionSimple("Boolean", "a required Boolean simple prop", true,
+ PropertySimpleType.BOOLEAN);
+ simplePropDef.setDisplayName(simplePropDef.getName());
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+ simplePropDef.setRequired(true);
+
+ simplePropDef = createIntegerPropDef();
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ simplePropDef = new PropertyDefinitionSimple("Float", "a Float simple prop", false, PropertySimpleType.FLOAT);
+ simplePropDef.setDisplayName(simplePropDef.getName());
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ simplePropDef = new PropertyDefinitionSimple("StringEnum1",
+ "a String enum prop with <=5 items - should be rendered as radio buttons", false,
+ PropertySimpleType.STRING);
+ simplePropDef.setDisplayName(simplePropDef.getName());
+ defaultConfiguration.put(new PropertySimple("StringEnum1", "NJ"));
+ ArrayList<PropertyDefinitionEnumeration> propDefEnums = new ArrayList<PropertyDefinitionEnumeration>();
+ propDefEnums.add(new PropertyDefinitionEnumeration("NY", "NY"));
+ propDefEnums.add(new PropertyDefinitionEnumeration("NJ", "NJ"));
+ propDefEnums.add(new PropertyDefinitionEnumeration("PA", "PA"));
+ simplePropDef.setEnumeratedValues(propDefEnums, false);
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ simplePropDef = new PropertyDefinitionSimple("StringEnum2",
+ "a String enum prop with >5 items - should be rendered as a popup menu", false, PropertySimpleType.STRING);
+ simplePropDef.setDisplayName(simplePropDef.getName());
+ defaultConfiguration.put(new PropertySimple("StringEnum2", "blue"));
+ propDefEnums = new ArrayList<PropertyDefinitionEnumeration>();
+ propDefEnums.add(new PropertyDefinitionEnumeration("red", "red"));
+ propDefEnums.add(new PropertyDefinitionEnumeration("orange", "orange"));
+ propDefEnums.add(new PropertyDefinitionEnumeration("yellow", "yellow"));
+ propDefEnums.add(new PropertyDefinitionEnumeration("green", "green"));
+ propDefEnums.add(new PropertyDefinitionEnumeration("blue", "blue"));
+ propDefEnums.add(new PropertyDefinitionEnumeration("purple", "purple"));
+ simplePropDef.setEnumeratedValues(propDefEnums, false);
+ addPropertyDefinition(configDef, simplePropDef, orderIndex++);
+
+ PropertyDefinitionMap mapPropDef = new PropertyDefinitionMap("MapOfSimples", "a map of simples", false);
+ mapPropDef.put(createStringPropDef1());
+ mapPropDef.put(createStringPropDef2());
+ mapPropDef.put(createIntegerPropDef());
+ mapPropDef.setDisplayName(mapPropDef.getName());
+ addPropertyDefinition(configDef, mapPropDef, orderIndex++);
+
+ PropertyDefinitionMap openMapPropDef = new PropertyDefinitionMap("OpenMapOfSimples", "an open map of simples",
+ false);
+ openMapPropDef.setDisplayName(openMapPropDef.getName());
+ addPropertyDefinition(configDef, openMapPropDef, orderIndex++);
+
+ PropertyDefinitionMap readOnlyOpenMapPropDef = new PropertyDefinitionMap("ReadOnlyOpenMapOfSimples",
+ "a read-only open map of simples", false);
+ readOnlyOpenMapPropDef.setDisplayName(readOnlyOpenMapPropDef.getName());
+ readOnlyOpenMapPropDef.setReadOnly(true);
+ addPropertyDefinition(configDef, readOnlyOpenMapPropDef, orderIndex++);
+
+ PropertyDefinitionList listOfSimplesPropDef = new PropertyDefinitionList("ListOfSimples",
+ "a list of Integer simples", true, new PropertyDefinitionSimple("integer", "an integer", false,
+ PropertySimpleType.INTEGER));
+ listOfSimplesPropDef.setDisplayName(listOfSimplesPropDef.getName());
+ addPropertyDefinition(configDef, listOfSimplesPropDef, orderIndex++);
+
+ PropertyDefinitionMap mapInListPropDef =
+ new PropertyDefinitionMap("MapOfSimplesInList", "a map of simples in a list", false);
+ mapInListPropDef.put(createStringPropDef1());
+ mapInListPropDef.put(createStringPropDef2());
+ mapInListPropDef.put(createIntegerPropDef());
+ mapInListPropDef.setDisplayName(mapInListPropDef.getName());
+
+ PropertyDefinitionList listPropDef = new PropertyDefinitionList("ListOfMaps", "a list of maps", true,
+ mapInListPropDef);
+ listPropDef.setDisplayName(listPropDef.getName());
+ addPropertyDefinition(configDef, listPropDef, orderIndex++);
+
+ PropertyDefinitionMap mapInReadOnlyListPropDef =
+ new PropertyDefinitionMap("MapOfSimplesInReadOnlyList", "a map of simples in a list", false);
+ mapInReadOnlyListPropDef.put(createStringPropDef1());
+ mapInReadOnlyListPropDef.put(createStringPropDef2());
+ mapInReadOnlyListPropDef.put(createIntegerPropDef());
+ mapInReadOnlyListPropDef.setDisplayName(mapInReadOnlyListPropDef.getName());
+
+ PropertyDefinitionList readOnlyListPropDef = new PropertyDefinitionList("ReadOnlyListOfMaps",
+ "a read-only list of maps", true, mapInReadOnlyListPropDef);
+ readOnlyListPropDef.setDisplayName(readOnlyListPropDef.getName());
+ readOnlyListPropDef.setReadOnly(true);
+ addPropertyDefinition(configDef, readOnlyListPropDef, orderIndex++);
+
+ PropertyGroupDefinition propertyGroupDefinition = new PropertyGroupDefinition("myGroup");
+ propertyGroupDefinition.setDisplayName(propertyGroupDefinition.getName());
+ propertyGroupDefinition.setDescription("this is an example group");
+
+ PropertyDefinitionSimple myString = new PropertyDefinitionSimple("myString1", "my little string", true,
+ PropertySimpleType.STRING);
+ myString.setDisplayName(myString.getName());
+ myString.setSummary(true);
+ addPropertyDefinition(configDef, myString, orderIndex++);
+ myString.setPropertyGroupDefinition(propertyGroupDefinition);
+
+ PropertyDefinitionSimple myString2 = new PropertyDefinitionSimple("myString2", "my other little string", true,
+ PropertySimpleType.STRING);
+ myString2.setDisplayName(myString2.getName());
+ myString2.setSummary(true);
+ addPropertyDefinition(configDef, myString2, orderIndex++);
+ myString2.setPropertyGroupDefinition(propertyGroupDefinition);
+
+ PropertyGroupDefinition propertyGroupDefinition2 = new PropertyGroupDefinition("myGroup2");
+ propertyGroupDefinition2.setDisplayName(propertyGroupDefinition2.getName());
+ propertyGroupDefinition2.setDescription("this is another example group");
+
+ PropertyDefinitionSimple myString3 = new PropertyDefinitionSimple("myString3", "my third string", true,
+ PropertySimpleType.STRING);
+ myString3.setDisplayName((myString3.getName()));
+ myString3.setSummary(true);
+ addPropertyDefinition(configDef, myString3, orderIndex++);
+ myString3.setPropertyGroupDefinition(propertyGroupDefinition2);
+
+ PropertyDefinitionSimple enumExample = new PropertyDefinitionSimple("myEnum",
+ "a grouped enum prop with <=5 items", false, PropertySimpleType.STRING);
+ enumExample.setDisplayName(enumExample.getName());
+ defaultConfiguration.put(new PropertySimple("myEnum", "Burlington"));
+ ArrayList<PropertyDefinitionEnumeration> myEnums = new ArrayList<PropertyDefinitionEnumeration>();
+ myEnums.add(new PropertyDefinitionEnumeration("Burlington", "Burlington"));
+ myEnums.add(new PropertyDefinitionEnumeration("Camden", "Camden"));
+ myEnums.add(new PropertyDefinitionEnumeration("Gloucester", "Gloucester"));
+ enumExample.setEnumeratedValues(myEnums, false);
+ addPropertyDefinition(configDef, enumExample, orderIndex++);
+ enumExample.setPropertyGroupDefinition(propertyGroupDefinition2);
+
+ return configDef;
+ }
+
+ private static void addPropertyDefinition(ConfigurationDefinition configDef,
+ PropertyDefinition propDef, int orderIndex) {
+ propDef.setOrder(orderIndex);
+ configDef.put(propDef);
+ }
+
+ public static Configuration createConfiguration() {
+ Configuration configuration = new Configuration();
+ configuration.setNotes("a test config");
+ configuration.setVersion(1);
+
+ configuration.put(new PropertySimple("String1", "blah"));
+ configuration.put(new PropertySimple("String2",
+ "a really, really, really, really, really long value that won't fit in the text input box"));
+ configuration.put(new PropertySimple("LongString", "blah blah blah\nblah blah blah"));
+ configuration.put(new PropertySimple("Password", null));
+ configuration.put(new PropertySimple("Boolean", false));
+ configuration.put(new PropertySimple("Integer", 666));
+ configuration.put(new PropertySimple("Float", Math.PI));
+
+ configuration.put(new PropertySimple("StringEnum1", "PA"));
+ configuration.put(new PropertySimple("StringEnum2", "blue"));
+
+ PropertyMap propMap1 = new PropertyMap("MapOfSimples");
+ propMap1.put(new PropertySimple("String1", "One"));
+ propMap1.put(new PropertySimple("String2", "Two"));
+ propMap1.put(new PropertySimple("Integer", 11));
+ configuration.put(propMap1);
+
+ PropertyMap openPropMap1 = new PropertyMap("OpenMapOfSimples");
+ openPropMap1.put(new PropertySimple("PROCESSOR_ARCHITECTURE", "x86"));
+ openPropMap1.put(new PropertySimple("PROCESSOR_IDENTIFIER", "x86 Family 6 Model 15 Stepping 6, GenuineIntel"));
+ openPropMap1.put(new PropertySimple("PROCESSOR_LEVEL", "6"));
+ openPropMap1.put(new PropertySimple("PROCESSOR_REVISION", "0f06"));
+ configuration.put(openPropMap1);
+
+ PropertyMap openPropMap2 = new PropertyMap("ReadOnlyOpenMapOfSimples");
+ openPropMap2.put(new PropertySimple("ANT_HOME", "C:\\opt\\ant-1.6.5"));
+ openPropMap2.put(new PropertySimple("ANT_OPTS", "-Xms128M -Xmx256M"));
+ configuration.put(openPropMap2);
+
+ configuration.put(new PropertyList("ListOfSimples", new PropertySimple("integer", "18"), new PropertySimple(
+ "integer", "127"), new PropertySimple("integer", "311"), new PropertySimple("integer", "2"), new PropertySimple(
+ "integer", "301"), new PropertySimple("integer", "79"), new PropertySimple("integer", "62")));
+
+ PropertyMap propMap2 = new PropertyMap("MapOfSimplesInList");
+ propMap2.put(new PropertySimple("String1", "Uno"));
+ propMap2.put(new PropertySimple("String2", "Dos"));
+ propMap2.put(new PropertySimple("Integer", Integer.MIN_VALUE));
+ PropertyMap propMap3 = new PropertyMap("MapOfSimplesInList");
+ propMap3.put(new PropertySimple("String1", "Un"));
+ propMap3.put(new PropertySimple("String2", "Deux"));
+ propMap3.put(new PropertySimple("Integer", Integer.MAX_VALUE));
+ configuration.put(new PropertyList("ListOfMaps", propMap2, propMap3));
+
+ PropertyMap propMap4 = new PropertyMap("MapOfSimplesInReadOnlyList");
+ propMap4.put(new PropertySimple("String1", "A"));
+ propMap4.put(new PropertySimple("String2", "B"));
+ propMap4.put(new PropertySimple("Integer", 999));
+ PropertyMap propMap5 = new PropertyMap("MapOfSimplesInReadOnlyList");
+ propMap5.put(new PropertySimple("String1", "a"));
+ propMap5.put(new PropertySimple("String2", "b"));
+ propMap5.put(new PropertySimple("Integer", 0));
+ configuration.put(new PropertyList("ReadOnlyListOfMaps", propMap4, propMap5));
+
+ configuration.put(new PropertySimple("myString1", "grouped String 1"));
+ configuration.put(new PropertySimple("myString2", "grouped String 2"));
+ configuration.put(new PropertySimple("myString3", "strings are cool"));
+ configuration.put(new PropertySimple("myEnum", "Burlington"));
+
+ return configuration;
+ }
+
+ private static PropertyDefinitionSimple createStringPropDef1() {
+ PropertyDefinitionSimple stringPropDef1;
+ stringPropDef1 = new PropertyDefinitionSimple("String1",
+ "an optional String simple prop", false, PropertySimpleType.STRING);
+ stringPropDef1.setDisplayName(stringPropDef1.getName());
+ return stringPropDef1;
+ }
+
+ private static PropertyDefinitionSimple createStringPropDef2() {
+ PropertyDefinitionSimple stringPropDef2;
+ stringPropDef2 = new PropertyDefinitionSimple("String2",
+ "a read-only String simple prop", false, PropertySimpleType.STRING);
+ stringPropDef2.setDisplayName(stringPropDef2.getName());
+ stringPropDef2.setReadOnly(true);
+ return stringPropDef2;
+ }
+
+ private static PropertyDefinitionSimple createIntegerPropDef() {
+ PropertyDefinitionSimple integerPropDef;
+ integerPropDef = new PropertyDefinitionSimple("Integer",
+ "a required summary Integer simple prop", true, PropertySimpleType.INTEGER);
+ integerPropDef.setDisplayName(integerPropDef.getName());
+ integerPropDef.setSummary(true);
+ return integerPropDef;
+ }
+
+ private TestConfigurationFactory() {
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationView.java
new file mode 100644
index 0000000..1f7ccaf
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestConfigurationView.java
@@ -0,0 +1,133 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.test.configuration;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeEvent;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeListener;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * @author Ian Springer
+ */
+public class TestConfigurationView
+ extends LocatableVLayout implements PropertyValueChangeListener {
+ public static final String VIEW_ID = "TestConfig";
+
+ private ConfigurationEditor editor;
+ private LocatableIButton saveButton;
+ private ConfigurationDefinition configurationDefinition;
+ private Configuration configuration;
+
+ public TestConfigurationView(String locatorId) {
+ super(locatorId);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+ build();
+ }
+
+ public void build() {
+ setWidth100();
+ setHeight100();
+
+ ToolStrip toolStrip = new ToolStrip();
+ toolStrip.setWidth100();
+
+ toolStrip.addMember(new LayoutSpacer());
+
+ this.saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save");
+ this.saveButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ save();
+ }
+ });
+ this.saveButton.disable();
+ toolStrip.addMember(this.saveButton);
+
+ addMember(toolStrip);
+
+ this.configurationDefinition = TestConfigurationFactory.createConfigurationDefinition();
+ this.configuration = TestConfigurationFactory.createConfiguration();
+
+ reloadConfiguration();
+ }
+
+ @Override
+ public void propertyValueChanged(PropertyValueChangeEvent event) {
+ MessageCenter messageCenter = CoreGUI.getMessageCenter();
+ Message message;
+ if (event.isValidationStateChanged()) {
+ Set<String> invalidPropertyNames = event.getInvalidPropertyNames();
+ if (invalidPropertyNames.isEmpty()) {
+ this.saveButton.enable();
+ message = new Message("All properties now have valid values, so the configuration can now be saved.",
+ Message.Severity.Info, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
+ }
+ else {
+ this.saveButton.disable();
+ message = new Message(
+ "The following properties have invalid values: " + invalidPropertyNames
+ + " - the values must be corrected before the configuration can be saved.",
+ Message.Severity.Error, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
+ }
+ messageCenter.notify(message);
+ }
+ else {
+ this.saveButton.enable();
+ }
+ }
+
+ private void reloadConfiguration() {
+ this.saveButton.disable();
+ if (editor != null) {
+ editor.destroy();
+ removeMember(editor);
+ }
+
+ editor = new ConfigurationEditor(extendLocatorId("Editor"), this.configurationDefinition, this.configuration);
+ editor.setOverflow(Overflow.AUTO);
+ editor.addPropertyValueChangeListener(this);
+ addMember(editor);
+ }
+
+ private void save() {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Configuration updated.", "Test configuration updated."));
+ reloadConfiguration();
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestGroupConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestGroupConfigurationView.java
new file mode 100644
index 0000000..1a8b304
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/configuration/TestGroupConfigurationView.java
@@ -0,0 +1,142 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.test.configuration;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.GroupConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.GroupMemberConfiguration;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeEvent;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeListener;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * @author Ian Springer
+ */
+public class TestGroupConfigurationView
+ extends LocatableVLayout implements PropertyValueChangeListener {
+ public static final String VIEW_ID = "TestGroupConfig";
+
+ private static final int GROUP_SIZE = 2;
+
+ private ConfigurationEditor editor;
+ private LocatableIButton saveButton;
+ private ConfigurationDefinition configurationDefinition;
+ private List<GroupMemberConfiguration> memberConfigurations;
+
+ public TestGroupConfigurationView(String locatorId) {
+ super(locatorId);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ setWidth100();
+ setHeight100();
+
+ ToolStrip toolStrip = new ToolStrip();
+ toolStrip.setWidth100();
+
+ toolStrip.addMember(new LayoutSpacer());
+
+ this.saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save");
+ this.saveButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ save();
+ }
+ });
+ this.saveButton.disable();
+ toolStrip.addMember(this.saveButton);
+
+ addMember(toolStrip);
+
+ this.configurationDefinition = TestConfigurationFactory.createConfigurationDefinition();
+ this.memberConfigurations = new ArrayList<GroupMemberConfiguration>(GROUP_SIZE);
+ for (int i = 0; i < GROUP_SIZE; i++) {
+ Configuration configuration = TestConfigurationFactory.createConfiguration();
+ GroupMemberConfiguration memberConfiguration = new GroupMemberConfiguration(i, "Member #" + i,
+ configuration);
+ this.memberConfigurations.add(memberConfiguration);
+ }
+
+ reloadConfiguration();
+ }
+
+ @Override
+ public void propertyValueChanged(PropertyValueChangeEvent event) {
+ MessageCenter messageCenter = CoreGUI.getMessageCenter();
+ Message message;
+ if (event.isValidationStateChanged()) {
+ Set<String> invalidPropertyNames = event.getInvalidPropertyNames();
+ if (invalidPropertyNames.isEmpty()) {
+ this.saveButton.enable();
+ message = new Message("All properties now have valid values, so the configuration can now be saved.",
+ Message.Severity.Info, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
+ }
+ else {
+ this.saveButton.disable();
+ message = new Message(
+ "The following properties have invalid values: " + invalidPropertyNames
+ + " - the values must be corrected before the configuration can be saved.",
+ Message.Severity.Error, EnumSet.of(Message.Option.Transient, Message.Option.Sticky));
+ }
+ messageCenter.notify(message);
+ } else {
+ this.saveButton.enable();
+ }
+ }
+
+ private void reloadConfiguration() {
+ this.saveButton.disable();
+ if (editor != null) {
+ editor.destroy();
+ removeMember(editor);
+ }
+
+ editor = new GroupConfigurationEditor(extendLocatorId("Editor"), this.configurationDefinition,
+ this.memberConfigurations);
+ editor.setOverflow(Overflow.AUTO);
+ editor.addPropertyValueChangeListener(this);
+ addMember(editor);
+ }
+
+ private void save() {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Member configurations updated.", "Member configurations updated."));
+ reloadConfiguration();
+ }
+}
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 1f95a24..f0c901d 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
@@ -96,7 +96,6 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
private void clearMessage(boolean clearSticky) {
if (this.label != null) {
this.label.destroy();
- removeMember(this.label);
markForRedraw();
}
if (clearSticky) {
commit ca25d496072ebaff5e7c79329eef950e647a40ea
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Oct 28 15:59:12 2010 +0200
Bump requested DB version and provide an updated data file, which adds the new column and a row for a call time metric.
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 1c35c5f..9bb6f0b 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
@@ -60,7 +60,7 @@ import org.testng.annotations.Test;
@Test(groups = "PERF" )
@Listeners({ DatabaseSetupInterceptor.class })
@PerformanceReporting(exporter=ExcelExporter.class)
-@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94")
+@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.101")
public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
ResourceManagerLocal resourceManager;
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 1b62820..0dcba79 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
@@ -60,7 +60,7 @@ import java.util.Set;
@Test(groups = "PERF")
@Listeners({ DatabaseSetupInterceptor.class })
@PerformanceReporting(exporter=ExcelExporter.class)
-@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94")
+@DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.101")
public class EventsInsertPurgeTest extends AbstractEJB3PerformanceTest {
private static final int ROUNDS = 20000;
diff --git a/modules/enterprise/server/jar/src/test/resources/perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip b/modules/enterprise/server/jar/src/test/resources/perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip
index 811c952..70bd0ce 100644
Binary files a/modules/enterprise/server/jar/src/test/resources/perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip and b/modules/enterprise/server/jar/src/test/resources/perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip differ
commit d1b7036d96028993dcc9f49ffbb191a7e92b70bf
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Oct 28 15:33:31 2010 +0200
Be less verbose, but print the used database.
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 0dc7266..594627a 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
@@ -84,6 +84,7 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
InputStreamProvider streamProvider = getInputStreamProvider(state.url(), state.storage(), method);
IDatabaseConnection connection = new DatabaseDataSourceConnection(new InitialContext(),
"java:/RHQDS");
+ System.out.println("Using database at " + connection.getConnection().getMetaData().getURL());
setDatabaseType(connection);
@@ -162,7 +163,7 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
// Filter out methods that are marked as setup/tear down
Annotation[] annots = javaMethod.getAnnotations();
for (Annotation an : annots) {
- System.out.println(" : " + an.toString());
+// System.out.println(" : " + an.toString());
if (an.annotationType().equals(BeforeMethod.class) || an.annotationType().equals(AfterMethod.class) ||
an.annotationType().equals(BeforeSuite.class) || an.annotationType().equals(AfterSuite.class) ||
an.annotationType().equals(BeforeTest.class) || an.annotationType().equals(AfterTest.class)
commit 6ed2a798c32a4db6b47aaa100ec2257a8ac600c9
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Oct 28 11:14:41 2010 +0200
Be less verbose.
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 b38d934..f17ca60 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
@@ -129,7 +129,6 @@ public class AbstractEJB3PerformanceTest extends AbstractEJB3Test {
@BeforeMethod
protected void setupTimings(Method meth) {
Date now = new Date();
- System.out.println(">>> before " + meth.getName() + " (AbstraceEJB3PerformanceTest) === " + now.getTime());
timings = new HashMap<String, Long>();
startTime = new HashMap<String, Long>();
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 9efbdff..0dc7266 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
@@ -155,7 +155,7 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
DatabaseState annotation = javaMethod.getAnnotation(DatabaseState.class);
if (annotation==null) {
- System.out.println("Method : " + javaMethod.getName());
+// System.out.println("Method : " + javaMethod.getName());
boolean skip = false;
@@ -172,8 +172,8 @@ public class DatabaseSetupInterceptor implements IInvokedMethodListener {
if (!skip)
annotation = javaMethod.getDeclaringClass().getAnnotation(DatabaseState.class);
- else
- System.out.println(" ..... Skipped");
+// else
+// System.out.println(" ..... Skipped");
}
return annotation;
commit 7d7c1a02ef9164940d3e6eb695293f520d9d923c
Merge: 7b27318... b3ac18a...
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Oct 28 10:31:28 2010 +0200
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit 7b2731889909ed988916ad0c4daed4333cfc7610
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Oct 28 10:29:47 2010 +0200
Allow to specify included groups as opposed to only excluding. The abstract ejb3 test is needed for integration and perf group.
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index 2abdae5..d444d67 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -499,6 +499,7 @@ Build-OS-Version=${os.version}
<exclude>com/**/*.java</exclude>
</excludes>
<excludedGroups>${rhq.testng.excludedGroups}</excludedGroups>
+ <groups>${rhq.testng.includedGroups}</groups>
<systemPropertyVariables>
<embeddedDeployment>true</embeddedDeployment>
<deploymentDirectory>target/classes</deploymentDirectory>
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index 2609861..1bd4600 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -63,7 +63,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
* @author Greg Hinkle
*/
public abstract class AbstractEJB3Test extends AssertJUnit {
- @BeforeSuite(groups = "integration.ejb3")
+ @BeforeSuite(groups = {"integration.ejb3","PERF"})
public static void startupEmbeddedJboss() throws Exception {
// Setting content location to the tmp dir
System.setProperty(ContentSourceManagerBean.FILESYSTEM_PROPERTY, System.getProperty("java.io.tmpdir"));
@@ -150,7 +150,7 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
public static Connection getConnection() throws SQLException {
return LookupUtil.getDataSource().getConnection();
}
-
+
@AfterMethod
public static void endTest() {
//System.out.println("Connections used: " + (stats.getQueryExecutionCount() - start));
commit b3ac18a6683892135af6301ac1d3af81c1a0b1ac
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Oct 28 01:17:43 2010 -0400
move InventoryView class to more logical package
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 143045c..dccab2c 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
@@ -42,7 +42,7 @@ import org.rhq.enterprise.gui.coregui.client.bundle.BundleTopView;
import org.rhq.enterprise.gui.coregui.client.dashboard.DashboardsView;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.ResourceGroupDetailView;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.ResourceGroupTopView;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.InventoryView;
+import org.rhq.enterprise.gui.coregui.client.inventory.InventoryView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.ResourceTopView;
import org.rhq.enterprise.gui.coregui.client.menu.MenuBarView;
import org.rhq.enterprise.gui.coregui.client.report.ReportTopView;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
new file mode 100644
index 0000000..ca23a16
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
@@ -0,0 +1,344 @@
+/*
+ * 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.inventory;
+
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.gwt.user.client.History;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.types.VisibilityMode;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.SectionStack;
+import com.smartgwt.client.widgets.layout.SectionStackSection;
+import com.smartgwt.client.widgets.tree.Tree;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.group.GroupCategory;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+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.ResourceDataSourceField;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.ResourceAutodiscoveryView;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
+
+/**
+ * @author Greg Hinkle
+ * @author Joseph Marques
+ */
+// TODO (ips, 10/28/10): Refactor this class to extend AbstractSectionedLeftNavigationView.
+public class InventoryView extends LocatableHLayout implements BookmarkableView {
+ public static final String VIEW_ID = "Inventory";
+
+ private static final String GROUPS_SECTION_VIEW_ID = "Groups";
+ private static final String RESOURCES_SECTION_VIEW_ID = "Resources";
+
+ private static final String SUBSECTION_RESOURCE_INVENTORY = "Resources";
+ private static final String SUBSECTION_GROUP_INVENTORY = "Groups";
+ private static final String SUBSECTION_SAVED_SEARCHES = "SavedSearches";
+
+ private static final String PAGE_ADQ = "DiscoveryManager";
+ private static final String PAGE_COMPATIBLE_GROUPS = "CompatibleGroups";
+ private static final String PAGE_DOWN = "DownServers";
+ private static final String PAGE_GROUPS = "AllGroups";
+ private static final String PAGE_GROUP_DEFINITIONS = "DynagroupManager";
+ private static final String PAGE_MIXED_GROUPS = "MixedGroups";
+ private static final String PAGE_PLATFORMS = "Platforms";
+ private static final String PAGE_PROBLEM_GROUPS = "ProblemGroups";
+ private static final String PAGE_RESOURCES = "AllResources";
+ private static final String PAGE_SERVERS = "Servers";
+ private static final String PAGE_SERVICES = "Services";
+
+ private ViewId currentSectionViewId;
+ private ViewId currentPageViewId;
+
+ private Canvas contentCanvas;
+ private Canvas currentContent;
+ private Map<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
+
+ private SectionStack sectionStack;
+
+ public InventoryView(String locatorId) {
+ super(locatorId);
+ }
+
+ @Override
+ protected void onInit() {
+ super.onInit();
+
+ setWidth100();
+ setHeight100();
+
+ contentCanvas = new Canvas();
+ contentCanvas.setWidth("*");
+ contentCanvas.setHeight100();
+
+ sectionStack = new LocatableSectionStack(getLocatorId());
+ sectionStack.setShowResizeBar(true);
+ sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
+ sectionStack.setWidth(250);
+ sectionStack.setHeight100();
+
+ GWTServiceLookup.getAuthorizationService().getExplicitGlobalPermissions(new AsyncCallback<Set<Permission>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Could not determine user's global permissions - assuming none.",
+ caught);
+ finishOnInit(EnumSet.noneOf(Permission.class));
+ }
+
+ @Override
+ public void onSuccess(Set<Permission> result) {
+ finishOnInit(result);
+ }
+ });
+ }
+
+ private void finishOnInit(Set<Permission> globalPermissions) {
+ addSection(buildResourcesSection(globalPermissions));
+ addSection(buildGroupsSection(globalPermissions));
+
+ addMember(sectionStack);
+ addMember(contentCanvas);
+ }
+
+ private void addSection(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();
+ String viewPath = InventoryView.VIEW_ID + "/" + sectionName + "/" + pageName;
+ String currentViewPath = History.getToken();
+ if (!currentViewPath.startsWith(viewPath)) {
+ CoreGUI.goToView(viewPath);
+ }
+ }
+ }
+ });
+
+ SectionStackSection section = new SectionStackSection(sectionName);
+ section.setExpanded(true);
+ section.addItem(treeGrid);
+
+ this.sectionStack.addSection(section);
+ }
+
+ private TreeGrid buildResourcesSection(Set<Permission> globalPermissions) {
+ final TreeNode discoveryQueue = new EnhancedTreeNode(PAGE_ADQ);
+ discoveryQueue.setEnabled(globalPermissions.contains(Permission.MANAGE_INVENTORY));
+ discoveryQueue.setIcon("global/Recent_16.png");
+
+ final TreeNode onlyPlatforms = new EnhancedTreeNode(PAGE_PLATFORMS);
+ onlyPlatforms.setIcon("types/Platform_up_16.png");
+
+ final TreeNode onlyServers = new EnhancedTreeNode(PAGE_SERVERS);
+ onlyServers.setIcon("types/Server_up_16.png");
+
+ final TreeNode onlyServices = new EnhancedTreeNode(PAGE_SERVICES);
+ onlyServices.setIcon("types/Service_up_16.png");
+
+ final TreeNode inventory = new EnhancedTreeNode(SUBSECTION_RESOURCE_INVENTORY, onlyPlatforms, onlyServers,
+ onlyServices);
+
+ final TreeNode downServers = new EnhancedTreeNode(PAGE_DOWN);
+ downServers.setIcon("types/Server_down_16.png");
+
+ final TreeNode savedSearches = new EnhancedTreeNode(SUBSECTION_SAVED_SEARCHES, downServers);
+
+ TreeGrid treeGrid = new LocatableTreeGrid(RESOURCES_SECTION_VIEW_ID);
+ treeGrid.setShowHeader(false);
+ Tree tree = new Tree();
+ TreeNode rootNode = new TreeNode(RESOURCES_SECTION_VIEW_ID, discoveryQueue, inventory, savedSearches);
+ tree.setRoot(rootNode);
+ treeGrid.setData(tree);
+
+ treeGrid.getTree().openAll();
+ treeGrids.put(RESOURCES_SECTION_VIEW_ID, treeGrid);
+
+ return treeGrid;
+ }
+
+ private TreeGrid buildGroupsSection(Set<Permission> globalPermissions) {
+ final TreeNode groupGroupDefinitions = new EnhancedTreeNode(PAGE_GROUP_DEFINITIONS);
+ groupGroupDefinitions.setEnabled(globalPermissions.contains(Permission.MANAGE_INVENTORY));
+ groupGroupDefinitions.setIcon("types/GroupDefinition_16.png");
+
+ final TreeNode onlyCompatible = new EnhancedTreeNode(PAGE_COMPATIBLE_GROUPS);
+ onlyCompatible.setIcon("types/Cluster_up_16.png");
+ final TreeNode onlyMixed = new EnhancedTreeNode(PAGE_MIXED_GROUPS);
+ onlyMixed.setIcon("types/Group_up_16.png");
+
+ final TreeNode inventory = new EnhancedTreeNode(SUBSECTION_GROUP_INVENTORY, onlyCompatible, onlyMixed);
+
+ final TreeNode problemGroups = new EnhancedTreeNode(PAGE_PROBLEM_GROUPS);
+ problemGroups.setIcon("types/Cluster_down_16.png");
+ final TreeNode savedSearches = new EnhancedTreeNode(SUBSECTION_SAVED_SEARCHES, problemGroups);
+
+ TreeGrid treeGrid = new LocatableTreeGrid(GROUPS_SECTION_VIEW_ID);
+ treeGrid.setShowHeader(false);
+ Tree tree = new Tree();
+ TreeNode rootNode = new EnhancedTreeNode(GROUPS_SECTION_VIEW_ID, groupGroupDefinitions, inventory,
+ savedSearches);
+ tree.setRoot(rootNode);
+ treeGrid.setData(tree);
+
+ treeGrid.getTree().openAll();
+ treeGrids.put(GROUPS_SECTION_VIEW_ID, treeGrid);
+
+ return treeGrid;
+ }
+
+ public void setContent(Canvas newContent) {
+ for (Canvas child : this.contentCanvas.getChildren()) {
+ child.destroy();
+ }
+ this.contentCanvas.addChild(newContent);
+ this.contentCanvas.markForRedraw();
+ this.currentContent = newContent;
+ }
+
+ private void renderContentView(ViewPath viewPath) {
+ currentSectionViewId = viewPath.getCurrent();
+ currentPageViewId = viewPath.getNext();
+
+ String sectionName = currentSectionViewId.getPath();
+ String pageName = currentPageViewId.getPath();
+
+ Canvas content = null;
+ if (RESOURCES_SECTION_VIEW_ID.equals(sectionName)) {
+ if (PAGE_PLATFORMS.equals(pageName)) {
+ content = new ResourceSearchView(extendLocatorId("Platforms"), new Criteria(
+ ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.PLATFORM.name()), PAGE_PLATFORMS,
+ "types/Platform_up_24.png");
+ } else if (PAGE_SERVERS.equals(pageName)) {
+ content = new ResourceSearchView(extendLocatorId("Servers"), new Criteria(
+ ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVER.name()), PAGE_SERVERS,
+ "types/Server_up_24.png");
+ } else if (PAGE_SERVICES.equals(pageName)) {
+ content = new ResourceSearchView(extendLocatorId("Services"), new Criteria(
+ ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVICE.name()), PAGE_SERVICES,
+ "types/Service_up_24.png");
+ } else if (PAGE_ADQ.equals(pageName)) {
+ content = new ResourceAutodiscoveryView(this.extendLocatorId("ADQ"));
+ } else if (PAGE_DOWN.equals(pageName)) {
+ Criteria criteria = new Criteria(ResourceDataSourceField.AVAILABILITY.propertyName(),
+ AvailabilityType.DOWN.name());
+ criteria.addCriteria(ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVER.name());
+ content = new ResourceSearchView(extendLocatorId("DownResources"), criteria, PAGE_DOWN);
+ } else { // selected the Inventory node itself
+ content = new ResourceSearchView(extendLocatorId("AllResources"), null, PAGE_RESOURCES,
+ "types/Platform_up_24.png", "types/Server_up_24.png", "types/Service_up_24.png");
+ }
+ } else if (GROUPS_SECTION_VIEW_ID.equals(sectionName)) {
+ if (PAGE_COMPATIBLE_GROUPS.equals(pageName)) {
+ 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(
+ 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)) {
+ //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"), "Problem Groups", "types/Cluster_down_16.png");
+ } else { // selected the Inventory node itself
+ content = new ResourceGroupListView(extendLocatorId("AllGroups"), null, "All Groups",
+ "types/Cluster_up_24.png", "types/Group_up_24.png");
+ }
+ }
+
+ // when changing sections make sure the previous section's selection is deselected
+ selectSectionPageTreeGridNode(sectionName, pageName);
+
+ // ignore clicks on subsection folder nodes
+ if (null != content) {
+ setContent(content);
+
+ if (content instanceof BookmarkableView) {
+ ((BookmarkableView) content).renderView(viewPath.next().next());
+ }
+ }
+ }
+
+ 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()) {
+ // i.e. "Inventory"
+ // Currently, leave content empty until the user selects something from section stack. To default
+ // to platform list uncomment following line.
+ // History.newItem("Inventory/Resources/Platforms", true);
+ } else {
+ // e.g. Inventory/Administration"
+ renderContentView(viewPath);
+ }
+ } else {
+ if (this.currentContent instanceof BookmarkableView) {
+ ((BookmarkableView) this.currentContent).renderView(viewPath.next().next());
+ }
+ }
+ }
+}
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
deleted file mode 100644
index 3145c05..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * 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.inventory.resource;
-
-import java.util.EnumSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import com.google.gwt.user.client.History;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.data.Criteria;
-import com.smartgwt.client.types.VisibilityMode;
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
-import com.smartgwt.client.widgets.grid.events.SelectionEvent;
-import com.smartgwt.client.widgets.layout.SectionStack;
-import com.smartgwt.client.widgets.layout.SectionStackSection;
-import com.smartgwt.client.widgets.tree.Tree;
-import com.smartgwt.client.widgets.tree.TreeGrid;
-import com.smartgwt.client.widgets.tree.TreeNode;
-
-import org.rhq.core.domain.authz.Permission;
-import org.rhq.core.domain.measurement.AvailabilityType;
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.group.GroupCategory;
-import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-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;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
-
-/**
- * @author Greg Hinkle
- * @author Joseph Marques
- */
-// TODO (ips, 10/28/10): Refactor this class to extend AbstractSectionedLeftNavigationView.
-public class InventoryView extends LocatableHLayout implements BookmarkableView {
- public static final String VIEW_ID = "Inventory";
-
- private static final String GROUPS_SECTION_VIEW_ID = "Groups";
- private static final String RESOURCES_SECTION_VIEW_ID = "Resources";
-
- private static final String SUBSECTION_RESOURCE_INVENTORY = "Resources";
- private static final String SUBSECTION_GROUP_INVENTORY = "Groups";
- private static final String SUBSECTION_SAVED_SEARCHES = "SavedSearches";
-
- private static final String PAGE_ADQ = "DiscoveryManager";
- private static final String PAGE_COMPATIBLE_GROUPS = "CompatibleGroups";
- private static final String PAGE_DOWN = "DownServers";
- private static final String PAGE_GROUPS = "AllGroups";
- private static final String PAGE_GROUP_DEFINITIONS = "DynagroupManager";
- private static final String PAGE_MIXED_GROUPS = "MixedGroups";
- private static final String PAGE_PLATFORMS = "Platforms";
- private static final String PAGE_PROBLEM_GROUPS = "ProblemGroups";
- private static final String PAGE_RESOURCES = "AllResources";
- private static final String PAGE_SERVERS = "Servers";
- private static final String PAGE_SERVICES = "Services";
-
- private ViewId currentSectionViewId;
- private ViewId currentPageViewId;
-
- private Canvas contentCanvas;
- private Canvas currentContent;
- private Map<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
-
- private SectionStack sectionStack;
-
- public InventoryView(String locatorId) {
- super(locatorId);
- }
-
- @Override
- protected void onInit() {
- super.onInit();
-
- setWidth100();
- setHeight100();
-
- contentCanvas = new Canvas();
- contentCanvas.setWidth("*");
- contentCanvas.setHeight100();
-
- sectionStack = new LocatableSectionStack(getLocatorId());
- sectionStack.setShowResizeBar(true);
- sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
- sectionStack.setWidth(250);
- sectionStack.setHeight100();
-
- GWTServiceLookup.getAuthorizationService().getExplicitGlobalPermissions(new AsyncCallback<Set<Permission>>() {
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Could not determine user's global permissions - assuming none.",
- caught);
- finishOnInit(EnumSet.noneOf(Permission.class));
- }
-
- @Override
- public void onSuccess(Set<Permission> result) {
- finishOnInit(result);
- }
- });
- }
-
- private void finishOnInit(Set<Permission> globalPermissions) {
- addSection(buildResourcesSection(globalPermissions));
- addSection(buildGroupsSection(globalPermissions));
-
- addMember(sectionStack);
- addMember(contentCanvas);
- }
-
- private void addSection(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();
- String viewPath = InventoryView.VIEW_ID + "/" + sectionName + "/" + pageName;
- String currentViewPath = History.getToken();
- if (!currentViewPath.startsWith(viewPath)) {
- CoreGUI.goToView(viewPath);
- }
- }
- }
- });
-
- SectionStackSection section = new SectionStackSection(sectionName);
- section.setExpanded(true);
- section.addItem(treeGrid);
-
- this.sectionStack.addSection(section);
- }
-
- private TreeGrid buildResourcesSection(Set<Permission> globalPermissions) {
- final TreeNode discoveryQueue = new EnhancedTreeNode(PAGE_ADQ);
- discoveryQueue.setEnabled(globalPermissions.contains(Permission.MANAGE_INVENTORY));
- discoveryQueue.setIcon("global/Recent_16.png");
-
- final TreeNode onlyPlatforms = new EnhancedTreeNode(PAGE_PLATFORMS);
- onlyPlatforms.setIcon("types/Platform_up_16.png");
-
- final TreeNode onlyServers = new EnhancedTreeNode(PAGE_SERVERS);
- onlyServers.setIcon("types/Server_up_16.png");
-
- final TreeNode onlyServices = new EnhancedTreeNode(PAGE_SERVICES);
- onlyServices.setIcon("types/Service_up_16.png");
-
- final TreeNode inventory = new EnhancedTreeNode(SUBSECTION_RESOURCE_INVENTORY, onlyPlatforms, onlyServers,
- onlyServices);
-
- final TreeNode downServers = new EnhancedTreeNode(PAGE_DOWN);
- downServers.setIcon("types/Server_down_16.png");
-
- final TreeNode savedSearches = new EnhancedTreeNode(SUBSECTION_SAVED_SEARCHES, downServers);
-
- TreeGrid treeGrid = new LocatableTreeGrid(RESOURCES_SECTION_VIEW_ID);
- treeGrid.setShowHeader(false);
- Tree tree = new Tree();
- TreeNode rootNode = new TreeNode(RESOURCES_SECTION_VIEW_ID, discoveryQueue, inventory, savedSearches);
- tree.setRoot(rootNode);
- treeGrid.setData(tree);
-
- treeGrid.getTree().openAll();
- treeGrids.put(RESOURCES_SECTION_VIEW_ID, treeGrid);
-
- return treeGrid;
- }
-
- private TreeGrid buildGroupsSection(Set<Permission> globalPermissions) {
- final TreeNode groupGroupDefinitions = new EnhancedTreeNode(PAGE_GROUP_DEFINITIONS);
- groupGroupDefinitions.setEnabled(globalPermissions.contains(Permission.MANAGE_INVENTORY));
- groupGroupDefinitions.setIcon("types/GroupDefinition_16.png");
-
- final TreeNode onlyCompatible = new EnhancedTreeNode(PAGE_COMPATIBLE_GROUPS);
- onlyCompatible.setIcon("types/Cluster_up_16.png");
- final TreeNode onlyMixed = new EnhancedTreeNode(PAGE_MIXED_GROUPS);
- onlyMixed.setIcon("types/Group_up_16.png");
-
- final TreeNode inventory = new EnhancedTreeNode(SUBSECTION_GROUP_INVENTORY, onlyCompatible, onlyMixed);
-
- final TreeNode problemGroups = new EnhancedTreeNode(PAGE_PROBLEM_GROUPS);
- problemGroups.setIcon("types/Cluster_down_16.png");
- final TreeNode savedSearches = new EnhancedTreeNode(SUBSECTION_SAVED_SEARCHES, problemGroups);
-
- TreeGrid treeGrid = new LocatableTreeGrid(GROUPS_SECTION_VIEW_ID);
- treeGrid.setShowHeader(false);
- Tree tree = new Tree();
- TreeNode rootNode = new EnhancedTreeNode(GROUPS_SECTION_VIEW_ID, groupGroupDefinitions, inventory,
- savedSearches);
- tree.setRoot(rootNode);
- treeGrid.setData(tree);
-
- treeGrid.getTree().openAll();
- treeGrids.put(GROUPS_SECTION_VIEW_ID, treeGrid);
-
- return treeGrid;
- }
-
- public void setContent(Canvas newContent) {
- for (Canvas child : this.contentCanvas.getChildren()) {
- child.destroy();
- }
- this.contentCanvas.addChild(newContent);
- this.contentCanvas.markForRedraw();
- this.currentContent = newContent;
- }
-
- private void renderContentView(ViewPath viewPath) {
- currentSectionViewId = viewPath.getCurrent();
- currentPageViewId = viewPath.getNext();
-
- String sectionName = currentSectionViewId.getPath();
- String pageName = currentPageViewId.getPath();
-
- Canvas content = null;
- if (RESOURCES_SECTION_VIEW_ID.equals(sectionName)) {
- if (PAGE_PLATFORMS.equals(pageName)) {
- content = new ResourceSearchView(extendLocatorId("Platforms"), new Criteria(
- ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.PLATFORM.name()), PAGE_PLATFORMS,
- "types/Platform_up_24.png");
- } else if (PAGE_SERVERS.equals(pageName)) {
- content = new ResourceSearchView(extendLocatorId("Servers"), new Criteria(
- ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVER.name()), PAGE_SERVERS,
- "types/Server_up_24.png");
- } else if (PAGE_SERVICES.equals(pageName)) {
- content = new ResourceSearchView(extendLocatorId("Services"), new Criteria(
- ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVICE.name()), PAGE_SERVICES,
- "types/Service_up_24.png");
- } else if (PAGE_ADQ.equals(pageName)) {
- content = new ResourceAutodiscoveryView(this.extendLocatorId("ADQ"));
- } else if (PAGE_DOWN.equals(pageName)) {
- Criteria criteria = new Criteria(ResourceDataSourceField.AVAILABILITY.propertyName(),
- AvailabilityType.DOWN.name());
- criteria.addCriteria(ResourceDataSourceField.CATEGORY.propertyName(), ResourceCategory.SERVER.name());
- content = new ResourceSearchView(extendLocatorId("DownResources"), criteria, PAGE_DOWN);
- } else { // selected the Inventory node itself
- content = new ResourceSearchView(extendLocatorId("AllResources"), null, PAGE_RESOURCES,
- "types/Platform_up_24.png", "types/Server_up_24.png", "types/Service_up_24.png");
- }
- } else if (GROUPS_SECTION_VIEW_ID.equals(sectionName)) {
- if (PAGE_COMPATIBLE_GROUPS.equals(pageName)) {
- 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(
- 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)) {
- //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"), "Problem Groups", "types/Cluster_down_16.png");
- } else { // selected the Inventory node itself
- content = new ResourceGroupListView(extendLocatorId("AllGroups"), null, "All Groups",
- "types/Cluster_up_24.png", "types/Group_up_24.png");
- }
- }
-
- // when changing sections make sure the previous section's selection is deselected
- selectSectionPageTreeGridNode(sectionName, pageName);
-
- // ignore clicks on subsection folder nodes
- if (null != content) {
- setContent(content);
-
- if (content instanceof BookmarkableView) {
- ((BookmarkableView) content).renderView(viewPath.next().next());
- }
- }
- }
-
- 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()) {
- // i.e. "Inventory"
- // Currently, leave content empty until the user selects something from section stack. To default
- // to platform list uncomment following line.
- // History.newItem("Inventory/Resources/Platforms", true);
- } else {
- // e.g. Inventory/Administration"
- renderContentView(viewPath);
- }
- } else {
- if (this.currentContent instanceof BookmarkableView) {
- ((BookmarkableView) this.currentContent).renderView(viewPath.next().next());
- }
- }
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index 517c105..7cb57f3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -48,7 +48,7 @@ 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;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupListView;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.InventoryView;
+import org.rhq.enterprise.gui.coregui.client.inventory.InventoryView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ConfigurationHistoryView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ResourceConfigurationEditView;
commit c9bbab5aef98111111634e6522af529d48956e43
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Oct 28 01:01:02 2010 -0400
fix several bugs in the group config component; extract abstract class to be used as superclass of Inventory, Reports, and Administration top level views; refactored Reports view to extend this new class; make FullHTMLPane locatable
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 b28f6a6..f622596 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
@@ -49,6 +49,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
/**
* @author Greg Hinkle
*/
+// TODO (ips, 10/28/10): Refactor this class to extend AbstractSectionedLeftNavigationView.
public class AdministrationView extends LocatableHLayout implements BookmarkableView {
public static final String VIEW_ID = "Administration";
@@ -242,7 +243,6 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
content = new RemoteAgentInstallView(this.extendLocatorId("RemoteAgentInstall"));
}
} else if (SECTION_CONFIGURATION_VIEW_ID.equals(sectionName)) {
-
String url = null;
if (PAGE_SYSTEM_SETTINGS_VIEW_ID.equals(pageName)) {
url = "/admin/config/Config.do?mode=edit";
@@ -258,7 +258,7 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
}
if (url != null) {
url = addQueryStringParam(url, "nomenu=true");
- content = new FullHTMLPane(url);
+ content = new FullHTMLPane(this.extendLocatorId(pageName), url);
}
} else if (SECTION_TOPOLOGY_VIEW_ID.equals(sectionName)) {
@@ -272,7 +272,7 @@ public class AdministrationView extends LocatableHLayout implements Bookmarkable
} else if (PAGE_PARTITION_EVENTS_VIEW_ID.equals(pageName)) {
url = "/rhq/ha/listPartitionEvents-plain.xhtml";
}
- content = new FullHTMLPane(url);
+ content = new FullHTMLPane(this.extendLocatorId(pageName), url);
}
// when changing sections make sure the previous section's selection is deselected
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 6e6c9c4..d7c2180 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
@@ -224,7 +224,8 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab
private void editMetricTemplate(int resourceTypeId) {
// TODO: convert this to GWT
Layout metricCanvas = getMetricTemplateCanvas();
- FullHTMLPane jspPage = new FullHTMLPane("/admin/platform/monitor/Config.do?nomenu=true&mode=configure&id="
+ FullHTMLPane jspPage = new FullHTMLPane(extendLocatorId("MetricTemplate"),
+ "/admin/platform/monitor/Config.do?nomenu=true&mode=configure&id="
+ resourceTypeId + "&type=" + resourceTypeId);
prepareSubCanvas(metricCanvas, jspPage, true);
switchToCanvas(ResourceTypeTreeView.this, metricCanvas);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java
index ba78b54..7254669 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertHistoryView.java
@@ -55,7 +55,9 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
* @author Heiko W. Rupp
*/
public class AlertHistoryView extends TableSection {
- public static final String VIEW_ID = "RecentAlerts";
+ // TODO: Create a subclass for the subsystem view.
+ public static final String SUBSYSTEM_VIEW_ID = "RecentAlerts";
+ private static final String SUBSYSTEM_VIEW_TITLE = "Recent Alerts";
private static SortSpecifier DEFAULT_SORT_SPECIFIER = new SortSpecifier(AlertCriteria.SORT_FIELD_CTIME,
SortDirection.DESCENDING);
@@ -64,11 +66,11 @@ public class AlertHistoryView extends TableSection {
// for subsystem views
public AlertHistoryView(String locatorId) {
- this(locatorId, EntityContext.forSubsystemView(), false);
+ this(locatorId, SUBSYSTEM_VIEW_TITLE, EntityContext.forSubsystemView(), false);
}
- protected AlertHistoryView(String tableTitle, EntityContext context, boolean hasWriteAccess) {
- super("AlertsView", tableTitle, new SortSpecifier[] { DEFAULT_SORT_SPECIFIER });
+ protected AlertHistoryView(String locatorId, String tableTitle, EntityContext context, boolean hasWriteAccess) {
+ super(locatorId, tableTitle, new SortSpecifier[] { DEFAULT_SORT_SPECIFIER });
this.context = context;
this.hasWriteAccess = hasWriteAccess;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/GroupAlertHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/GroupAlertHistoryView.java
index b65ad1b..a0943c0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/GroupAlertHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/GroupAlertHistoryView.java
@@ -26,16 +26,14 @@ import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
* @author Joseph Marques
*/
public class GroupAlertHistoryView extends AlertHistoryView {
-
- public static GroupAlertHistoryView get(ResourceGroupComposite composite) {
+ public static GroupAlertHistoryView get(String locatorId, ResourceGroupComposite composite) {
String tableTitle = "Group Alert History";
EntityContext context = EntityContext.forGroup(composite.getResourceGroup().getId());
boolean hasWriteAccess = composite.getResourcePermission().isAlert();
-
- return new GroupAlertHistoryView(tableTitle, context, hasWriteAccess);
+ return new GroupAlertHistoryView(locatorId, tableTitle, context, hasWriteAccess);
}
- private GroupAlertHistoryView(String tableTitle, EntityContext context, boolean hasWriteAccess) {
- super(tableTitle, context, hasWriteAccess);
+ private GroupAlertHistoryView(String locatorId, String tableTitle, EntityContext context, boolean hasWriteAccess) {
+ super(locatorId, tableTitle, context, hasWriteAccess);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/ResourceAlertHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/ResourceAlertHistoryView.java
index e47f5b0..daecace 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/ResourceAlertHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/ResourceAlertHistoryView.java
@@ -26,15 +26,14 @@ import org.rhq.core.domain.resource.composite.ResourceComposite;
* @author Joseph Marques
*/
public class ResourceAlertHistoryView extends AlertHistoryView {
-
- public static ResourceAlertHistoryView get(ResourceComposite composite) {
+ public static ResourceAlertHistoryView get(String locatorId, ResourceComposite composite) {
String tableTitle = "Resource Alert History";
EntityContext context = EntityContext.forResource(composite.getResource().getId());
boolean hasWriteAccess = composite.getResourcePermission().isAlert();
- return new ResourceAlertHistoryView(tableTitle, context, hasWriteAccess);
+ return new ResourceAlertHistoryView(locatorId, tableTitle, context, hasWriteAccess);
}
- private ResourceAlertHistoryView(String tableTitle, EntityContext context, boolean hasWriteAccess) {
- super(tableTitle, context, hasWriteAccess);
+ private ResourceAlertHistoryView(String locatorId, String tableTitle, EntityContext context, boolean hasWriteAccess) {
+ super(locatorId, tableTitle, context, hasWriteAccess);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
index bc296cc..f0c553f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java
@@ -19,21 +19,18 @@
package org.rhq.enterprise.gui.coregui.client.components;
import com.smartgwt.client.types.ContentsType;
-import com.smartgwt.client.widgets.HTMLPane;
+
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane;
/**
* @author Greg Hinkle
*/
-public class FullHTMLPane extends HTMLPane {
- public FullHTMLPane() {
+public class FullHTMLPane extends LocatableHTMLPane {
+ public FullHTMLPane(String locatorId, String url) {
+ super(locatorId);
setWidth100();
setHeight100();
setContentsType(ContentsType.PAGE);
- }
-
- public FullHTMLPane(String url) {
- this();
- com.allen_sauer.gwt.log.client.Log.debug("Creating IFrame pane with URL [" + url + "]...");
setContentsURL(url);
}
}
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 f544ac6..b5a324e 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,7 +32,7 @@ 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.CanvasItem;
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
@@ -40,7 +40,6 @@ 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;
@@ -221,7 +220,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
final DynamicForm setAllForm = new DynamicForm();
setAllForm.setNumCols(4);
- setAllForm.setColWidths(175, 25, 250, 100);
+ setAllForm.setColWidths(175, 25, 200, 100);
setAllForm.setCellPadding(5);
List<FormItem> setAllItems = new ArrayList<FormItem>();
@@ -232,7 +231,9 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
StaticTextItem unsetAllHeader = new StaticTextItem();
unsetAllHeader.setShowTitle(false);
- unsetAllHeader.setDefaultValue("<h4>Unset</h4>");
+ if (!propertyDefinitionSimple.isRequired()) {
+ unsetAllHeader.setDefaultValue("<h4>Unset</h4>");
+ }
setAllItems.add(unsetAllHeader);
StaticTextItem valueAllHeader = new StaticTextItem();
@@ -264,10 +265,42 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
setAllItems.add(masterUnsetItem);
setAllItems.add(masterValueItem);
- ButtonItem applyButtonItem = new ButtonItem();
- applyButtonItem.setTitle("Apply");
+ //ButtonItem applyButtonItem = new ButtonItem();
+ //applyButtonItem.setTitle("Apply");
//applyButtonItem.setEndRow(true);
- setAllItems.add(applyButtonItem);
+ //setAllItems.add(applyButtonItem);
+
+ // NOTE (ips, 10/27/10): Using a ButtonItem didn't work out, because SmartGWT would always display it in a new
+ // table row, rather than in the next column in the current row (most likely a bug). So
+ // we use an IButton wrapped in a CanvasItem instead.
+ CanvasItem canvasItem = new CanvasItem();
+ canvasItem.setShowTitle(false);
+ HLayout buttonCanvas = new HLayout();
+ buttonCanvas.setWidth(90);
+ buttonCanvas.setHeight100();
+ buttonCanvas.setAlign(Alignment.LEFT);
+ final IButton applyButton = new IButton("Apply");
+ applyButton.setDisabled(true);
+ buttonCanvas.addMember(applyButton);
+ canvasItem.setCanvas(buttonCanvas);
+ canvasItem.setEndRow(true);
+ setAllItems.add(canvasItem);
+
+ masterValueItem.addChangedHandler(new ChangedHandler() {
+ @Override
+ public void onChanged(ChangedEvent changedEvent) {
+ applyButton.enable();
+ applyButton.focus();
+ }
+ });
+
+ masterUnsetItem.addChangedHandler(new ChangedHandler() {
+ @Override
+ public void onChanged(ChangedEvent changedEvent) {
+ applyButton.enable();
+ applyButton.focus();
+ }
+ });
setAllForm.setFields(setAllItems.toArray(new FormItem[setAllItems.size()]));
layout.addMember(setAllForm);
@@ -290,7 +323,9 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
items.add(memberHeader);
StaticTextItem unsetHeader = new StaticTextItem();
unsetHeader.setShowTitle(false);
- unsetHeader.setDefaultValue("<h4>Unset</h4>");
+ if (!propertyDefinitionSimple.isRequired()) {
+ unsetHeader.setDefaultValue("<h4>Unset</h4>");
+ }
items.add(unsetHeader);
StaticTextItem valueHeader = new StaticTextItem();
valueHeader.setShowTitle(false);
@@ -310,7 +345,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
Configuration configuration = memberConfiguration.getConfiguration();
PropertySimple memberPropertySimple =
(PropertySimple)getProperty(configuration, aggregatePropertySimple, index);
- FormItem valueItem = buildSimpleField(propertyDefinitionSimple, memberPropertySimple);
+ FormItem valueItem = buildSimpleField(propertyDefinitionSimple, memberPropertySimple);
valueItems.add(valueItem);
valueItemNameToPropertySimpleMap.put(valueItem.getName(), memberPropertySimple);
FormItem unsetItem = buildUnsetItem(propertyDefinitionSimple, memberPropertySimple, valueItem);
@@ -320,6 +355,12 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
}
membersForm.setItems(items.toArray(new FormItem[items.size()]));
+ for (FormItem valueItem : valueItems) {
+ String defaultValue = valueItem.getAttribute("defaultValue");
+ setValue(valueItem, defaultValue);
+ valueItem.setDisabled(false);
+ }
+
final IButton okButton = new IButton("OK");
okButton.disable();
okButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
@@ -367,8 +408,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
}
firePropertyChangedEvent(aggregatePropertySimple, propertyDefinitionSimple, isValid);
-
- membersForm.markForRedraw();
+
popup.destroy();
}
});
@@ -380,9 +420,9 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
}
});
- applyButtonItem.addClickHandler(new ClickHandler() {
+ applyButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
@Override
- public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent clickEvent) {
+ public void onClick(ClickEvent clickEvent) {
Object value = masterValueItem.getValue();
for (FormItem valueItem : valueItems) {
setValue(valueItem, value);
@@ -399,6 +439,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
});
final IButton cancelButton = new IButton("Cancel");
+ cancelButton.focus();
cancelButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(ClickEvent clickEvent) {
popup.destroy();
@@ -419,7 +460,8 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
@Override
protected boolean updatePropertyValueOnChange(PropertyDefinitionSimple propertyDefinitionSimple,
PropertySimple propertySimple) {
- return isAggregateProperty(propertySimple) && super.updatePropertyValueOnChange(propertyDefinitionSimple, propertySimple); // TODO: Implement this method.
+ return isAggregateProperty(propertySimple) && super.updatePropertyValueOnChange(propertyDefinitionSimple,
+ propertySimple);
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
new file mode 100644
index 0000000..94b957f
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
@@ -0,0 +1,232 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.components.view;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.smartgwt.client.types.VisibilityMode;
+import com.smartgwt.client.widgets.Canvas;
+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;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+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.util.selenium.LocatableHLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
+
+/**
+ * The base class for the various top-level views which have a sectioned navigation menu on the left side and a content
+ * pane on the right side.
+ *
+ * @author Greg Hinkle
+ * @author Ian Springer
+ * @author Jay Shaughnessy
+ */
+public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayout implements BookmarkableView {
+ private String viewId;
+ private ViewId currentSectionViewId;
+ private ViewId currentPageViewId;
+
+ private SectionStack sectionStack;
+
+ private Canvas contentCanvas;
+ private Canvas currentContent;
+ private Map<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
+ private Map<String, NavigationSection> sectionsByName;
+
+ public AbstractSectionedLeftNavigationView(String locatorId) {
+ this(locatorId, locatorId);
+ }
+
+ public AbstractSectionedLeftNavigationView(String locatorId, String viewId) {
+ super(locatorId);
+ this.viewId = viewId;
+ }
+
+ @Override
+ protected void onInit() {
+ super.onInit();
+
+ setWidth100();
+ setHeight100();
+
+ contentCanvas = new Canvas();
+ contentCanvas.setWidth("*");
+ contentCanvas.setHeight100();
+
+ sectionStack = new LocatableSectionStack(this.getLocatorId());
+ sectionStack.setShowResizeBar(true);
+ sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
+ sectionStack.setWidth(250);
+ sectionStack.setHeight100();
+
+ List<NavigationSection> sections = getNavigationSections();
+ this.sectionsByName = new HashMap<String, NavigationSection>(sections.size());
+ for (NavigationSection section : sections) {
+ TreeGrid treeGrid = buildTreeGridForSection(section);
+ addSection(treeGrid);
+ this.sectionsByName.put(section.getName(), section);
+ }
+
+ addMember(sectionStack);
+ addMember(contentCanvas);
+ }
+
+ protected abstract Canvas defaultView();
+
+ protected abstract List<NavigationSection> getNavigationSections();
+
+ private TreeGrid buildTreeGridForSection(NavigationSection navigationSection) {
+ final TreeGrid treeGrid = new LocatableTreeGrid(navigationSection.getName());
+ treeGrid.setLeaveScrollbarGap(false);
+ treeGrid.setShowHeader(false);
+
+ List<NavigationItem> navigationItems = navigationSection.getNavigationItems();
+ TreeNode[] treeNodes = new TreeNode[navigationItems.size()];
+ for (int i = 0, navigationItemsSize = navigationItems.size(); i < navigationItemsSize; i++) {
+ NavigationItem item = navigationItems.get(i);
+ final TreeNode treeNode = new EnhancedTreeNode(item.getName());
+ treeNode.setIcon(item.getIcon());
+ treeNodes[i] = treeNode;
+ }
+
+ TreeNode rootNode = new EnhancedTreeNode(navigationSection.getName(), treeNodes);
+ Tree tree = new Tree();
+ tree.setRoot(rootNode);
+ treeGrid.setData(tree);
+
+ return treeGrid;
+ }
+
+ private void addSection(final TreeGrid treeGrid) {
+ final String sectionName = treeGrid.getTree().getRoot().getName();
+ this.treeGrids.put(sectionName, treeGrid);
+
+ 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 = viewId + "/" + sectionName + "/" + pageName;
+ CoreGUI.goToView(viewPath);
+ }
+ }
+ });
+
+ SectionStackSection section = new SectionStackSection(sectionName);
+ section.setExpanded(true);
+ section.addItem(treeGrid);
+
+ this.sectionStack.addSection(section);
+ }
+
+ public void setContent(Canvas newContent) {
+ // A call to destroy (e.g. certain IFrames/FullHTMLPane) can actually remove multiple children of the
+ // contentCanvas. As such, we need to query for the children after each destroy to ensure only valid children
+ // are in the array.
+ Canvas[] children;
+ while ((children = contentCanvas.getChildren()).length > 0) {
+ children[0].destroy();
+ }
+
+ contentCanvas.addChild(newContent);
+ contentCanvas.markForRedraw();
+ currentContent = newContent;
+ }
+
+ private void renderContentView(ViewPath viewPath) {
+ currentSectionViewId = viewPath.getCurrent();
+ currentPageViewId = viewPath.getNext();
+
+ String sectionName = currentSectionViewId.getPath();
+ String pageName = currentPageViewId.getPath();
+
+ NavigationSection section = this.sectionsByName.get(sectionName);
+ NavigationItem item = section.getNavigationItem(pageName);
+ // TODO: null checks for section and item.
+ ViewFactory viewFactory = item.getViewFactory();
+ Canvas content = viewFactory.createView();
+
+ // When changing sections make sure the previous section's selection is deselected.
+ selectSectionPageTreeGridNode(sectionName, pageName);
+
+ // Ignore clicks on subsection folder nodes.
+ if (null != content) {
+ setContent(content);
+
+ if (content instanceof BookmarkableView) {
+ ((BookmarkableView) content).renderView(viewPath.next().next());
+ }
+ }
+ }
+
+ public void renderView(ViewPath viewPath) {
+ if (!viewPath.isCurrent(currentSectionViewId) || !viewPath.isNext(currentPageViewId)) {
+ if (viewPath.isEnd()) {
+ // Display default view
+ setContent(defaultView());
+ } else {
+ renderContentView(viewPath);
+ }
+ } else {
+ if (this.currentContent instanceof BookmarkableView) {
+ ((BookmarkableView) this.currentContent).renderView(viewPath.next().next());
+ }
+ }
+ }
+
+ private void selectSectionPageTreeGridNode(String sectionName, String pageName) {
+ for (String name : treeGrids.keySet()) {
+ TreeGrid treeGrid = treeGrids.get(name);
+ if (!name.equals(sectionName)) {
+ treeGrid.deselectAllRecords();
+ } else {
+ Tree tree = treeGrid.getTree();
+ TreeNode node = tree.find(sectionName + "/" + pageName);
+ if (node != null) {
+ treeGrid.selectSingleRecord(node);
+ } else {
+ CoreGUI.getErrorHandler().handleError("Unknown page name '" + pageName + "' for section '"
+ + sectionName + "' - URL is invalid.");
+ }
+ }
+ }
+ }
+
+ protected static String addQueryStringParam(String url, String param) {
+ char separatorChar = (url.indexOf('?') == -1) ? '?' : '&';
+ return url + separatorChar + param;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
new file mode 100644
index 0000000..ee64e84
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
@@ -0,0 +1,47 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.components.view;
+
+/**
+ * @author Ian Springer
+ */
+public class NavigationItem {
+ private String name;
+ private String icon;
+ private ViewFactory viewFactory;
+
+ public NavigationItem(String name, String icon, ViewFactory viewFactory) {
+ this.icon = icon;
+ this.name = name;
+ this.viewFactory = viewFactory;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getIcon() {
+ return icon;
+ }
+
+ public ViewFactory getViewFactory() {
+ return viewFactory;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationSection.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationSection.java
new file mode 100644
index 0000000..f4d04fb
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationSection.java
@@ -0,0 +1,55 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.components.view;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Ian Springer
+ */
+public class NavigationSection {
+ private String name;
+ private List<NavigationItem> navigationItems;
+ private Map<String, NavigationItem> navigationItemsByName;
+
+ public NavigationSection(String name, NavigationItem ... navigationItems) {
+ this.name = name;
+ this.navigationItems = Arrays.asList(navigationItems);
+ this.navigationItemsByName = new LinkedHashMap<String, NavigationItem>(navigationItems.length);
+ for (NavigationItem navigationItem : navigationItems) {
+ this.navigationItemsByName.put(navigationItem.getName(), navigationItem);
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List<NavigationItem> getNavigationItems() {
+ return navigationItems;
+ }
+
+ public NavigationItem getNavigationItem(String name) {
+ return navigationItemsByName.get(name);
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/ViewFactory.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/ViewFactory.java
new file mode 100644
index 0000000..a95b716
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/ViewFactory.java
@@ -0,0 +1,31 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.components.view;
+
+import com.smartgwt.client.widgets.Canvas;
+
+/**
+ * Factory for a "view", which is a SmartGWT Canvas.
+ *
+ * @author Ian Springer
+ */
+public interface ViewFactory {
+ Canvas createView();
+}
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 2d2c7c8..dfa408a 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
@@ -221,11 +221,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
if (updateTab(this.monitoringTab, groupCategory == GroupCategory.COMPATIBLE, true)) {
visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT);
- canvas = (visible) ? new FullHTMLPane("/rhq/group/monitor/graphs-plain.xhtml?groupId=" + groupId) : null;
+ canvas = (visible) ? new FullHTMLPane(this.monitorGraphs.extendLocatorId("View"),
+ "/rhq/group/monitor/graphs-plain.xhtml?groupId=" + groupId) : null;
updateSubTab(this.monitoringTab, this.monitorGraphs, canvas, visible, true);
// visible = same test as above
- canvas = (visible) ? new FullHTMLPane("/rhq/group/monitor/tables-plain.xhtml?groupId=" + groupId) : null;
+ canvas = (visible) ? new FullHTMLPane(this.monitorTables.extendLocatorId("View"),
+ "/rhq/group/monitor/tables-plain.xhtml?groupId=" + groupId) : null;
updateSubTab(this.monitoringTab, this.monitorTables, canvas, visible, true);
visible = hasMetricsOfType(this.groupComposite, DataType.TRAIT);
@@ -237,7 +239,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateSubTab(this.monitoringTab, this.monitorSched, canvas, visible, true);
visible = facets.contains(ResourceTypeFacet.CALL_TIME);
- canvas = (visible) ? new FullHTMLPane("/rhq/group/monitor/response-plain.xhtml?groupId=" + groupId) : null;
+ canvas = (visible) ? new FullHTMLPane(this.monitorCallTime.extendLocatorId("View"),
+ "/rhq/group/monitor/response-plain.xhtml?groupId=" + groupId) : null;
updateSubTab(this.monitoringTab, this.monitorCallTime, canvas, visible, true);
// TODO (ips): Add Availability subtab.
}
@@ -255,16 +258,17 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
if (updateTab(this.operationsTab, groupCategory == GroupCategory.COMPATIBLE
&& facets.contains(ResourceTypeFacet.OPERATION), true)) {
- updateSubTab(this.operationsTab, this.opHistory, new FullHTMLPane(
+ updateSubTab(this.operationsTab, this.opHistory, new FullHTMLPane(this.opHistory.extendLocatorId("View"),
"/rhq/group/operation/groupOperationHistory-plain.xhtml?groupId=" + groupId), true, true);
- updateSubTab(this.operationsTab, this.opSched, new FullHTMLPane(
+ updateSubTab(this.operationsTab, this.opSched, new FullHTMLPane(this.opSched.extendLocatorId("View"),
"/rhq/group/operation/groupOperationSchedules-plain.xhtml?groupId=" + groupId), true, true);
}
// alerts tab is always visible, even for mixed groups
if (updateTab(this.alertsTab, true, true)) {
// alert history is always available
- updateSubTab(this.alertsTab, this.alertHistory, GroupAlertHistoryView.get(groupComposite), true, true);
+ updateSubTab(this.alertsTab, this.alertHistory, GroupAlertHistoryView.get(
+ this.alertHistory.extendLocatorId("View"), groupComposite), true, true);
// but alert definitions can only be created on compatible groups
visible = (groupCategory == GroupCategory.COMPATIBLE);
canvas = (visible) ? new GroupAlertDefinitionsView(alertDef.extendLocatorId("View"),
@@ -279,6 +283,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateSubTab(this.configurationTab, this.configCurrent, new GroupResourceConfigurationEditView(
this.configCurrent.extendLocatorId("View"), this.groupComposite), true, true);
updateSubTab(this.configurationTab, this.configHistory, new FullHTMLPane(
+ this.configHistory.extendLocatorId("View"),
"/rhq/group/configuration/history-plain.xhtml?groupId=" + groupId), true, true);
}
// allow mixed groups to show events from supporting resources
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 5ade636..3145c05 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
@@ -58,6 +58,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
* @author Greg Hinkle
* @author Joseph Marques
*/
+// TODO (ips, 10/28/10): Refactor this class to extend AbstractSectionedLeftNavigationView.
public class InventoryView extends LocatableHLayout implements BookmarkableView {
public static final String VIEW_ID = "Inventory";
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 f0154d3..e5926aa 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
@@ -54,7 +54,7 @@ public class ResourceSearchView extends Table {
private static final String DEFAULT_TITLE = "Resources";
- private ArrayList<ResourceSelectListener> selectListeners = new ArrayList<ResourceSelectListener>();
+ private List<ResourceSelectListener> selectListeners = new ArrayList<ResourceSelectListener>();
/**
* A list of all Resources in the system.
@@ -74,12 +74,19 @@ public class ResourceSearchView extends Table {
this(locatorId, criteria, DEFAULT_TITLE);
}
+ /**
+ * A Resource list filtered by a given criteria with the given title.
+ *
+ * @param headerIcons 24x24 icon(s) to be displayed in the header
+ */
public ResourceSearchView(String locatorId, Criteria criteria, String title, String... headerIcons) {
this(locatorId, criteria, title, null, null, headerIcons);
}
/**
* A Resource list filtered by a given criteria with the given title.
+ *
+ * @param headerIcons 24x24 icon(s) to be displayed in the header
*/
public ResourceSearchView(String locatorId, Criteria criteria, String title, SortSpecifier[] sortSpecifier,
String[] excludeFields, String... headerIcons) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index 3b1d107..517c105 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -206,28 +206,36 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
updateSubTab(this.summaryTab, this.summaryOverview,
new OverviewView(this.summaryTab.extendLocatorId("OverviewView"), this.resourceComposite), true, true);
- updateSubTab(this.summaryTab, this.summaryDashboard, new DashboardView(this.resourceComposite), true, true);
+ updateSubTab(this.summaryTab, this.summaryDashboard, new DashboardView(
+ this.summaryDashboard.extendLocatorId("View"), this.resourceComposite), true, true);
updateSubTab(this.summaryTab, this.summaryTimeline, new FullHTMLPane(
+ this.summaryTimeline.extendLocatorId("View"),
"/rhq/resource/summary/timeline-plain.xhtml?id=" + resource.getId()), true, true);
visible = hasMetricsOfType(this.resourceComposite, DataType.MEASUREMENT);
//canvas = (visible) ? new GraphListView(this.monitoringTab.extendLocatorId("GraphListView"), resource) : null;
- canvas = (visible) ? new FullHTMLPane("/rhq/resource/monitor/graphs-plain.xhtml?id=" + resource.getId()) : null;
+ canvas = (visible) ? new FullHTMLPane(this.monitorGraphs.extendLocatorId("View"),
+ "/rhq/resource/monitor/graphs-plain.xhtml?id=" + resource.getId()) : null;
updateSubTab(this.monitoringTab, this.monitorGraphs, canvas, visible, true);
+
// visible = same test as above
- canvas = (visible) ? new FullHTMLPane("/rhq/common/monitor/tables-plain.xhtml?id=" + resource.getId()) : null;
+ canvas = (visible) ? new FullHTMLPane(this.monitorTables.extendLocatorId("View"),
+ "/rhq/common/monitor/tables-plain.xhtml?id=" + resource.getId()) : null;
updateSubTab(this.monitoringTab, this.monitorTables, canvas, visible, true);
+
visible = hasMetricsOfType(this.resourceComposite, DataType.TRAIT);
canvas = (visible) ? new TraitsView(this.monitoringTab.extendLocatorId("TraitsView"), resource.getId()) : null;
updateSubTab(this.monitoringTab, this.monitorTraits, canvas, visible, true);
- updateSubTab(this.monitoringTab, this.monitorAvail, new FullHTMLPane(
+ updateSubTab(this.monitoringTab, this.monitorAvail, new FullHTMLPane(this.monitorAvail.extendLocatorId("View"),
"/rhq/resource/monitor/availabilityHistory-plain.xhtml?id=" + resource.getId()), true, true);
updateSubTab(this.monitoringTab, this.monitorSched,
new SchedulesView(monitoringTab.extendLocatorId("SchedulesView"), resource.getId()),
hasMetricsOfType(this.resourceComposite, null), true);
+
visible = facets.contains(ResourceTypeFacet.CALL_TIME);
- canvas = (visible) ? new FullHTMLPane("/rhq/resource/monitor/response-plain.xhtml?id=" + resource.getId())
+ canvas = (visible) ? new FullHTMLPane(this.monitorCallTime.extendLocatorId("View"),
+ "/rhq/resource/monitor/response-plain.xhtml?id=" + resource.getId())
: null;
updateSubTab(this.monitoringTab, this.monitorCallTime, canvas, visible, true);
@@ -257,11 +265,12 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
// note: enabled operation execution/schedules from left-nav, if it doesn't already exist
updateSubTab(this.operationsTab, this.opHistory, OperationHistoryView.getResourceHistoryView(
operationsTab.extendLocatorId("HistoryView"), this.resourceComposite), true, true);
- updateSubTab(this.operationsTab, this.opSched, new FullHTMLPane(
+ updateSubTab(this.operationsTab, this.opSched, new FullHTMLPane(this.opSched.extendLocatorId("View"),
"/rhq/resource/operation/resourceOperationSchedules-plain.xhtml?id=" + resource.getId()), true, true);
}
- updateSubTab(this.alertsTab, this.alertHistory, ResourceAlertHistoryView.get(resourceComposite), true, true);
+ updateSubTab(this.alertsTab, this.alertHistory,
+ ResourceAlertHistoryView.get(this.alertHistory.extendLocatorId("View"), resourceComposite), true, true);
updateSubTab(this.alertsTab, this.alertDef,
new ResourceAlertDefinitionsView(alertsTab.extendLocatorId("AlertDefView"), this.resourceComposite), true,
true);
@@ -283,12 +292,15 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
if (updateTab(this.contentTab, facets.contains(ResourceTypeFacet.CONTENT), true)) {
updateSubTab(this.contentTab, this.contentDeployed, new FullHTMLPane(
+ this.contentDeployed.extendLocatorId("View"),
"/rhq/resource/content/view-plain.xhtml?id=" + resource.getId()), true, true);
- updateSubTab(this.contentTab, this.contentNew, new FullHTMLPane(
+ updateSubTab(this.contentTab, this.contentNew, new FullHTMLPane(this.contentNew.extendLocatorId("View"),
"/rhq/resource/content/deploy-plain.xhtml?id=" + resource.getId()), true, true);
updateSubTab(this.contentTab, this.contentSubscrip, new FullHTMLPane(
+ this.contentSubscrip.extendLocatorId("View"),
"/rhq/resource/content/subscription-plain.xhtml?id=" + resource.getId()), true, true);
updateSubTab(this.contentTab, this.contentHistory, new FullHTMLPane(
+ this.configHistory.extendLocatorId("View"),
"/rhq/resource/content/history-plain.xhtml?id=" + resource.getId()), true, true);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/DashboardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/DashboardView.java
index b857b35..078c8e9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/DashboardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/DashboardView.java
@@ -30,7 +30,8 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectLi
public class DashboardView extends FullHTMLPane implements ResourceSelectListener {
private ResourceComposite resourceComposite;
- public DashboardView(ResourceComposite resourceComposite) {
+ public DashboardView(String locatorId, ResourceComposite resourceComposite) {
+ super(locatorId, null);
this.resourceComposite = resourceComposite;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
index 1f5a37b..d5cd465 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
@@ -22,249 +22,121 @@
*/
package org.rhq.enterprise.gui.coregui.client.report;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
-import com.google.gwt.http.client.URL;
-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.layout.SectionStack;
-import com.smartgwt.client.widgets.layout.SectionStackSection;
-import com.smartgwt.client.widgets.tree.Tree;
-import com.smartgwt.client.widgets.tree.TreeGrid;
-import com.smartgwt.client.widgets.tree.TreeNode;
-import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ViewId;
-import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.alert.AlertHistoryView;
import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
-import org.rhq.enterprise.gui.coregui.client.components.tree.EnhancedTreeNode;
+import org.rhq.enterprise.gui.coregui.client.components.view.AbstractSectionedLeftNavigationView;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
+import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
+import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.platform.PlatformPortletView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ConfigurationHistoryView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.OperationHistoryView;
import org.rhq.enterprise.gui.coregui.client.report.measurement.MeasurementOOBView;
import org.rhq.enterprise.gui.coregui.client.report.tag.TaggedView;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
/**
* @author Greg Hinkle
*/
-public class ReportTopView extends LocatableHLayout implements BookmarkableView {
+public class ReportTopView extends AbstractSectionedLeftNavigationView {
public static final String VIEW_ID = "Reports";
private static final String SUBSYSTEMS_SECTION_VIEW_ID = "Subsystems";
private static final String INVENTORY_SECTION_VIEW_ID = "Inventory";
- private ViewId currentSectionViewId;
- private ViewId currentPageViewId;
-
- private SectionStack sectionStack;
-
- private Canvas contentCanvas;
- private Canvas currentContent;
- private Map<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
-
public ReportTopView(String locatorId) {
- super(locatorId);
+ super(locatorId, VIEW_ID);
}
@Override
- protected void onInit() {
- super.onInit();
-
- setWidth100();
- setHeight100();
+ protected List<NavigationSection> getNavigationSections() {
+ List<NavigationSection> sections = new ArrayList<NavigationSection>();
- contentCanvas = new Canvas();
- contentCanvas.setWidth("*");
- contentCanvas.setHeight100();
+ NavigationSection subsystemsSection = buildSubsystemsSection();
+ sections.add(subsystemsSection);
- sectionStack = new LocatableSectionStack(this.getLocatorId());
- sectionStack.setShowResizeBar(true);
- sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
- sectionStack.setWidth(250);
- sectionStack.setHeight100();
+ NavigationSection inventorySection = buildInventorySection();
+ sections.add(inventorySection);
- addSection(buildSubsystemsSection());
- addSection(buildInventorySection());
-
- addMember(sectionStack);
- addMember(contentCanvas);
+ return sections;
}
- private void addSection(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();
- String viewPath = ReportTopView.VIEW_ID + "/" + sectionName + "/" + pageName;
- String currentViewPath = History.getToken();
- if (!currentViewPath.startsWith(viewPath)) {
- CoreGUI.goToView(viewPath);
- }
- }
- }
- });
-
- SectionStackSection section = new SectionStackSection(sectionName);
- section.setExpanded(true);
- section.addItem(treeGrid);
-
- this.sectionStack.addSection(section);
- }
-
- private HTMLFlow defaultView() {
+ @Override
+ protected HTMLFlow defaultView() {
String contents = "<h1>Reports</h1>\n" + "This section provides access to global reports.";
HTMLFlow flow = new HTMLFlow(contents);
flow.setPadding(20);
return flow;
}
- private TreeGrid buildSubsystemsSection() {
- final TreeGrid inventoryTreeGrid = new LocatableTreeGrid(SUBSYSTEMS_SECTION_VIEW_ID);
- inventoryTreeGrid.setLeaveScrollbarGap(false);
- inventoryTreeGrid.setShowHeader(false);
-
- Tree tree = new Tree();
- final TreeNode tagCloud = new EnhancedTreeNode(TaggedView.VIEW_ID);
- tagCloud.setIcon("global/Cloud_16.png");
-
- final TreeNode suspectMetrics = new EnhancedTreeNode(MeasurementOOBView.VIEW_ID);
- suspectMetrics.setIcon("subsystems/monitor/Monitor_failed_16.png");
-
- final TreeNode recentConfigurationChanges = new EnhancedTreeNode(ConfigurationHistoryView.VIEW_ID);
- recentConfigurationChanges.setIcon("subsystems/configure/Configure_16.png");
-
- final TreeNode recentOperations = new EnhancedTreeNode(OperationHistoryView.VIEW_ID);
- recentOperations.setIcon("subsystems/control/Operation_16.png");
-
- final TreeNode recentAlerts = new EnhancedTreeNode(AlertHistoryView.VIEW_ID);
- recentAlerts.setIcon("subsystems/alert/Alert_LOW_16.png");
-
- final TreeNode alertDefinitions = new EnhancedTreeNode("Alert Definitions");
- alertDefinitions.setIcon("subsystems/alert/Alerts_16.png");
-
- TreeNode inventoryNode = new EnhancedTreeNode(SUBSYSTEMS_SECTION_VIEW_ID, tagCloud, suspectMetrics,
- recentConfigurationChanges, recentOperations, recentAlerts, alertDefinitions);
- tree.setRoot(inventoryNode);
-
- inventoryTreeGrid.setData(tree);
-
- return inventoryTreeGrid;
- }
-
- private TreeGrid buildInventorySection() {
-
- final TreeGrid reportsTreeGrid = new LocatableTreeGrid(INVENTORY_SECTION_VIEW_ID);
- reportsTreeGrid.setLeaveScrollbarGap(false);
- reportsTreeGrid.setShowHeader(false);
-
- Tree tree = new Tree();
- final TreeNode inventorySummary = new EnhancedTreeNode("InventorySummary");
- inventorySummary.setIcon("subsystems/inventory/Inventory_16.png");
-
- final TreeNode platforms = new EnhancedTreeNode(PlatformPortletView.VIEW_ID);
- platforms.setIcon("types/Platform_up_16.png");
-
- TreeNode reportsNode = new EnhancedTreeNode(INVENTORY_SECTION_VIEW_ID, inventorySummary, platforms);
- tree.setRoot(reportsNode);
-
- reportsTreeGrid.setData(tree);
-
- return reportsTreeGrid;
- }
-
- public void setContent(Canvas newContent) {
- // A call to destroy (e.g. certain IFrames/FullHTMLPane) can actually remove multiple children of the
- // contentCanvas. As such, we need to query for the children after each destroy to ensure only valid children
- // are in the array.
- Canvas[] children;
- while ((children = contentCanvas.getChildren()).length > 0) {
- children[0].destroy();
- }
-
- contentCanvas.addChild(newContent);
- contentCanvas.markForRedraw();
- this.currentContent = newContent;
- }
-
- private void renderContentView(ViewPath viewPath) {
- currentSectionViewId = viewPath.getCurrent();
- currentPageViewId = viewPath.getNext();
-
- String sectionName = currentSectionViewId.getPath();
- String pageName = currentPageViewId.getPath();
-
- pageName = URL.decode(pageName);
+ private NavigationSection buildSubsystemsSection() {
+ NavigationItem tagItem = new NavigationItem(TaggedView.VIEW_ID, "global/Cloud_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return new TaggedView(extendLocatorId("Tag"));
+ }
+ });
- Canvas content = null;
- if (SUBSYSTEMS_SECTION_VIEW_ID.equals(sectionName)) {
- if (TaggedView.VIEW_ID.equals(pageName)) {
- content = new TaggedView(this.extendLocatorId("Tag"));
- } else if (MeasurementOOBView.VIEW_ID.equals(pageName)) {
- content = new MeasurementOOBView(this.extendLocatorId("SuspectMetrics"));
- } else if (ConfigurationHistoryView.VIEW_ID.equals(pageName)) {
- content = new ConfigurationHistoryView(this.extendLocatorId("ConfigHistory"));
- } else if (OperationHistoryView.VIEW_ID.equals(pageName)) {
- content = new OperationHistoryView(this.extendLocatorId("RecentOps"));
- } else if (AlertHistoryView.VIEW_ID.equals(pageName)) {
- content = new AlertHistoryView(this.extendLocatorId("RecentAlerts"));
- } else if ("Alert Definitions".equals(pageName)) {
- // TODO (mazz)
+ NavigationItem suspectMetricsItem = new NavigationItem(MeasurementOOBView.VIEW_ID,
+ "subsystems/monitor/Monitor_failed_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return new MeasurementOOBView(extendLocatorId("SuspectMetrics"));
}
- } else if (INVENTORY_SECTION_VIEW_ID.equals(sectionName)) {
- if ("InventorySummary".equals(pageName)) {
- content = new FullHTMLPane("/rhq/admin/report/resourceInstallReport-body.xhtml");
- } else if (PlatformPortletView.VIEW_ID.equals(pageName)) {
- content = new PlatformPortletView(this.extendLocatorId("Platforms"));
+ });
+
+ NavigationItem recentConfigurationChangesItem = new NavigationItem(ConfigurationHistoryView.VIEW_ID,
+ "subsystems/configure/Configure_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return new ConfigurationHistoryView(extendLocatorId("ConfigHistory"));
}
- }
+ });
- for (String name : treeGrids.keySet()) {
- TreeGrid treeGrid = treeGrids.get(name);
- if (name.equals(sectionName)) {
- TreeNode node = treeGrid.getTree().find(pageName);
- if (node != null) {
- treeGrid.selectSingleRecord(node);
- }
- } else {
- treeGrid.deselectAllRecords();
+ NavigationItem recentOperationsItem = new NavigationItem(OperationHistoryView.VIEW_ID,
+ "subsystems/control/Operation_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return new OperationHistoryView(extendLocatorId("RecentOps"));
}
- }
+ });
- if (null != content) {
- setContent(content);
+ NavigationItem recentAlertsItem = new NavigationItem(AlertHistoryView.SUBSYSTEM_VIEW_ID,
+ "subsystems/alert/Alert_LOW_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return new AlertHistoryView(extendLocatorId("RecentAlerts"));
+ }
+ });
- if (content instanceof BookmarkableView) {
- ((BookmarkableView) content).renderView(viewPath.next().next());
+ NavigationItem alertDefinitionsItem = new NavigationItem("AlertDefinitions",
+ "subsystems/alert/Alerts_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return null; // TODO: mazz
}
- }
+ });
+
+ return new NavigationSection(SUBSYSTEMS_SECTION_VIEW_ID, tagItem, suspectMetricsItem,
+ recentConfigurationChangesItem, recentOperationsItem, recentAlertsItem, alertDefinitionsItem);
}
- public void renderView(ViewPath viewPath) {
- if (!viewPath.isCurrent(currentSectionViewId) || !viewPath.isNext(currentPageViewId)) {
- if (viewPath.isEnd()) {
- // Display default view
- setContent(defaultView());
- } else {
- renderContentView(viewPath);
+ private NavigationSection buildInventorySection() {
+ NavigationItem
+ inventorySummaryItem = new NavigationItem("InventorySummary", "subsystems/inventory/Inventory_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new FullHTMLPane(extendLocatorId("InventorySummary"),
+ "/rhq/admin/report/resourceInstallReport-body.xhtml");
}
- } else {
- if (this.currentContent instanceof BookmarkableView) {
- ((BookmarkableView) this.currentContent).renderView(viewPath.next().next());
+ });
+
+ NavigationItem platformSystemInfoItem = new NavigationItem(PlatformPortletView.VIEW_ID, "types/Platform_up_16.png",
+ new ViewFactory() {
+ public Canvas createView() {
+ return new PlatformPortletView(extendLocatorId("Platforms"));
}
- }
+ });
+
+ return new NavigationSection(INVENTORY_SECTION_VIEW_ID, inventorySummaryItem, platformSystemInfoItem);
}
}
\ No newline at end of file
13 years, 7 months
[rhq] 2 commits - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 52 ++++------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java | 8 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java | 30 ++++-
3 files changed, 53 insertions(+), 37 deletions(-)
New commits:
commit 65210f07b8b74eb5f19d931539d97ef0c8217f97
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Nov 1 16:11:25 2010 -0400
be able to have a left-hand nav item refresh the right side. this is used today by Administration>Templates
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 e3b0450..dcc5f7e 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
@@ -158,6 +158,7 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
return new ResourceTypeTreeView(extendLocatorId(PAGE_TEMPLATES_VIEW_ID));
}
});
+ templatesItem.setRefreshRequired(true); // we always need a new page
NavigationItem downloadsItem = new NavigationItem(PAGE_DOWNLOADS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
index 74861c2..c70fccd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
@@ -190,6 +190,10 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
throw new IllegalStateException("Invalid page: " + pageName);
}
+ if (item.isRefreshRequired()) {
+ this.currentPageViewId = null;
+ }
+
// When changing sections, make sure the previous section's selection is deselected.
selectSectionPageTreeGridNode(sectionName, pageName);
@@ -231,8 +235,8 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
if (node != null) {
treeGrid.selectSingleRecord(node);
} else {
- CoreGUI.getErrorHandler().handleError("Unknown page name '" + pageName + "' for section '"
- + sectionName + "' - URL is invalid.");
+ CoreGUI.getErrorHandler().handleError(
+ "Unknown page name '" + pageName + "' for section '" + sectionName + "' - URL is invalid.");
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
index 24e04ff..90339d3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/NavigationItem.java
@@ -23,10 +23,12 @@ package org.rhq.enterprise.gui.coregui.client.components.view;
* @author Ian Springer
*/
public class NavigationItem {
- private String name;
- private String icon;
- private ViewFactory viewFactory;
- private boolean enabled;
+ private final String name;
+ private final String icon;
+ private final ViewFactory viewFactory;
+ private final boolean enabled;
+
+ private boolean refreshRequired = false;
public NavigationItem(String name, String icon, ViewFactory viewFactory) {
this(name, icon, viewFactory, true);
@@ -42,7 +44,7 @@ public class NavigationItem {
public String getName() {
return name;
}
-
+
public String getIcon() {
return icon;
}
@@ -54,4 +56,22 @@ public class NavigationItem {
public boolean isEnabled() {
return enabled;
}
+
+ /**
+ * This flag indicates if the item's view must be refreshed when its main navigation item
+ * is selected within the user interface. Most times, if the navigation item's view is already
+ * created, it can just be re-displayed as it was previously - in which case this flag can
+ * be <code>false</code> (which is its default). However, if the view must be recreated due to
+ * the possibility of some dynamic data changing (where that dynamic data is needed to build
+ * the view), then this flag should be <code>true</code>.
+ *
+ * @return flag to indicate if the navigation item's view needs to be refreshed when the item is selected again
+ */
+ public boolean isRefreshRequired() {
+ return refreshRequired;
+ }
+
+ public void setRefreshRequired(boolean flag) {
+ this.refreshRequired = flag;
+ }
}
commit 992506bc757e64d10f9b0ddf0f41c6b7be9fa387
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Nov 1 16:06:13 2010 -0400
reformat to line length
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 dcd6aea..e3b0450 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
@@ -90,15 +90,13 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
}
private NavigationSection buildSecuritySection() {
- NavigationItem usersItem = new NavigationItem(UsersView.VIEW_ID, "global/User_16.png",
- new ViewFactory() {
+ NavigationItem usersItem = new NavigationItem(UsersView.VIEW_ID, "global/User_16.png", new ViewFactory() {
public Canvas createView() {
return new UsersView(extendLocatorId("Users"));
}
});
- NavigationItem rolesItem = new NavigationItem(RolesView.VIEW_ID, "global/Role_16.png",
- new ViewFactory() {
+ NavigationItem rolesItem = new NavigationItem(RolesView.VIEW_ID, "global/Role_16.png", new ViewFactory() {
public Canvas createView() {
return new RolesView(extendLocatorId("Roles"));
}
@@ -108,81 +106,74 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
}
private NavigationSection buildTopologySection() {
- NavigationItem serversItem = new NavigationItem(PAGE_SERVERS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem serversItem = new NavigationItem(PAGE_SERVERS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
- return new FullHTMLPane(extendLocatorId(PAGE_SERVERS_VIEW_ID), "/rhq/ha/listServers-plain.xhtml?nomenu=true");
+ return new FullHTMLPane(extendLocatorId(PAGE_SERVERS_VIEW_ID),
+ "/rhq/ha/listServers-plain.xhtml?nomenu=true");
}
});
- NavigationItem agentsItem = new NavigationItem(PAGE_AGENTS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem agentsItem = new NavigationItem(PAGE_AGENTS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
- return new FullHTMLPane(extendLocatorId(PAGE_AGENTS_VIEW_ID), "/rhq/ha/listAgents-plain.xhtml?nomenu=true");
+ return new FullHTMLPane(extendLocatorId(PAGE_AGENTS_VIEW_ID),
+ "/rhq/ha/listAgents-plain.xhtml?nomenu=true");
}
});
- NavigationItem affinityGroupsItem = new NavigationItem(PAGE_AFFINITY_GROUPS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem affinityGroupsItem = new NavigationItem(PAGE_AFFINITY_GROUPS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_AFFINITY_GROUPS_VIEW_ID),
"/rhq/ha/listAffinityGroups-plain.xhtml?nomenu=true");
}
});
- NavigationItem partitionEventsItem = new NavigationItem(PAGE_PARTITION_EVENTS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem partitionEventsItem = new NavigationItem(PAGE_PARTITION_EVENTS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_PARTITION_EVENTS_VIEW_ID),
"/rhq/ha/listPartitionEvents-plain.xhtml?nomenu=true");
}
});
- NavigationItem remoteAgentInstallItem = new NavigationItem(RemoteAgentInstallView.VIEW_ID, "global/Agent_16.png",
- new ViewFactory() {
- public Canvas createView() {
- return new RemoteAgentInstallView(extendLocatorId("RemoteAgentInstall"));
- }
- });
+ NavigationItem remoteAgentInstallItem = new NavigationItem(RemoteAgentInstallView.VIEW_ID,
+ "global/Agent_16.png", new ViewFactory() {
+ public Canvas createView() {
+ return new RemoteAgentInstallView(extendLocatorId("RemoteAgentInstall"));
+ }
+ });
return new NavigationSection(SECTION_TOPOLOGY_VIEW_ID, serversItem, agentsItem, affinityGroupsItem,
partitionEventsItem, remoteAgentInstallItem);
}
private NavigationSection buildConfigurationSection() {
- NavigationItem systemSettingsItem = new NavigationItem(PAGE_SYSTEM_SETTINGS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem systemSettingsItem = new NavigationItem(PAGE_SYSTEM_SETTINGS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_SYSTEM_SETTINGS_VIEW_ID),
"/admin/config/Config.do?mode=edit&nomenu=true");
}
});
- NavigationItem templatesItem = new NavigationItem(PAGE_TEMPLATES_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem templatesItem = new NavigationItem(PAGE_TEMPLATES_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new ResourceTypeTreeView(extendLocatorId(PAGE_TEMPLATES_VIEW_ID));
}
});
- NavigationItem downloadsItem = new NavigationItem(PAGE_DOWNLOADS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem downloadsItem = new NavigationItem(PAGE_DOWNLOADS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_DOWNLOADS_VIEW_ID),
"/rhq/admin/downloads-body.xhtml?nomenu=true");
}
});
- NavigationItem licenseItem = new NavigationItem(PAGE_LICENSE_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem licenseItem = new NavigationItem(PAGE_LICENSE_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_LICENSE_VIEW_ID),
"/admin/license/LicenseAdmin.do?mode=view&nomenu=true");
}
});
- NavigationItem pluginsItem = new NavigationItem(PAGE_PLUGINS_VIEW_ID, null,
- new ViewFactory() {
+ NavigationItem pluginsItem = new NavigationItem(PAGE_PLUGINS_VIEW_ID, null, new ViewFactory() {
public Canvas createView() {
return new FullHTMLPane(extendLocatorId(PAGE_PLUGINS_VIEW_ID),
"/rhq/admin/plugin/plugin-list-plain.xhtml?nomenu=true");
13 years, 7 months
[rhq] pom.xml
by ips
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 11f3d55457933831087b0d15211bc802370cb3c4
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 15:09:24 2010 -0400
re-upgrade assembly plugin from 2.2-beta-5 to 2.2, since that was not what was causing the issue in hudson
diff --git a/pom.xml b/pom.xml
index fbc99cc..3d4b50f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -473,7 +473,7 @@
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
- <version>2.2-beta-5</version>
+ <version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
13 years, 7 months
[rhq] modules/enterprise
by ips
modules/enterprise/remoting/cli/pom.xml | 25 ++-----------------------
1 file changed, 2 insertions(+), 23 deletions(-)
New commits:
commit 182d7b273c511c97d2a4155ef9dda89431480ee4
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 14:46:28 2010 -0400
another attempt to fix Hudson assembly plugin error
diff --git a/modules/enterprise/remoting/cli/pom.xml b/modules/enterprise/remoting/cli/pom.xml
index d418d82..28f56b1 100644
--- a/modules/enterprise/remoting/cli/pom.xml
+++ b/modules/enterprise/remoting/cli/pom.xml
@@ -84,28 +84,7 @@
<build>
<plugins>
-
- <plugin>
- <artifactId>maven-enforcer-plugin</artifactId>
- <executions>
- <execution>
- <id>enforce-versions</id>
- <goals>
- <!-- IMPORTANT: Use enforce goal, rather than enforce-once goal, otherwise reactor
- builds will fail due to http://jira.codehaus.org/browse/MENFORCER-11 -->
- <goal>enforce</goal>
- </goals>
- <configuration>
- <rules>
- <requireJavaVersion>
- <version>[1.6,1.8)</version> <!-- 1.6.x, 1.7.x -->
- </requireJavaVersion>
- </rules>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
+
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
@@ -206,7 +185,7 @@
<executions>
<execution>
<id>assemble-rhq-client-zip</id>
- <phase>package</phase>
+ <phase>pre-integration-test</phase>
<goals>
<goal>single</goal>
</goals>
13 years, 7 months
[rhq] pom.xml
by ips
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 33bca7123055444a61871f3c1d2a3ac317a05f93
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 13:59:15 2010 -0400
downgrade assembly plugin from 2.2 to 2.2-beta-5 in an attempt to fix hudson build error for cli module
diff --git a/pom.xml b/pom.xml
index 3d4b50f..fbc99cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -473,7 +473,7 @@
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
- <version>2.2</version>
+ <version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
13 years, 7 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
New commits:
commit 89a48ed7a217921ef8cdaa3798af7882a9bd1ade
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Nov 1 13:11:40 2010 -0400
HeaderItem.setDefaultValue should be used to set the header text
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
index b808fc8..eb07c45 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
@@ -59,7 +59,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
*/
public class RemoteAgentInstallView extends LocatableVLayout {
public static final String VIEW_ID = "RemoteAgentInstall";
-
+
private RemoteInstallGWTServiceAsync remoteInstallService = GWTServiceLookup.getRemoteInstallService();
private DynamicForm connectionForm;
@@ -100,7 +100,7 @@ public class RemoteAgentInstallView extends LocatableVLayout {
connectionForm.setMargin(20);
HeaderItem connectionHeader = new HeaderItem();
- connectionHeader.setValue("Connection Information");
+ connectionHeader.setDefaultValue("Connection Information");
TextItem host = new TextItem("host", "Hostname");
host.setRequired(true);
@@ -178,7 +178,7 @@ public class RemoteAgentInstallView extends LocatableVLayout {
buttonsForm.setColWidths("10%", "30%", "30%", "30%");
HeaderItem buttonsHeader = new HeaderItem();
- buttonsHeader.setValue("Operations");
+ buttonsHeader.setDefaultValue("Operations");
SpacerItem spacerItem = new SpacerItem();
spacerItem.setStartRow(true);
13 years, 7 months
[rhq] modules/helpers
by ips
modules/helpers/pluginGen/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 4f283ddf6eb0d43c2645c87283520f78bf9b2a5f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 1 13:08:17 2010 -0400
[maven-release-plugin] prepare for next development iteration
diff --git a/modules/helpers/pluginGen/pom.xml b/modules/helpers/pluginGen/pom.xml
index 8dd75a2..db4e85d 100644
--- a/modules/helpers/pluginGen/pom.xml
+++ b/modules/helpers/pluginGen/pom.xml
@@ -13,7 +13,7 @@
<groupId>org.rhq.helpers</groupId>
<artifactId>rhq-pluginGen</artifactId>
<packaging>jar</packaging>
- <version>3.0.1</version>
+ <version>3.0.2-SNAPSHOT</version>
<name>RHQ plugin generator</name>
<description>Helper to generate plugin skeletons</description>
13 years, 7 months
[rhq] Changes to 'refs/tags/rhq-pluginGen-3.0.1'
by ips
Tag 'rhq-pluginGen-3.0.1' created by Ian Springer <ian.springer(a)redhat.com> at 2010-11-01 17:08 +0000
[maven-release-plugin] copy for tag rhq-pluginGen-3.0.1
Changes since rhq-pluginAnnotations-3.0.1:
Ian Springer (4):
[maven-release-plugin] prepare for next development iteration
fix scm URLs
prep for pluginGen release
[maven-release-plugin] prepare release rhq-pluginGen-3.0.1
---
modules/helpers/pluginAnnotations/pom.xml | 4 ++--
modules/helpers/pluginGen/pom.xml | 26 ++++++++++++++++----------
pom.xml | 8 +++++---
3 files changed, 23 insertions(+), 15 deletions(-)
---
13 years, 7 months