[rhq] Branch 'bugfixes' - 4 commits - modules/core modules/enterprise
by John Sanda
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 5 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java | 13 +++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java | 5 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java | 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java | 37 ++++++++++
6 files changed, 66 insertions(+)
New commits:
commit b24055ad8389fa4fa5bcf7d1468ec77b246dd3cb
Merge: 5a56c76... f2cc28d...
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Mar 29 15:16:26 2010 -0400
Merge branch 'bugfixes' of ssh://git.fedorahosted.org/git/rhq/rhq into bugfixes
commit 5a56c76e6d073c31a1818167d6cab87496f8c461
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Mar 29 15:14:22 2010 -0400
[BZ 573982] Adding performance monitoring interceptor temporarily for this bug
Adding the hibernate performance momnitoring interceptor only for these
EJBs to reduce noise in the logs
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
index 11d86a4..5ecc627 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
@@ -27,6 +27,7 @@ import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
+import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;
@@ -52,6 +53,7 @@ import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.AlertManagerLocal;
import org.rhq.enterprise.server.common.EntityContext;
+import org.rhq.enterprise.server.common.PerformanceMonitorInterceptor;
import org.rhq.enterprise.server.measurement.MeasurementPreferences.MetricRangePreferences;
import org.rhq.enterprise.server.measurement.uibean.MetricDisplayConstants;
import org.rhq.enterprise.server.measurement.uibean.MetricDisplaySummary;
@@ -66,6 +68,7 @@ import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
*/
@Stateless
@javax.annotation.Resource(name = "RHQ_DS", mappedName = RHQConstants.DATASOURCE_JNDI_NAME)
+(a)Interceptors(PerformanceMonitorInterceptor.class)
public class MeasurementChartsManagerBean implements MeasurementChartsManagerLocal {
private final Log log = LogFactory.getLog(MeasurementChartsManagerBean.class);
@@ -446,6 +449,8 @@ public class MeasurementChartsManagerBean implements MeasurementChartsManagerLoc
return data;
}
+ // TODO if cannot view resources throw permission exception
+
MeasurementDataManagerUtility dataUtil = MeasurementDataManagerUtility.getInstance(rhqDs);
// Loop over the definitions, find matching schedules and create a MetricDisplaySummary for each definition
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 6080f7b..4a95ac1 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
@@ -34,6 +34,7 @@ import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
+import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
@@ -84,6 +85,7 @@ import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.authz.RequiredPermissions;
+import org.rhq.enterprise.server.common.PerformanceMonitorInterceptor;
import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
@@ -103,6 +105,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
@Stateless
@javax.annotation.Resource(name = "RHQ_DS", mappedName = RHQConstants.DATASOURCE_JNDI_NAME)
+(a)Interceptors(PerformanceMonitorInterceptor.class)
public class MeasurementScheduleManagerBean implements MeasurementScheduleManagerLocal,
MeasurementScheduleManagerRemote {
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
commit d584b84602f1e5a660540f744ae0458688b24fc8
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Mar 29 15:11:27 2010 -0400
[BZ 573982] Adding JPA query for canViewResources
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index beb1703..9d91174 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -119,6 +119,10 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ "FROM Resource res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.subjects) s "
+ "WHERE s = :subject AND res.id = :resourceId"),
+ @NamedQuery(name = Subject.QUERY_CAN_VIEW_RESOURCES, query = "SELECT COUNT(res) "
+ + "FROM Resource res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.subjects) s "
+ + "WHERE s = :subject AND res.id IN (:resourceIds)"),
+
@NamedQuery(name = Subject.QUERY_CAN_VIEW_GROUP, query = "SELECT count(g) " + "FROM ResourceGroup g "
+ "WHERE (g.id IN (SELECT rg.id " + " FROM ResourceGroup rg "
+ " JOIN rg.roles r " + " JOIN r.subjects s "
@@ -180,6 +184,7 @@ public class Subject implements Externalizable {
public static final String QUERY_HAS_RESOURCE_PERMISSION = "Subject.hasResourcePermission";
public static final String QUERY_CAN_VIEW_RESOURCE = "Subject.canViewResource";
+ public static final String QUERY_CAN_VIEW_RESOURCES = "Subject.canViewResources";
public static final String QUERY_CAN_VIEW_GROUP = "Subject.canViewGroup";
public static final String QUERY_GET_RESOURCES_BY_PERMISSION = "Subject.getResourcesByPermission";
commit c7212aecbb5e81fbe227164b9030f8782941a7fb
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Mar 29 15:08:52 2010 -0400
[BZ 573982] Adding inital impl and test for AuthorizationManagerBean.canViewResources
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
index ad8ae65..a6b3e99 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
@@ -151,6 +151,19 @@ public class AuthorizationManagerBean implements AuthorizationManagerLocal {
return (count != 0);
}
+ public boolean canViewResources(Subject subject, List<Integer> resourceIds) {
+ if (isInventoryManager(subject)) {
+ return true;
+ }
+
+ Query query = entityManager.createNamedQuery(Subject.QUERY_CAN_VIEW_RESOURCES);
+ query.setParameter("subject", subject);
+ query.setParameter("resourceIds", resourceIds);
+ long count = (Long) query.getSingleResult();
+
+ return count == resourceIds.size();
+ }
+
public boolean canViewGroup(Subject subject, int groupId) {
if (isInventoryManager(subject)) {
return true;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java
index 9cdab76..ce8ad68 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.authz;
import java.util.Collection;
+import java.util.List;
import java.util.Set;
import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
@@ -44,6 +45,8 @@ public interface AuthorizationManagerLocal {
*/
boolean canViewResource(Subject subject, int resourceId);
+ boolean canViewResources(Subject subject, List<Integer> resourceIds);
+
/**
* Returns true if the current user has some role attached to this group.
*
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java
index 49b5bca..9d31668 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java
@@ -18,8 +18,10 @@
*/
package org.rhq.enterprise.server.authz.test;
+import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
+import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
@@ -371,6 +373,41 @@ public class AuthorizationManagerBeanTest extends AbstractEJB3Test {
}
}
+ @Test
+ public void testCanViewResources() throws Exception {
+ getTransactionManager().begin();
+ EntityManager entityMgr = getEntityManager();
+
+ try {
+ Subject subject = SessionTestHelper.createNewSubject(entityMgr, "testSubject");
+ Subject anotherSubject = SessionTestHelper.createNewSubject(entityMgr, "anotherTestSubject");
+
+ Role roleWithSubject = SessionTestHelper.createNewRoleForSubject(entityMgr, subject, "role with subject");
+ roleWithSubject.addPermission(Permission.VIEW_RESOURCE);
+
+ Role roleWithoutSubject = SessionTestHelper.createNewRoleForSubject(entityMgr, anotherSubject,
+ "role without subject");
+
+ ResourceGroup group = SessionTestHelper.createNewCompatibleGroupForRole(entityMgr, roleWithSubject,
+ "accessible group");
+
+ Resource r1 = SessionTestHelper.createNewResourceForGroup(entityMgr, group, "r1");
+
+ entityMgr.flush();
+
+ List<Integer> resourceIds = Arrays.asList(r1.getId());
+
+ assertTrue(
+ "The subject should have permission to view the resources",
+ authorizationManager.canViewResources(subject, resourceIds)
+ );
+
+ }
+ finally {
+ getTransactionManager().rollback();
+ }
+ }
+
/*
* Test methods: getResourcePermissions(Subject, Resource) hasResourcePermission(Subject, Permission, Resource)
* hasResourcePermission(Subject, Permission, Collection<Resource>)
14 years, 1 month
[rhq] Branch 'bugfixes' - 12 commits - modules/enterprise
by ips
modules/enterprise/gui/installer-war/pom.xml | 17 -
modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java | 54 ++-
modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java | 23 +
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/AuthenticateUserAction.java | 7
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/FaceletRedirectionViewHandler.java | 21 +
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserTrackingFilter.java | 3
modules/enterprise/server/container-lib/pom.xml | 7
modules/enterprise/server/container-lib/src/main/java/org/rhq/jbossatx/jta/recovery/AppServerJDBCXARecovery.java | 144 ++++++++
modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat | 112 ++++++
modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh | 165 ++++++++++
modules/enterprise/server/container/src/main/resources/jbossas/server/default/conf/login-config.xml | 22 +
modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.h2.rej | 9
modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.oracle.rej | 13
modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.postgres.rej | 9
modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.sqlserver.rej | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java | 27 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java | 48 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java | 32 +
18 files changed, 654 insertions(+), 68 deletions(-)
New commits:
commit f2cc28dc10d6b9f0922d2f0f7f34c3371b450727
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Mon Mar 29 14:08:04 2010 -0400
fix bug causing RepoSyncingTest.testCancelSync() to fail
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
index ab12bae..a6d8d2a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
@@ -296,7 +296,7 @@ public class ContentProviderManager {
return false;
}
- Exception ie = null;
+ boolean syncCancelled = false;
try {
ThreadUtil.checkInterrupted();
@@ -429,9 +429,9 @@ public class ContentProviderManager {
tracker.setResults(progress.toString());
log.debug("synchronizeRepo :: " + tracker.getRepoSyncResults().getStatus());
- } catch (Exception e) {
+ } catch (InterruptedException e) {
RepoSyncResults recentResults = repoManager.getMostRecentSyncResults(overlord, repo.getId());
- log.debug("Caught InterruptedException");
+ log.debug("Caught InterruptedException during sync of repo with id [" + repoId + "].");
progress.append("\n ** Cancelled syncing **");
tracker.setResults(progress.toString());
tracker.getProgressWatcher().resetToZero();
@@ -441,7 +441,7 @@ public class ContentProviderManager {
} catch (InterruptedException e1) {
throw new RuntimeException("Unexpected InterruptedException", e1);
}
- ie = e;
+ syncCancelled = true;
}
if (tracker.getRepoSyncResults() != null) {
@@ -452,12 +452,8 @@ public class ContentProviderManager {
repoManager.mergeRepoSyncResults(tracker.getRepoSyncResults());
log.debug("synchronizeRepo :: merging results.");
}
- if (ie != null) {
- return false;
- } else {
- return true;
- }
-
+
+ return !syncCancelled;
}
private SyncTracker updatePercentComplete(SyncTracker tracker, RepoManagerLocal repoManager) {
@@ -467,15 +463,16 @@ public class ContentProviderManager {
}
private SyncTracker processSyncException(Exception e, SyncTracker tracker, Repo repo, ContentSource source,
- RepoManagerLocal repoManager) {
-
+ RepoManagerLocal repoManager) throws InterruptedException {
+ if (e instanceof InterruptedException) {
+ InterruptedException ie = (InterruptedException) e;
+ throw ie;
+ }
StringBuilder progress = new StringBuilder();
log.error("Error while synchronizing repo [" + repo + "] with content provider [" + source
+ "]. Synchronization for the repo will continue for other providers.", e);
- // try to reload the results in case it was updated by the SLSB before
- // the
- // exception happened
+ // Try to reload the results in case it was updated by the SLSB before the exception happened.
RepoSyncResults reloadedResults = repoManager.getRepoSyncResults(tracker.getRepoSyncResults().getId());
if (reloadedResults != null) {
tracker.setRepoSyncResults(reloadedResults);
commit 08ac9e60b798724fae307783a45006945e831510
Merge: 237ee88... cffa6ea...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Mon Mar 29 13:48:35 2010 -0400
Merge branch 'master' into bugfixes
commit cffa6eace4a2139bc89db5a23be3b657dbc708a1
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Mon Mar 29 11:31:53 2010 -0400
fix getServerRoot() so that if server root from httpd command line is a relative path, it will be resolved relative to the httpd process's cwd, not the cwd of the Agent process (see https://bugzilla.redhat.com/show_bug.cgi?id=536328)
(cherry picked from commit 237ee88dbecd6809cefea82865bbe0b1d3b5582d)
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
index b87b3d6..95c2bfc 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
@@ -20,7 +20,6 @@ package org.rhq.plugins.apache;
import java.io.File;
import java.io.IOException;
-import java.net.InetAddress;
import java.net.URI;
import java.util.HashSet;
import java.util.List;
@@ -35,7 +34,6 @@ import org.jetbrains.annotations.Nullable;
import org.rhq.augeas.AugeasProxy;
import org.rhq.augeas.node.AugeasNode;
import org.rhq.augeas.tree.AugeasTree;
-import org.rhq.augeas.tree.AugeasTreeException;
import org.rhq.augeas.util.Glob;
import org.rhq.augeas.util.GlobFilter;
import org.rhq.core.domain.configuration.Configuration;
@@ -49,6 +47,7 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.pluginapi.inventory.ManualAddFacet;
import org.rhq.core.pluginapi.util.FileUtils;
import org.rhq.core.system.ProcessInfo;
+import org.rhq.core.system.SystemInfoException;
import org.rhq.plugins.apache.augeas.AugeasConfigurationApache;
import org.rhq.plugins.apache.augeas.AugeasTreeBuilderApache;
import org.rhq.plugins.apache.util.ApacheBinaryInfo;
@@ -293,24 +292,51 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
@Nullable
private String getServerRoot(@NotNull ApacheBinaryInfo binaryInfo, @NotNull ProcessInfo processInfo) {
+ // First see if -d was specified on the httpd command line.
String[] cmdLine = processInfo.getCommandLine();
String root = getCommandLineOption(cmdLine, "-d");
+ // If not, extract the path from the httpd binary.
if (root == null) {
root = binaryInfo.getRoot();
}
- if (root != null) {
- root = FileUtils.getCanonicalPath(root);
+ if (root == null) {
+ // We have failed to determine the server root :(
+ return null;
+ }
+
+ // If the path is relative, convert it to an absolute path, resolving it relative to the cwd of the httpd process.
+ File rootFile = new File(root);
+ if (!rootFile.isAbsolute()) {
+ String currentWorkingDir;
+ try {
+ currentWorkingDir = processInfo.getCurrentWorkingDirectory();
+ } catch (Exception e) {
+ log.error("Unable to determine current working directory of Apache process [" + processInfo
+ + "], which is needed to determine the server root of the Apache instance.", e);
+ return null;
+ }
+ if (currentWorkingDir == null) {
+ log.error("Unable to determine current working directory of Apache process [" + processInfo
+ + "], which is needed to determine the server root of the Apache instance.");
+ return null;
+ } else {
+ rootFile = new File(currentWorkingDir, root);
+ root = rootFile.getPath();
+ }
}
+ // And finally canonicalize the path, but using our own getCanonicalPath() method, which preserves symlinks.
+ root = FileUtils.getCanonicalPath(root);
+
return root;
}
@Nullable
private File getServerConfigFile(ApacheBinaryInfo binaryInfo, ProcessInfo processInfo, String serverRoot) {
- String[] cmdLine = processInfo.getCommandLine();
// First see if -f was specified on the httpd command line.
+ String[] cmdLine = processInfo.getCommandLine();
String serverConfigFile = getCommandLineOption(cmdLine, "-f");
// If not, extract the path from the httpd binary.
@@ -330,7 +356,7 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
serverConfigFile = file.getPath();
}
- // And now canonicalize the path, but using our own getCanonicalPath() method, which preserves symlinks.
+ // And finally canonicalize the path, but using our own getCanonicalPath() method, which preserves symlinks.
serverConfigFile = FileUtils.getCanonicalPath(serverConfigFile);
return new File(serverConfigFile);
commit b0140c202e7cad66ebb0dcd779501797a6bd6390
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 29 14:16:28 2010 +0200
Fix definition of _JB_DIR variable
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
index 3b85102..223c581 100644
--- a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
@@ -85,7 +85,7 @@ if not exist "%RHQ_SERVER_JAVA_EXE_FILE_PATH%" (
exit /B 1
)
-set _JB_DIR = %RHQ_SERVER_HOME%\jbossas
+set _JB_DIR=%RHQ_SERVER_HOME%\jbossas
%RHQ_SERVER_JAVA_EXE_FILE_PATH% -cp %_JB_DIR%\lib\jboss-common.jar;%_JB_DIR%\lib\jboss-jmx.jar;%_JB_DIR%\server\default\lib\jbosssx.jar;%_JB_DIR%\server\default\lib\jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule %1
commit 1e8fb58daad6cf30d410480714e8b3fe93e41551
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 26 14:29:48 2010 +0100
Fix an omission and clean up
diff --git a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
index 3b47e95..6f6235a 100644
--- a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
+++ b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
@@ -768,19 +768,13 @@ public class ConfigurationBean {
Class clazz = SecureIdentityLoginModule.class;
Method m = clazz.getDeclaredMethod("encode",String.class);
m.setAccessible(true);
- String res = (String) m.invoke(lm,"rhqadmin");
+ String res = (String) m.invoke(lm,password);
return res;
} catch (Exception e) {
throw new Exception("Encoding db password failed: " , e);
}
}
- private boolean isWindows() {
- String osName = System.getProperty("os.name").toLowerCase(Locale.US);
-
- return osName.indexOf("windows") > -1;
- }
-
private Properties getConfigurationAsProperties(List<PropertyItemWithValue> config) {
Properties props = new Properties();
diff --git a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java
index 5af10d0..425dc01 100644
--- a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java
+++ b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java
@@ -529,7 +529,7 @@ public class ServerInformation {
return deployDirectory;
}
- protected File getBinDirectory() {
+ private File getBinDirectory() {
if (binDirectory == null) {
MBeanServer mbs = getMBeanServer();
ObjectName name = ObjectNameFactory.create("jboss.system:type=ServerConfig");
commit a32db89465af384df8d30b3667f4f545d9893105
Merge: 9f3981b... 002b86a...
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 26 13:50:03 2010 +0100
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit 9f3981b21e128316ff39cbd5fe54e998e9002af4
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 26 13:49:55 2010 +0100
First cut of a Windows script to generate the passwords.
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
new file mode 100644
index 0000000..3b85102
--- /dev/null
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
@@ -0,0 +1,112 @@
+@echo off
+
+rem ===========================================================================
+rem RHQ Server Windows Generate db password script
+rem
+rem This file is used to execute the generate a new encrypted db password.
+rem
+rem This script is customizable by setting the following environment variables:
+rem
+rem RHQ_SERVER_DEBUG - If this is defined, the script will emit debug
+rem messages.
+rem If not set or set to "false", debug is turned off.
+rem
+rem RHQ_SERVER_HOME - Defines where the Server's home install directory is.
+rem If not defined, it will be assumed to be the parent
+rem directory of the directory where this script lives.
+rem
+rem RHQ_SERVER_JAVA_HOME - The location of the JRE that the Server will
+rem use. This will be ignored if
+rem RHQ_SERVER_JAVA_EXE_FILE_PATH is set.
+rem If this and RHQ_SERVER_JAVA_EXE_FILE_PATH are
+rem not set, the Server's embedded JRE will be used.
+rem
+rem RHQ_SERVER_JAVA_EXE_FILE_PATH - Defines the full path to the Java
+rem executable to use. If this is set,
+rem RHQ_SERVER_JAVA_HOME is ignored.
+rem If this is not set, then
+rem %RHQ_SERVER_JAVA_HOME%\bin\java.exe
+rem is used. If this and
+rem RHQ_SERVER_JAVA_HOME are not set, the
+rem Server's embedded JRE will be used.
+rem
+rem
+rem Note that you cannot define custom Java VM parameters or command line
+rem arguments to pass to the RHQ Server run.sh. If you wish to pass in
+rem specific arguments, modify the rhq-server-wrapper.conf file.
+rem
+rem If the embedded JRE is to be used but is not available, the fallback
+rem JRE to be used will be determined by the JAVA_HOME environment variable.
+rem
+rem ===========================================================================
+
+setlocal
+
+rem if debug variable is set, it is assumed to be on, unless its value is false
+if "%RHQ_SERVER_DEBUG%" == "false" (
+ set RHQ_SERVER_DEBUG=
+)
+
+rem ----------------------------------------------------------------------
+rem Change directory so the current directory is the Server home.
+rem ----------------------------------------------------------------------
+
+set RHQ_SERVER_BIN_DIR_PATH=%~dp0
+
+if not defined RHQ_SERVER_HOME (
+ cd "%RHQ_SERVER_BIN_DIR_PATH%\.."
+) else (
+ cd "%RHQ_SERVER_HOME%" || (
+ echo Cannot go to the RHQ_SERVER_HOME directory: %RHQ_SERVER_HOME%
+ exit /B 1
+ )
+)
+
+set RHQ_SERVER_HOME=%CD%
+
+if defined RHQ_SERVER_DEBUG echo RHQ_SERVER_HOME: %RHQ_SERVER_HOME%
+
+rem ----------------------------------------------------------------------
+rem Find the Java executable and verify we have a VM available.
+rem ----------------------------------------------------------------------
+
+if not defined RHQ_SERVER_JAVA_EXE_FILE_PATH (
+ if not defined RHQ_SERVER_JAVA_HOME call :prepare_embedded_jre
+)
+
+if not defined RHQ_SERVER_JAVA_EXE_FILE_PATH set RHQ_SERVER_JAVA_EXE_FILE_PATH=%RHQ_SERVER_JAVA_HOME%\bin\java.exe
+
+if defined RHQ_SERVER_DEBUG echo RHQ_SERVER_JAVA_HOME: %RHQ_SERVER_JAVA_HOME%
+if defined RHQ_SERVER_DEBUG echo RHQ_SERVER_JAVA_EXE_FILE_PATH: %RHQ_SERVER_JAVA_EXE_FILE_PATH%
+
+if not exist "%RHQ_SERVER_JAVA_EXE_FILE_PATH%" (
+ echo There is no JVM available.
+ echo Please set RHQ_SERVER_JAVA_HOME or RHQ_SERVER_JAVA_EXE_FILE_PATH appropriately.
+ exit /B 1
+)
+
+set _JB_DIR = %RHQ_SERVER_HOME%\jbossas
+%RHQ_SERVER_JAVA_EXE_FILE_PATH% -cp %_JB_DIR%\lib\jboss-common.jar;%_JB_DIR%\lib\jboss-jmx.jar;%_JB_DIR%\server\default\lib\jbosssx.jar;%_JB_DIR%\server\default\lib\jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule %1
+
+
+goto :done
+
+rem ----------------------------------------------------------------------
+rem CALL subroutine that prepares to use the embedded JRE
+rem ----------------------------------------------------------------------
+
+:prepare_embedded_jre
+set RHQ_SERVER_JAVA_HOME=%RHQ_SERVER_HOME%\jre
+if defined RHQ_SERVER_DEBUG echo Using the embedded JRE
+if not exist "%RHQ_SERVER_JAVA_HOME%" (
+ if defined RHQ_SERVER_DEBUG echo No embedded JRE found - will try to use JAVA_HOME: %JAVA_HOME%
+ set RHQ_SERVER_JAVA_HOME=%JAVA_HOME%
+)
+goto :eof
+
+rem ----------------------------------------------------------------------
+rem CALL subroutine that exits this script normally
+rem ----------------------------------------------------------------------
+
+:done
+endlocal
commit 73626e4146d1acf382dca898748227475755afec
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 26 13:42:37 2010 +0100
Fix comments
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
index c515e4c..d3fd715 100755
--- a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
@@ -6,20 +6,12 @@
# processname: java
# =============================================================================
-# RHQ Server UNIX Startup Script
+# RHQ Server UNIX Generate db password script
#
-# This file is used to execute the RHQ Server on a UNIX platform as part of
-# the platform's bootup sequence or as a foreground console process.
-# Run this script without any command line options for the syntax help.
+# This file is used to execute the generate a new encrypted db password.
#
# This script is customizable by setting the following environment variables:
#
-# Note that if this script is to be used as an init.d script, you must set
-# RHQ_SERVER_HOME so this script knows where to find the Server installation.
-#
-# RHQ_SERVER_DEBUG - If this is defined, the script will emit debug
-# messages. If this is not defined or set to "false"
-# debug messages are not emitted.
#
# RHQ_SERVER_HOME - Defines where the server's home install directory is.
# If not defined, it will be assumed to be the parent
@@ -40,44 +32,9 @@
# RHQ_SERVER_JAVA_HOME are not set, the
# Server's embedded JRE will be used.
#
-# RHQ_SERVER_JAVA_OPTS - Java VM command line options to be
-# passed into the Server's VM. If this is not defined
-# this script will pass in a default set of options.
-# If this is set, it completely overrides the
-# Server's defaults. If you only want to add options
-# to the Server's defaults, then you will want to
-# use RHQ_SERVER_ADDITIONAL_JAVA_OPTS instead.
-#
-# RHQ_SERVER_ADDITIONAL_JAVA_OPTS - additional Java VM command line options
-# to be passed into the Server's VM. This
-# is added to RHQ_SERVER_JAVA_OPTS; it
-# is mainly used to augment the Server's
-# default set of options. This can be
-# left unset if it is not needed.
-#
-# RHQ_SERVER_CMDLINE_OPTS - If this is defined, these are the command line
-# arguments that will be passed to the RHQ Server
-# JBossAS run.sh. If you only want to add options
-# to the Server's defaults, then you will want to
-# use RHQ_SERVER_ADDITIONAL_CMDLINE_OPTS instead.
-#
-# RHQ_SERVER_ADDITIONAL_CMDLINE_OPTS - additional command line arguments to
-# be passed to the RHQ Server JBossAS
-# run.sh. This is added to
-# RHQ_SERVER_CMDLINE_OPTS; it is mainly
-# used to augment the Server's default
-# set of options. This can be left unset
-# if it is not needed.
-#
-# RHQ_SERVER_PIDFILE_DIR - a full path to a writable directory where this
-# script can write its pidfile to.
-# If not defined, this defaults to the Server's
-# bin directory.
-#
# If the embedded JRE is to be used but is not available, the fallback
# JRE to be used will be determined by the JAVA_HOME environment variable.
#
-# This script calls run.sh when starting the underlying JBossAS server.
# =============================================================================
# ----------------------------------------------------------------------
@@ -88,11 +45,6 @@
# RHQ_SERVER_DEBUG=true
# JAVA_HOME=/path/to/java/installation
# RHQ_SERVER_JAVA_EXE_FILE_PATH=/path/directly/to/java/executable
-# RHQ_SERVER_JAVA_OPTS=VM options
-# RHQ_SERVER_ADDITIONAL_JAVA_OPTS=additional VM options
-# RHQ_SERVER_CMDLINE_OPTS=run.sh options
-# RHQ_SERVER_ADDITIONAL_CMDLINE_OPTS=additional run.sh options
-
# ----------------------------------------------------------------------
# Make sure we unset any lingering JBossAS environment variables that
# were set in the user's environment. This might happen if the user
commit ec5d610a0c9849073bba5547bd2464e0a7004796
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 26 12:34:23 2010 +0100
BZ 535601 - Optimize the generate password script
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
index 6c170b3..c515e4c 100755
--- a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
@@ -1,9 +1,213 @@
#!/bin/sh
-# the sleep is important to prevent a race condition when called from the installer
-sleep 2
+# chkconfig: 2345 92 26
+# description: Starts and stops the RHQ Server
+#
+# processname: java
-# We stand in $RHQ/bin when called from the installer
-cd ../jbossas/
+# =============================================================================
+# RHQ Server UNIX Startup Script
+#
+# This file is used to execute the RHQ Server on a UNIX platform as part of
+# the platform's bootup sequence or as a foreground console process.
+# Run this script without any command line options for the syntax help.
+#
+# This script is customizable by setting the following environment variables:
+#
+# Note that if this script is to be used as an init.d script, you must set
+# RHQ_SERVER_HOME so this script knows where to find the Server installation.
+#
+# RHQ_SERVER_DEBUG - If this is defined, the script will emit debug
+# messages. If this is not defined or set to "false"
+# debug messages are not emitted.
+#
+# RHQ_SERVER_HOME - Defines where the server's home install directory is.
+# If not defined, it will be assumed to be the parent
+# directory of the directory where this script lives.
+#
+# RHQ_SERVER_JAVA_HOME - The location of the JRE that the server will
+# use. This will be ignored if
+# RHQ_SERVER_JAVA_EXE_FILE_PATH is set.
+# If this and RHQ_SERVER_JAVA_EXE_FILE_PATH are
+# not set, the Server's embedded JRE will be used.
+#
+# RHQ_SERVER_JAVA_EXE_FILE_PATH - Defines the full path to the Java
+# executable to use. If this is set,
+# RHQ_SERVER_JAVA_HOME is ignored.
+# If this is not set, then
+# $RHQ_SERVER_JAVA_HOME/bin/java
+# is used. If this and
+# RHQ_SERVER_JAVA_HOME are not set, the
+# Server's embedded JRE will be used.
+#
+# RHQ_SERVER_JAVA_OPTS - Java VM command line options to be
+# passed into the Server's VM. If this is not defined
+# this script will pass in a default set of options.
+# If this is set, it completely overrides the
+# Server's defaults. If you only want to add options
+# to the Server's defaults, then you will want to
+# use RHQ_SERVER_ADDITIONAL_JAVA_OPTS instead.
+#
+# RHQ_SERVER_ADDITIONAL_JAVA_OPTS - additional Java VM command line options
+# to be passed into the Server's VM. This
+# is added to RHQ_SERVER_JAVA_OPTS; it
+# is mainly used to augment the Server's
+# default set of options. This can be
+# left unset if it is not needed.
+#
+# RHQ_SERVER_CMDLINE_OPTS - If this is defined, these are the command line
+# arguments that will be passed to the RHQ Server
+# JBossAS run.sh. If you only want to add options
+# to the Server's defaults, then you will want to
+# use RHQ_SERVER_ADDITIONAL_CMDLINE_OPTS instead.
+#
+# RHQ_SERVER_ADDITIONAL_CMDLINE_OPTS - additional command line arguments to
+# be passed to the RHQ Server JBossAS
+# run.sh. This is added to
+# RHQ_SERVER_CMDLINE_OPTS; it is mainly
+# used to augment the Server's default
+# set of options. This can be left unset
+# if it is not needed.
+#
+# RHQ_SERVER_PIDFILE_DIR - a full path to a writable directory where this
+# script can write its pidfile to.
+# If not defined, this defaults to the Server's
+# bin directory.
+#
+# If the embedded JRE is to be used but is not available, the fallback
+# JRE to be used will be determined by the JAVA_HOME environment variable.
+#
+# This script calls run.sh when starting the underlying JBossAS server.
+# =============================================================================
-java -cp lib/jboss-common.jar:lib/jboss-jmx.jar:server/default/lib/jbosssx.jar:server/default/lib/jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule $*
+# ----------------------------------------------------------------------
+# Environment variables you can set to customize the launch of the RHQ Server.
+# ----------------------------------------------------------------------
+
+# RHQ_SERVER_HOME=/path/to/server/home
+# RHQ_SERVER_DEBUG=true
+# JAVA_HOME=/path/to/java/installation
+# RHQ_SERVER_JAVA_EXE_FILE_PATH=/path/directly/to/java/executable
+# RHQ_SERVER_JAVA_OPTS=VM options
+# RHQ_SERVER_ADDITIONAL_JAVA_OPTS=additional VM options
+# RHQ_SERVER_CMDLINE_OPTS=run.sh options
+# RHQ_SERVER_ADDITIONAL_CMDLINE_OPTS=additional run.sh options
+
+# ----------------------------------------------------------------------
+# Make sure we unset any lingering JBossAS environment variables that
+# were set in the user's environment. This might happen if the user
+# has an external JBossAS configured.
+# ----------------------------------------------------------------------
+
+unset JBOSS_HOME
+unset RUN_CONF
+unset JAVAC_JAR
+unset JBOSS_CLASSPATH
+
+# ----------------------------------------------------------------------
+# Dumps a message iff debug mode is enabled
+# ----------------------------------------------------------------------
+
+debug_msg ()
+{
+ # if debug variable is set, it is assumed to be on, unless its value is false
+ if [ "x$RHQ_SERVER_DEBUG" != "x" ]; then
+ if [ "$RHQ_SERVER_DEBUG" != "false" ]; then
+ echo $1
+ fi
+ fi
+}
+
+
+# ----------------------------------------------------------------------
+# Determine what specific platform we are running on.
+# Set some platform-specific variables.
+# ----------------------------------------------------------------------
+
+case "`uname`" in
+ CYGWIN*) _CYGWIN=true
+ ;;
+ Darwin*) _DARWIN=true
+ ;;
+ SunOS*) _SOLARIS=true
+ ;;
+ AIX*) _AIX=true
+ ;;
+esac
+
+# ----------------------------------------------------------------------
+# Determine the RHQ Server installation directory.
+# If RHQ_SERVER_HOME is not defined, we will assume we are running
+# directly from the server installation's bin directory.
+# ----------------------------------------------------------------------
+
+if [ -z "$RHQ_SERVER_HOME" ]; then
+ _DOLLARZERO=`readlink "$0" 2>/dev/null || echo "$0"`
+ RHQ_SERVER_HOME=`dirname "$_DOLLARZERO"`/..
+else
+ if [ ! -d "$RHQ_SERVER_HOME" ]; then
+ echo "ERROR! RHQ_SERVER_HOME is not pointing to a valid directory"
+ echo "RHQ_SERVER_HOME: $RHQ_SERVER_HOME"
+ exit 1
+ fi
+fi
+
+cd "$RHQ_SERVER_HOME"
+RHQ_SERVER_HOME=`pwd`
+
+debug_msg "RHQ_SERVER_HOME: $RHQ_SERVER_HOME"
+
+if [ ! -f "${RHQ_SERVER_HOME}/jbossas/bin/run.jar" ]; then
+ echo "ERROR! RHQ_SERVER_HOME is not pointing to a valid RHQ Server"
+ echo "Missing ${RHQ_SERVER_HOME}/jbossas/bin/run.jar"
+ exit 1
+fi
+
+# ----------------------------------------------------------------------
+# if we are on a Mac and JAVA_HOME is not set, then set it to /usr
+# as this is the default location.
+# ----------------------------------------------------------------------
+if [ -z "$JAVA_HOME" ]; then
+ if [ -n "$_DARWIN" ]; then
+ debug_msg "Running on Mac OS X, setting JAVA_HOME to /usr"
+ JAVA_HOME=/usr
+ fi
+fi
+
+
+# ----------------------------------------------------------------------
+# Find the Java executable and verify we have a VM available
+# ----------------------------------------------------------------------
+
+if [ -z "$RHQ_SERVER_JAVA_EXE_FILE_PATH" ]; then
+ if [ -z "$RHQ_SERVER_JAVA_HOME" ]; then
+ RHQ_SERVER_JAVA_HOME="${RHQ_SERVER_HOME}/jre"
+ debug_msg "Using the embedded JRE"
+ if [ ! -d "$RHQ_SERVER_JAVA_HOME" ]; then
+ debug_msg "No embedded JRE found - will try to use JAVA_HOME: $JAVA_HOME"
+ RHQ_SERVER_JAVA_HOME="$JAVA_HOME"
+ fi
+ fi
+ debug_msg "RHQ_SERVER_JAVA_HOME: $RHQ_SERVER_JAVA_HOME"
+ RHQ_SERVER_JAVA_EXE_FILE_PATH="${RHQ_SERVER_JAVA_HOME}/bin/java"
+fi
+debug_msg "RHQ_SERVER_JAVA_EXE_FILE_PATH: $RHQ_SERVER_JAVA_EXE_FILE_PATH"
+
+if [ ! -f "$RHQ_SERVER_JAVA_EXE_FILE_PATH" ]; then
+ echo "There is no JVM available."
+ echo "Please set RHQ_SERVER_JAVA_HOME or RHQ_SERVER_JAVA_EXE_FILE_PATH appropriately."
+ exit 1
+fi
+
+# run.sh will use JAVA as the full java command
+JAVA="$RHQ_SERVER_JAVA_EXE_FILE_PATH"
+export JAVA
+
+if [ $# == 0 ]
+then
+ echo "Usage generate-db-password <password>"
+ exit 1
+fi
+
+_JB_DIR=${RHQ_SERVER_HOME}/jbossas
+$JAVA -cp $_JB_DIR/lib/jboss-common.jar:$_JB_DIR/lib/jboss-jmx.jar:$_JB_DIR/server/default/lib/jbosssx.jar:$_JB_DIR/server/default/lib/jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule $*
commit 1cda39acf128b40df403e212469c8f683875d11e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Mar 26 12:15:11 2010 +0100
BZ 535601 - encrypt the db password by default when installing the server.
diff --git a/modules/enterprise/gui/installer-war/pom.xml b/modules/enterprise/gui/installer-war/pom.xml
index 6c9121b..b500fb1 100644
--- a/modules/enterprise/gui/installer-war/pom.xml
+++ b/modules/enterprise/gui/installer-war/pom.xml
@@ -25,7 +25,7 @@
<war.dir>${basedir}/target/${final.name}</war.dir>
<!-- plugin versions -->
- <jetty-jspc-maven-plugin.version>7.0.1.v20091125</jetty-jspc-maven-plugin.version>
+ <jetty-jspc-maven-plugin.version>7.0.1.v20091125</jetty-jspc-maven-plugin.version>
<product.shortName>RHQ</product.shortName>
<product.name>RHQ</product.name>
@@ -90,6 +90,21 @@
</dependency>
<dependency>
+ <groupId>jboss</groupId>
+ <artifactId>jbosssx</artifactId>
+ <version>4.2.3.GA</version>
+ <scope>provided</scope> <!-- by JBossAS -->
+ </dependency>
+
+ <dependency>
+ <groupId>jboss.jbossas.core-libs</groupId>
+ <artifactId>jboss-jca</artifactId>
+ <version>4.2.2.GA</version>
+ <scope>provided</scope> <!-- by JBossAS -->
+ </dependency>
+
+
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
diff --git a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
index bca6381..3b47e95 100644
--- a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
+++ b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
@@ -18,6 +18,12 @@
*/
package org.rhq.enterprise.installer;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.net.InetAddress;
import java.sql.Connection;
import java.sql.Statement;
@@ -36,14 +42,16 @@ import mazz.i18n.Msg;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jboss.resource.security.SecureIdentityLoginModule;
+
import org.rhq.core.db.DatabaseTypeFactory;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.installer.i18n.InstallerI18NResourceKeys;
/**
- * Responisible for taking the settings the user selects in the installer window and saves them
+ * Responsible for taking the settings the user selects in the installer window and saves them
* as the server's initial configuration.
- *
+ *
* @author John Mazzitelli
* @author Jay Shaughnessy
*/
@@ -195,7 +203,7 @@ public class ConfigurationBean {
* so the caller will not see any of the hidden properties in the returned list.
*
* @return current server settings, minus database related settings and hidden settings.
- *
+ *
* @see #getDatabaseConfiguration()
* @see #getConfiguration()
*/
@@ -218,7 +226,7 @@ public class ConfigurationBean {
* Loads in the server's current configuration and returns only the database related properties.
*
* @return current database settings
- *
+ *
* @see #getNonDatabaseConfiguration()
* @see #getConfiguration()
*/
@@ -240,7 +248,7 @@ public class ConfigurationBean {
* Checks to see if the server has been preconfigured and should be auto-installed. If <code>true</code>
* is returned, the installer webapp should not be needed to install the server and the installer should
* immediately begin the installation process.
- *
+ *
* @return <code>true</code> if auto-install should occur; <code>false</code> means the user needs to use
* the installer GUI before the installation can begin
*/
@@ -475,7 +483,7 @@ public class ConfigurationBean {
path = path.replace('\\', '/'); // in case we are on windows, we still want forward slashes
return path;
} catch (Exception e) {
- throw new RuntimeException(e); // this should never happen unless the file system is out of wack
+ throw new RuntimeException(e); // this should never happen unless the file system is out of wack
}
}
@@ -722,6 +730,17 @@ public class ConfigurationBean {
// Ensure the install server info is up to date and stored in the DB
serverInfo.storeServer(configurationAsProperties, haServer);
+ // encode database password and set updated properties
+ String pass = configurationAsProperties.getProperty(ServerProperties.PROP_DATABASE_PASSWORD);
+ pass = encryptPassword(pass);
+ configurationAsProperties.setProperty(ServerProperties.PROP_DATABASE_PASSWORD,pass);
+
+ serverInfo.setServerProperties(configurationAsProperties);
+
+ // We have changed the password of the database connection, so we need to
+ // tell the login config about it
+ serverInfo.restartLoginConfig();
+
// build a keystore whose cert has a CN of this server's public endpoint address
serverInfo.createKeystore(haServer);
@@ -739,6 +758,29 @@ public class ConfigurationBean {
return StartPageResults.SUCCESS;
}
+ private String encryptPassword(String password) throws Exception {
+
+ // We need to do some mumbo jumbo, as the interesting method is private
+ // in SecureIdentityLoginModule
+
+ try {
+ SecureIdentityLoginModule lm = new SecureIdentityLoginModule();
+ Class clazz = SecureIdentityLoginModule.class;
+ Method m = clazz.getDeclaredMethod("encode",String.class);
+ m.setAccessible(true);
+ String res = (String) m.invoke(lm,"rhqadmin");
+ return res;
+ } catch (Exception e) {
+ throw new Exception("Encoding db password failed: " , e);
+ }
+ }
+
+ private boolean isWindows() {
+ String osName = System.getProperty("os.name").toLowerCase(Locale.US);
+
+ return osName.indexOf("windows") > -1;
+ }
+
private Properties getConfigurationAsProperties(List<PropertyItemWithValue> config) {
Properties props = new Properties();
@@ -839,7 +881,7 @@ public class ConfigurationBean {
this.haServerName = serverName;
- // try pulling info from the database for this server name
+ // try pulling info from the database for this server name
if (isRegisteredServers()) {
Properties configurationAsProperties = getConfigurationAsProperties(configuration);
setHaServer(serverInfo.getServerDetail(configurationAsProperties, serverName));
@@ -881,10 +923,10 @@ public class ConfigurationBean {
/**
* This method will set the HA Server information based solely on the server configuration
* properties. It does not rely on any database access.
- *
+ *
* This is used by the auto-installation process - see {@link AutoInstallServlet}.
*
- * @throws Exception
+ * @throws Exception
*/
public void setHaServerFromPropertiesOnly() throws Exception {
diff --git a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java
index 0896ace..5af10d0 100644
--- a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java
+++ b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ServerInformation.java
@@ -49,6 +49,8 @@ import org.apache.tools.ant.helper.ProjectHelper2;
import org.jboss.mx.util.MBeanServerLocator;
import org.jboss.mx.util.ObjectNameFactory;
+import org.jboss.security.auth.login.XMLLoginConfig;
+import org.jboss.security.auth.login.XMLLoginConfigMBean;
import org.jboss.system.server.ServerConfig;
import org.rhq.core.db.DatabaseType;
@@ -128,7 +130,7 @@ public class ServerInformation {
/**
* Call this when you need to confirm that the database is supported.
- *
+ *
* @param props set of properties where the connection information is found
*
* @throws Exception if the database is not supported
@@ -208,7 +210,7 @@ public class ServerInformation {
* data/tables and recreated.</p>
*
* @param props
- *
+ *
* @throws Exception if failed to create the new schema for some reason
*/
public void createNewDatabaseSchema(Properties props) throws Exception {
@@ -246,7 +248,7 @@ public class ServerInformation {
* occur.</p>
*
* @param props
- *
+ *
* @throws Exception if the upgrade failed for some reason
*/
public void upgradeExistingDatabaseSchema(Properties props) throws Exception {
@@ -527,7 +529,7 @@ public class ServerInformation {
return deployDirectory;
}
- private File getBinDirectory() {
+ protected File getBinDirectory() {
if (binDirectory == null) {
MBeanServer mbs = getMBeanServer();
ObjectName name = ObjectNameFactory.create("jboss.system:type=ServerConfig");
@@ -788,8 +790,8 @@ public class ServerInformation {
* Clean up messages in the JMS message table. Make sure you call this when no other Servers
* are communicating with the database, otherwise, its possible in-flight messages will get lost
* or go into a bad state.
- *
- * @param props
+ *
+ * @param props
*/
public void cleanJmsTables(Properties props) {
@@ -818,6 +820,17 @@ public class ServerInformation {
}
}
+ public void restartLoginConfig() throws Exception {
+
+ MBeanServer mbs = getMBeanServer();
+ ObjectName name = ObjectNameFactory.create("jboss.security:service=XMLLoginConfig");
+ Object mbean = MBeanServerInvocationHandler.newProxyInstance(mbs, name,XMLLoginConfigMBean.class,false);
+
+ XMLLoginConfigMBean conf = (XMLLoginConfigMBean) mbean;
+ conf.stop();
+ conf.start();
+ }
+
public static class Server {
public static final String DEFAULT_AFFINITY_GROUP = "";
public static final int DEFAULT_ENDPOINT_PORT = 7080;
diff --git a/modules/enterprise/server/container-lib/pom.xml b/modules/enterprise/server/container-lib/pom.xml
index cd58ba5..2c98817 100644
--- a/modules/enterprise/server/container-lib/pom.xml
+++ b/modules/enterprise/server/container-lib/pom.xml
@@ -40,6 +40,13 @@
<scope>provided</scope> <!-- by JBossAS -->
</dependency>
+ <dependency>
+ <groupId>jboss</groupId>
+ <artifactId>jbosssx</artifactId>
+ <version>4.2.3.GA</version>
+ <scope>provided</scope> <!-- by JBossAS -->
+ </dependency>
+
</dependencies>
<profiles>
diff --git a/modules/enterprise/server/container-lib/src/main/java/org/rhq/jbossatx/jta/recovery/AppServerJDBCXARecovery.java b/modules/enterprise/server/container-lib/src/main/java/org/rhq/jbossatx/jta/recovery/AppServerJDBCXARecovery.java
index 72083b5..3c87183 100644
--- a/modules/enterprise/server/container-lib/src/main/java/org/rhq/jbossatx/jta/recovery/AppServerJDBCXARecovery.java
+++ b/modules/enterprise/server/container-lib/src/main/java/org/rhq/jbossatx/jta/recovery/AppServerJDBCXARecovery.java
@@ -23,11 +23,22 @@ import java.beans.PropertyEditorManager;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
+import java.math.BigInteger;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Properties;
-
+import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
@@ -42,12 +53,14 @@ import javax.transaction.xa.XAResource;
import com.arjuna.ats.jta.recovery.XAResourceRecovery;
import org.jboss.logging.Logger;
+import org.jboss.security.SecurityAssociation;
+import org.jboss.security.SimplePrincipal;
/**
* This is an enhanced version of JBossTM's AppServerJDBCXARecovery implementation.
* The only thing this implementation does differently is it becomes tolerant of
* the times when the data source is not yet deployed.
- *
+ *
* This provides recovery for compliant JDBC drivers accessed via datasources deployed in JBossAS 4.2
* It is not meant to be db driver specific.
*
@@ -100,6 +113,8 @@ public class AppServerJDBCXARecovery implements XAResourceRecovery {
if (parameter == null)
return false;
+ retrieveData(parameter, _DELIMITER);
+
// don't create the datasource yet, we'll do it lazily. Just keep its id.
_dataSourceId = parameter;
@@ -150,6 +165,13 @@ public class AppServerJDBCXARecovery implements XAResourceRecovery {
MBeanServerConnection server = (MBeanServerConnection) context.lookup("jmx/invoker/RMIAdaptor");
ObjectName objectName = new ObjectName("jboss.jca:name=" + _dataSourceId
+ ",service=ManagedConnectionFactory");
+
+ if(_username !=null && _password !=null)
+ {
+ SecurityAssociation.setPrincipal(new SimplePrincipal(_username));
+ SecurityAssociation.setCredential(_password);
+ }
+
String className = (String) server.invoke(objectName, "getManagedConnectionFactoryAttribute",
new Object[] { "XADataSourceClass" }, new String[] { "java.lang.String" });
log.debug("AppServerJDBCXARecovery datasource classname = " + className);
@@ -158,6 +180,29 @@ public class AppServerJDBCXARecovery implements XAResourceRecovery {
// debug disabled due to security paranoia - it may log datasource password in cleartext.
// log.debug("AppServerJDBCXARecovery.result="+properties);
+ ObjectName txCmObjectName = new ObjectName("jboss.jca:name=" +_dataSourceId + ",service=XATxCM");
+ String securityDomainName = (String) server.getAttribute(txCmObjectName, "SecurityDomainJndiName");
+ log.debug("Security domain name associated with JCA ConnectionManager jboss.jca:name=" +_dataSourceId + ",service=XATxCM"+" is:"+securityDomainName);
+
+ if(securityDomainName != null && !securityDomainName.equals(""))
+ {
+ ObjectName _objectName = new ObjectName("jboss.security:service=XMLLoginConfig");
+ String config = (String)server.invoke(_objectName, "displayAppConfig", new Object[] {securityDomainName}, new String[] {"java.lang.String"});
+ String loginModuleClass = getValueForLoginModuleClass(config);
+ _dbUsername = getValueForKey(config, _USERNAME);
+ String _encryptedPassword = getValueForKey(config, _PASSWORD);
+ if (loginModuleClass.trim().equals("org.jboss.resource.security.SecureIdentityLoginModule"))
+ {
+ _dbPassword = new String (decode(_encryptedPassword));
+ }
+ else if (loginModuleClass.trim().equals("org.jboss.resource.security.JaasSecurityDomainIdentityLoginModule"))
+ {
+ String jaasSecurityDomain = getValueForKey(config, "jaasSecurityDomain");
+ _dbPassword = new String (decodePBE(server, _encryptedPassword, jaasSecurityDomain));
+ }
+ _encrypted = true;
+ }
+
try {
_dataSource = getXADataSource(className, properties);
_supportsIsValidMethod = true; // assume it does; we'll lazily check the first time we try to connect
@@ -230,7 +275,15 @@ public class AppServerJDBCXARecovery implements XAResourceRecovery {
}
}
- _connection = _dataSource.getXAConnection();
+ // Check if the password is encrypted, the criteria should be the existence of <security-domain>EncryptDBPassword</security-domain>
+ // in the -ds.xml file.
+
+ if(!_encrypted) {
+ _connection = _dataSource.getXAConnection();
+ }
+ else {
+ _connection = _dataSource.getXAConnection(_dbUsername, _dbPassword);
+ }
_connection.addConnectionEventListener(_connectionEventListener);
log.debug("Created new XAConnection");
}
@@ -305,13 +358,98 @@ public class AppServerJDBCXARecovery implements XAResourceRecovery {
return xads;
}
+ public void retrieveData(String parameter,String delimiter)
+ {
+ StringTokenizer st = new StringTokenizer(parameter,delimiter);
+ while (st.hasMoreTokens())
+ {
+ String data = st.nextToken();
+ if(data.length()>9)
+ {
+ if(_USERNAME.equalsIgnoreCase(data.substring(0,8)))
+ {
+ _username =data.substring(9);
+ }
+ if(_PASSWORD.equalsIgnoreCase(data.substring(0,8)))
+ {
+ _password =data.substring(9);
+ }
+ if(_JNDINAME.equalsIgnoreCase(data.substring(0,8)))
+ {
+ _dataSourceId=data.substring(9);
+ }
+ }
+ }
+
+ if(_dataSourceId == null && parameter != null && parameter.indexOf('=') == -1) {
+ // try to fallback to old parameter format where only the dataSourceId is given, without jndiname= prefix
+ _dataSourceId = parameter;
+ }
+ }
+
+ private String getValueForKey(String config, String key)
+ {
+ Pattern usernamePattern = Pattern.compile("(name=" + key + ", value=)(.*)(</li>)");
+ Matcher m = usernamePattern.matcher(config);
+ if(m.find())
+ {
+ return m.group(2);
+ }
+ return "";
+ }
+
+ private String getValueForLoginModuleClass(String config)
+ {
+ Pattern usernamePattern = Pattern.compile("(" + _MODULE + ":)(.*)");
+ Matcher m = usernamePattern.matcher(config);
+ if(m.find())
+ {
+ return m.group(2);
+ }
+ return "";
+ }
+
+ private static String decode(String secret) throws NoSuchPaddingException, NoSuchAlgorithmException,
+ InvalidKeyException, BadPaddingException, IllegalBlockSizeException
+ {
+ byte[] kbytes = "jaas is the way".getBytes();
+ SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
+
+ BigInteger n = new BigInteger(secret, 16);
+ byte[] encoding = n.toByteArray();
+
+ Cipher cipher = Cipher.getInstance("Blowfish");
+ cipher.init(Cipher.DECRYPT_MODE, key);
+ byte[] decode = cipher.doFinal(encoding);
+ return new String(decode);
+ }
+
+ private static String decodePBE(MBeanServerConnection server, String password, String jaasSecurityDomain) throws Exception
+ {
+ byte[] secret = (byte[]) server.invoke(new ObjectName(jaasSecurityDomain), "decode64", new Object[] {password}, new String[] {"java.lang.String"});
+ return new String(secret, "UTF-8");
+ }
+
+
private boolean _supportsIsValidMethod;
private XAConnection _connection;
private XADataSource _dataSource;
private LocalConnectionEventListener _connectionEventListener;
private boolean _hasMoreResources;
+ private boolean _encrypted;
private String _dataSourceId;
+ private String _username;
+ private String _password;
+ private String _dbUsername;
+ private String _dbPassword;
+
+ private final String _JNDINAME = "jndiname";
+ private final String _USERNAME = "username";
+ private final String _PASSWORD = "password";
+ private final String _MODULE = "LoginModule Class";
+ private final String _DELIMITER = ",";
+
private Logger log = org.jboss.logging.Logger.getLogger(AppServerJDBCXARecovery.class);
}
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
new file mode 100755
index 0000000..6c170b3
--- /dev/null
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# the sleep is important to prevent a race condition when called from the installer
+sleep 2
+
+# We stand in $RHQ/bin when called from the installer
+cd ../jbossas/
+
+java -cp lib/jboss-common.jar:lib/jboss-jmx.jar:server/default/lib/jbosssx.jar:server/default/lib/jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule $*
diff --git a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/conf/login-config.xml b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/conf/login-config.xml
index 256d419..8f6ca6d 100644
--- a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/conf/login-config.xml
+++ b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/conf/login-config.xml
@@ -14,6 +14,28 @@
</authentication>
</application-policy>
+<!-- security domains for encrypted dataseouce passwords -->
+ <application-policy name = "XADSRealm">
+ <authentication>
+ <login-module code = "org.jboss.resource.security.SecureIdentityLoginModule"
+ flag = "required">
+ <module-option name = "username">${rhq.server.database.user-name}</module-option>
+ <module-option name = "password">${rhq.server.database.password}</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=XATxCM,name=RHQDS</module-option>
+ </login-module>
+ </authentication>
+ </application-policy>
+ <application-policy name = "NONXADSRealm">
+ <authentication>
+ <login-module code = "org.jboss.resource.security.SecureIdentityLoginModule"
+ flag = "required">
+ <module-option name = "username">${rhq.server.database.user-name}</module-option>
+ <module-option name = "password">${rhq.server.database.password}</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=NoTxCM,name=NoTxRHQDS</module-option>
+ </login-module>
+ </authentication>
+ </application-policy>
+
<!-- Security domain for JBossMQ -->
<application-policy name = "jbossmq">
<authentication>
diff --git a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.h2.rej b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.h2.rej
index e6f18ac..612e0c1 100644
--- a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.h2.rej
+++ b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.h2.rej
@@ -7,16 +7,14 @@
<xa-datasource>
<jndi-name>RHQDS</jndi-name>
<xa-datasource-class>${rhq.server.database.xa-datasource-class}</xa-datasource-class>
- <xa-datasource-property name="User">${rhq.server.database.user-name}</xa-datasource-property>
- <xa-datasource-property name="Password">${rhq.server.database.password}</xa-datasource-property>
<xa-datasource-property name="URL">${rhq.server.database.connection-url}</xa-datasource-property>
<no-tx-separate-pools/>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
+
+ <security-domain>XADSRealm</security-domain>
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<min-pool-size>5</min-pool-size>
<max-pool-size>50</max-pool-size>
@@ -31,8 +29,7 @@
<jndi-name>NoTxRHQDS</jndi-name>
<connection-url>${rhq.server.database.connection-url}</connection-url>
<driver-class>${rhq.server.database.driver-class}</driver-class>
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
+ <security-domain>NONXADSRealm</security-domain>
<connection-property name="char.encoding">UTF-8</connection-property>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<min-pool-size>2</min-pool-size>
diff --git a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.oracle.rej b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.oracle.rej
index 2197386..5559b83 100644
--- a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.oracle.rej
+++ b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.oracle.rej
@@ -7,8 +7,6 @@
<xa-datasource>
<jndi-name>RHQDS</jndi-name>
<xa-datasource-class>${rhq.server.database.xa-datasource-class}</xa-datasource-class>
- <xa-datasource-property name="User">${rhq.server.database.user-name}</xa-datasource-property>
- <xa-datasource-property name="Password">${rhq.server.database.password}</xa-datasource-property>
<xa-datasource-property name="URL">${rhq.server.database.connection-url}</xa-datasource-property>
<xa-datasource-property name="ConnectionProperties">SetBigStringTryClob=true</xa-datasource-property>
@@ -18,10 +16,10 @@
<!-- Checks the Oracle error codes and messages for fatal errors -->
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<!-- Oracles XA datasource cannot reuse a connection outside a transaction once enlisted in a global transaction and vice-versa -->
-
<track-connection-by-tx/>
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
+
+ <security-domain>XADSRealm</security-domain>
+
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<min-pool-size>5</min-pool-size>
<max-pool-size>50</max-pool-size>
@@ -43,8 +41,9 @@
<jndi-name>NoTxRHQDS</jndi-name>
<connection-url>${rhq.server.database.connection-url}</connection-url>
<driver-class>${rhq.server.database.driver-class}</driver-class>
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
+
+ <security-domain>NONXADSRealm</security-domain>
+
<connection-property name="char.encoding">UTF-8</connection-property>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<min-pool-size>2</min-pool-size>
diff --git a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.postgres.rej b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.postgres.rej
index 242bfce..2a71733 100644
--- a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.postgres.rej
+++ b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.postgres.rej
@@ -7,15 +7,13 @@
<xa-datasource>
<jndi-name>RHQDS</jndi-name>
<xa-datasource-class>${rhq.server.database.xa-datasource-class}</xa-datasource-class>
- <xa-datasource-property name="User">${rhq.server.database.user-name}</xa-datasource-property>
- <xa-datasource-property name="Password">${rhq.server.database.password}</xa-datasource-property>
<xa-datasource-property name="ServerName">${rhq.server.database.server-name}</xa-datasource-property>
<xa-datasource-property name="PortNumber">${rhq.server.database.port}</xa-datasource-property>
<xa-datasource-property name="DatabaseName">${rhq.server.database.db-name}</xa-datasource-property>
+
+ <security-domain>XADSRealm</security-domain>
<track-connection-by-tx/>
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<min-pool-size>5</min-pool-size>
<max-pool-size>50</max-pool-size>
@@ -30,8 +28,7 @@
<jndi-name>NoTxRHQDS</jndi-name>
<connection-url>${rhq.server.database.connection-url}</connection-url>
<driver-class>${rhq.server.database.driver-class}</driver-class>
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
+ <security-domain>NONXADSRealm</security-domain>
<connection-property name="char.encoding">UTF-8</connection-property>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<min-pool-size>2</min-pool-size>
diff --git a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.sqlserver.rej b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.sqlserver.rej
index 61ccc08..c79418f 100644
--- a/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.sqlserver.rej
+++ b/modules/enterprise/server/container/src/main/resources/jbossas/server/default/deploy/rhq-ds.xml.sqlserver.rej
@@ -7,8 +7,6 @@
<xa-datasource>
<jndi-name>RHQDS</jndi-name>
<xa-datasource-class>${rhq.server.database.xa-datasource-class}</xa-datasource-class>
- <xa-datasource-property name="User">${rhq.server.database.user-name}</xa-datasource-property>
- <xa-datasource-property name="Password">${rhq.server.database.password}</xa-datasource-property>
<xa-datasource-property name="ServerName">${rhq.server.database.server-name}</xa-datasource-property>
<xa-datasource-property name="PortNumber">${rhq.server.database.port}</xa-datasource-property>
<xa-datasource-property name="DatabaseName">${rhq.server.database.db-name}</xa-datasource-property>
@@ -24,9 +22,7 @@
<xa-datasource-property name="XaEmulation">true</xa-datasource-property>
-->
-
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
+ <security-domain>XADSRealm</security-domain>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<min-pool-size>5</min-pool-size>
<max-pool-size>50</max-pool-size>
@@ -43,8 +39,7 @@
<jndi-name>NoTxRHQDS</jndi-name>
<connection-url>${rhq.server.database.connection-url}</connection-url>
<driver-class>${rhq.server.database.driver-class}</driver-class>
- <user-name>${rhq.server.database.user-name}</user-name>
- <password>${rhq.server.database.password}</password>
+ <security-domain>NONXADSRealm</security-domain>
<track-connection-by-tx></track-connection-by-tx>
commit 002b86ac0fc42f69e390a5f51ea104a7afbd8369
Author: Joseph Marques <joseph(a)redhat.com>
Date: Fri Mar 26 03:13:34 2010 -0400
improve logging to capture some simple rules and thresholds to indicate performance issues
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/FaceletRedirectionViewHandler.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/FaceletRedirectionViewHandler.java
index 17247dc..22aaccb 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/FaceletRedirectionViewHandler.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/FaceletRedirectionViewHandler.java
@@ -62,10 +62,27 @@ public class FaceletRedirectionViewHandler extends FaceletViewHandler {
public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
long monitorId = HibernatePerformanceMonitor.get().start();
super.renderView(context, viewToRender);
- HibernatePerformanceMonitor.get().stop(monitorId, "URL " + viewToRender.getViewId());
+ HibernatePerformanceMonitor.get().stop(monitorId, "URL " + getURL(viewToRender));
}
- protected void handleRnderException(FacesContext context, Exception ex) throws IOException, ELException,
+ private String getURL(UIViewRoot viewToRender) {
+ StringBuilder results = new StringBuilder(viewToRender.getViewId());
+
+ boolean first = true;
+ for (Map.Entry<String, Object> urlParam : viewToRender.getAttributes().entrySet()) {
+ if (first) {
+ results.append('?');
+ } else {
+ results.append('&');
+ }
+ results.append(urlParam.getKey() + "=" + urlParam.getValue());
+ }
+
+ return results.toString();
+ }
+
+ @Override
+ protected void handleRenderException(FacesContext context, Exception ex) throws IOException, ELException,
FacesException {
try {
if (context.getViewRoot().getViewId().equals("/rhq/common/error.xhtml")) {
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserTrackingFilter.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserTrackingFilter.java
index 8b6c03c..6299947 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserTrackingFilter.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserTrackingFilter.java
@@ -13,6 +13,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.enterprise.gui.legacy.util.SessionUtils;
+import org.rhq.enterprise.server.util.HibernatePerformanceMonitor;
public class WebUserTrackingFilter extends BaseFilter {
@@ -23,6 +24,8 @@ public class WebUserTrackingFilter extends BaseFilter {
ServletException {
HttpServletRequest request = (HttpServletRequest) req;
+ HibernatePerformanceMonitor.get().zeroStats();
+
// only record GET requests, resubmitting to POST pages is dangerous
String method = request.getMethod();
if (method.equals("GET")) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java
index 1215cb0..848a067 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java
@@ -18,14 +18,20 @@
*/
package org.rhq.enterprise.server.util;
+import java.lang.management.ManagementFactory;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
+import javax.management.MBeanServer;
import javax.persistence.EntityManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hibernate.stat.QueryStatistics;
+import org.hibernate.stat.Statistics;
+
+import org.rhq.core.domain.util.PersistenceUtility;
/**
* @author Joseph Marques
@@ -45,6 +51,15 @@ public class HibernatePerformanceMonitor {
return singleton;
}
+ public void zeroStats() {
+ if (log.isDebugEnabled()) {
+ EntityManager entityManager = LookupUtil.getEntityManager();
+ MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+ Statistics stats = PersistenceUtility.getStatisticsService(entityManager, platformMBeanServer);
+ stats.clear();
+ }
+ }
+
public long start() {
if (log.isDebugEnabled()) {
EntityManager entityManager = LookupUtil.getEntityManager();
@@ -61,11 +76,38 @@ public class HibernatePerformanceMonitor {
if (log.isDebugEnabled()) {
HibernateStatisticsStopWatch watch = watches.remove(id);
if (watch == null) {
- // could happen if debugging was turned on and the start() call was already skipped
- return;
+ return; // could happen if debugging was turned on and the start() call was already skipped
}
watch.stop();
- log.debug(watch.toString() + (logPrefix == null ? "(unknown)" : " for " + logPrefix + " "));
+
+ String cause = "";
+ if (watch.getQueryExecutions() != 0) {
+ if ((watch.getConnects() / (double) (watch.getEntityLoads() + watch.getQueryExecutions())) >= 5.0) {
+ cause = "(N+1 issue?) ";// might indicate need for LEFT JOIN FETCHes
+ }
+ if ((watch.getTransations() / (double) watch.getQueryExecutions()) >= 5.0) {
+ cause = "(xaction nesting?) "; // might indicate excessive @REQUIRES_NEW
+ } else if (watch.getTransations() > 10) {
+ cause = "(too many xactions?";
+ }
+ }
+ if (watch.getTime() > 3000) {
+ cause = "(slowness?) "; // might indicate inefficient query or table contention
+ }
+
+ String callingContext = " for " + (logPrefix == null ? "(unknown)" : logPrefix);
+ log.debug(watch.toString() + cause + callingContext);
+
+ if (logPrefix.contains("URL")) {
+ String[] queries = watch.getStats().getQueries();
+ for (int i = 0; i < queries.length; i++) {
+ String query = queries[i];
+ QueryStatistics queryStats = watch.getStats().getQueryStatistics(query);
+ log.debug("queryString[" + i + "]=" + queries[i]);
+ log.debug("queryStats[" + i + "=" + queryStats);
+ }
+ //watch.getStats().logSummary();
+ }
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java
index 5ca8470..7eb62da 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java
@@ -34,10 +34,10 @@ public class HibernateStatisticsStopWatch {
private Statistics stats;
- long queryExecutions;
- long transations;
- long entityLoads;
- long connects;
+ long queryExecutions; // Get global number of executed queries
+ long transations; // The number of transactions we know to have completed
+ long entityLoads; // Get global number of entity loads
+ long connects; // Get the global number of connections asked by the sessions
long time;
public HibernateStatisticsStopWatch(EntityManager entityManager) {
@@ -61,6 +61,30 @@ public class HibernateStatisticsStopWatch {
time += System.currentTimeMillis();
}
+ public Statistics getStats() {
+ return stats;
+ }
+
+ public long getQueryExecutions() {
+ return queryExecutions;
+ }
+
+ public long getTransations() {
+ return transations;
+ }
+
+ public long getEntityLoads() {
+ return entityLoads;
+ }
+
+ public long getConnects() {
+ return connects;
+ }
+
+ public long getTime() {
+ return time;
+ }
+
public String toString() {
return "HibernateStats" //
+ "[ queries=" + queryExecutions //
commit d0d27d83e1e961d591b674e7c4a80e6adf2981e8
Author: Joseph Marques <joseph(a)redhat.com>
Date: Fri Mar 26 03:11:37 2010 -0400
BZ 577109 - fix for partial-page requests not properly recovering from view exceptions
during the authentication action, test whether we've "bookmarked" an ajax request;
if so, redirect to the URLs in the web user preferences stored by WebUserTrackingFilter;
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 62e9518..c314189 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
@@ -145,6 +145,13 @@ public class AuthenticateUserAction extends TilesAction {
if ((url == null) || url.equals("/Logout.do")) {
url = URL_DASHBOARD;
}
+ if (url.toLowerCase().indexOf("ajax") != -1) {
+ // we can't return to a URL that was a partial page request
+ // because the view no longer exists, and will blow up.
+ // instead, redirect back to the last saved URL
+ url = webUser.getWebPreferences().getLastVisitedURL(2);
+ System.out.println("Bypassing partial-page with " + url);
+ }
af = new ActionForward(url);
}
14 years, 1 month
[rhq] Branch 'bugfixes' - modules/plugins
by ips
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java | 38 ++++++++--
1 file changed, 32 insertions(+), 6 deletions(-)
New commits:
commit 237ee88dbecd6809cefea82865bbe0b1d3b5582d
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Mon Mar 29 11:31:53 2010 -0400
fix getServerRoot() so that if server root from httpd command line is a relative path, it will be resolved relative to the httpd process's cwd, not the cwd of the Agent process (see https://bugzilla.redhat.com/show_bug.cgi?id=536328)
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
index b87b3d6..95c2bfc 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
@@ -20,7 +20,6 @@ package org.rhq.plugins.apache;
import java.io.File;
import java.io.IOException;
-import java.net.InetAddress;
import java.net.URI;
import java.util.HashSet;
import java.util.List;
@@ -35,7 +34,6 @@ import org.jetbrains.annotations.Nullable;
import org.rhq.augeas.AugeasProxy;
import org.rhq.augeas.node.AugeasNode;
import org.rhq.augeas.tree.AugeasTree;
-import org.rhq.augeas.tree.AugeasTreeException;
import org.rhq.augeas.util.Glob;
import org.rhq.augeas.util.GlobFilter;
import org.rhq.core.domain.configuration.Configuration;
@@ -49,6 +47,7 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.pluginapi.inventory.ManualAddFacet;
import org.rhq.core.pluginapi.util.FileUtils;
import org.rhq.core.system.ProcessInfo;
+import org.rhq.core.system.SystemInfoException;
import org.rhq.plugins.apache.augeas.AugeasConfigurationApache;
import org.rhq.plugins.apache.augeas.AugeasTreeBuilderApache;
import org.rhq.plugins.apache.util.ApacheBinaryInfo;
@@ -293,24 +292,51 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
@Nullable
private String getServerRoot(@NotNull ApacheBinaryInfo binaryInfo, @NotNull ProcessInfo processInfo) {
+ // First see if -d was specified on the httpd command line.
String[] cmdLine = processInfo.getCommandLine();
String root = getCommandLineOption(cmdLine, "-d");
+ // If not, extract the path from the httpd binary.
if (root == null) {
root = binaryInfo.getRoot();
}
- if (root != null) {
- root = FileUtils.getCanonicalPath(root);
+ if (root == null) {
+ // We have failed to determine the server root :(
+ return null;
+ }
+
+ // If the path is relative, convert it to an absolute path, resolving it relative to the cwd of the httpd process.
+ File rootFile = new File(root);
+ if (!rootFile.isAbsolute()) {
+ String currentWorkingDir;
+ try {
+ currentWorkingDir = processInfo.getCurrentWorkingDirectory();
+ } catch (Exception e) {
+ log.error("Unable to determine current working directory of Apache process [" + processInfo
+ + "], which is needed to determine the server root of the Apache instance.", e);
+ return null;
+ }
+ if (currentWorkingDir == null) {
+ log.error("Unable to determine current working directory of Apache process [" + processInfo
+ + "], which is needed to determine the server root of the Apache instance.");
+ return null;
+ } else {
+ rootFile = new File(currentWorkingDir, root);
+ root = rootFile.getPath();
+ }
}
+ // And finally canonicalize the path, but using our own getCanonicalPath() method, which preserves symlinks.
+ root = FileUtils.getCanonicalPath(root);
+
return root;
}
@Nullable
private File getServerConfigFile(ApacheBinaryInfo binaryInfo, ProcessInfo processInfo, String serverRoot) {
- String[] cmdLine = processInfo.getCommandLine();
// First see if -f was specified on the httpd command line.
+ String[] cmdLine = processInfo.getCommandLine();
String serverConfigFile = getCommandLineOption(cmdLine, "-f");
// If not, extract the path from the httpd binary.
@@ -330,7 +356,7 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
serverConfigFile = file.getPath();
}
- // And now canonicalize the path, but using our own getCanonicalPath() method, which preserves symlinks.
+ // And finally canonicalize the path, but using our own getCanonicalPath() method, which preserves symlinks.
serverConfigFile = FileUtils.getCanonicalPath(serverConfigFile);
return new File(serverConfigFile);
14 years, 1 month
[rhq] modules/enterprise
by Heiko W. Rupp
modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit b0140c202e7cad66ebb0dcd779501797a6bd6390
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 29 14:16:28 2010 +0200
Fix definition of _JB_DIR variable
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
index 3b85102..223c581 100644
--- a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
@@ -85,7 +85,7 @@ if not exist "%RHQ_SERVER_JAVA_EXE_FILE_PATH%" (
exit /B 1
)
-set _JB_DIR = %RHQ_SERVER_HOME%\jbossas
+set _JB_DIR=%RHQ_SERVER_HOME%\jbossas
%RHQ_SERVER_JAVA_EXE_FILE_PATH% -cp %_JB_DIR%\lib\jboss-common.jar;%_JB_DIR%\lib\jboss-jmx.jar;%_JB_DIR%\server\default\lib\jbosssx.jar;%_JB_DIR%\server\default\lib\jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule %1
14 years, 1 month
[rhq] Branch 'gwt' - 5 commits - .classpath modules/common modules/core modules/enterprise modules/plugins
by mazz
.classpath | 5
modules/common/ant-bundle/pom.xml | 50 +
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java | 27 +
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java | 191 +++++++
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java | 50 +
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java | 29 +
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java | 115 ++++
modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties | 1
modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java | 87 +++
modules/common/ant-bundle/src/test/resources/simple-build.xml | 12
modules/common/pom.xml | 1
modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 16
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java | 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java | 44 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java | 5
modules/enterprise/server/plugins/ant-bundle/pom.xml | 214 ++++++++
modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java | 125 ++++
modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml | 20
modules/enterprise/server/plugins/filetemplate-bundle/pom.xml | 6
modules/enterprise/server/plugins/pom.xml | 1
modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml | 1
modules/plugins/ant-bundle/pom.xml | 267 ++++++++++
modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java | 136 +++++
modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java | 51 +
modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml | 20
modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java | 158 +++++
modules/plugins/ant-bundle/src/test/resources/log4j.xml | 35 +
modules/plugins/ant-bundle/src/test/resources/simple-build.xml | 8
modules/plugins/ant-bundle/src/test/resources/test-build.xml | 27 +
modules/plugins/pom.xml | 1
modules/plugins/validate-all-plugins/pom.xml | 1
32 files changed, 1689 insertions(+), 27 deletions(-)
New commits:
commit 8bd78f0b3a282f09d4549dee054d94855509d484
Merge: c3bb31e... ae88c7c...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:31:34 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit c3bb31e179881380b02df5d9dee0743878a3e4c5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:31:14 2010 -0400
introduce a new bundle type - ANT
we now two kinds of bundles - one has a simple recipe style (file template)
and the second uses Ant scripts as its recipe (thus providing a
more advanced way to lay down bundle content on the agent)
diff --git a/.classpath b/.classpath
index 082cf31..c1a9e78 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="modules/common/jboss-as/src/main/java"/>
+ <classpathentry kind="src" path="modules/common/ant-bundle/src/main/java"/>
+ <classpathentry kind="src" path="modules/common/ant-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/common/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/common/filetemplate-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/gui/base-perspective-jar/src/main/java"/>
@@ -71,6 +73,7 @@
<classpathentry kind="src" path="modules/enterprise/server/plugins/alert-microblog/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/alert-mobicents/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/cobbler/src/main/java"/>
+ <classpathentry kind="src" path="modules/enterprise/server/plugins/ant-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/gui/portal-war/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/gui/portal-war/src/test/java"/>
@@ -129,6 +132,8 @@
<classpathentry kind="src" path="modules/plugins/jdbctrace/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/ant-bundle/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/ant-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/filetemplate-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/helpers/rtfilter/src/main/java"/>
diff --git a/modules/common/ant-bundle/pom.xml b/modules/common/ant-bundle/pom.xml
new file mode 100644
index 0000000..90e3f39
--- /dev/null
+++ b/modules/common/ant-bundle/pom.xml
@@ -0,0 +1,50 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-common-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Ant Bundle Plugins Common Library</name>
+ <description>A library with the code common to the agent and server plugins for Ant Bundles</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/common/ant-bundle/</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/common/ant-bundle/</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/common/ant-bundle/</scm.module.path>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.6.5</version>
+ </dependency>
+
+ <dependency>
+ <groupId>ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.6.5</version>
+ </dependency>
+
+ <!-- include some optional ant tasks for users to be able to use -->
+ <dependency>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ </dependency>
+
+ </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java
new file mode 100644
index 0000000..d5db4cc
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java
@@ -0,0 +1,27 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.bundle.ant;
+
+import org.apache.tools.ant.Task;
+
+public abstract class AbstractBundleTask extends Task {
+ public BundleAntProject getBundleAntProject() {
+ return (BundleAntProject) getProject();
+ }
+}
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
new file mode 100644
index 0000000..b184274
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
@@ -0,0 +1,191 @@
+/*
+ * 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.bundle.ant;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.helper.ProjectHelper2;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertySimpleType;
+
+public class AntLauncher {
+
+ // currently, the bundle plugins don't need custom ant tasks, but there is an ant task stubbed for future use here
+ private static final String ANT_TASKS = "bundle-ant-tasks.properties";
+
+ /**
+ * Launches ANT and parses the given build file and optionally executes it.
+ *
+ * @param buildFile the build file that ANT will run
+ * @param target the target to run, <code>null</code> will run the default target
+ * @param customTaskDefs the properties file found in classloader that contains all the taskdef definitions
+ * @param properties set of properties to set for the ANT task to access
+ * @param logFile where ANT messages will be logged
+ * @param logStdOut if <code>true</code>, log messages will be sent to stdout as well as the log file
+ * @param execute if <code>true</code> the ant script will be parsed and executed; otherwise, it will only be parsed
+ *
+ * @throws RuntimeException
+ */
+ public BundleAntProject startAnt(File buildFile, String target, String customTaskDefs, Properties properties,
+ File logFile, boolean logStdOut, boolean execute) {
+
+ PrintWriter logFileOutput = null;
+
+ try {
+ logFileOutput = new PrintWriter(new FileOutputStream(logFile, true));
+
+ ClassLoader classLoader = getClass().getClassLoader();
+
+ Properties taskDefs = new Properties();
+ if (customTaskDefs != null) {
+ InputStream taskDefsStream = classLoader.getResourceAsStream(customTaskDefs);
+ try {
+ taskDefs.load(taskDefsStream);
+ } finally {
+ taskDefsStream.close();
+ }
+ }
+
+ BundleAntProject project = new BundleAntProject();
+ project.setCoreLoader(classLoader);
+ project.init();
+ project.setBaseDir(buildFile.getParentFile());
+
+ if (properties != null) {
+ for (Map.Entry<Object, Object> property : properties.entrySet()) {
+ project.setProperty(property.getKey().toString(), property.getValue().toString());
+ }
+ }
+
+ // notice we are adding the listener after we set the properties - we do not want the
+ // the properties echoed out in the log (in case they contain sensitive passwords)
+ project.addBuildListener(new LoggerAntBuildListener(target, logFileOutput, Project.MSG_DEBUG));
+ if (logStdOut) {
+ PrintWriter stdout = new PrintWriter(System.out);
+ project.addBuildListener(new LoggerAntBuildListener(target, stdout, Project.MSG_INFO));
+ }
+
+ for (Map.Entry<Object, Object> taskDef : taskDefs.entrySet()) {
+ project.addTaskDefinition(taskDef.getKey().toString(), Class.forName(taskDef.getValue().toString(),
+ true, classLoader));
+ }
+
+ ProjectHelper2 helper = new ProjectHelper2();
+ helper.parse(project, buildFile);
+
+ parseBundleFiles(project);
+ parseBundleConfiguration(project);
+
+ if (execute) {
+ project.executeTarget((target == null) ? project.getDefaultTarget() : target);
+ }
+
+ return project;
+
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot run ANT on script [" + buildFile + "]. Cause: " + e, e);
+ } finally {
+ if (logFileOutput != null) {
+ logFileOutput.close();
+ }
+ }
+ }
+
+ private void parseBundleFiles(BundleAntProject project) {
+ Map<String, ? extends Task> refs = project.getReferences();
+ for (Map.Entry<String, ? extends Task> entry : refs.entrySet()) {
+ String refId = entry.getKey();
+ if (refId.startsWith("_bundlefile.")) {
+ Hashtable attribs = entry.getValue().getRuntimeConfigurableWrapper().getAttributeMap();
+
+ if (!attribs.containsKey("name")) {
+ throw new BuildException("Property id=[" + refId + "] must specify the 'name' attribute");
+ }
+ String name = attribs.get("name").toString();
+
+ // allow the bundle author to specify the bundle file in one of the standard two ways
+ Object location = attribs.get("location");
+ Object value = attribs.get("value");
+
+ String bundleFilename;
+ if (location != null) {
+ bundleFilename = location.toString();
+ } else if (value != null) {
+ bundleFilename = value.toString();
+ } else {
+ throw new BuildException("Property id=[" + refId + "], name=[" + name
+ + "] must specify the bundle file name in an attribute named 'location' or 'value'");
+ }
+
+ project.addBundleFile(name, bundleFilename);
+ }
+ }
+ }
+
+ private void parseBundleConfiguration(BundleAntProject project) {
+ Map<String, ? extends Task> refs = project.getReferences();
+ for (Map.Entry<String, ? extends Task> entry : refs.entrySet()) {
+ String refId = entry.getKey();
+ if (refId.startsWith("_bundleconfig.")) {
+ Hashtable attribs = entry.getValue().getRuntimeConfigurableWrapper().getAttributeMap();
+
+ if (!attribs.containsKey("name")) {
+ throw new BuildException("Property id=[" + refId + "] must specify the 'name' attribute");
+ }
+ String name = attribs.get("name").toString();
+
+ // allow the bundle author to specify the bundle config prop in one of the standard two ways
+ Object location = attribs.get("location");
+ Object value = attribs.get("value");
+
+ String bundlePropValue;
+ if (location != null) {
+ bundlePropValue = location.toString();
+ } else if (value != null) {
+ bundlePropValue = value.toString();
+ } else {
+ throw new BuildException("Property id=[" + refId + "], name=[" + name
+ + "] must specify the bundle configuration name in an attribute named 'location' or 'value'");
+ }
+
+ PropertyDefinitionSimple prop = new PropertyDefinitionSimple(name, "Needed by bundle recipe.", false,
+ PropertySimpleType.STRING);
+ prop.setDisplayName(name);
+ prop.setDefaultValue(bundlePropValue);// TODO: I would like to set this-setDefaultValue is deprecated, how to do this?
+ ConfigurationDefinition configDef = project.getConfigurationDefinition();
+ configDef.put(prop);
+ }
+ }
+ }
+}
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java
new file mode 100644
index 0000000..0dd282c
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java
@@ -0,0 +1,50 @@
+/*
+ * 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.bundle.ant;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tools.ant.Project;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+
+public class BundleAntProject extends Project {
+ private final Map<String, String> bundleFiles = new HashMap<String, String>();
+ private ConfigurationDefinition configDef;
+
+ public Map<String, String> getBundleFiles() {
+ return bundleFiles;
+ }
+
+ public void addBundleFile(String name, String filename) {
+ bundleFiles.put(name, filename);
+ }
+
+ public ConfigurationDefinition getConfigurationDefinition() {
+ if (configDef == null) {
+ configDef = new ConfigurationDefinition("antbundle", null);
+ }
+ return configDef;
+ }
+}
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java
new file mode 100644
index 0000000..a21ca6e
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java
@@ -0,0 +1,29 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.bundle.ant;
+
+import org.apache.tools.ant.BuildException;
+
+public class BundleTask extends AbstractBundleTask {
+ @Override
+ public void execute() throws BuildException {
+ // TODO this is a stub for a custom bundle task, in case we need one
+ return;
+ }
+}
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java
new file mode 100644
index 0000000..e7365e3
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java
@@ -0,0 +1,115 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.bundle.ant;
+
+import java.io.PrintWriter;
+import java.util.Date;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+
+/**
+ * Listens for ANT build events and logs them to a log stream.
+ *
+ * @author John Mazzitelli
+ */
+public class LoggerAntBuildListener implements BuildListener {
+ private final String mainTarget;
+ private final PrintWriter output;
+ private final int priorityThreshold;
+
+ public LoggerAntBuildListener(String target, PrintWriter logFile, int priorityThreshold) {
+ this.mainTarget = (target != null) ? target : "(default)";
+ this.output = logFile;
+ this.priorityThreshold = priorityThreshold;
+
+ // start with the date this was started
+ this.output.println("======================================");
+ this.output.println("ANT target [" + this.mainTarget + "]");
+ this.output.println(new Date().toString());
+ this.output.println("======================================");
+ }
+
+ public void buildFinished(BuildEvent event) {
+ logEvent(event, "FINISHED! [" + this.mainTarget + ']');
+ }
+
+ public void buildStarted(BuildEvent event) {
+ logEvent(event, "STARTED! [" + this.mainTarget + ']');
+ }
+
+ public void messageLogged(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void targetFinished(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void targetStarted(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void taskFinished(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void taskStarted(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ private void logEvent(BuildEvent event, String additionalMessage) {
+ if (event.getPriority() > this.priorityThreshold) {
+ return;
+ }
+
+ String message = event.getMessage();
+ Throwable exception = event.getException();
+ Target target = event.getTarget();
+ Task task = event.getTask();
+
+ if (additionalMessage != null) {
+ output.println(additionalMessage);
+ }
+
+ if (target != null) {
+ output.print("[" + target.getName() + "] ");
+ }
+
+ if (task != null) {
+ output.print("[" + task.getTaskName() + "] ");
+ }
+
+ if (message != null) {
+ output.print(message);
+ }
+
+ if (exception != null) {
+ output.println();
+ exception.printStackTrace(output);
+ }
+
+ output.println();
+ output.flush();
+
+ return;
+ }
+}
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties b/modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties
new file mode 100644
index 0000000..6f84e21
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties
@@ -0,0 +1 @@
+bundle-task=org.rhq.bundle.ant.BundleTask
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java b/modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java
new file mode 100644
index 0000000..01de89e
--- /dev/null
+++ b/modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.bundle.ant;
+
+import java.io.File;
+import java.util.Map;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+
+@Test
+public class AntLauncherTest {
+ private File logFile;
+
+ @BeforeMethod
+ public void beforeMethod() {
+ logFile = new File("target/test-ant-log.txt");
+ if (logFile.exists()) {
+ if (!logFile.delete()) {
+ System.out.println("Failed to clean up test - log file did not delete");
+ }
+ }
+ return;
+ }
+
+ public void testSimpleParseTest() throws Exception {
+ AntLauncher ant = new AntLauncher();
+ BundleAntProject project = ant.startAnt(getBuildXml("simple-build.xml"), "unnecessary-target", null, null,
+ logFile, true, false);
+ assert project != null;
+ Map<String, String> bundleFiles = project.getBundleFiles();
+ assert bundleFiles != null;
+ assert bundleFiles.size() == 2 : bundleFiles;
+ assert bundleFiles.get("f").equals("file.txt") : bundleFiles;
+ assert bundleFiles.get("pkg").equals("package.zip") : bundleFiles;
+
+ ConfigurationDefinition configDef = project.getConfigurationDefinition();
+ assert configDef.getPropertyDefinitions().size() == 2;
+ assert configDef.getPropertyDefinitionSimple("custom.prop1") != null;
+ assert configDef.getPropertyDefinitionSimple("custom.prop2") != null;
+ }
+
+ public void testSimpleExecTest() throws Exception {
+ AntLauncher ant = new AntLauncher();
+ BundleAntProject project = ant.startAnt(getBuildXml("simple-build.xml"), "first-target", null, null, logFile,
+ true, true);
+ Map<String, String> bundleFiles = project.getBundleFiles();
+ assert bundleFiles != null;
+ assert bundleFiles.size() == 2 : bundleFiles;
+ assert bundleFiles.get("f").equals("file.txt") : bundleFiles;
+ assert bundleFiles.get("pkg").equals("package.zip") : bundleFiles;
+
+ ConfigurationDefinition configDef = project.getConfigurationDefinition();
+ assert configDef.getPropertyDefinitions().size() == 2;
+ assert configDef.getPropertyDefinitionSimple("custom.prop1") != null;
+ assert configDef.getPropertyDefinitionSimple("custom.prop2") != null;
+ }
+
+ private File getBuildXml(String name) throws Exception {
+ File file = new File("target/test-classes", name);
+ assert file.exists() : "the test ant build script doesn't exist: " + file.getAbsolutePath();
+ return file;
+ }
+}
diff --git a/modules/common/ant-bundle/src/test/resources/simple-build.xml b/modules/common/ant-bundle/src/test/resources/simple-build.xml
new file mode 100644
index 0000000..fecb376
--- /dev/null
+++ b/modules/common/ant-bundle/src/test/resources/simple-build.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<project name="simple-bundle-test">
+ <property id="_bundlefile.1" name="f" location="file.txt" />
+ <property id="_bundleconfig.1" name="custom.prop1" location="1" />
+
+ <target name="first-target">
+ <echo>Hello!!!!!!!!</echo>
+ <property id="_bundlefile.2" name="pkg" value="package.zip" />
+ <property id="_bundleconfig.2" name="custom.prop2" value="2" />
+ <echo>World!!!!!!!!</echo>
+ </target>
+</project>
\ No newline at end of file
diff --git a/modules/common/pom.xml b/modules/common/pom.xml
index 8abfe11..1e561b4 100644
--- a/modules/common/pom.xml
+++ b/modules/common/pom.xml
@@ -67,5 +67,6 @@
<modules>
<module>jboss-as</module>
<module>filetemplate-bundle</module>
+ <module>ant-bundle</module>
</modules>
</project>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java
index 07c49a8..0e83859 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java
@@ -143,12 +143,12 @@ public class ServerPluginService implements ServerPluginServiceManagement {
File tmpDir = LookupUtil.getCoreServer().getJBossServerTempDir();
- // TODO: determine what things to hide from our war classloader
- //StringBuilder defaultRegex = new StringBuilder();
- //defaultRegex.append("(package\\.with\\.classes\\.to\\.hide\\..*)|");
+ // determine what things to hide from our war classloader
+ StringBuilder defaultRegex = new StringBuilder();
+ defaultRegex.append("(org\\.apache\\.tools\\..*)"); // ant.jar
MasterServerPluginContainerConfiguration config;
- config = new MasterServerPluginContainerConfiguration(pluginDir, dataDir, tmpDir, null);
+ config = new MasterServerPluginContainerConfiguration(pluginDir, dataDir, tmpDir, defaultRegex.toString());
pc.initialize(config);
return pc;
}
diff --git a/modules/enterprise/server/plugins/ant-bundle/pom.xml b/modules/enterprise/server/plugins/ant-bundle/pom.xml
new file mode 100644
index 0000000..b044ca3
--- /dev/null
+++ b/modules/enterprise/server/plugins/ant-bundle/pom.xml
@@ -0,0 +1,214 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-server-plugins-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-serverplugin-ant-bundle</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Ant Bundle Server Plugin</name>
+ <description>Server side plugin that manages ant-scripted bundles</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/...</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/...</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/enterprise/server/plugins/ant-bundle/</scm.module.path>
+ </properties>
+
+ <dependencies>
+
+ <!-- Internal Deps -->
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-domain</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-client-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <!-- 3rd Party Deps -->
+
+ <!-- TODO: This is a fix for the Javac bug requiring annotations to be
+ available when compiling dependent classes. It is fixed in JDK 6 -->
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>jboss.jboss-embeddable-ejb3</groupId>
+ <artifactId>hibernate-all</artifactId>
+ <version>1.0.0.Alpha9</version>
+ <scope>provided</scope>
+ <!-- needed for referenced domain entities that use Hibernate annotations -->
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludedGroups>${rhq.testng.excludedGroups}</excludedGroups>
+ <!--
+ <argLine>-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y</argLine>
+ -->
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>copy-rhq-plugins</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+
+ <artifactItem>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <!-- include some optional ant tasks for users to be able to use -->
+ <artifactItem>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ </artifactItem>
+
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ <profiles>
+
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-serverplugins</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${rhq.deploymentDir}" />
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.outputDirectory}">
+ <patternset>
+ <include name="META-INF/**" />
+ </patternset>
+ </unjar>
+ <jar destfile="${deployment.file}" manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF"
+ update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+</project>
\ No newline at end of file
diff --git a/modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java b/modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java
new file mode 100644
index 0000000..15e4ecb
--- /dev/null
+++ b/modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java
@@ -0,0 +1,125 @@
+/*
+ * 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.server.plugins.ant;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.bundle.ant.AntLauncher;
+import org.rhq.bundle.ant.BundleAntProject;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.util.stream.StreamUtil;
+import org.rhq.enterprise.server.bundle.RecipeParseResults;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
+import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
+
+/**
+ * A bundle server-side plugin component that the server uses to process ant-based bundles.
+ *
+ * @author John Mazzitelli
+ */
+public class AntBundleServerPluginComponent implements ServerPluginComponent, BundleServerPluginFacet {
+
+ private final Log log = LogFactory.getLog(AntBundleServerPluginComponent.class);
+
+ private ServerPluginContext context;
+ private File tmpDirectory;
+
+ public void initialize(ServerPluginContext context) throws Exception {
+ this.context = context;
+ this.tmpDirectory = new File(this.context.getTemporaryDirectory(), "ant-bundle-server-plugin");
+ this.tmpDirectory.mkdirs();
+ if (!this.tmpDirectory.exists() || !this.tmpDirectory.isDirectory()) {
+ throw new Exception("Failed to create tmp dir [" + this.tmpDirectory + "] - cannot process ant bundles");
+ }
+ log.debug("The ant bundle plugin has been initialized: " + this);
+ }
+
+ public void start() {
+ log.debug("The ant bundle plugin has started: " + this);
+ }
+
+ public void stop() {
+ log.debug("The ant bundle plugin has stopped: " + this);
+ }
+
+ public void shutdown() {
+ log.debug("The ant bundle plugin has been shut down: " + this);
+ }
+
+ public RecipeParseResults parseRecipe(String recipe) throws Exception {
+
+ Map<String, String> bundleFiles = null;
+ ConfigurationDefinition configDef = null;
+ RecipeParseResults results;
+
+ File recipeFile = File.createTempFile("ant-bundle-recipe", ".xml", this.tmpDirectory);
+ File logFile = File.createTempFile("ant-bundle-recipe", ".log", this.tmpDirectory);
+ try {
+ // store the recipe in the tmp recipe file
+ ByteArrayInputStream in = new ByteArrayInputStream(recipe.getBytes());
+ FileOutputStream out = new FileOutputStream(recipeFile);
+ StreamUtil.copy(in, out);
+
+ // parse, but do not execute, the ant script
+ AntLauncher antLauncher = new AntLauncher();
+ BundleAntProject project = antLauncher.startAnt(recipeFile, null, null, null, logFile, false, false);
+
+ // obtain the parse results
+ bundleFiles = project.getBundleFiles();
+ configDef = project.getConfigurationDefinition();
+ } catch (Throwable t) {
+ if (log.isDebugEnabled()) {
+ try {
+ log.debug(new String(StreamUtil.slurp(new FileInputStream(logFile))));
+ } catch (Exception e) {
+ }
+ }
+ throw new Exception("Failed to parse the bundle ANT script", t);
+ } finally {
+ recipeFile.delete();
+ logFile.delete();
+ }
+
+ results = new RecipeParseResults(configDef, new HashSet<String>(bundleFiles.values()));
+ return results;
+
+ }
+
+ @Override
+ public String toString() {
+ if (this.context == null) {
+ return "<no context>";
+ }
+
+ StringBuilder str = new StringBuilder();
+ str.append("plugin-key=").append(this.context.getPluginEnvironment().getPluginKey()).append(",");
+ str.append("plugin-url=").append(this.context.getPluginEnvironment().getPluginUrl());
+ return str.toString();
+ }
+}
diff --git a/modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml
new file mode 100644
index 0000000..23208b7
--- /dev/null
+++ b/modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<bundle-plugin name="AntBundleServerPlugin"
+ displayName="Ant Bundle Processor"
+ description="Processes bundles whose recipes are Ant scripts"
+ package="org.rhq.enterprise.server.plugins.ant"
+ xmlns="urn:xmlns:rhq-serverplugin.bundle"
+ xmlns:serverplugin="urn:xmlns:rhq-serverplugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <serverplugin:help><![CDATA[
+ Processes Ant bundles on the server side.
+ ]]></serverplugin:help>
+
+ <serverplugin:plugin-component class="AntBundleServerPluginComponent">
+ </serverplugin:plugin-component>
+
+ <bundle type="Ant Bundle"/>
+
+</bundle-plugin>
diff --git a/modules/enterprise/server/plugins/pom.xml b/modules/enterprise/server/plugins/pom.xml
index b86cde2..06f91cf 100644
--- a/modules/enterprise/server/plugins/pom.xml
+++ b/modules/enterprise/server/plugins/pom.xml
@@ -84,6 +84,7 @@
<module>alert-subject</module>
<module>cobbler</module>
<module>filetemplate-bundle</module>
+ <module>ant-bundle</module>
<module>validate-all-serverplugins</module>
</modules>
diff --git a/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml b/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
index 58e3d40..9c7cc74 100644
--- a/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
+++ b/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
@@ -54,6 +54,7 @@
<pathelement location="../alert-subject/target/alert-subject-${project.version}.jar" />
<pathelement location="../cobbler/target/cobbler-${project.version}.jar" />
<pathelement location="../filetemplate-bundle/target/rhq-serverplugin-filetemplate-bundle-${project.version}.jar" />
+ <pathelement location="../ant-bundle/target/rhq-serverplugin-ant-bundle-${project.version}.jar" />
<pathelement location="../perspectives/core/target/rhq-core-perspective-${project.version}.jar" />
</classpath>
<sysproperty key="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.SimpleLog" />
diff --git a/modules/plugins/ant-bundle/pom.xml b/modules/plugins/ant-bundle/pom.xml
new file mode 100644
index 0000000..3777af9
--- /dev/null
+++ b/modules/plugins/ant-bundle/pom.xml
@@ -0,0 +1,267 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-plugins-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-plugin</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Ant Bundle Plugin</name>
+ <description>a plugin that processes ant-based bundles</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/plugins/ant-bundle/</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/plugins/ant-bundle/</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/plugins/ant-bundle/</scm.module.path>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>copy-rhq-plugins</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+
+ <artifactItem>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <!-- include some optional ant tasks for users to be able to use -->
+ <artifactItem>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ </artifactItem>
+
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>integration-tests</id>
+ <activation>
+ <property>
+ <name>maven.test.skip</name>
+ <value>!true</value>
+ </property>
+ </activation>
+
+ <build>
+ <plugins>
+ <!-- Integration testing voodoo to load and test this plugin with its plugin dependencies -->
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>pre-integration-test</phase>
+ <configuration>
+ <tasks>
+ <echo>Setting up plugin dependencies for ${project.artifactId}-${project.version}.jar...</echo>
+ <property name="settings.localRepository" location="${user.home}/.m2/repository" />
+ <mkdir dir="target/itest" />
+ <mkdir dir="target/itest/plugins" />
+ <mkdir dir="target/itest/lib" />
+ <copy toDir="target/itest/plugins" flatten="true">
+ <fileset dir="${settings.localRepository}/">
+ <include name="org/rhq/rhq-platform-plugin/${project.version}/rhq-platform-plugin-${project.version}.jar" />
+ </fileset>
+ <fileset dir="${project.build.directory}">
+ <include name="${project.artifactId}-${project.version}.jar" />
+ </fileset>
+ </copy>
+ <unzip dest="target/itest/lib">
+ <fileset dir="${settings.localRepository}/org/hyperic/sigar-dist/${sigar.version}" includes="*.zip" />
+ <patternset>
+ <include name="**/lib/sigar.jar" />
+ <include name="**/lib/bcel*.jar" />
+ <include name="**/lib/*.so" />
+ <include name="**/lib/*.sl" />
+ <include name="**/lib/*.dll" />
+ <include name="**/lib/*.dylib" />
+ </patternset>
+ </unzip>
+ <move todir="target/itest/lib" flatten="true">
+ <fileset dir="target/itest/lib">
+ <include name="**/lib/*" />
+ </fileset>
+ </move>
+ <delete dir="target/itest/lib/hyperic-sigar-${sigar.version}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ <executions>
+ <execution>
+ <id>surefire-it</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <skip>${maven.test.skip}</skip>
+ <excludedGroups>${rhq.testng.excludedGroups}</excludedGroups>
+ <useSystemClassLoader>false</useSystemClassLoader>
+ <argLine>-Dorg.hyperic.sigar.path=${basedir}/target/itest/lib</argLine>
+ <!--
+ <argLine>-Dorg.hyperic.sigar.path=${basedir}/target/itest/lib -Xdebug -Xnoagent -Djava.compiler=NONE
+ -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y</argLine>
+ -->
+ <systemProperties>
+ <property>
+ <name>project.artifactId</name>
+ <value>${project.artifactId}</value>
+ </property>
+ <property>
+ <name>project.version</name>
+ <value>${project.version}</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+
+ </build>
+ </profile>
+
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-downloads/rhq-plugins</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${rhq.deploymentDir}" />
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}" update="true" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.outputDirectory}">
+ <patternset>
+ <include name="META-INF/**" />
+ </patternset>
+ </unjar>
+ <jar destfile="${deployment.file}" manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF"
+ update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+</project>
diff --git a/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java
new file mode 100644
index 0000000..f523be1
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java
@@ -0,0 +1,136 @@
+/*
+ * 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.plugins.ant;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.bundle.ant.AntLauncher;
+import org.rhq.bundle.ant.BundleAntProject;
+import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.bundle.BundleDeployRequest;
+import org.rhq.core.pluginapi.bundle.BundleDeployResult;
+import org.rhq.core.pluginapi.bundle.BundleFacet;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.system.SystemInfoFactory;
+import org.rhq.core.util.stream.StreamUtil;
+
+/**
+ * @author John Mazzitelli
+ */
+@SuppressWarnings("unchecked")
+public class AntBundlePluginComponent implements ResourceComponent, BundleFacet {
+
+ private final Log log = LogFactory.getLog(AntBundlePluginComponent.class);
+
+ private ResourceContext resourceContext;
+
+ private File tmpDirectory;
+
+ public void start(ResourceContext context) throws Exception {
+ resourceContext = context;
+ this.tmpDirectory = new File(context.getTemporaryDirectory(), "ant-bundle-plugin");
+ this.tmpDirectory.mkdirs();
+ if (!this.tmpDirectory.exists() || !this.tmpDirectory.isDirectory()) {
+ throw new Exception("Failed to create tmp dir [" + this.tmpDirectory + "] - cannot process ant bundles");
+ }
+ }
+
+ public void stop() {
+ }
+
+ public AvailabilityType getAvailability() {
+ return AvailabilityType.UP;
+ }
+
+ public BundleDeployResult deployBundle(BundleDeployRequest request) {
+ BundleDeployResult result = new BundleDeployResult();
+ try {
+ BundleDeployDefinition bundleDeployDef = request.getBundleDeployDefinition();
+ BundleVersion bundleVersion = bundleDeployDef.getBundleVersion();
+
+ String recipe = bundleVersion.getRecipe();
+ File recipeFile = File.createTempFile("ant-bundle-recipe", ".xml", request.getBundleFilesLocation());
+ File logFile = File.createTempFile("ant-bundle-recipe", ".log", this.tmpDirectory);
+ try {
+ // store the recipe in the tmp recipe file
+ ByteArrayInputStream in = new ByteArrayInputStream(recipe.getBytes());
+ FileOutputStream out = new FileOutputStream(recipeFile);
+ StreamUtil.copy(in, out);
+
+ // get the bundle's configuration values and the global system facts and
+ // add them as ant properties so the ant script can get their values
+ Configuration config = bundleDeployDef.getConfiguration();
+ Map<String, String> sysFacts = SystemInfoFactory.fetchTemplateEngine().getTokens();
+ Properties antProps = new Properties();
+ for (Map.Entry<String, String> fact : sysFacts.entrySet()) {
+ antProps.setProperty(fact.getKey(), fact.getValue());
+ }
+ if (config != null) {
+ Map<String, Property> allProperties = config.getAllProperties();
+ for (Map.Entry<String, Property> entry : allProperties.entrySet()) {
+ String name = entry.getKey();
+ Property prop = entry.getValue();
+ String value;
+ if (prop instanceof PropertySimple) {
+ value = ((PropertySimple) prop).getStringValue();
+ } else {
+ // for now, just skip all property lists and maps, just assume we are getting simples
+ continue;
+ }
+ antProps.setProperty(name, value);
+ }
+ }
+
+ // parse & execute, the ant script
+ AntLauncher antLauncher = new AntLauncher();
+ BundleAntProject project = antLauncher.startAnt(recipeFile, null, null, antProps, logFile, false, true);
+ } catch (Throwable t) {
+ if (log.isDebugEnabled()) {
+ try {
+ log.debug(new String(StreamUtil.slurp(new FileInputStream(logFile))));
+ } catch (Exception e) {
+ }
+ }
+ throw new Exception("Failed to parse the bundle ANT script", t);
+ } finally {
+ recipeFile.delete();
+ logFile.delete();
+ }
+
+ } catch (Throwable t) {
+ log.error("Failed to deploy bundle [" + request + "]", t);
+ result.setErrorMessage(t);
+ }
+ return result;
+ }
+}
diff --git a/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java
new file mode 100644
index 0000000..50a2f86
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java
@@ -0,0 +1,51 @@
+/*
+ * 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.plugins.ant;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+/**
+ * @author John Mazzitelli
+ */
+@SuppressWarnings("unchecked")
+public class AntBundlePluginDiscoveryComponent implements ResourceDiscoveryComponent {
+ //private final Log log = LogFactory.getLog(FileTemplateBundlePluginDiscoveryComponent.class);
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext context) {
+
+ HashSet<DiscoveredResourceDetails> set = new HashSet<DiscoveredResourceDetails>();
+
+ String key = "ant-bundle";
+ String name = "Ant Bundle Handler";
+ String version = this.getClass().getPackage().getImplementationVersion();
+ String description = "Processes bundles whose recipes are Ant scripts";
+
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(context.getResourceType(), key, name,
+ version, description, null, null);
+
+ set.add(resource);
+
+ return set;
+ }
+}
\ No newline at end of file
diff --git a/modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml
new file mode 100644
index 0000000..ce2b150
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<plugin name="AntBundlePlugin"
+ displayName="Ant Bundle Plugin"
+ package="org.rhq.plugins.ant"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+
+ <server name="Ant Bundle Handler Server"
+ discovery="AntBundlePluginDiscoveryComponent"
+ class="AntBundlePluginComponent"
+ singleton="true"
+ description="This plugin is used to process Ant bundles">
+
+ <bundle type="Ant Bundle" />
+
+ </server>
+</plugin>
diff --git a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
new file mode 100644
index 0000000..4f2f28b
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.plugins.ant;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.bundle.BundleDeployRequest;
+import org.rhq.core.pluginapi.bundle.BundleDeployResult;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.system.SystemInfoFactory;
+import org.rhq.core.util.stream.StreamUtil;
+
+@Test
+public class AntBundlePluginComponentTest {
+
+ private AntBundlePluginComponent plugin;
+ private File tmpDir;
+
+ @BeforeMethod
+ public void beforeMethod() throws Exception {
+ tmpDir = new File("target/antbundletest");
+ tmpDir.mkdirs();
+ plugin = new AntBundlePluginComponent();
+ ResourceType type = new ResourceType("antBundleTestType", "antBundleTestPlugin", ResourceCategory.SERVER, null);
+ Resource resource = new Resource("antBundleTestKey", "antBundleTestName", type);
+ ResourceContext<?> context = new ResourceContext(resource, null, null,
+ SystemInfoFactory.createJavaSystemInfo(), tmpDir, null, "antBundleTestPC", null, null, null, null, null);
+ plugin.start(context);
+ }
+
+ @BeforeClass
+ @AfterMethod
+ public void cleanTmpDir() {
+ if (tmpDir != null) {
+ File[] files = tmpDir.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ file.delete();
+ }
+ }
+ }
+ }
+
+ public void testSimpleBundle() throws Exception {
+ ResourceType resourceType = new ResourceType("testSimpleBundle", "plugin", ResourceCategory.SERVER, null);
+ BundleType bundleType = new BundleType("testSimpleBundle", resourceType);
+ Bundle bundle = new Bundle("testSimpleBundle", bundleType);
+ BundleVersion bundleVersion = new BundleVersion("testSimpleBundle", "1.0", bundle,
+ getRecipeFromFile("simple-build.xml"));
+
+ BundleDeployDefinition deployDef = new BundleDeployDefinition();
+ deployDef.setBundleVersion(bundleVersion);
+ deployDef.setConfiguration(null);
+
+ BundleDeployRequest request = new BundleDeployRequest();
+ request.setBundleFilesLocation(tmpDir);
+ request.setBundleDeployDefinition(deployDef);
+
+ BundleDeployResult results = plugin.deployBundle(request);
+
+ assertResultsSuccess(results);
+
+ // our ant script wrote some output that we should verify to make sure we ran it
+ File outputFile = new File(tmpDir, "output.1");
+ String output = new String(StreamUtil.slurp(new FileInputStream(outputFile)));
+ assert output.equals("HELLO WORLD") : output;
+
+ }
+
+ public void testAntBundle() throws Exception {
+ ResourceType resourceType = new ResourceType("testSimpleBundle", "plugin", ResourceCategory.SERVER, null);
+ BundleType bundleType = new BundleType("testSimpleBundle", resourceType);
+ Bundle bundle = new Bundle("testSimpleBundle", bundleType);
+ BundleVersion bundleVersion = new BundleVersion("testSimpleBundle", "1.0", bundle,
+ getRecipeFromFile("test-build.xml"));
+
+ Configuration config = new Configuration();
+ config.put(new PropertySimple("custom.prop1", "custom property 1"));
+ config.put(new PropertySimple("custom.prop2", "custom property 2"));
+
+ BundleDeployDefinition deployDef = new BundleDeployDefinition();
+ deployDef.setBundleVersion(bundleVersion);
+ deployDef.setConfiguration(config);
+
+ File file1 = new File(tmpDir, "file.txt");
+ File file2 = new File(tmpDir, "package.zip");
+ assert file1.createNewFile() : "could not create our mock bundle file";
+ assert file2.createNewFile() : "could not create our mock bundle file";
+
+ BundleDeployRequest request = new BundleDeployRequest();
+ request.setBundleFilesLocation(tmpDir);
+ request.setBundleDeployDefinition(deployDef);
+
+ BundleDeployResult results = plugin.deployBundle(request);
+
+ assertResultsSuccess(results);
+
+ // our ant script wrote some output that we should verify to make sure we ran it
+ File outputFile = new File(tmpDir, "output.2");
+ Properties props = new Properties();
+ props.load(new FileInputStream(outputFile));
+ assert props.getProperty("prop1").equals("custom property 1") : props;
+ assert props.getProperty("prop2").equals("custom property 2") : props;
+ assert props.getProperty("f.exists").equals("true") : props;
+ assert props.getProperty("pkg.exists").equals("true") : props;
+ assert props.getProperty("hostname").equals(SystemInfoFactory.createSystemInfo().getHostname()) : props;
+ assert props.getProperty("tmpdir").equals(System.getProperty("java.io.tmpdir")) : props;
+ }
+
+ private void assertResultsSuccess(BundleDeployResult results) {
+ if (results.getErrorMessage() != null) {
+ assert false : "Failed to process bundle: [" + results.getErrorMessage() + "]";
+ }
+ }
+
+ private String getRecipeFromFile(String filename) {
+ InputStream stream = getClass().getClassLoader().getResourceAsStream(filename);
+ byte[] contents = StreamUtil.slurp(stream);
+ return new String(contents);
+ }
+}
diff --git a/modules/plugins/ant-bundle/src/test/resources/log4j.xml b/modules/plugins/ant-bundle/src/test/resources/log4j.xml
new file mode 100644
index 0000000..181834e
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/resources/log4j.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- tests configuration that only dumps WARN or higher messages due to appender threadhold -->
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+
+ <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+ <param name="Threshold" value="ERROR"/>
+ <param name="Target" value="System.out"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] (%c{5}) - %m%n"/>
+ </layout>
+ </appender>
+
+ <appender name="FILE" class="org.apache.log4j.FileAppender">
+ <param name="File" value="target/test.log"/>
+ <param name="Threshold" value="DEBUG"/>
+ <param name="Append" value="false"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} (%F:%M:%L) -%m%n"/>
+ </layout>
+ </appender>
+
+ <category name="org.rhq">
+ <priority value="DEBUG"/>
+ </category>
+
+ <root>
+ <appender-ref ref="CONSOLE"/>
+ <appender-ref ref="FILE"/>
+ </root>
+
+</log4j:configuration>
diff --git a/modules/plugins/ant-bundle/src/test/resources/simple-build.xml b/modules/plugins/ant-bundle/src/test/resources/simple-build.xml
new file mode 100644
index 0000000..c1606dc
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/resources/simple-build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<project name="test" default="init">
+ <property name="outfile" value="${basedir}/output.1" />
+
+ <target name="init">
+ <echo file="${outfile}" message="HELLO WORLD"/>
+ </target>
+</project>
\ No newline at end of file
diff --git a/modules/plugins/ant-bundle/src/test/resources/test-build.xml b/modules/plugins/ant-bundle/src/test/resources/test-build.xml
new file mode 100644
index 0000000..4b0b778
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/resources/test-build.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<project name="simple-build" default="first-target">
+ <property id="_bundlefile.1" name="f" location="file.txt" />
+ <property id="_bundleconfig.1" name="custom.prop1" location="1" />
+
+ <property name="outfile" value="${basedir}/output.2" />
+
+ <target name="first-target">
+ <property id="_bundlefile.2" name="pkg" value="${basedir}/package.zip" />
+ <property id="_bundleconfig.2" name="custom.prop2" value="2" />
+
+ <condition property="file.f.exists">
+ <available file="${f}" />
+ </condition>
+ <condition property="file.pkg.exists">
+ <available file="${pkg}" />
+ </condition>
+
+ <echo file="${outfile}">prop1=${custom.prop1}
+prop2=${custom.prop2}
+f.exists=${file.f.exists}
+pkg.exists=${file.pkg.exists}
+hostname=${rhq.system.hostname}
+tmpdir=${rhq.system.sysprop.java.io.tmpdir}
+ </echo>
+ </target>
+</project>
\ No newline at end of file
diff --git a/modules/plugins/pom.xml b/modules/plugins/pom.xml
index d41b7b1..76ee0ee 100644
--- a/modules/plugins/pom.xml
+++ b/modules/plugins/pom.xml
@@ -162,6 +162,7 @@
<!-- bundle plugins -->
<module>filetemplate-bundle</module>
+ <module>ant-bundle</module>
</modules>
</profile>
diff --git a/modules/plugins/validate-all-plugins/pom.xml b/modules/plugins/validate-all-plugins/pom.xml
index 01e2a34..b3d5e87 100644
--- a/modules/plugins/validate-all-plugins/pom.xml
+++ b/modules/plugins/validate-all-plugins/pom.xml
@@ -62,6 +62,7 @@
<pathelement location="../virt/target/rhq-virt-plugin-${project.version}.jar" />
<pathelement location="../kickstart/target/rhq-kickstart-plugin-${project.version}.jar" />
<pathelement location="../filetemplate-bundle/target/rhq-filetemplate-bundle-plugin-${project.version}.jar" />
+ <pathelement location="../ant-bundle/target/rhq-ant-bundle-plugin-${project.version}.jar" />
</classpath>
<sysproperty key="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.SimpleLog" />
<!--
commit d4e2842142ab368dee94fdee322f8168837956aa
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:29:04 2010 -0400
force the filetemplate plugin to use its own gnu getopt just to isolate it from the servers's version (this probably isn't that important to do)
diff --git a/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml b/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml
index 4a3536e..44cdb03 100644
--- a/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml
+++ b/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml
@@ -101,6 +101,12 @@
<version>${project.version}</version>
</artifactItem>
+ <artifactItem>
+ <groupId>gnu-getopt</groupId>
+ <artifactId>getopt</artifactId>
+ <!-- NOTE: The version is defined in the root POM's dependencyManagement section. -->
+ </artifactItem>
+
</artifactItems>
<outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
</configuration>
commit 5f33867f613ccc768ef2e30efb9ffc722d6b77fa
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:27:49 2010 -0400
allow public API to obtain tokens from the template engine
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index d748463..79ad1ff 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -37,6 +37,10 @@ public class TemplateEngine implements Serializable {
this.tokens = tokens;
}
+ public Map<String, String> getTokens() {
+ return this.tokens;
+ }
+
public String replaceTokens(String input) {
StringBuffer buffer = new StringBuffer();
Matcher matcher = tokenPattern.matcher(input);
commit 0c03d1eb6b3b03cabe58a17dbb98bd43307ca127
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:27:11 2010 -0400
make the parse call directly in the bundle PC so we can set context CL
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 7b41da0..61715df 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -79,7 +79,6 @@ import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
-import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.enterprise.server.util.HibernateDetachUtility;
@@ -248,12 +247,11 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// parse the recipe (validation occurs here) and get the config def and list of files
BundleType bundleType = bundle.getBundleType();
- BundleServerPluginFacet bp = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
- .getBundleServerPluginFacet(bundleType.getName());
RecipeParseResults results;
try {
- results = bp.parseRecipe(recipe);
+ results = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager().parseRecipe(
+ bundleType.getName(), recipe);
} catch (Exception e) {
// ensure that we throw a runtime exception to force a rollback
throw new RuntimeException("Failed to parse recipe", e);
@@ -574,9 +572,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// parse the recipe (validation occurs here) and get the config def and list of files
BundleType bundleType = bundleVersion.getBundle().getBundleType();
- BundleServerPluginFacet bp = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
- .getBundleServerPluginFacet(bundleType.getName());
- RecipeParseResults parseResults = bp.parseRecipe(bundleVersion.getRecipe());
+ RecipeParseResults parseResults = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
+ .parseRecipe(bundleType.getName(), bundleVersion.getRecipe());
Set<String> result = parseResults.getBundleFileNames();
@@ -613,9 +610,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// parse the recipe (validation occurs here) and get the config def and list of files
BundleType bundleType = bundleVersion.getBundle().getBundleType();
- BundleServerPluginFacet bp = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
- .getBundleServerPluginFacet(bundleType.getName());
- RecipeParseResults parseResults = bp.parseRecipe(bundleVersion.getRecipe());
+ RecipeParseResults parseResults = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
+ .parseRecipe(bundleType.getName(), bundleVersion.getRecipe());
Set<String> filenames = parseResults.getBundleFileNames();
Map<String, Boolean> result = new HashMap<String, Boolean>(filenames.size());
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java
index 68f8a0f..7387f3a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.plugin.pc.bundle;
+import org.rhq.enterprise.server.bundle.RecipeParseResults;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
@@ -68,28 +69,51 @@ public class BundleServerPluginManager extends ServerPluginManager {
}
/**
- * Given the {@link BundleType#getName() name of a bundle type}, this will return the stateful plugin component
- * that manages bundles of that type.
+ * Given the {@link BundleType#getName() name of a bundle type}, this will parse the given recipe by asking the
+ * bundle plugin that can parse a recipe of that bundle type.
*
- * @param bundleTypeName
+ * @param bundleTypeName essentially identifies the kind of recipe that is to be parsed
+ * @param recipe the recipe to parse
*
- * @return the plugin component object that will manage bundles of the named bundle type; <code>null</code> if there is no plugin
- * that can support the given bundle type
+ * @return the results of the parse
+ *
+ * @throws Exception if the recipe could not be parsed successfully
*/
- public BundleServerPluginFacet getBundleServerPluginFacet(String bundleTypeName) {
+ public RecipeParseResults parseRecipe(String bundleTypeName, String recipe) throws Exception {
+
if (bundleTypeName == null) {
throw new IllegalArgumentException("bundleTypeName == null");
}
+ if (recipe == null) {
+ throw new IllegalArgumentException("recipe == null");
+ }
+ // find the plugin environment for the bundle plugin of the given type
+ ServerPluginEnvironment pluginEnv = null;
for (ServerPluginEnvironment env : getPluginEnvironments()) {
BundlePluginDescriptorType descriptor = (BundlePluginDescriptorType) env.getPluginDescriptor();
if (bundleTypeName.equals(descriptor.getBundle().getType())) {
- ServerPluginComponent component = getServerPluginComponent(env.getPluginKey().getPluginName());
- // we know this cast will work because our loadPlugin ensured that this component implements this interface
- return (BundleServerPluginFacet) component;
+ pluginEnv = env;
+ break;
}
}
- return null;
+ if (pluginEnv == null) {
+ throw new IllegalArgumentException("Bundle type [" + bundleTypeName + "] is not known to the system");
+ }
+
+ // get the facet and call the parse method in the appropriate classloader
+ String pluginName = pluginEnv.getPluginKey().getPluginName();
+ ServerPluginComponent component = getServerPluginComponent(pluginName);
+ BundleServerPluginFacet facet = (BundleServerPluginFacet) component; // we know this cast will work because our loadPlugin ensured so
+ getLog().debug("Bundle server plugin [" + pluginName + "] is parsing a bundle recipe");
+ ClassLoader originalContextClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(pluginEnv.getPluginClassLoader());
+ RecipeParseResults results = facet.parseRecipe(recipe);
+ return results;
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalContextClassLoader);
+ }
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
index 90aab2f..20fa204 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
@@ -187,9 +187,8 @@ public class TestBundleServerPluginService extends ServerPluginService implement
}
@Override
- public BundleServerPluginFacet getBundleServerPluginFacet(String bundleTypeName) {
-
- return new TestBundlePluginComponent();
+ public RecipeParseResults parseRecipe(String bundleTypeName, String recipe) throws Exception {
+ return new TestBundlePluginComponent().parseRecipe(recipe);
}
}
14 years, 1 month
[rhq] Branch 'gwt' - 8 commits - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml | 2
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 25 ++-
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java | 24 ++
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java | 24 ++
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java | 48 +++++
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java | 14 -
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java | 47 -----
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java | 51 +++---
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java | 20 ++
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java | 9 -
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java | 1
modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js | 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 21 +-
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 81 ++++------
15 files changed, 236 insertions(+), 147 deletions(-)
New commits:
commit ae88c7ce59839f71a1f5a58d713671c2d0aef03d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 19:54:52 2010 -0400
see if setting an initial value fixes the single-value drop down issue.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
index 52f7c5b..700104f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
@@ -136,6 +136,7 @@ public class SelectBundleVersionStep implements WizardStep {
radioGroupItem.redraw();
selectVersionItem.setValueMap(selectVersionValues);
+ selectVersionItem.setValue(latestVersion.getVersion());
selectVersionItem.redraw();
form.markForRedraw();
commit 4575847ce04b52cfc2f1b5fe47a1fe0b562a600b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 19:36:32 2010 -0400
re-enable single deployment test
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
index 34986f1..bf1c901 100644
--- a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -26,7 +26,7 @@
* said platform.
*/
-var TestsEnabled = false;
+var TestsEnabled = true;
var bundleName = 'testScriptBundle';
@@ -83,9 +83,9 @@ function testDeployment() {
}
function testGroupDeployment() {
-// if ( !TestsEnabled ) {
-// return;
-// }
+ if ( !TestsEnabled ) {
+ return;
+ }
// delete the test bundle if it exists
cleanupTestBundle();
commit 25ca25ee29ce5c69678be92d60c72f2da6100e4c
Merge: 5ee5728... a13969c...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 15:56:19 2010 -0400
Merge branch 'gwt' into gwt-jay
commit 5ee572891e50172aeeee1619ea15814d1bea61e1
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 15:54:32 2010 -0400
Domain Model Change and Refactor
Change from a single PackageType for a BundleType to a PackageType per
Bundle.
The former approach originally worked with the idea that
Package.classification set to bundleName could be used to distinguish
between BundleFile packages with the same name but contained in different
bundles. But the fact that classification was never designed to
be used as part of the natural key for a package would have forced a large
refactor potentially conflicting with the current use of classification.
The alternatives were to add a Package.subType to package and make it part
of the natural key. This would have been specific to the needs of bundling
and again added changes to the underlying content domain model. Instead
it was deemed reasonable to have a devoted PackageType per Bundle. This
model does create a potentially large number of packageTypes
(one per bundle) on the BundleType's ResourceType. But it's not clear that
creates any problem. It has the advantage of leveraging the Package
design without introducing any more complexity. Also, Bundle deletion now
can cause cascade removals of the packages for its package type.
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
index 005bafb..90a71a7 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -501,6 +501,7 @@
<column name="DESCRIPTION" size="500" type="VARCHAR2" required="false"/>
<column name="BUNDLE_TYPE_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_TYPE"/>
<column name="REPO_ID" type="INTEGER" required="true" references="RHQ_REPO"/>
+ <column name="PACKAGE_TYPE_ID" type="INTEGER" required="true" references="RHQ_PACKAGE_TYPE"/>
<!-- This index is for constraint, not performance -->
<index name="RHQ_BUNDLE_UNIQUE" unique="true">
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 326f3ba..2bb52d7 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -2852,6 +2852,7 @@
<schemaSpec version="2.78.1">
<schema-addColumn table="RHQ_BUNDLE" column="REPO_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_BUNDLE" column="REPO_ID" nullable="FALSE" />
<schema-directSQL>
<statement desc="Creating RHQ_BUNDLE foreign key relation to RHQ_REPO">
ALTER TABLE RHQ_BUNDLE
@@ -2922,13 +2923,13 @@
<schema-directSQL>
<statement desc="Creating RHQ_BUNDLE_GROUP_DEPLOY foreign key relation to RHQ_RESOURCE_GROUP">
ALTER TABLE RHQ_BUNDLE_GROUP_DEPLOY
- ADD CONSTRAINT RHQ_RESOURCE_GROUP_FK
+ ADD CONSTRAINT RHQ_RESOURCE_GROUP_ID_FK
FOREIGN KEY (GROUP_ID)
REFERENCES RHQ_RESOURCE_GROUP (ID)
</statement>
<statement desc="Creating RHQ_BUNDLE_GROUP_DEPLOY foreign key relation to RHQ_BUNDLE_DEPLOY_DEF">
ALTER TABLE RHQ_BUNDLE_GROUP_DEPLOY
- ADD CONSTRAINT RHQ_BUNDLE_DEPLOY_DEF_FK
+ ADD CONSTRAINT RHQ_BUNDLE_DEPLOY_DEF_ID_FK
FOREIGN KEY (BUNDLE_DEPLOY_DEF_ID)
REFERENCES RHQ_BUNDLE_DEPLOY_DEF (ID)
</statement>
@@ -2938,7 +2939,7 @@
<schema-directSQL>
<statement desc="Creating RHQ_BUNDLE_DEPLOY foreign key relation to RHQ_BUNDLE_GROUP_DEPLOY">
ALTER TABLE RHQ_BUNDLE_DEPLOY
- ADD CONSTRAINT RHQ_BUNDLE_GROUP_DEPLOY_FK
+ ADD CONSTRAINT RHQ_BUNDLE_GROUP_DEPLOY_ID_FK
FOREIGN KEY (BUNDLE_GROUP_DEPLOY_ID)
REFERENCES RHQ_BUNDLE_GROUP_DEPLOY (ID)
</statement>
@@ -2950,6 +2951,19 @@
<schema-alterColumn table="RHQ_BUNDLE_DEPLOY" column="STATUS" nullable="FALSE" />
</schemaSpec>
+ <schemaSpec version="2.78.7">
+ <schema-addColumn table="RHQ_BUNDLE" column="PACKAGE_TYPE_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_BUNDLE" column="PACKAGE_TYPE_ID" nullable="FALSE" />
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE foreign key relation to RHQ_PACKAGE_TYPE">
+ ALTER TABLE RHQ_BUNDLE
+ ADD CONSTRAINT RHQ_PACKAGE_TYPE_ID_FK
+ FOREIGN KEY (PACKAGE_TYPE_ID)
+ REFERENCES RHQ_PACKAGE_TYPE (ID)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
<schemaSpec version="2.79">
<schema-directSQL>
<statement desc="Normalizing resource group descriptions">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
index 1573d6d..261a54e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
@@ -44,6 +44,7 @@ import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
+import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.Repo;
/**
@@ -89,6 +90,10 @@ public class Bundle implements Serializable {
@OneToOne(fetch = FetchType.LAZY, optional = false)
private Repo repo;
+ @JoinColumn(name = "PACKAGE_TYPE_ID", referencedColumnName = "ID", nullable = false)
+ @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
+ private PackageType packageType;
+
@OneToMany(mappedBy = "bundle", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<BundleVersion> bundleVersions = new ArrayList<BundleVersion>();
@@ -138,6 +143,14 @@ public class Bundle implements Serializable {
this.bundleType = bundleType;
}
+ public PackageType getPackageType() {
+ return packageType;
+ }
+
+ public void setPackageType(PackageType packageType) {
+ this.packageType = packageType;
+ }
+
public Repo getRepo() {
return repo;
}
@@ -161,7 +174,7 @@ public class Bundle implements Serializable {
@Override
public String toString() {
- return "Bundle[id=" + id + ",name=" + name + ",bundleType=" + bundleType + "]";
+ return "Bundle[id=" + id + ",name=" + name + ",bundleType=" + bundleType + ",packageType=" + packageType + "]";
}
@Override
@@ -169,6 +182,7 @@ public class Bundle implements Serializable {
final int prime = 31;
int result = 1;
result = (prime * result) + ((name == null) ? 0 : name.hashCode());
+ result = (prime * result) + ((bundleType == null) ? 0 : bundleType.hashCode());
return result;
}
@@ -192,6 +206,14 @@ public class Bundle implements Serializable {
return false;
}
+ if (bundleType == null) {
+ if (other.bundleType != null) {
+ return false;
+ }
+ } else if (!bundleType.equals(other.bundleType)) {
+ return false;
+ }
+
return true;
}
}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java
index 9a7bce8..2b7017f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java
@@ -1,25 +1,25 @@
- /*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.core.domain.content;
/**
@@ -53,7 +53,12 @@ public enum PackageCategory {
/**
* A log file
*/
- LOG("Log");
+ LOG("Log"),
+
+ /**
+ * A bundle file, deployable as part of a bundle deploy.
+ */
+ BUNDLE("Bundle");
// Attributes --------------------------------------------
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
index a6b2292..9495b80 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
@@ -36,11 +36,14 @@ public class BundleCriteria extends Criteria {
private Integer filterId;
private Integer filterBundleTypeId; // needs override
- private String filterBundleTypeName; // needs override
+ private String filterBundleTypeName; // needs override
private String filterDescription;
private String filterName;
+ private Integer filterPackageTypeId; // needs override
+ private String filterPackageTypeName; // needs override
private boolean fetchBundleVersions;
+ private boolean fetchPackageType;
private boolean fetchRepo;
private PageOrdering sortName;
@@ -49,6 +52,9 @@ public class BundleCriteria extends Criteria {
public BundleCriteria() {
filterOverrides.put("bundleTypeId", "bundleType.id = ?");
filterOverrides.put("bundleTypeName", "bundleType.name like ?");
+ filterOverrides.put("packageTypeId", "packageType.id = ?");
+ filterOverrides.put("packageTypeName", "packageType.name like ?");
+
}
@Override
@@ -76,10 +82,22 @@ public class BundleCriteria extends Criteria {
this.filterName = filterName;
}
+ public void addFilterPackageTypeId(Integer filterPackageTypeId) {
+ this.filterPackageTypeId = filterPackageTypeId;
+ }
+
+ public void addFilterPackageTypeName(String filterPackageTypeName) {
+ this.filterPackageTypeName = filterPackageTypeName;
+ }
+
public void fetchBundleVersions(boolean fetchBundleVersions) {
this.fetchBundleVersions = fetchBundleVersions;
}
+ public void fetchPackageType(boolean fetchPackageType) {
+ this.fetchPackageType = fetchPackageType;
+ }
+
public void fetchRepo(boolean fetchRepo) {
this.fetchRepo = fetchRepo;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
index 54b4930..96a8594 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
@@ -23,8 +23,6 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
-import org.rhq.core.domain.bundle.BundleDeployDefinition;
-
/**
* @author Jay Shaughnessy
*/
@@ -42,12 +40,13 @@ public class BundleDeployDefinitionCriteria extends Criteria {
private boolean fetchBundleVersion;
private boolean fetchConfiguration;
private boolean fetchDeployments;
+ private boolean fetchGroupDeployments;
public BundleDeployDefinitionCriteria() {
}
@Override
- public Class getPersistentClass() {
+ public Class<?> getPersistentClass() {
return BundleDeployDefinitionCriteria.class;
}
@@ -79,4 +78,8 @@ public class BundleDeployDefinitionCriteria extends Criteria {
this.fetchDeployments = fetchDeployments;
}
+ public void fetchGroupDeployments(boolean fetchGroupDeployments) {
+ this.fetchGroupDeployments = fetchGroupDeployments;
+ }
+
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
index 47f500c..7db3060 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
@@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
/**
* @author Jay Shaughnessy
@@ -38,6 +39,7 @@ public class BundleDeploymentCriteria extends Criteria {
private String filterBundleDeployDefinitionName; // requires override
private Integer filterResourceId; // requires override
private String filterResourceName; // requires override
+ private BundleDeploymentStatus filterStatus;
private boolean fetchBundleDeployDefinition;
private boolean fetchResource;
@@ -51,7 +53,7 @@ public class BundleDeploymentCriteria extends Criteria {
}
@Override
- public Class getPersistentClass() {
+ public Class<?> getPersistentClass() {
return BundleDeployment.class;
}
@@ -75,6 +77,10 @@ public class BundleDeploymentCriteria extends Criteria {
this.filterResourceName = filterResourceName;
}
+ public void addFilterStatus(BundleDeploymentStatus filterStatus) {
+ this.filterStatus = filterStatus;
+ }
+
public void fetchBundleDeployDefinition(boolean fetchBundleDeployDefinition) {
this.fetchBundleDeployDefinition = fetchBundleDeployDefinition;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 7b41da0..05c8fb6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -58,6 +58,7 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.Package;
+import org.rhq.core.domain.content.PackageCategory;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
@@ -143,7 +144,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
Bundle bundle = new Bundle(name, bundleType);
bundle.setDescription(description);
- // create and add the required Repo. the Repo is a detached object ehich helps in its eventual
+ // create and add the required Repo. the Repo is a detached object which helps in its eventual
// removal.
Repo repo = new Repo(name);
repo.setCandidate(false);
@@ -151,6 +152,13 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
repo = repoManager.createRepo(subject, repo);
bundle.setRepo(repo);
+ // add the required PackageType. the PackageType is an attached object which helps in cascade removal
+ // of packages in the bundle's repo.
+ ResourceType resourceType = entityManager.find(ResourceType.class, bundleType.getResourceType().getId());
+ PackageType packageType = new PackageType(name, resourceType);
+ packageType.setCategory(PackageCategory.BUNDLE);
+ bundle.setPackageType(packageType);
+
log.info("Creating bundle: " + bundle);
entityManager.persist(bundle);
@@ -349,7 +357,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// Create the PackageVersion the BundleFile is tied to. This implicitly creates the
// Package for the PackageVersion.
Bundle bundle = bundleVersion.getBundle();
- PackageType packageType = getBundleTypePackageType(bundle.getBundleType());
+ PackageType packageType = bundle.getPackageType();
architecture = (null == architecture) ? contentManager.getNoArchitecture() : architecture;
if (architecture.getId() == 0) {
Query q = entityManager.createNamedQuery(Architecture.QUERY_FIND_BY_NAME);
@@ -424,15 +432,6 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return bundleFile;
}
- private PackageType getBundleTypePackageType(BundleType bundleType) {
-
- Query packageTypeQuery = entityManager.createNamedQuery(PackageType.QUERY_FIND_BY_RESOURCE_TYPE_ID_AND_NAME);
- packageTypeQuery.setParameter("typeId", bundleType.getResourceType().getId());
- packageTypeQuery.setParameter("name", bundleType.getName());
-
- return (PackageType) packageTypeQuery.getSingleResult();
- }
-
public BundleDeployment scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
throws Exception {
BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index a98d66e..427714b 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -134,13 +134,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
// clean up any tests that don't already clean up after themselves
- q = em.createQuery("SELECT bdh FROM BundleDeploymentHistory bdh ");//WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
- doomed = q.getResultList();
- for (Object removeMe : doomed) {
- em.remove(em.getReference(BundleDeploymentHistory.class, ((BundleDeploymentHistory) removeMe).getId()));
- }
-
- // remove bundleversions which cascade remove bundlefiles and bundledeploydefs
+ // remove bundleversions which cascade remove bundlefiles and bundledeploydefs
+ // bundledeploydefs cascade remove bundledeployments and bundlegroupdeployments
+ // bundledeployments cascade remove bundledeploymenthistory
q = em.createQuery("SELECT bv FROM BundleVersion bv WHERE bv.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
@@ -153,12 +149,11 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleFile.class, ((BundleFile) removeMe).getId()));
}
- // remove any orphaned bgds
- q = em.createQuery("SELECT bgd FROM BundleGroupDeployment bgd WHERE bgd.bundleDeployDefinition.name LIKE '"
- + TEST_PREFIX + "%'");
+ // remove any orphaned deployment history
+ q = em.createQuery("SELECT bdh FROM BundleDeploymentHistory bdh ");//WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
- em.remove(em.getReference(BundleGroupDeployment.class, ((BundleGroupDeployment) removeMe).getId()));
+ em.remove(em.getReference(BundleDeploymentHistory.class, ((BundleDeploymentHistory) removeMe).getId()));
}
// remove any orphaned bds
q = em.createQuery("SELECT bd FROM BundleDeployment bd WHERE bd.bundleDeployDefinition.name LIKE '"
@@ -167,17 +162,27 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleDeployment.class, ((BundleDeployment) removeMe).getId()));
}
+ // remove any orphaned bgds
+ q = em.createQuery("SELECT bgd FROM BundleGroupDeployment bgd WHERE bgd.bundleDeployDefinition.name LIKE '"
+ + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(BundleGroupDeployment.class, ((BundleGroupDeployment) removeMe).getId()));
+ }
// remove any orphaned bdds
q = em.createQuery("SELECT bdd FROM BundleDeployDefinition bdd WHERE bdd.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleDeployDefinition.class, ((BundleDeployDefinition) removeMe).getId()));
}
- // remove packages which cascade remove packageversions
- q = em.createQuery("SELECT p FROM Package p WHERE p.name LIKE '" + TEST_PREFIX + "%'");
+
+ // remove bundles which cascade remove repos and packageTypes
+ // packagetypes cascade remove packages
+ // package cascade remove packageversions
+ q = em.createQuery("SELECT b FROM Bundle b WHERE b.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
- em.remove(em.getReference(Package.class, ((Package) removeMe).getId()));
+ em.remove(em.getReference(Bundle.class, ((Bundle) removeMe).getId()));
}
em.flush();
// remove any orphaned pvs
@@ -187,20 +192,26 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(PackageVersion.class, ((PackageVersion) removeMe).getId()));
}
- // remove bundles which cascade remove repos
- q = em.createQuery("SELECT b FROM Bundle b WHERE b.name LIKE '" + TEST_PREFIX + "%'");
+ // remove any oprphaned packages
+ q = em.createQuery("SELECT p FROM Package p WHERE p.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
- em.remove(em.getReference(Bundle.class, ((Bundle) removeMe).getId()));
+ em.remove(em.getReference(Package.class, ((Package) removeMe).getId()));
+ }
+ // remove any orphaned packagetypes
+ q = em.createQuery("SELECT pt FROM PackageType pt WHERE pt.name LIKE '" + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(PackageType.class, ((PackageType) removeMe).getId()));
}
- em.flush();
// remove any orphaned repos
q = em.createQuery("SELECT r FROM Repo r WHERE r.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
em.remove(em.getReference(Repo.class, ((Repo) removeMe).getId()));
}
- // remove ResourceTypes which cascade remove BundleTypes and PackageTypes
+
+ // remove ResourceTypes which cascade remove BundleTypes
q = em.createQuery("SELECT rt FROM ResourceType rt WHERE rt.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
@@ -213,12 +224,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleType.class, ((BundleType) removeMe).getId()));
}
- // remove any orphaned packagetypes
- q = em.createQuery("SELECT pt FROM PackageType pt WHERE pt.name LIKE '" + TEST_PREFIX + "%'");
- doomed = q.getResultList();
- for (Object removeMe : doomed) {
- em.remove(em.getReference(PackageType.class, ((PackageType) removeMe).getId()));
- }
+
// remove Agents left over from test resources
q = em.createQuery("SELECT a FROM Agent a WHERE a.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
@@ -526,7 +532,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
@Test(enabled = TESTS_ENABLED)
public void testAddBundleFilesToDifferentBundles() throws Exception {
- Bundle b1 = createBundle("one");
+ // create a bundle type to use for both bundles.
+ BundleType bt = createBundleType("one");
+ Bundle b1 = createBundle("one", bt);
assertNotNull(b1);
BundleVersion bv1 = createBundleVersion(b1.getName(), "1.0", b1);
assertNotNull(bv1);
@@ -534,7 +542,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
null, "Bundle #1 File # 1".getBytes(), false);
// create a second bundle but create file of the same name as above
- Bundle b2 = createBundle("two");
+ Bundle b2 = createBundle("two", bt);
assertNotNull(b2);
BundleVersion bv2 = createBundleVersion(b2.getName(), "1.0", b2);
assertNotNull(bv2);
@@ -743,7 +751,6 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
private BundleType createBundleType(String name) throws Exception {
final String fullName = TEST_PREFIX + "-type-" + name;
ResourceType rt = createResourceType(name);
- PackageType pt = createPackageType(name, rt);
BundleType bt = bundleManager.createBundleType(overlord, fullName, rt.getId());
assert bt.getId() > 0;
@@ -800,20 +807,6 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
return rt;
}
- private PackageType createPackageType(String name, ResourceType rt) throws Exception {
- // the package type is named the same as the bundle type
- final String fullName = TEST_PREFIX + "-type-" + name;
- PackageType pt = new PackageType(fullName, rt);
-
- TransactionManager txMgr = getTransactionManager();
- txMgr.begin();
- EntityManager em = getEntityManager();
- em.persist(pt);
- em.close();
- txMgr.commit();
- return pt;
- }
-
// lifted from ResourceManagerBeanTest
private Resource createTestResource() throws Exception {
getTransactionManager().begin();
commit 74202995ca16b2edf797d7bf721e09e7b706fe22
Merge: e09ae65... 994a9db...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 14:48:35 2010 -0400
Merge branch 'gwt' into gwt-jay
commit e09ae659e017da3d4f32755e88685663680c782f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 14:47:48 2010 -0400
intermittent checkin
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
deleted file mode 100644
index 5c8cac5..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
+++ /dev/null
@@ -1,48 +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, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.rhq.core.domain.bundle;
-
-/**
- * Simple statuses for Bundle (Group) Deploy requests. When a request is first initiated, it will be considered in the
- * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
- * {@link #FAILURE}. For group deploy requests the status values are the same. Any individual failure will be
- * reflected as a group failure.
- *
- * @author Jay Shaughnessy
- */
-public enum BundlDeploymentStatus {
- INPROGRESS("In Progress"), //
- SUCCESS("Success"), //
- FAILURE("Failure"), //
- NOCHANGE("No Change");
-
- private String displayName;
-
- BundlDeploymentStatus(String displayName) {
- this.displayName = displayName;
- }
-
- public String toString() {
- return displayName;
- }
-}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
index 28d5adc..f1bb4d1 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
@@ -88,7 +88,7 @@ public class BundleDeployment implements Serializable {
@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
- protected BundlDeploymentStatus status;
+ protected BundleDeploymentStatus status;
@Column(name = "CTIME")
private Long ctime = -1L;
@@ -100,9 +100,7 @@ public class BundleDeployment implements Serializable {
}
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource) {
- this.bundleDeployDefinition = bundleDeploymentDef;
- this.resource = resource;
- this.status = BundlDeploymentStatus.INPROGRESS;
+ this(bundleDeploymentDef, resource, null);
}
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource,
@@ -110,6 +108,7 @@ public class BundleDeployment implements Serializable {
this.bundleDeployDefinition = bundleDeploymentDef;
this.resource = resource;
this.bundleGroupDeployment = bundleGroupDeployment;
+ this.status = BundleDeploymentStatus.INPROGRESS;
}
public BundleDeployDefinition getBundleDeployDefinition() {
@@ -172,11 +171,11 @@ public class BundleDeployment implements Serializable {
*
* @return the request status
*/
- public BundlDeploymentStatus getStatus() {
+ public BundleDeploymentStatus getStatus() {
return status;
}
- public void setStatus(BundlDeploymentStatus status) {
+ public void setStatus(BundleDeploymentStatus status) {
this.status = status;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java
new file mode 100644
index 0000000..66f8f68
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java
@@ -0,0 +1,48 @@
+/*
+ * 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.core.domain.bundle;
+
+/**
+ * Simple statuses for Bundle (Group) Deploy requests. When a request is first initiated, it will be considered in the
+ * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
+ * {@link #FAILURE}. For group deploy requests the status values are the same. Any individual failure will be
+ * reflected as a group failure.
+ *
+ * @author Jay Shaughnessy
+ */
+public enum BundleDeploymentStatus {
+ INPROGRESS("In Progress"), //
+ SUCCESS("Success"), //
+ FAILURE("Failure"), //
+ NOCHANGE("No Change");
+
+ private String displayName;
+
+ BundleDeploymentStatus(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String toString() {
+ return displayName;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
index 6f8364d..d1fbc24 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
@@ -66,7 +66,7 @@ public class BundleGroupDeployment implements Serializable {
@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
- protected BundlDeploymentStatus status;
+ protected BundleDeploymentStatus status;
@Column(name = "ERROR_MESSAGE")
protected String errorMessage;
@@ -91,7 +91,7 @@ public class BundleGroupDeployment implements Serializable {
this.subjectName = subjectName;
this.bundleDeployDefinition = bundleDeployDefinition;
this.group = group;
- this.status = BundlDeploymentStatus.INPROGRESS;
+ this.status = BundleDeploymentStatus.INPROGRESS;
}
public int getId() {
@@ -108,11 +108,11 @@ public class BundleGroupDeployment implements Serializable {
*
* @return the request status
*/
- public BundlDeploymentStatus getStatus() {
+ public BundleDeploymentStatus getStatus() {
return status;
}
- public void setStatus(BundlDeploymentStatus status) {
+ public void setStatus(BundleDeploymentStatus status) {
this.status = status;
}
@@ -135,7 +135,7 @@ public class BundleGroupDeployment implements Serializable {
/**
* If not <code>null</code>, this is an error message (possibly a full stack trace) to indicate the overall error
* that occurred when the configuration update failed. This will normally be <code>null</code> unless the
- * {@link #getStatus() status} indicates a {@link BundlDeploymentStatus#FAILURE}.
+ * {@link #getStatus() status} indicates a {@link BundleDeploymentStatus#FAILURE}.
*
* @return overall error that occurred
*/
@@ -155,7 +155,7 @@ public class BundleGroupDeployment implements Serializable {
this.errorMessage = errorMessage;
if (this.errorMessage != null) {
- setStatus(BundlDeploymentStatus.FAILURE);
+ setStatus(BundleDeploymentStatus.FAILURE);
}
}
@@ -212,7 +212,7 @@ public class BundleGroupDeployment implements Serializable {
public long getDuration() {
long start = this.createdTime;
long end;
- if ((status == null) || (status == BundlDeploymentStatus.INPROGRESS)) {
+ if ((status == null) || (status == BundleDeploymentStatus.INPROGRESS)) {
end = System.currentTimeMillis();
} else {
end = this.modifiedTime;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 5990e61..a98d66e 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -555,9 +555,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert b1f1.getId() != b2f1.getId() : "should have been different bundle files";
assert b1f1.getPackageVersion().getId() != b2f1.getPackageVersion().getId() : "should be different PV";
- assert b1f1.getPackageVersion().getGeneralPackage().getId() == b2f1.getPackageVersion().getGeneralPackage()
+ assert b1f1.getPackageVersion().getGeneralPackage().getId() != b2f1.getPackageVersion().getGeneralPackage()
.getId() : "package IDs should be different";
- assert b1f1.getPackageVersion().getGeneralPackage().equals(b2f1.getPackageVersion().getGeneralPackage()) : "should be different packages";
+ assert !b1f1.getPackageVersion().getGeneralPackage().equals(b2f1.getPackageVersion().getGeneralPackage()) : "should be different packages";
}
@Test(enabled = TESTS_ENABLED)
commit 3c3f0cf8380fad1be4200a4a97e2cb26037178af
Merge: 771a00d... 7258569...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 13:47:38 2010 -0400
Merge branch 'gwt' into gwt-jay
commit 771a00d5accc4234353bb257cd46994275b15912
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 13:46:26 2010 -0400
Intermittent check-in for deployment status work
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
index f3bdf49..005bafb 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -586,6 +586,7 @@
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="BUNDLE_DEPLOY_DEF_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY_DEF" />
<column name="RESOURCE_ID" type="INTEGER" required="true" references="RHQ_RESOURCE" />
+ <column name="STATUS" type="VARCHAR2" required="true" size="16"/>
<column name="CTIME" type="LONG" required="true"/>
<column name="BUNDLE_GROUP_DEPLOY_ID" type="INTEGER" required="false" references="RHQ_BUNDLE_GROUP_DEPLOY"/>
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 18db292..326f3ba 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -2945,6 +2945,11 @@
</schema-directSQL>
</schemaSpec>
+ <schemaSpec version="2.78.6">
+ <schema-addColumn table="RHQ_BUNDLE_DEPLOY" column="STATUS" columnType="VARCHAR2" precision="16" />
+ <schema-alterColumn table="RHQ_BUNDLE_DEPLOY" column="STATUS" nullable="FALSE" />
+ </schemaSpec>
+
<schemaSpec version="2.79">
<schema-directSQL>
<statement desc="Normalizing resource group descriptions">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
new file mode 100644
index 0000000..5c8cac5
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
@@ -0,0 +1,48 @@
+/*
+ * 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.core.domain.bundle;
+
+/**
+ * Simple statuses for Bundle (Group) Deploy requests. When a request is first initiated, it will be considered in the
+ * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
+ * {@link #FAILURE}. For group deploy requests the status values are the same. Any individual failure will be
+ * reflected as a group failure.
+ *
+ * @author Jay Shaughnessy
+ */
+public enum BundlDeploymentStatus {
+ INPROGRESS("In Progress"), //
+ SUCCESS("Success"), //
+ FAILURE("Failure"), //
+ NOCHANGE("No Change");
+
+ private String displayName;
+
+ BundlDeploymentStatus(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String toString() {
+ return displayName;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
index 4bb964d..28d5adc 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
@@ -29,6 +29,8 @@ import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@@ -84,6 +86,10 @@ public class BundleDeployment implements Serializable {
@ManyToOne
private BundleGroupDeployment bundleGroupDeployment;
+ @Column(name = "STATUS", nullable = false)
+ @Enumerated(EnumType.STRING)
+ protected BundlDeploymentStatus status;
+
@Column(name = "CTIME")
private Long ctime = -1L;
@@ -96,6 +102,7 @@ public class BundleDeployment implements Serializable {
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource) {
this.bundleDeployDefinition = bundleDeploymentDef;
this.resource = resource;
+ this.status = BundlDeploymentStatus.INPROGRESS;
}
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource,
@@ -159,6 +166,20 @@ public class BundleDeployment implements Serializable {
this.bundleGroupDeployment = bundleGroupDeployment;
}
+ /**
+ * The status of the request which indicates that the request is either still in progress, or it has completed and
+ * either succeeded or failed.
+ *
+ * @return the request status
+ */
+ public BundlDeploymentStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(BundlDeploymentStatus status) {
+ this.status = status;
+ }
+
@Override
public String toString() {
StringBuilder str = new StringBuilder("BundleDeployment: ");
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
index 8a0365f..6f8364d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
@@ -66,7 +66,7 @@ public class BundleGroupDeployment implements Serializable {
@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
- protected BundleGroupDeploymentStatus status;
+ protected BundlDeploymentStatus status;
@Column(name = "ERROR_MESSAGE")
protected String errorMessage;
@@ -91,7 +91,7 @@ public class BundleGroupDeployment implements Serializable {
this.subjectName = subjectName;
this.bundleDeployDefinition = bundleDeployDefinition;
this.group = group;
- this.status = BundleGroupDeploymentStatus.INPROGRESS;
+ this.status = BundlDeploymentStatus.INPROGRESS;
}
public int getId() {
@@ -108,11 +108,11 @@ public class BundleGroupDeployment implements Serializable {
*
* @return the request status
*/
- public BundleGroupDeploymentStatus getStatus() {
+ public BundlDeploymentStatus getStatus() {
return status;
}
- public void setStatus(BundleGroupDeploymentStatus status) {
+ public void setStatus(BundlDeploymentStatus status) {
this.status = status;
}
@@ -135,7 +135,7 @@ public class BundleGroupDeployment implements Serializable {
/**
* If not <code>null</code>, this is an error message (possibly a full stack trace) to indicate the overall error
* that occurred when the configuration update failed. This will normally be <code>null</code> unless the
- * {@link #getStatus() status} indicates a {@link BundleGroupDeploymentStatus#FAILURE}.
+ * {@link #getStatus() status} indicates a {@link BundlDeploymentStatus#FAILURE}.
*
* @return overall error that occurred
*/
@@ -155,7 +155,7 @@ public class BundleGroupDeployment implements Serializable {
this.errorMessage = errorMessage;
if (this.errorMessage != null) {
- setStatus(BundleGroupDeploymentStatus.FAILURE);
+ setStatus(BundlDeploymentStatus.FAILURE);
}
}
@@ -212,7 +212,7 @@ public class BundleGroupDeployment implements Serializable {
public long getDuration() {
long start = this.createdTime;
long end;
- if ((status == null) || (status == BundleGroupDeploymentStatus.INPROGRESS)) {
+ if ((status == null) || (status == BundlDeploymentStatus.INPROGRESS)) {
end = System.currentTimeMillis();
} else {
end = this.modifiedTime;
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java
deleted file mode 100644
index 94f9113..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java
+++ /dev/null
@@ -1,47 +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, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.rhq.core.domain.bundle;
-
-/**
- * Simple statuses for Bundle Group Deploy requests. When a request is first initiated, it will be considered in the
- * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
- * {@link #FAILURE}.
- *
- * @author Jay Shaughnessy
- */
-public enum BundleGroupDeploymentStatus {
- INPROGRESS("In Progress"), //
- SUCCESS("Success"), //
- FAILURE("Failure"), //
- NOCHANGE("No Change");
-
- private String displayName;
-
- BundleGroupDeploymentStatus(String displayName) {
- this.displayName = displayName;
- }
-
- public String toString() {
- return displayName;
- }
-}
\ No newline at end of file
14 years, 1 month
[rhq] Branch 'bugfixes' - 4 commits - modules/enterprise
by John Sanda
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml | 16 +
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/pages.xml | 23 --
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml | 100 ++++------
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationDefinitionUpdateReport.java | 54 +++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBean.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerLocal.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java | 52 +++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java | 42 +++-
8 files changed, 214 insertions(+), 85 deletions(-)
New commits:
commit 2a8965d9baf652cf36bcaa3241790b3a8e25cd3b
Merge: 4d073e0... 6f27026...
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 26 16:09:31 2010 -0400
Merge branch 'bugfixes' of ssh://git.fedorahosted.org/git/rhq/rhq into bugfixes
commit 4d073e0db85a5d8f8177233598abcdcfceead5f2
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 26 16:05:24 2010 -0400
merge fix
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
index 5997637..9dcd041 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
@@ -16,7 +16,21 @@
</component>
- <!-- Load i18n bundles -->
+ <!--<component class="org.jboss.seam.web.MultipartFilter">-->
+ <!--<property name="createTempFiles">true</property>-->
+ <!--<property name="maxRequestSize">1000000</property>-->
+ <!--<property name="urlPattern">*.xhtml</property>-->
+ <!--</component>-->
+
+ <!--<component class="org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean"-->
+ <!--name="ExistingResourceConfigurationViewUIBean"-->
+ <!--scope="page"/>-->
+
+ <!--<component class="org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean"-->
+ <!--name="ExistingResourceConfigurationUIBean"-->
+ <!--scope="session"/>-->
+
+ <!-- Load i18n bundles -->
<core:resource-loader>
<core:bundle-names>
<value>messages</value>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/pages.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/pages.xml
index 97fed67..e5fb0c8 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/pages.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/pages.xml
@@ -1,16 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<pages xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://jboss.com/products/seam/pages
+ xsi:schemaLocation="http://jboss.com/products/seam/pages
http://jboss.com/products/seam/pages-2.1.xsd">
- <page view-id="/rhq/resource/alert/viewAlert.xhtml" action="#{alertNotificationStoreSelector.select('alertDefinitionNotificationStore')}" />
-
- <page view-id="/rhq/resource/alert/notif/notificationTemplates.xhtml" action="#{alertNotificationStoreSelector.select('alertNotificationTemplateStore')}" />
-
<page view-id="/rhq/resource/configuration/view.xhtml">
<action execute="#{configurationViewer.initialize}" on-postback="false"/>
-
<navigation from-action="#{ConfigHelperUIBean.accessMap}">
<redirect view-id="/rhq/resource/configuration/view-map.xhtml">
<param name="id" value="#{ResourceUIBean.id}"/>
@@ -22,35 +17,27 @@
<page view-id="/rhq/resource/configuration/view-map.xhtml" action="#{configurationViewer.initialize}"/>
- <page view-id="/rhq/resource/configuration/edit.xhtml" concurrent-request-timeout="15000" timeout="180000">
+ <page view-id="/rhq/resource/configuration/edit.xhtml" concurrent-request-timeout="10000" timeout="180000">
<action execute="#{configurationEditor.initialize}"
on-postback="false"
if="#{!conversation.longRunning or (empty resourceConfiguration or resourceConfiguration.id ne ResourceUIBean.id)}"/>
<navigation from-action="#{configurationEditor.initialize}">
- <rule if="#{configurationEditor.initialized}">
- <begin-conversation join="true"/>
- </rule>
-
+ <begin-conversation join="true"/>
<rule if="#{configurationEditor.updateInProgress}">
<redirect view-id="/rhq/resource/configuration/view.xhtml" include-page-params="true">
- <param name="id" value="#{ResourceUIBean.id}"/>
+ <param name="id" value="#{ResourceUIBean.id}"/>
</redirect>
</rule>
</navigation>
<navigation from-action="#{configurationEditor.updateConfiguration}">
- <!-- success out is used for both success and in progress update statuses -->
<rule if-outcome="success">
<end-conversation before-redirect="false"/>
<redirect view-id="/rhq/resource/configuration/history.xhtml">
<param name="id" value="#{ResourceUIBean.id}"/>
</redirect>
</rule>
-
- <rule if-outcome="#{nochange or failure}">
- <render view-id="/rhq/resource/configuration/edit.xhtml"/>
- </rule>
</navigation>
<navigation from-action="#{configurationEditor.finishAddMap}">
@@ -62,4 +49,4 @@
</navigation>
</page>
-</pages>
\ No newline at end of file
+</pages>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
index f030db7..13055f5 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
@@ -8,60 +8,50 @@
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
- <rich:modalPanel id="uploadWindow" width="800" height="400" rendered="#{configurationEditor.renderFileUpload}">
- <f:facet name="header">
- <h:panelGroup>
- <h:outputText value="#{selectedRawUIBean.path}"/>
- </h:panelGroup>
- </f:facet>
- <f:facet name="controls">
- <h:panelGroup>
- <h:graphicImage value="/images/close.png" styleClass="hidelink" id="hideUploadModalLink"/>
- <rich:componentControl for="uploadWindow" attachTo="hideUploadModalLink" operation="hide" event="onclick"/>
- </h:panelGroup>
- </f:facet>
-
- <!--
- Note that the form *must* being nested inside the modalPanel; otherwise, the file upload listener is not invoked.
- This was discovered through trial and error along this jira (https://jira.jboss.org/jira/browse/RF-3492).
- -->
- <h:form id="uploadForm">
- <ui:remove>
- <!--
- Adding the keepAlive here for ResourceUIBean so that the current instance of ResourceUIBean lives across
- upload requests. There are a number of places that look for and expect to find the id request parameter. Even
- though the file upload is done via an ajax request, things still break down without the id parameter because
- ajax requests still trigger the JSF lifecycle, and that id parameter is expected in various places during the
- update model phase.
-
- With a file upload submission, richfaces sets the form's enctype attribute to multipart/form-data which prevents
- other input values from being submitted with the form. Along with a bit of refactoring and the keepAlive for
- ResourceUIBean, we are able to circumvent the need for passing the id parameter.
-
- jsanda - 02/10/2010
- -->
- </ui:remove>
- <a4j:keepAlive beanName="ResourceUIBean"/>
-
- <rich:panel id="uploadPanel">
- <rich:fileUpload id="fileUpload"
- listHeight="50px"
- fileUploadListener="#{fileUploader.listener}"
- noDuplicates="true"
- allowFlash="false"
- addControlLabel="Browse"
- immediateUpload="false">
- <f:facet name="label">
- <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}"/>
- </f:facet>
- <a4j:support event="onuploadcomplete"
- action="#{fileUploader.completeUpload}"
- limitToList="true"
- reRender="fileContents,fileMenu,fileUpload,modalEditor"
- onsubmit="#{rich:component('uploadWindow')}.hide()"/>
- </rich:fileUpload>
- </rich:panel>
- </h:form>
- </rich:modalPanel>
+ <f:subview id="uploadSubview">
+ <script type="text/javascript">
+ function prepareFormForUpload() {
+ var form = document.getElementById('editResourceConfigurationForm');
+ form.encoding = 'multipart/form-data';
+
+ return true;
+ }
+ </script>
+
+ <rich:modalPanel id="uploadWindow" width="800" height="400">
+ <f:facet name="header">
+ <h:panelGroup>
+ <h:outputText value="#{selectedRawUIBean.path}"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="controls">
+ <h:panelGroup>
+ <h:graphicImage value="/images/close.png" styleClass="hidelink" id="hidelink"/>
+ <rich:componentControl for="uploadWindow" attachTo="hidelink" operation="hide" event="onclick"/>
+ </h:panelGroup>
+ </f:facet>
+
+
+ <rich:panel id="uploadPanel">
+
+ <input type="hidden" name="currentResourceId" value="#{ResourceUIBean.id}"/>
+
+ <rich:fileUpload id="fileUpload"
+ listHeight="50px"
+ fileUploadListener="#{fileUploader.fileUploadListener}"
+ addControlLabel="Browse"
+ immediateUpload="false">
+ <f:facet name="label">
+ <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}"/>
+ </f:facet>
+ <a4j:support event="onuploadcomplete"
+ action="#{configurationEditor.completeUpload}"
+ reRender="fileUpload,fileContents,fileMenu"
+ onsubmit="#{rich:component('uploadWindow')}.hide()"/>
+ </rich:fileUpload>
+
+ </rich:panel>
+ </rich:modalPanel>
+ </f:subview>
</ui:composition>
commit 0e3b445f9634deb3bc5b916dad1b1d91146cb868
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 26 15:26:43 2010 -0400
Disabling tests due to a transaction problem which causes entity removal to fail
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
index 6b7ec13..87d254a 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
@@ -29,6 +29,7 @@ import org.rhq.core.clientapi.descriptor.configuration.ConfigurationDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.resource.metadata.test.UpdateSubsytemTestBase;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
@@ -41,6 +42,7 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.persistence.EntityManager;
+import javax.transaction.TransactionManager;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
@@ -60,7 +62,7 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
ConfigurationDefinition newConfigurationDef;
- @BeforeClass
+ @BeforeClass(enabled = false)
public void setupClass() throws Exception {
String pluginFileBaseName = "configuration_metadata_manager_bean_test";
String version1 = pluginFileBaseName + "_v1.xml";
@@ -74,10 +76,28 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
originalConfigurationDef = createAndSaveConfigurationDef(version1);
newConfigurationDef = loadPluginConfigurationFromFile(version2);
+ assertGroupDefinitionExists();
+
+ originalConfigurationDef = entityMgr.getReference(ConfigurationDefinition.class,
+ originalConfigurationDef.getId());
+
configurationMetadataMgr.updateConfigurationDefinition(newConfigurationDef, originalConfigurationDef);
+
+ originalConfigurationDef = entityMgr.find(ConfigurationDefinition.class, originalConfigurationDef.getId());
+
+ assertNotNull(originalConfigurationDef);
}
- @AfterClass
+ void assertGroupDefinitionExists() {
+ for (PropertyGroupDefinition groupDef : originalConfigurationDef.getGroupDefinitions()) {
+ if (groupDef.getName().equals("groupToBeRemoved")) {
+ assertTrue(groupDef.getId() != 0);
+ assertNotNull(entityMgr.find(PropertyGroupDefinition.class, groupDef.getId()));
+ }
+ }
+ }
+
+ @AfterClass(enabled = false)
public void tearDownClass() throws Exception {
getTransactionManager().rollback();
}
@@ -117,7 +137,7 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
AssertUtils.assertPropertiesMatch(msg, expected, actual, "id", "configurationDefinition");
}
- @Test
+ @Test(enabled = false)
public void newUngroupedPropertyDefsShouldBeAddedToConfigurationDef() throws Exception {
PropertyDefinitionSimple expected = newConfigurationDef.getPropertyDefinitionSimple("bar");
PropertyDefinitionSimple actual = originalConfigurationDef.getPropertyDefinitionSimple("bar");
@@ -126,7 +146,7 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
expected, actual);
}
- @Test
+ @Test(enabled = false)
public void existingUngroupedPropertyDefShouldBeUpdated() throws Exception {
PropertyDefinitionSimple expected = newConfigurationDef.getPropertyDefinitionSimple("foo");
PropertyDefinitionSimple actual = originalConfigurationDef.getPropertyDefinitionSimple("foo");
@@ -134,12 +154,20 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
assertPropertyDefinitionMatches("Existing ungrouped property defs should be updated", expected, actual);
}
- @Test
- public void propertyDefNotInNewConfigurationDefShouldBeRemovedFromConfigurationDef() throws Exception {
+ @Test(enabled = false)
+ public void propertyDefNotInNewConfigurationDefShouldBeRemoved() throws Exception {
assertNull(
- "A property def in the original configuration def that is removed in the new configuration def should be deleted",
+ "A property def in the original configuration def that is removed in the new configuration def should be deleted",
originalConfigurationDef.getPropertyDefinitionSimple("propertyToBeRemoved")
);
}
+ @Test(enabled = false)
+ public void propertyGroupDefNotInNewConfigurationDefShouldBeRemoved() throws Exception {
+ for (PropertyGroupDefinition def : originalConfigurationDef.getGroupDefinitions()) {
+ if (def.getName().equals("groupToBeRemoved")) {
+ fail("Expected property group 'groupToBeRemoved' to be deleted since it is not in the new configuration def.");
+ }
+ }
+ }
}
commit fee99c4cc57020ff3056d710c7df7da14c02a9ae
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 26 15:17:28 2010 -0400
[BZ 573034] Updating ConfigurationMetadataManagerBean to generate a report of property defs added
ResourceMetadataManagerBean nows gets back a report from ConfigurationMetadataManagerBean
that says which property definitions have been added to the configuration definition. All of
the resources for the given resource type are fetched and their plugin configurations are
updated with new properties using their default values for the new property definitions that
are required.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationDefinitionUpdateReport.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationDefinitionUpdateReport.java
new file mode 100644
index 0000000..ad0c84b
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationDefinitionUpdateReport.java
@@ -0,0 +1,54 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.enterprise.server.configuration.metadata;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinition;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ConfigurationDefinitionUpdateReport {
+
+ private ConfigurationDefinition configurationDef;
+
+ private Set<PropertyDefinition> newPropertyDefs = new HashSet<PropertyDefinition>();
+
+ public ConfigurationDefinitionUpdateReport(ConfigurationDefinition configurationDefinition) {
+ configurationDef = configurationDefinition;
+ }
+
+ public ConfigurationDefinition getConfigurationDefinition() {
+ return configurationDef;
+ }
+
+ public void addNewPropertyDefinition(PropertyDefinition propertyDef) {
+ newPropertyDefs.add(propertyDef);
+ }
+
+ public Set<PropertyDefinition> getNewPropertyDefinitions() {
+ return newPropertyDefs;
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBean.java
index 3e8653c..8814a06 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBean.java
@@ -50,8 +50,11 @@ public class ConfigurationMetadataManagerBean implements ConfigurationMetadataMa
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityManager;
- public void updateConfigurationDefinition(ConfigurationDefinition newDefinition,
+ public ConfigurationDefinitionUpdateReport updateConfigurationDefinition(ConfigurationDefinition newDefinition,
ConfigurationDefinition existingDefinition) {
+
+ ConfigurationDefinitionUpdateReport updateReport = new ConfigurationDefinitionUpdateReport(existingDefinition);
+
/*
* handle grouped and ungrouped properties separately. for ungrouped, we don't need to care about the group, but
* for the grouped ones we need to start at group level and then look at the properties. This is done below.
@@ -68,6 +71,7 @@ public class ConfigurationMetadataManagerBean implements ConfigurationMetadataMa
updatePropertyDefinition(existingProp, newProperty);
} else {
existingDefinition.put(newProperty);
+ updateReport.addNewPropertyDefinition(newProperty);
}
}
@@ -123,6 +127,7 @@ public class ConfigurationMetadataManagerBean implements ConfigurationMetadataMa
updatePropertyDefinition(existingProperty, nDef);
} else {
existingDefinition.put(nDef);
+ updateReport.addNewPropertyDefinition(nDef);
}
}
@@ -191,6 +196,8 @@ public class ConfigurationMetadataManagerBean implements ConfigurationMetadataMa
}
entityManager.flush();
+
+ return updateReport;
}
/**
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerLocal.java
index 9385f91..feb7a9c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerLocal.java
@@ -29,5 +29,6 @@ public interface ConfigurationMetadataManagerLocal {
* @param newDefinition
* @param existingDefinition
*/
- void updateConfigurationDefinition(ConfigurationDefinition newDefinition, ConfigurationDefinition existingDefinition);
+ ConfigurationDefinitionUpdateReport updateConfigurationDefinition(ConfigurationDefinition newDefinition,
+ ConfigurationDefinition existingDefinition);
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java
index 9e69de6..b85e5dc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java
@@ -26,6 +26,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -55,8 +56,13 @@ import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
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.content.PackageType;
+import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.event.EventDefinition;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.MeasurementSchedule;
@@ -71,6 +77,8 @@ import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.RequiredPermission;
+import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
+import org.rhq.enterprise.server.configuration.metadata.ConfigurationDefinitionUpdateReport;
import org.rhq.enterprise.server.configuration.metadata.ConfigurationMetadataManagerLocal;
import org.rhq.enterprise.server.event.EventManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
@@ -100,19 +108,28 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal
@EJB
private MeasurementDefinitionManagerLocal measurementDefinitionManager;
+
@EJB
private MeasurementScheduleManagerLocal scheduleManager;
+
@EJB
private ConfigurationMetadataManagerLocal configurationMetadataManager;
+
@EJB
private SubjectManagerLocal subjectManager;
+
@EJB
private ResourceManagerLocal resourceManager;
+
@EJB
private EventManagerLocal eventManager;
+
@EJB
private ResourceMetadataManagerLocal resourceMetadataManager; // self
+ @EJB
+ private ConfigurationManagerLocal configurationManager;
+
@SuppressWarnings("unchecked")
public List<Plugin> getAllPluginsById(List<Integer> pluginIds) {
if (pluginIds == null || pluginIds.size() == 0) {
@@ -740,8 +757,20 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal
existingType.setPluginConfigurationDefinition(resourceType.getPluginConfigurationDefinition());
} else // update the configuration
{
- configurationMetadataManager.updateConfigurationDefinition(resourceType
- .getPluginConfigurationDefinition(), existingConfigurationDefinition);
+ ConfigurationDefinitionUpdateReport updateReport =
+ configurationMetadataManager.updateConfigurationDefinition(
+ resourceType.getPluginConfigurationDefinition(), existingConfigurationDefinition);
+
+ if (updateReport.getNewPropertyDefinitions().size() > 0) {
+ Subject overlord = subjectManager.getOverlord();
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.addFilterResourceTypeId(existingType.getId());
+ List<Resource> resources = resourceManager.findResourcesByCriteria(overlord, criteria);
+
+ for (Resource resource : resources) {
+ updateResourcePluginConfiguration(resource, updateReport);
+ }
+ }
}
} else {
// resourceType.getPlu... is null -> remove the existing config
@@ -752,6 +781,25 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal
}
}
+ private void updateResourcePluginConfiguration(Resource resource,
+ ConfigurationDefinitionUpdateReport updateReport) {
+ Configuration pluginConfiguration = resource.getPluginConfiguration();
+ int numberOfProperties = pluginConfiguration.getProperties().size();
+ ConfigurationTemplate template = updateReport.getConfigurationDefinition().getDefaultTemplate();
+ Configuration templateConfiguration = template.getConfiguration();
+
+ for (PropertyDefinition propertyDef : updateReport.getNewPropertyDefinitions()) {
+ if (propertyDef.isRequired() ) {
+ Property templateProperty = templateConfiguration.get(propertyDef.getName());
+ pluginConfiguration.put(templateProperty.deepCopy(false));
+ }
+ }
+
+ if (pluginConfiguration.getProperties().size() > numberOfProperties) {
+ resource.setMtime(new Date().getTime());
+ }
+ }
+
/**
* Update the set of process scans for a given resource type
*
14 years, 1 month
[rhq] Branch 'gwt' - 4 commits - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java | 125 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java | 75 ++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 75 +++---
5 files changed, 237 insertions(+), 46 deletions(-)
New commits:
commit a13969c550099c19bbeb3cbad76df38ec4391cb5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:32:17 2010 -0400
show bundle versions at the bottom right of the bundle view
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java
new file mode 100644
index 0000000..9a576a6
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java
@@ -0,0 +1,125 @@
+/*
+ * 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.bundle.list;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author John Mazzitelli
+ */
+public class BundleVersionDataSource extends RPCDataSource<BundleVersion> {
+
+ private BundleGWTServiceAsync bundleService = GWTServiceLookup.getBundleService();
+ private int bundleId;
+
+ public BundleVersionDataSource() {
+ DataSourceIntegerField idField = new DataSourceIntegerField("id", "ID");
+ idField.setPrimaryKey(true);
+ addField(idField);
+
+ DataSourceTextField nameField = new DataSourceTextField("name", "Name");
+ addField(nameField);
+
+ DataSourceTextField descriptionField = new DataSourceTextField("description", "Description");
+ addField(descriptionField);
+
+ DataSourceTextField latestVersionField = new DataSourceTextField("version", "Version");
+ addField(latestVersionField);
+
+ DataSourceIntegerField deploymentCountField = new DataSourceIntegerField("fileCount", "File Count");
+ addField(deploymentCountField);
+ }
+
+ public int getBundleId() {
+ return bundleId;
+ }
+
+ public void setBundleId(int bundleId) {
+ this.bundleId = bundleId;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+
+ BundleVersionCriteria criteria = new BundleVersionCriteria();
+ criteria.addFilterBundleId(this.bundleId);
+ criteria.fetchBundleFiles(true);
+ criteria.setPageControl(getPageControl(request));
+
+ bundleService.findBundleVersionsByCriteria(criteria, new AsyncCallback<PageList<BundleVersion>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load bundle version data", caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(PageList<BundleVersion> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+
+ }
+
+ @Override
+ public BundleVersion copyValues(ListGridRecord from) {
+ // can't I just get the "object" attribute and return it???
+ Integer idAttrib = from.getAttributeAsInt("id");
+ String nameAttrib = from.getAttribute("name");
+ String descriptionAttrib = from.getAttribute("description");
+ String versionAttrib = from.getAttribute("version");
+
+ BundleVersion bv = new BundleVersion();
+ bv.setId(idAttrib.intValue());
+ bv.setName(nameAttrib);
+ bv.setDescription(descriptionAttrib);
+ bv.setVersion(versionAttrib);
+ return bv;
+ }
+
+ @Override
+ public ListGridRecord copyValues(BundleVersion from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute("id", from.getId());
+ record.setAttribute("name", from.getName());
+ record.setAttribute("description", from.getDescription());
+ record.setAttribute("version", from.getVersion());
+ record.setAttribute("fileCount", Integer.valueOf(from.getBundleFiles().size()));
+
+ record.setAttribute("object", from);
+
+ return record;
+
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
index 4d7575e..be0e415 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
@@ -21,6 +21,8 @@ package org.rhq.enterprise.gui.coregui.client.bundle.list;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.types.SelectionAppearance;
+import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
@@ -32,6 +34,7 @@ import com.smartgwt.client.widgets.tab.TabSet;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
public class BundleView extends VLayout {
@@ -41,6 +44,7 @@ public class BundleView extends VLayout {
private HeaderLabel headerLabel;
private StaticTextItem descriptionItem;
private StaticTextItem latestVersionItem;
+ private Table bundleVersionsTable;
public BundleView() {
super();
@@ -77,11 +81,30 @@ public class BundleView extends VLayout {
}
private Tab createDeploymentsTab() {
- return new Tab("Deployments");
+ Tab deploymentsTab = new Tab("Deployments");
+ return deploymentsTab;
}
private Tab createVersionsTab() {
- return new Tab("Versions");
+ Tab versionsTab = new Tab("Versions");
+
+ bundleVersionsTable = new Table();
+ bundleVersionsTable.setHeight100();
+
+ BundleVersionDataSource bundleVersionsDataSource = new BundleVersionDataSource();
+ bundleVersionsTable.setDataSource(bundleVersionsDataSource);
+
+ bundleVersionsTable.getListGrid().getField("id").setWidth("60");
+ bundleVersionsTable.getListGrid().getField("name").setWidth("25%");
+ bundleVersionsTable.getListGrid().getField("version").setWidth("10%");
+ bundleVersionsTable.getListGrid().getField("fileCount").setWidth("10%");
+ bundleVersionsTable.getListGrid().getField("description").setWidth("*");
+
+ bundleVersionsTable.getListGrid().setSelectionType(SelectionStyle.NONE);
+ bundleVersionsTable.getListGrid().setSelectionAppearance(SelectionAppearance.ROW_STYLE);
+
+ versionsTab.setPane(bundleVersionsTable);
+ return versionsTab;
}
private Tab createSummaryTab() {
@@ -109,21 +132,39 @@ public class BundleView extends VLayout {
}
public void viewRecord(Record record) {
- final BundleWithLatestVersionComposite object;
- object = (BundleWithLatestVersionComposite) record.getAttributeAsObject("object");
-
- if (bundleBeingViewed != object.getBundleId()) {
- headerLabel.setContents(object.getBundleName());
- latestVersionItem.setValue(object.getLatestVersion());
- descriptionItem.setValue(object.getBundleDescription());
- }
-
- try {
- message.hide();
- canvas.show();
- markForRedraw();
- } catch (Throwable t) {
- CoreGUI.getErrorHandler().handleError("Cannot view bundle record", t);
+ if (record == null) {
+ viewNone();
+ } else {
+ final BundleWithLatestVersionComposite object;
+ object = (BundleWithLatestVersionComposite) record.getAttributeAsObject("object");
+
+ if (object == null) {
+ viewNone();
+ } else {
+ if (bundleBeingViewed != object.getBundleId()) {
+ bundleBeingViewed = object.getBundleId();
+
+ // summary tab
+ headerLabel.setContents(object.getBundleName());
+ latestVersionItem.setValue(object.getLatestVersion());
+ descriptionItem.setValue(object.getBundleDescription());
+
+ // versions tab
+ BundleVersionDataSource bvDataSource;
+ bvDataSource = (BundleVersionDataSource) bundleVersionsTable.getDataSource();
+ bvDataSource.setBundleId(bundleBeingViewed);
+ bvDataSource.fetchData();
+ bundleVersionsTable.getListGrid().invalidateCache(); // TODO: is there a better way to refresh?
+ }
+
+ try {
+ message.hide();
+ canvas.show();
+ markForRedraw();
+ } catch (Throwable t) {
+ CoreGUI.getErrorHandler().handleError("Cannot view bundle record", t);
+ }
+ }
}
}
commit 8bfd48b11e356dab8b7621d615fa83916782257f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:31:55 2010 -0400
be able to go to next step when no files need to be uploaded
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
index e241771..7baec2f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
@@ -47,6 +47,7 @@ public class BundleUploadDataStep implements WizardStep {
private final AbstractBundleCreateWizard wizard;
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
private ArrayList<BundleFileUploadForm> uploadForms;
+ private Boolean noFilesNeedToBeUploaded = null; // will be non-null when we know the answer
public BundleUploadDataStep(AbstractBundleCreateWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -84,6 +85,10 @@ public class BundleUploadDataStep implements WizardStep {
}
private boolean isFinished() {
+ if (noFilesNeedToBeUploaded != null && noFilesNeedToBeUploaded.booleanValue()) {
+ return true;
+ }
+
if (wizard.getAllBundleFilesStatus() == null) {
return false;
}
@@ -114,9 +119,11 @@ public class BundleUploadDataStep implements WizardStep {
label.setWidth100();
mainLayout.addMember(label);
uploadForms = null;
+ noFilesNeedToBeUploaded = Boolean.TRUE;
return;
}
+ noFilesNeedToBeUploaded = Boolean.FALSE;
uploadForms = new ArrayList<BundleFileUploadForm>();
for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) {
commit 1ad47adb952bab44b66c973f535f638c447ac492
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:19:44 2010 -0400
allow for a non-titled table
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
index 1c7c68c..e56c48f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
@@ -83,6 +83,10 @@ public class Table extends VLayout {
private ArrayList<TableActionInfo> tableActions = new ArrayList<TableActionInfo>();
+ public Table() {
+ this(null, null, null, null, true);
+ }
+
public Table(String tableTitle) {
this(tableTitle, null, null, null, true);
}
@@ -100,10 +104,11 @@ public class Table extends VLayout {
}
public Table(String tableTitle, Criteria criteria, SortSpecifier[] sortSpecifiers, String[] excludedFieldNames) {
- this(tableTitle,criteria,sortSpecifiers,excludedFieldNames,true);
+ this(tableTitle, criteria, sortSpecifiers, excludedFieldNames, true);
}
+
public Table(String tableTitle, Criteria criteria, SortSpecifier[] sortSpecifiers, String[] excludedFieldNames,
- boolean autoFetchData) {
+ boolean autoFetchData) {
super();
setWidth100();
@@ -111,11 +116,7 @@ public class Table extends VLayout {
// Title
title = new HTMLFlow();
- title.setWidth100();
- title.setHeight(35);
- title.setContents(tableTitle);
- title.setPadding(4);
- title.setStyleName("HeaderLabel");
+ setTableTitle(tableTitle);
// Grid
listGrid = new ListGrid();
@@ -169,7 +170,8 @@ public class Table extends VLayout {
public void onClick(ClickEvent clickEvent) {
if (tableAction.confirmMessage != null) {
- String message = tableAction.confirmMessage.replaceAll("\\#", String.valueOf(listGrid.getSelection().length));
+ String message = tableAction.confirmMessage.replaceAll("\\#", String.valueOf(listGrid
+ .getSelection().length));
SC.ask(message, new BooleanCallback() {
public void execute(Boolean confirmed) {
@@ -213,9 +215,8 @@ public class Table extends VLayout {
}
});
-
// TODO GH: This doesn't yet work as desired to force the fields to fit to the table when you resize one of them.
- if (false) { // If Force Fit
+ if (false) { // If Force Fit
listGrid.addDataArrivedHandler(new DataArrivedHandler() {
public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
for (ListGridField f : listGrid.getFields()) {
@@ -273,14 +274,30 @@ public class Table extends VLayout {
private ArrayList<Integer> fieldSizes = new ArrayList<Integer>();
private boolean autoSizing = false;
-
public void refresh(Criteria criteria) {
this.listGrid.setCriteria(criteria);
this.listGrid.markForRedraw();
}
- public void setTableTitle(String title) {
- this.title.setContents(title);
+ public void setTableTitle(String titleString) {
+ if (titleString == null) {
+ titleString = "";
+ }
+ if (titleString.length() > 0) {
+ title.setWidth100();
+ title.setHeight(35);
+ title.setContents(titleString);
+ title.setPadding(4);
+ title.setStyleName("HeaderLabel");
+ } else {
+ title.setWidth100();
+ title.setHeight(0);
+ title.setContents(null);
+ title.setPadding(0);
+ title.setStyleName("normal");
+ }
+
+ title.markForRedraw();
}
public void setDataSource(RPCDataSource dataSource) {
@@ -299,7 +316,8 @@ public class Table extends VLayout {
this.addTableAction(title, null, null, tableAction);
}
- public void addTableAction(String title, SelectionEnablement enablement, String confirmation, TableAction tableAction) {
+ public void addTableAction(String title, SelectionEnablement enablement, String confirmation,
+ TableAction tableAction) {
if (enablement == null) {
enablement = DEFAULT_SELECTION_ENABLEMENT;
}
@@ -313,27 +331,26 @@ public class Table extends VLayout {
for (TableActionInfo tableAction : tableActions) {
boolean enabled;
switch (tableAction.enablement) {
- case ALWAYS:
- enabled = true;
- break;
- case ANY:
- enabled = (count >= 1);
- break;
- case SINGLE:
- enabled = (count == 1);
- break;
- case MULTIPLE:
- enabled = (count > 1);
- break;
- default:
- throw new IllegalStateException("Unhandled SelectionEnablement: " + tableAction.enablement.name());
+ case ALWAYS:
+ enabled = true;
+ break;
+ case ANY:
+ enabled = (count >= 1);
+ break;
+ case SINGLE:
+ enabled = (count == 1);
+ break;
+ case MULTIPLE:
+ enabled = (count > 1);
+ break;
+ default:
+ throw new IllegalStateException("Unhandled SelectionEnablement: " + tableAction.enablement.name());
}
tableAction.actionButton.setDisabled(!enabled);
}
this.tableInfo.setContents("Total: " + listGrid.getTotalRows() + " (" + count + " selected)");
}
-
// -------------- Inner utility class -------------
private static class TableActionInfo {
commit cf3888c51458c009411d1ccee4e4b3becfe336c3
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:18:53 2010 -0400
put the summary data in the same location as the other steps (via margin)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
index ffa143a..c010952 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -41,6 +41,7 @@ public class BundleSummaryStep implements WizardStep {
DynamicForm form = new DynamicForm();
form.setNumCols(2);
+ form.setMargin(20);
StaticTextItem bundleTypeLabel = new StaticTextItem("bundleType", "Type");
bundleTypeLabel.setTitleAlign(Alignment.LEFT);
14 years, 1 month
[rhq] Branch 'bugfixes' - 33 commits - modules/core modules/enterprise
by ips
modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml | 22
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 38 +
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java | 56 +
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java | 128 ++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java | 27
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java | 87 +++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java | 139 ++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java | 148 +++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java | 54 +
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java | 21
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java | 18
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java | 11
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java | 13
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateNewPackageUIBean.java | 1
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateRepoUIBean.java | 1
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java | 12
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java | 6
modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties | 8
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml | 42 +
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml | 4
modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp | 27
modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp | 30 +
modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp | 39 +
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventAlertJSON.jsp | 4
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventConfigJSON.jsp | 2
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp | 6
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventCreateDeleteChildJSON.jsp | 4
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventEventsJSON.jsp | 4
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventOperationsJSON.jsp | 4
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventPluginConfigJSON.jsp | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java | 102 +++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java | 51 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java | 281 ++++++++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java | 25
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/RepoManagerBeanTest.java | 25
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java | 5
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java | 2
43 files changed, 1394 insertions(+), 84 deletions(-)
New commits:
commit 6f270263dacffd680dbe180824ca00d6e9ef4d39
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Mar 26 14:50:41 2010 -0400
get rid of createCandidateRepo() SLSB method (createRepo() can be used instead); fix some failing content tests
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateNewPackageUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateNewPackageUIBean.java
index a520b21..3db7ce6 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateNewPackageUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateNewPackageUIBean.java
@@ -469,6 +469,7 @@ public class CreateNewPackageUIBean {
RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
Repo newRepo = new Repo(newRepoName);
+ newRepo.setCandidate(false);
newRepo = repoManager.createRepo(subject, newRepo);
repoId = Integer.toString(newRepo.getId());
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateRepoUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateRepoUIBean.java
index 06c41fd..9173dec 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateRepoUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateRepoUIBean.java
@@ -44,6 +44,7 @@ public class CreateRepoUIBean {
RepoManagerLocal manager = LookupUtil.getRepoManagerLocal();
try {
+ newRepo.setCandidate(false);
Repo created = manager.createRepo(subject, newRepo);
FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Saved [" + created.getName()
+ "] with the ID of [" + created.getId() + "]");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
index 7b35cad..20ad6bc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
@@ -417,6 +417,7 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
}
Repo repo = new Repo(repoName);
+ repo.setCandidate(false);
repo.setDescription(createMe.getDescription());
try {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
index b7e13c7..0a37901 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
@@ -344,30 +344,23 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
@RequiredPermission(Permission.MANAGE_INVENTORY)
public Repo createRepo(Subject subject, Repo repo) throws RepoException {
validateRepo(repo);
- repo.setCandidate(false);
log.debug("User [" + subject + "] is creating [" + repo + "]...");
entityManager.persist(repo);
- log.debug("User [" + subject + "] created [" + repo + "]");
+ log.debug("User [" + subject + "] created [" + repo + "].");
- // Schedule the repo sync job.
- try {
- ContentServerPluginContainer pc = ContentManagerHelper.getPluginContainer();
- // Schedule a job for the future
- pc.scheduleRepoSyncJob(repo);
- } catch (Exception e) {
- log.error("Failed to schedule repository synchronization job for [" + repo + "].", e);
- throw new RuntimeException(e);
+ // If this repo is imported, schedule the repo sync job.
+ if ( ! repo.isCandidate()) {
+ try {
+ ContentServerPluginContainer pc = ContentManagerHelper.getPluginContainer();
+ pc.scheduleRepoSyncJob(repo);
+ } catch (Exception e) {
+ log.error("Failed to schedule repository synchronization job for [" + repo + "].", e);
+ throw new RuntimeException(e);
+ }
}
- return repo; // now has the ID set
- }
-
- @RequiredPermission(Permission.MANAGE_INVENTORY)
- public Repo createCandidateRepo(Subject subject, Repo repo) throws RepoException {
- validateRepo(repo);
- entityManager.persist(repo);
- return repo;
+ return repo; // now has the id set
}
@SuppressWarnings("unchecked")
@@ -388,6 +381,10 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
public void processRepoImportReport(Subject subject, RepoImportReport report, int contentSourceId,
StringBuilder result) {
+ // TODO: The below line was added to simplify things for JON (i.e. patches from JBoss CSP) - remove it if we
+ // need more flexibility for other use cases. (ips, 03/26/10)
+ boolean autoImport = (report.getRepoGroups().isEmpty() && report.getRepos().size() == 1);
+
// Import groups first
List<RepoGroupDetails> repoGroups = report.getRepoGroups();
@@ -446,7 +443,7 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
for (RepoDetails createMe : repos) {
if (createMe.getParentRepoName() == null) {
try {
- if (addCandidateRepo(contentSourceId, createMe)) {
+ if (addCandidateRepo(contentSourceId, createMe, autoImport)) {
importedRepos.add(createMe);
}
removeRepoFromList(createMe.getName(), candidatesForThisProvider);
@@ -469,7 +466,7 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
for (RepoDetails createMe : repos) {
if (createMe.getParentRepoName() != null) {
try {
- if (addCandidateRepo(contentSourceId, createMe)) {
+ if (addCandidateRepo(contentSourceId, createMe, autoImport)) {
importedRepos.add(createMe);
}
removeRepoFromList(createMe.getName(), candidatesForThisProvider);
@@ -494,8 +491,8 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
for (Repo deleteMe : candidatesForThisProvider) {
deleteRepo(subject, deleteMe.getId());
}
- result.append("Deleted the following ").append(candidatesForThisProvider.size()).append("obsolete repository(s): ").
- append(candidatesForThisProvider).append('\n');
+ result.append("Deleted the following ").append(candidatesForThisProvider.size()).
+ append(" obsolete repository(s): ").append(candidatesForThisProvider).append('\n');
}
}
@@ -873,10 +870,12 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
* @param contentSourceId identifies the content provider that introduced the candidate into the system
* @param createMe describes the candidate to be created
*
+ * @param autoImport whether or not to import the repo
+ *
* @throws Exception if there is an error associating the content source with the repo or if the repo
* indicates a parent or repo group that does not exist
*/
- private boolean addCandidateRepo(int contentSourceId, RepoDetails createMe) throws Exception {
+ private boolean addCandidateRepo(int contentSourceId, RepoDetails createMe, boolean autoImport) throws Exception {
Subject overlord = subjectManager.getOverlord();
String name = createMe.getName();
@@ -893,9 +892,7 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
// The repo doesn't exist yet in the system - create it.
Repo addMe = new Repo(name);
- // TODO: The below line was added to simplify things for JON (i.e. patches from JBoss CSP) - remove it if we
- // need more flexibility for other use cases. (ips, 03/24/10)
- addMe.setCandidate(false); // auto-import
+ addMe.setCandidate(!autoImport);
addMe.setDescription(createMe.getDescription());
String createMeGroup = createMe.getRepoGroup();
@@ -905,7 +902,7 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
}
// Add the new candidate to the database
- addMe = createCandidateRepo(overlord, addMe);
+ addMe = createRepo(overlord, addMe);
// Associate the content provider that introduced the candidate with the repo
addContentSourcesToRepo(overlord, addMe.getId(), new int[] { contentSourceId });
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
index aea0ef2..503e514 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
@@ -162,17 +162,6 @@ public interface RepoManagerLocal {
void addRepoRelationship(Subject subject, int repoId, int relatedRepoId, String relationshipTypeName);
/**
- * Functions similar to {@link RepoManagerRemote#createRepo(Subject, Repo)} except that it will ensure
- * the candidate bit on the repo parameter is correctly set.
- *
- * @param subject user creating the repo
- * @param repo repo data to create
- * @return persisted repo (ID will be populated)
- * @throws RepoException if the repo contains invalid data
- */
- Repo createCandidateRepo(Subject subject, Repo repo) throws RepoException;
-
- /**
* Removes candidate repos whose only content source is the indicated content source.
*
* @param subject user performing the delete
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/RepoManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/RepoManagerBeanTest.java
index be68961..a98c6de 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/RepoManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/RepoManagerBeanTest.java
@@ -151,7 +151,7 @@ public class RepoManagerBeanTest extends AbstractEJB3Test {
@Test(enabled = ENABLED)
public void createFindDeleteCandidateRepo() throws Exception {
// Setup
- Repo repo = new Repo("test candidate repo");
+ Repo repo = new Repo("test create candidate repo");
PageList<Repo> importedRepos = repoManager.findRepos(overlord, new PageControl());
int origSize = 0;
@@ -160,13 +160,14 @@ public class RepoManagerBeanTest extends AbstractEJB3Test {
}
// Test
- repo = repoManager.createCandidateRepo(overlord, repo);
+ repo.setCandidate(true);
+ repo = repoManager.createRepo(overlord, repo);
// Verify
try {
assert repo.isCandidate();
- // Should not be returned from this call since its a candidate repo
+ // Should not be returned from this call since it's a candidate repo
importedRepos = repoManager.findRepos(overlord, new PageControl());
assert importedRepos.size() == origSize;
assert repoManager.getRepo(overlord, repo.getId()) != null;
@@ -302,8 +303,9 @@ public class RepoManagerBeanTest extends AbstractEJB3Test {
// Create a candidate repo associated with that source
Repo candidateRepo = new Repo(candidateRepoName);
+ candidateRepo.setCandidate(true);
candidateRepo.addContentSource(contentSource);
- candidateRepo = repoManager.createCandidateRepo(overlord, candidateRepo);
+ candidateRepo = repoManager.createRepo(overlord, candidateRepo);
// Test
RepoCriteria criteria = new RepoCriteria();
@@ -329,7 +331,8 @@ public class RepoManagerBeanTest extends AbstractEJB3Test {
public void importCandidateRepo() throws Exception {
// Setup
Repo candidate = new Repo("create me");
- Repo created = repoManager.createCandidateRepo(overlord, candidate);
+ candidate.setCandidate(true);
+ Repo created = repoManager.createRepo(overlord, candidate);
// Test
List<Integer> repoIds = new ArrayList<Integer>(1);
@@ -395,24 +398,28 @@ public class RepoManagerBeanTest extends AbstractEJB3Test {
// -> Only has source to delete, should be deleted
Repo repo1 = new Repo("repo1");
+ repo1.setCandidate(true);
repo1.addContentSource(source1);
// -> Has different source, should not be deleted
Repo repo2 = new Repo("repo2");
+ repo2.setCandidate(true);
repo2.addContentSource(source2);
// -> Has source to delete and another source, should not be deleted
Repo repo3 = new Repo("repo3");
+ repo3.setCandidate(true);
repo3.addContentSource(source1);
repo3.addContentSource(source2);
// -> No sources, should not be deleted
Repo repo4 = new Repo("repo4");
+ repo4.setCandidate(true);
- repo1 = repoManager.createCandidateRepo(overlord, repo1);
- repo2 = repoManager.createCandidateRepo(overlord, repo2);
- repo3 = repoManager.createCandidateRepo(overlord, repo3);
- repo4 = repoManager.createCandidateRepo(overlord, repo4);
+ repo1 = repoManager.createRepo(overlord, repo1);
+ repo2 = repoManager.createRepo(overlord, repo2);
+ repo3 = repoManager.createRepo(overlord, repo3);
+ repo4 = repoManager.createRepo(overlord, repo4);
// Test
repoManager.deleteCandidatesWithOnlyContentSource(overlord, source1.getId());
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java
index 7e374d0..c3bec3a 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java
@@ -200,13 +200,13 @@ public class ContentProviderManagerSyncContentProviderTest extends AbstractEJB3T
Repo existingCandidateRepo = new Repo(TestContentProvider.EXISTING_CANDIDATE_REPO_NAME);
existingCandidateRepo.setCandidate(true);
existingCandidateRepo.addContentSource(syncSource);
- repoManager.createCandidateRepo(overlord, existingCandidateRepo);
+ repoManager.createRepo(overlord, existingCandidateRepo);
// -> Simulate a candidate repo from a previous import that will *NOT* be in this report
Repo previousRepo = new Repo(PREVIOUS_CANDIDATE_REPO_NAME);
previousRepo.setCandidate(true);
previousRepo.addContentSource(syncSource);
- repoManager.createCandidateRepo(overlord, previousRepo);
+ repoManager.createRepo(overlord, previousRepo);
// Test
// --------------------------------------------
@@ -300,6 +300,5 @@ public class ContentProviderManagerSyncContentProviderTest extends AbstractEJB3T
// -> Non-existent repo
retrievedRepos = repoManager.getRepoByName("testRepoFoo");
assert retrievedRepos.size() == 0;
-
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
index ec239d0..04e26fc 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
@@ -90,7 +90,7 @@ public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
}
}
- // @Test TODO further work on this
+ @Test // TODO further work on this
public void testMoveResoureType() throws Exception {
System.out.println("testUpdatePlugin2 --- start");
getTransactionManager().begin();
commit 97cf95d24d0872fcef444a7d2f068bfc37436ffc
Merge: 73ce59b... 413a2fc...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Mar 26 11:30:43 2010 -0400
Merge branch 'bugfixes' of ssh://git.fedorahosted.org/git/rhq/rhq into bugfixes
commit 73ce59b4d83556f106d7c08e4bba12abee8afbae
Merge: 6345fd4... bf2ad7a...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Mar 25 18:06:17 2010 -0400
Merge branch 'master' into bugfixes
commit bf2ad7ab6e9532e4869f4373712fcbc0c04f8618
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Mar 24 05:04:01 2010 -0400
added null ptr check before retrieval for JSON population.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp
index 093c943..61a7505 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp
@@ -67,9 +67,11 @@
%>
{ "start" : "<%=sdf.format(new Date(installedPackage.getTimestamp()))%>",
- "title" : "<%= (""+installedPackage.getPackageVersion().getDisplayName() + " " + installedPackage.getPackageVersion().getDisplayVersion()).replaceAll("[\"']","").trim()%>",
+ "title" : "<% out.write(
+ (installedPackage.getPackageVersion().getDisplayName()==null ? null : installedPackage.getPackageVersion().getDisplayName().replaceAll("[\"']","")) + " " +
+ (installedPackage.getPackageVersion().getDisplayVersion() ==null ? null : installedPackage.getPackageVersion().getDisplayVersion().replaceAll("[\"']","")));%>",
"link" : "<%=link%>",
- "description" : "<b>User:</b> <%= (""+installedPackage.getContentServiceRequest() == null ? "-Detected-" : installedPackage.getContentServiceRequest().getSubjectName()).replaceAll("[\"']","").trim()%><br/> <b>Version: <%= (""+installedPackage.getPackageVersion().getDisplayVersion()).replaceAll("[\"']","").trim()%></b> <br/><b>Status:</b> <%=(""+installedPackage.getStatus()).replaceAll("[\"']","").trim()%>",
+ "description" : "<b>User:</b> <% out.write((installedPackage.getContentServiceRequest() == null ? "-Detected- " : installedPackage.getContentServiceRequest().getSubjectName().replaceAll("[\"']","").trim())+"<br/> <b>Version: "+(installedPackage.getPackageVersion().getDisplayVersion() ==null ? null :installedPackage.getPackageVersion().getDisplayVersion().replaceAll("[\"']","").trim())+" </b> <br/><b>Status:</b> "+installedPackage.getStatus());%>",
"icon" : "<%=icon%>",
"color" : "<%=(installedPackage.getStatus() != InstalledPackageHistoryStatus.FAILED ? "#4EB84E" : "#DD5656")%>"
}
commit 7002a02a713675e1deec633096094120838a6473
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Mar 23 18:59:22 2010 -0400
added single and double quote removal code to *JSON jsps to guard against creating invalid runtime javascript
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventAlertJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventAlertJSON.jsp
index 5cebe5d..2cc3da3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventAlertJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventAlertJSON.jsp
@@ -59,9 +59,9 @@
%>
{ "start" : "<%=sdf.format(new Date(alert.getCtime()))%>",
- "title" : "<%=alert.getAlertDefinition().getName()%>",
+ "title" : "<%= (""+alert.getAlertDefinition().getName()).replaceAll("[\"']","").trim()%>",
"link" : "<%=link%>",
- "description" : "<%=buf.toString()%>",
+ "description" : "<%= (""+buf.toString()).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=(alert.getAlertDefinition().getPriority() == AlertPriority.LOW ? "#4EB84E" : "#DD5656")%>"
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventConfigJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventConfigJSON.jsp
index b64cb55..6bb34c4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventConfigJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventConfigJSON.jsp
@@ -49,7 +49,7 @@
{ "start" : "<%=sdf.format(configUpdate.getCreatedTime())%>",
"title" : "Configuration Change",
"link" : "<%=link%>",
- "description" : "<b>User:</b> <%=configUpdate.getSubjectName()%><br/><b>Status:</b> <%=configUpdate.getStatus()%>",
+ "description" : "<b>User:</b> <%= (""+configUpdate.getSubjectName()).replaceAll("[\"']","").trim()%><br/><b>Status:</b> <%= (""+configUpdate.getStatus()).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=(configUpdate.getStatus() != ConfigurationUpdateStatus.FAILURE ? "#4EB84E" : "#DD5656")%>"
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp
index ccb197b..093c943 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventContentJSON.jsp
@@ -67,9 +67,9 @@
%>
{ "start" : "<%=sdf.format(new Date(installedPackage.getTimestamp()))%>",
- "title" : "<%=installedPackage.getPackageVersion().getDisplayName() + " " + installedPackage.getPackageVersion().getDisplayVersion()%>",
+ "title" : "<%= (""+installedPackage.getPackageVersion().getDisplayName() + " " + installedPackage.getPackageVersion().getDisplayVersion()).replaceAll("[\"']","").trim()%>",
"link" : "<%=link%>",
- "description" : "<b>User:</b> <%= installedPackage.getContentServiceRequest() == null ? "-Detected-" : installedPackage.getContentServiceRequest().getSubjectName()%><br/> <b>Version: <%=installedPackage.getPackageVersion().getDisplayVersion()%></b> <br/><b>Status:</b> <%=installedPackage.getStatus()%>",
+ "description" : "<b>User:</b> <%= (""+installedPackage.getContentServiceRequest() == null ? "-Detected-" : installedPackage.getContentServiceRequest().getSubjectName()).replaceAll("[\"']","").trim()%><br/> <b>Version: <%= (""+installedPackage.getPackageVersion().getDisplayVersion()).replaceAll("[\"']","").trim()%></b> <br/><b>Status:</b> <%=(""+installedPackage.getStatus()).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=(installedPackage.getStatus() != InstalledPackageHistoryStatus.FAILED ? "#4EB84E" : "#DD5656")%>"
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventCreateDeleteChildJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventCreateDeleteChildJSON.jsp
index 5e139db..46f3480 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventCreateDeleteChildJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventCreateDeleteChildJSON.jsp
@@ -65,7 +65,7 @@
{ "start" : "<%=sdf.format(entry.getCreatedTime())%>",
"title" : "Child resource created",
"link" : "<%=link%>",
- "description" : "<b>User:</b> <%=entry.getSubjectName()%><br/><b>Status:</b> <%=entry.getStatus()%>",
+ "description" : "<b>User:</b> <%=(""+entry.getSubjectName()).replaceAll("[\"']","").trim()%><br/><b>Status:</b> <%=(""+entry.getStatus()).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=(entry.getStatus() != CreateResourceStatus.FAILURE ? "#4EB84E" : "#DD5656")%>"
}
@@ -101,7 +101,7 @@
{ "start" : "<%=sdf.format(entry.getCreatedTime())%>",
"title" : "Child resource deleted",
"link" : "<%=link%>",
- "description" : "<b>User:</b> <%=entry.getSubjectName()%><br/><b>Status:</b> <%=entry.getStatus()%>",
+ "description" : "<b>User:</b> <%=(""+entry.getSubjectName()).replaceAll("[\"']","").trim()%><br/><b>Status:</b> <%=(""+entry.getStatus()).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=(entry.getStatus() != DeleteResourceStatus.FAILURE ? "#4EB84E" : "#DD5656")%>"
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventEventsJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventEventsJSON.jsp
index e575df5..87a791d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventEventsJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventEventsJSON.jsp
@@ -178,9 +178,9 @@
%>
{ "start" : "<%=sdf.format(event.getTimestamp())%>",
- "title" : "<%= title%>",
+ "title" : "<%= (""+title).replaceAll("[\"']","").trim()%>",
"link" : "<%=link%>",
- "description" : "<%=detail%>",
+ "description" : "<%=(""+detail).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=color%>"
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventOperationsJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventOperationsJSON.jsp
index d42c09c..0846050 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventOperationsJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventOperationsJSON.jsp
@@ -58,9 +58,9 @@
%>
{ "start" : "<%=sdf.format(new Date(operation.getCreatedTime()))%>",
- "title" : "Operation: <%=operation.getOperationDefinition().getName()%>",
+ "title" : "Operation: <%=(""+operation.getOperationDefinition().getName()).replaceAll("[\"']","").trim()%>",
"link" : "<%=link%>",
- "description" : "<b>User:</b> <%=operation.getSubjectName()%><br/><b>Status:</b> <%=operation.getStatus()%>",
+ "description" : "<b>User:</b> <%=(""+operation.getSubjectName()).replaceAll("[\"']","").trim()%><br/><b>Status:</b> <%=(""+operation.getStatus()).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=(operation.getStatus() == OperationRequestStatus.SUCCESS ? "#4EB84E" : "#DD5656")%>"
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventPluginConfigJSON.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventPluginConfigJSON.jsp
index 9f8ce1d..06ff3aa 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventPluginConfigJSON.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/events/EventPluginConfigJSON.jsp
@@ -60,7 +60,7 @@
{ "start" : "<%=sdf.format(configUpdate.getCreatedTime())%>",
"title" : "Plugin Configuration Change",
"link" : "<%=link%>",
- "description" : "<b>User:</b> <%=configUpdate.getSubjectName()%><br/><b>Status:</b> <%=configUpdate.getStatus()%>",
+ "description" : "<b>User:</b> <%=(""+configUpdate.getSubjectName()).replaceAll("[\"']","").trim()%><br/><b>Status:</b> <%=(""+configUpdate.getStatus()).replaceAll("[\"']","").trim()%>",
"icon" : "<%=icon%>",
"color" : "<%=(configUpdate.getStatus() != ConfigurationUpdateStatus.FAILURE ? "#4EB84E" : "#DD5656")%>"
}
commit 59ef9c778f809c2723d3764c8dcd5bdf7660f909
Merge: d6c56f6... eb64c17...
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Mar 23 11:43:37 2010 -0400
Merge branch 'master' into ldap
commit d6c56f6ad3a3bbd9cc9d4ce20ef339623359da82
Merge: 8f0337b... 6bf9398...
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Mar 9 10:31:32 2010 -0500
Merge branch 'linux-config' into ldap
commit 8f0337b2df94be73adf900606e276b4d372dfa2a
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Mar 9 02:26:00 2010 -0500
Added code to handle ldap group queries
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index 4f3aaea..f2734a3 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -20,6 +20,7 @@ package org.rhq.enterprise.server.authz;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@@ -509,6 +510,9 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
}
private List<Role> findRolesByLdapGroupNames(List<String> ldapGroupNames) {
+ if (ldapGroupNames.isEmpty()) {
+ return Collections.EMPTY_LIST;
+ }
Query query = entityManager.createNamedQuery(LdapGroup.FIND_BY_ROLES_GROUP_NAMES);
query.setParameter("names", ldapGroupNames);
return (List<Role>) query.getResultList();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
index 3820a63..eb20236 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -19,7 +19,6 @@
package org.rhq.enterprise.server.resource.group;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -28,6 +27,8 @@ import java.util.Set;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
@@ -58,121 +59,110 @@ public class LdapGroupManager {
public Set<Map<String, String>> findAvailableGroups() {
SystemManagerLocal manager = LookupUtil.getSystemManager();
- manager.getSystemConfiguration();
- Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
- String[] names = { "bar", "foo" };
-
- for (String name : names) {
- Map<String, String> group = new HashMap<String, String>();
- group.put("id", name);
- group.put("name", name);
- group.put("description", name);
- ldapSet.add(group);
- }
- return ldapSet;
+
+ Properties options = manager.getSystemConfiguration();
+ String groupFilter = (String) options.get(RHQConstants.LDAPGroupFilter);
+ String filter = String.format("(%s)", groupFilter);
+
+ return buildGroup(options, filter);
}
public Set<String> findAvailableGroupsFor(String userName) {
SystemManagerLocal manager = LookupUtil.getSystemManager();
- manager.getSystemConfiguration();
- Set<String> ldapSet = new HashSet<String>();
- String[] names = { "foo" };
- for (String name : names) {
- ldapSet.add(name);
+ Properties options = manager.getSystemConfiguration();
+ String groupFilter = (String) options.get(RHQConstants.LDAPGroupFilter);
+ String groupMember = (String) options.get(RHQConstants.LDAPGroupMember);
+ String userDN = getUserDN(options, userName);
+ String filter = String.format("(&(%s)(%s=%s))", groupFilter, groupMember, userDN);
+
+ Set<Map<String, String>> matched = buildGroup(options, filter);
+
+ Set<String> ldapSet = new HashSet<String>();
+ for (Map<String, String> match : matched) {
+ ldapSet.add(match.get("id"));
}
return ldapSet;
}
- /*
- *
- {BindDN=uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com,
- java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, jboss.security.security_domain=JON,
- LoginProperty=uid, BaseDN=dc=rhndev,dc=redhat,dc=com, java.naming.provider.url=ldap://fjs-0-16.rhndev.redhat.com,
- java.naming.security.protocol=, BindPW=dog8code}
- */
- protected boolean test() throws Exception {
-
+ private String getUserDN(Properties options, String userName) {
// Load our LDAP specific properties
- Properties env = null;// getProperties();
+ Properties env = getProperties(options);
// Load the BaseDN
- String baseDN = "dc=rhndev,dc=redhat,dc=com";
+ // Load the BaseDN
+ String baseDN = (String) options.get(RHQConstants.LDAPBaseDN);
// Load the LoginProperty
- String loginProperty = "uid";
-
- // Load any search filter
-
- // Find the user that is calling us
- String userName = "sdoo";
-
+ String loginProperty = (String) options.get(RHQConstants.LDAPLoginProperty);
+ if (loginProperty == null) {
+ // Use the default
+ loginProperty = "cn";
+ }
// Load any information we may need to bind
- String bindDN = "uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com";
- String bindPW = "dog8code";
+ String bindDN = (String) options.get(RHQConstants.LDAPBindDN);
+ String bindPW = (String) options.get(RHQConstants.LDAPBindPW);
+ // Load any search filter
+ String searchFilter = (String) options.get(RHQConstants.LDAPFilter);
if (bindDN != null) {
env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
}
- InitialLdapContext ctx = new InitialLdapContext(env, null);
- SearchControls searchControls = getSearchControls();
-
- // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
- String filter;
- /* if ((searchFilter != null) && (searchFilter.length() != 0)) {
- filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
- } else {
- filter = "(" + loginProperty + "=" + userName + ")";
+
+ try {
+ InitialLdapContext ctx = new InitialLdapContext(env, null);
+ SearchControls searchControls = getSearchControls();
+
+ // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
+ String filter;
+ if ((searchFilter != null) && (searchFilter.length() != 0)) {
+ filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
+ } else {
+ filter = "(" + loginProperty + "=" + userName + ")";
+ }
+
+ log.debug("Using LDAP filter=" + filter);
+
+ // Loop through each configured base DN. It may be useful
+ // in the future to allow for a filter to be configured for
+ // each BaseDN, but for now the filter will apply to all.
+ String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+ for (int x = 0; x < baseDNs.length; x++) {
+ NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ if (!answer.hasMore()) {
+ log.debug("User " + userName + " not found for BaseDN " + baseDNs[x]);
+ // Nothing found for this DN, move to the next one if we have one.
+ continue;
}
- */
- //filter = "(" + loginProperty + "=" + userName + ")";
- filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
- + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
-
- // Loop through each configured base DN. It may be useful
- // in the future to allow for a filter to be configured for
- // each BaseDN, but for now the filter will apply to all.
- String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
- log.info(Arrays.asList(baseDNs));
- for (int x = 0; x < baseDNs.length; x++) {
- NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
- log.info(answer.hasMore());
- while (answer.hasMore()) {
+
// We use the first match
SearchResult si = (SearchResult) answer.next();
- log.info(si);
-
- /*
- // Construct the UserDN
- String userDN = si.getName() + "," + baseDNs[x];
- print (userDN);
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, "dog8code");
- ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
- ctx.reconnect(null);*/
+
+ // Construct the UserDN
+ String userDN = si.getName() + "," + baseDNs[x];
+ return userDN;
}
+ // If we try all the BaseDN's and have not found a match, return false
+ return "";
+ } catch (NamingException e) {
+ throw new RuntimeException(e);
}
-
- // If we try all the BaseDN's and have not found a match, return false
- return false;
}
/**
+ * @throws NamingException
* @see org.jboss.security.auth.spi.UsernamePasswordLoginModule#validatePassword(java.lang.String,java.lang.String)
*/
- protected void buildGroup(Properties options, String userName) {
+ protected Set<Map<String, String>> buildGroup(Properties options, String filter) {
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
// Load our LDAP specific properties
Properties env = getProperties(options);
// Load the BaseDN
String baseDN = (String) options.get(RHQConstants.LDAPBaseDN);
- if (baseDN == null) {
- // If the BaseDN is not specified, log an error and refuse the login attempt
- log.info("BaseDN is not set, refusing login");
- }
// Load the LoginProperty
String loginProperty = (String) options.get(RHQConstants.LDAPLoginProperty);
@@ -180,54 +170,46 @@ public class LdapGroupManager {
// Use the default
loginProperty = "cn";
}
-
- String groupFilter = (String) options.get("groupFilter");
- String groupMember = (String) options.get("groupMember");
-
// Load any information we may need to bind
- String bindDN = (String) options.get("BindDN");
- String bindPW = (String) options.get("BindPW");
+ String bindDN = (String) options.get(RHQConstants.LDAPBindDN);
+ String bindPW = (String) options.get(RHQConstants.LDAPBindPW);
if (bindDN != null) {
env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
}
-
try {
InitialLdapContext ctx = new InitialLdapContext(env, null);
SearchControls searchControls = getSearchControls();
- String filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
- + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
- // Load any search filter
- String searchFilter = (String) options.get("Filter");
- // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
- if ((searchFilter != null) && (searchFilter.length() != 0)) {
- filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
- } else {
- filter = "(" + loginProperty + "=" + userName + ")";
- }
+ /*String filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
+ + ",ou=People, dc=rhndev, dc=redhat, dc=com))";*/
// Loop through each configured base DN. It may be useful
// in the future to allow for a filter to be configured for
// each BaseDN, but for now the filter will apply to all.
String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+
for (int x = 0; x < baseDNs.length; x++) {
NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
- if (!answer.hasMore()) {
- log.debug("User " + userName + " not found for BaseDN " + baseDNs[x]);
-
- // Nothing found for this DN, move to the next one if we have one.
- continue;
+ while (answer.hasMore()) {
+ // We use the first match
+ SearchResult si = (SearchResult) answer.next();
+ Map<String, String> entry = new HashMap<String, String>();
+ String name = (String) si.getAttributes().get("cn").get();
+ Attribute desc = si.getAttributes().get("description");
+ String description = desc != null ? (String) desc.get() : "";
+ entry.put("id", name);
+ entry.put("name", name);
+ entry.put("description", description);
+ ret.add(entry);
}
-
- // We use the first match
- SearchResult si = (SearchResult) answer.next();
-
}
-
- } catch (Exception e) {
- log.info("Failed to validate password: " + e.getMessage());
+ } catch (NamingException e) {
+ // TODO Auto-generated catch block
+ throw new RuntimeException(e);
}
+
+ return ret;
}
/**
@@ -240,13 +222,11 @@ public class LdapGroupManager {
private Properties getProperties(Properties options) {
Properties env = new Properties(options);
// Set our default factory name if one is not given
- String factoryName = env.getProperty(Context.INITIAL_CONTEXT_FACTORY);
- if (factoryName == null) {
- env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
- }
+ String factoryName = env.getProperty(RHQConstants.LDAPFactory);
+ env.setProperty(Context.INITIAL_CONTEXT_FACTORY, factoryName);
// Setup SSL if requested
- String protocol = env.getProperty(Context.SECURITY_PROTOCOL);
+ String protocol = env.getProperty(RHQConstants.LDAPProtocol);
if ((protocol != null) && protocol.equals("ssl")) {
String ldapSocketFactory = env.getProperty("java.naming.ldap.factory.socket");
if (ldapSocketFactory == null) {
@@ -256,7 +236,7 @@ public class LdapGroupManager {
}
// Set the LDAP url
- String providerUrl = env.getProperty(Context.PROVIDER_URL);
+ String providerUrl = env.getProperty(RHQConstants.LDAPUrl);
if (providerUrl == null) {
providerUrl = "ldap://localhost:" + (((protocol != null) && protocol.equals("ssl")) ? "636" : "389");
}
commit 08e009091f9fbea25e5b08c3ab8b0bb82fa2c71d
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 14:51:08 2010 -0500
Added the logic to sync roles to ldap users on login
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
index 78fa9dc..b8e2beb 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
@@ -43,13 +43,16 @@ import org.rhq.core.domain.authz.Role;
*
*/
@Entity
-@NamedQueries( { @NamedQuery(name = LdapGroup.DELETE_BY_ID, query = "DELETE FROM LdapGroup an WHERE an.id IN ( :ids )") })
+@NamedQueries( {
+ @NamedQuery(name = LdapGroup.DELETE_BY_ID, query = "DELETE FROM LdapGroup an WHERE an.id IN ( :ids )"),
+ @NamedQuery(name = LdapGroup.FIND_BY_ROLES_GROUP_NAMES, query = "SELECT distinct l.role FROM LdapGroup l WHERE l.name in (:names)") })
@Table(name = "RHQ_ROLE_LDAP_GROUP")
@SequenceGenerator(name = "id", sequenceName = "RHQ_ROLE_LDAP_GROUP_ID_SEQ", allocationSize = 100)
@XmlAccessorType(XmlAccessType.FIELD)
public class LdapGroup implements Serializable {
private static final long serialVersionUID = 1L;
public static final String DELETE_BY_ID = "LdapGroup.deleteById";
+ public static final String FIND_BY_ROLES_GROUP_NAMES = "LdapGroup.findRolesByGroupNames";
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
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 1c8b5a0..2c6db30 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,7 +18,9 @@
*/
package org.rhq.enterprise.gui.admin.user;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -37,7 +39,10 @@ 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.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.resource.group.LdapGroupManager;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -106,6 +111,14 @@ public class RegisterAction extends BaseAction {
HashMap parms = new HashMap(1);
parms.put(Constants.USER_PARAM, newSubject.getId());
+ String provider = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(RHQConstants.JAASProvider);
+ if (RHQConstants.LDAPJAASProvider.equals(provider)) {
+ List<String> groupNames = new ArrayList(LdapGroupManager.getInstance().findAvailableGroupsFor(
+ newSubject.getName()));
+ RoleManagerLocal roleManager = LookupUtil.getRoleManager();
+ roleManager.assignRolesToLdapSubject(newSubject.getId(), groupNames);
+
+ }
return returnSuccess(request, mapping, parms, false);
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index bcf7738..4f3aaea 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -174,6 +174,14 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
*/
@RequiredPermission(Permission.MANAGE_SECURITY)
public void addRolesToSubject(Subject subject, int subjectId, int[] roleIds) {
+ addRolesToSubject(subject, subjectId, roleIds, false);
+ }
+
+ /**
+ * @see org.rhq.enterprise.server.authz.RoleManagerLocal#addRolesToSubject(Subject, int, int[])
+ */
+ @RequiredPermission(Permission.MANAGE_SECURITY)
+ public void addRolesToSubject(Subject subject, int subjectId, int[] roleIds, boolean isLdap) {
if (roleIds != null) {
Subject subjectToModify = subjectManager.getSubjectById(subjectId); // attach it
if (subjectToModify == null) {
@@ -194,10 +202,11 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
+ "], but role was not found");
}
role.addSubject(subjectToModify);
+ if (isLdap) {
+ role.addLdapSubject(subjectToModify);
+ }
}
}
-
- return;
}
/**
@@ -499,6 +508,23 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
}
}
+ private List<Role> findRolesByLdapGroupNames(List<String> ldapGroupNames) {
+ Query query = entityManager.createNamedQuery(LdapGroup.FIND_BY_ROLES_GROUP_NAMES);
+ query.setParameter("names", ldapGroupNames);
+ return (List<Role>) query.getResultList();
+ }
+
+ public void assignRolesToLdapSubject(int subjectId, List<String> ldapGroupNames) {
+ Subject sub = entityManager.find(Subject.class, subjectId);
+ List<Role> roles = findRolesByLdapGroupNames(ldapGroupNames);
+ sub.getRoles().clear();
+ sub.getLdapRoles().clear();
+ for (Role role : roles) {
+ sub.addRole(role);
+ sub.addLdapRole(role);
+ }
+ }
+
private void processDependentPermissions(Role role) {
/*
* if you can control user/roles, then you can give yourself permissions, too; so we might as well
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
index 34b81e0..30dcceb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
@@ -219,4 +219,5 @@ public interface RoleManagerLocal {
PageList<Role> findRolesByCriteria(Subject subject, RoleCriteria criteria);
+ void assignRolesToLdapSubject(int subjectId, List<String> ldapGroupNames);
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
index 1875475..3820a63 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -72,18 +72,14 @@ public class LdapGroupManager {
return ldapSet;
}
- public Set<Map<String, String>> findAvailableGroupsFor(String userName) {
+ public Set<String> findAvailableGroupsFor(String userName) {
SystemManagerLocal manager = LookupUtil.getSystemManager();
manager.getSystemConfiguration();
- Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
- String[] names = { "bar", "foo" };
+ Set<String> ldapSet = new HashSet<String>();
+ String[] names = { "foo" };
for (String name : names) {
- Map<String, String> group = new HashMap<String, String>();
- group.put("id", name);
- group.put("name", name);
- group.put("description", name);
- ldapSet.add(group);
+ ldapSet.add(name);
}
return ldapSet;
}
commit ac2479467dc65ab832e240749582df68183be033
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 12:07:05 2010 -0500
Added methods to get 2 kinds of ldap groups
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
index c673cb5..78b1f1f 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
@@ -81,8 +81,7 @@ public class AddLdapGroupsFormPrepareAction extends TilesAction {
log.trace("getting pending groups for role [" + roleId + ")");
String name = "foo";
- Set<Map<String, String>> allGroups = LdapGroupManager.getInstance().findAvailableGroupsByRole(whoami,
- role.getId());
+ Set<Map<String, String>> allGroups = LdapGroupManager.getInstance().findAvailableGroups();
RoleManagerLocal roleManager = LookupUtil.getRoleManager();
PageList<LdapGroup> assignedList = roleManager.findLdapGroupsByRole(role.getId(), PageControl
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
index 86bd8b4..1875475 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -35,7 +35,6 @@ import javax.naming.ldap.InitialLdapContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.core.domain.auth.Subject;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -57,7 +56,23 @@ public class LdapGroupManager {
return INSTANCE;
}
- public Set<Map<String, String>> findAvailableGroupsByRole(Subject subject, int roleId) {
+ public Set<Map<String, String>> findAvailableGroups() {
+ SystemManagerLocal manager = LookupUtil.getSystemManager();
+ manager.getSystemConfiguration();
+ Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
+ String[] names = { "bar", "foo" };
+
+ for (String name : names) {
+ Map<String, String> group = new HashMap<String, String>();
+ group.put("id", name);
+ group.put("name", name);
+ group.put("description", name);
+ ldapSet.add(group);
+ }
+ return ldapSet;
+ }
+
+ public Set<Map<String, String>> findAvailableGroupsFor(String userName) {
SystemManagerLocal manager = LookupUtil.getSystemManager();
manager.getSystemConfiguration();
Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
commit 4730f9bdaf6da619e1b4b5b61936bb3d5450725d
Merge: c4d4879... 3fcd671...
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 09:50:22 2010 -0500
Merge branch 'linux-config' into ldap
commit c4d48792e4876666f24ed0159562cb00eba3d3b0
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 09:49:26 2010 -0500
Added functionality to deal with roles
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index 6e0a31e..fc59516 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -27,16 +27,16 @@
</constraint>
</table>
- <table name="RHQ_ROLE_LDAP_GROUP_MAP">
+ <table name="RHQ_ROLE_LDAP_GROUP">
+ <column name="ID" default="sequence-only" initial="10001"
+ primarykey="true" required="true" type="INTEGER"/>
<column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
- <column name="LDAP_GROUP_NAME" required="true" type="VARCHAR2"/>
+ <column name="LDAP_GROUP_NAME" size="128" required="true" type="VARCHAR2"/>
- <constraint name="RHQ_ROLE_LDAP_GROUP_MAP_KEY">
- <primaryKey>
- <field ref="ROLE_ID"/>
- <field ref="LDAP_GROUP_NAME"/>
- </primaryKey>
- </constraint>
+ <index name="RHQ_ROLE_LDAP_GROUP_IDX" unique="true">
+ <field ref="ROLE_ID"/>
+ <field ref="LDAP_GROUP_NAME"/>
+ </index>
</table>
<table name="RHQ_PERMISSION">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 9b991cd..beb1703 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -240,6 +240,7 @@ public class Subject implements Externalizable {
private void init() {
roles = new HashSet<Role>();
+ ldapRoles = new HashSet<Role>();
}
/**
@@ -376,8 +377,15 @@ public class Subject implements Externalizable {
this.roles = roles;
}
- public void addRole(Role role) {
+ public void addRole(Role role, boolean isLdap) {
getRoles().add(role);
+ if (isLdap) {
+ getLdapRoles().add(role);
+ }
+ }
+
+ public void addRole(Role role) {
+ addRole(role, false);
}
public void removeRole(Role role) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index b7004bd..ada89a8 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -37,6 +37,7 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@@ -46,6 +47,7 @@ import org.hibernate.annotations.CollectionOfElements;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.resource.group.LdapGroup;
/**
* A role has zero or more {@link org.rhq.core.domain.resource.group.ResourceGroup}s assigned to it. You can assign a
@@ -110,6 +112,9 @@ public class Role implements Serializable {
@ManyToMany(mappedBy = "ldapRoles")
private java.util.Set<Subject> ldapSubjects = new HashSet<Subject>();
+ @OneToMany(mappedBy = "role", cascade = javax.persistence.CascadeType.ALL)
+ private Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
+
@ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@@ -181,6 +186,26 @@ public class Role implements Serializable {
return this.permissions.remove(permission);
}
+ public Set<LdapGroup> getLdapGroups() {
+ if (ldapGroups == null) {
+ ldapGroups = new HashSet<LdapGroup>();
+ }
+ return this.ldapGroups;
+ }
+
+ public void setLdapGroups(Set<LdapGroup> groups) {
+ this.ldapGroups = groups;
+ }
+
+ public void addLdapGroup(LdapGroup ldapGroup) {
+ ldapGroup.setRole(this);
+ this.ldapGroups.add(ldapGroup);
+ }
+
+ public boolean removeLdapGroup(LdapGroup ldapGroup) {
+ return this.ldapGroups.remove(ldapGroup);
+ }
+
public java.util.Set<Subject> getSubjects() {
return subjects;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
new file mode 100644
index 0000000..78fa9dc
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
@@ -0,0 +1,125 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.resource.group;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+
+import org.rhq.core.domain.authz.Role;
+
+/**
+ * @author paji
+ *
+ */
+@Entity
+@NamedQueries( { @NamedQuery(name = LdapGroup.DELETE_BY_ID, query = "DELETE FROM LdapGroup an WHERE an.id IN ( :ids )") })
+@Table(name = "RHQ_ROLE_LDAP_GROUP")
+@SequenceGenerator(name = "id", sequenceName = "RHQ_ROLE_LDAP_GROUP_ID_SEQ", allocationSize = 100)
+(a)XmlAccessorType(XmlAccessType.FIELD)
+public class LdapGroup implements Serializable {
+ private static final long serialVersionUID = 1L;
+ public static final String DELETE_BY_ID = "LdapGroup.deleteById";
+ @Id
+ @Column(name = "ID", nullable = false)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
+ private Integer id;
+
+ @ManyToOne
+ @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID", nullable = false)
+ private Role role;
+
+ @Column(name = "LDAP_GROUP_NAME", nullable = false)
+ private String name;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Transient
+ private String description = "";
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Role getRole() {
+ return role;
+ }
+
+ public void setRole(Role role) {
+ this.role = role;
+ }
+
+ @Override
+ public int hashCode() {
+ return getName().hashCode() + 17 * ((role != null) ? role.hashCode() : 0);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+
+ if (!(o instanceof LdapGroup)) {
+ return false;
+ }
+ LdapGroup grp = (LdapGroup) o;
+ if (!getName().equals(grp.getName())) {
+ return false;
+ }
+
+ if (getRole() != null) {
+ return getRole().equals(grp.getRole());
+ }
+
+ return grp.getRole() == null;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
index 4f35fe6..237858d 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
@@ -568,7 +568,7 @@ public class SystemConfigForm extends BaseValidatorForm {
public void setLdapSearchFilter(String s) {
ldapSearchFilter = s;
}
-
+
public String getLdapGroupFilter() {
return ldapGroupFilter;
}
@@ -578,7 +578,7 @@ public class SystemConfigForm extends BaseValidatorForm {
}
public String getLdapGroupMember() {
- return ldapGroupFilter;
+ return ldapGroupMember;
}
public void setLdapGroupMember(String s) {
@@ -609,7 +609,6 @@ public class SystemConfigForm extends BaseValidatorForm {
this.reindex = reindex;
}
-
/* (non-Javadoc)
* @see org.apache.struts.action.ActionForm#validate(org.apache.struts.action.ActionMapping,
* javax.servlet.http.HttpServletRequest)
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java
new file mode 100644
index 0000000..fe91d46
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java
@@ -0,0 +1,87 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.logging.Log;
+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.rhq.enterprise.gui.legacy.Constants;
+import org.rhq.enterprise.gui.legacy.action.BaseAction;
+import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
+import org.rhq.enterprise.gui.legacy.util.RequestUtils;
+import org.rhq.enterprise.gui.legacy.util.SessionUtils;
+import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * An Action that adds resource groups for a role.
+ */
+public class AddLdapGroupsAction extends BaseAction {
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+ Log log = LogFactory.getLog(AddLdapGroupsAction.class.getName());
+ HttpSession session = request.getSession();
+
+ AddLdapGroupsForm addForm = (AddLdapGroupsForm) form;
+ Integer roleId = addForm.getR();
+
+ ActionForward forward = checkSubmit(request, mapping, form, Constants.ROLE_PARAM, roleId);
+ if (forward != null) {
+ BaseValidatorForm spiderForm = (BaseValidatorForm) form;
+
+ if (spiderForm.isCancelClicked() || spiderForm.isResetClicked()) {
+ log.debug("removing pending group list");
+ SessionUtils.removeList(session, Constants.PENDING_RESGRPS_SES_ATTR);
+ } else if (spiderForm.isAddClicked()) {
+ log.debug("adding to pending group list");
+ SessionUtils.addToList(session, Constants.PENDING_RESGRPS_SES_ATTR, addForm.getAvailableGroups());
+ } else if (spiderForm.isRemoveClicked()) {
+ log.debug("removing from pending group list");
+ SessionUtils.removeFromList(session, Constants.PENDING_RESGRPS_SES_ATTR, addForm.getPendingGroups());
+ }
+
+ return forward;
+ }
+
+ log.debug("getting pending group list");
+ List<String> pendingGroupIds = SessionUtils.getListAsListStr(request.getSession(),
+ Constants.PENDING_RESGRPS_SES_ATTR);
+ for (String id : pendingGroupIds) {
+ log.debug("adding group [" + id + "] for role [" + roleId + "]");
+ }
+
+ RoleManagerLocal roleManager = LookupUtil.getRoleManager();
+ roleManager.addLdapGroupsToRole(RequestUtils.getSubject(request), roleId, pendingGroupIds);
+
+ log.debug("removing pending group list");
+ SessionUtils.removeList(session, Constants.PENDING_RESGRPS_SES_ATTR);
+
+ RequestUtils.setConfirmation(request, "admin.role.confirm.AddLdapGroups");
+ return returnSuccess(request, mapping, Constants.ROLE_PARAM, roleId);
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java
new file mode 100644
index 0000000..4740012
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java
@@ -0,0 +1,139 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts.action.ActionMapping;
+
+import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
+
+/**
+ * A subclass of <code>Spider</code> representing the <em>Add Role Resource Groups</em> form.
+ */
+public class AddLdapGroupsForm extends BaseValidatorForm {
+ //-------------------------------------instance variables
+
+ private String[] availableGroups;
+ private String[] pendingGroups;
+ private Integer psa;
+ private Integer psp;
+ private Integer r;
+
+ //-------------------------------------constructors
+
+ public AddLdapGroupsForm() {
+ super();
+ }
+
+ //-------------------------------------public methods
+
+ public String[] getAvailableGroup() {
+ return this.availableGroups;
+ }
+
+ public String[] getAvailableGroups() {
+ return getAvailableGroup();
+ }
+
+ public void setAvailableGroup(String[] availableGroups) {
+ this.availableGroups = availableGroups;
+ }
+
+ public void setAvailableGroups(String[] availableGroups) {
+ setAvailableGroup(availableGroups);
+ }
+
+ public String[] getPendingGroup() {
+ return this.pendingGroups;
+ }
+
+ public String[] getPendingGroups() {
+ return getPendingGroup();
+ }
+
+ public void setPendingGroup(String[] pendingGroups) {
+ this.pendingGroups = pendingGroups;
+ }
+
+ public void setPendingGroups(String[] pendingGroups) {
+ setPendingGroup(pendingGroups);
+ }
+
+ public Integer getPsa() {
+ return this.psa;
+ }
+
+ public void setPsa(Integer ps) {
+ this.psa = ps;
+ }
+
+ public Integer getPsp() {
+ return this.psp;
+ }
+
+ public void setPsp(Integer ps) {
+ this.psp = ps;
+ }
+
+ public Integer getR() {
+ return this.r;
+ }
+
+ public void setR(Integer r) {
+ this.r = r;
+ }
+
+ public void reset(ActionMapping mapping, HttpServletRequest request) {
+ super.reset(mapping, request);
+ this.psa = null;
+ this.psp = null;
+ this.r = null;
+ this.pendingGroups = new String[0];
+ this.availableGroups = new String[0];
+ }
+
+ public String toString() {
+ StringBuilder s = new StringBuilder(super.toString());
+ s.append("r=" + r + " ");
+ s.append("psa=" + psa + " ");
+ s.append("psp=" + psp + " ");
+
+ s.append("availableGroups={");
+ listToString(s, availableGroups);
+ s.append("} ");
+
+ s.append("pendingGroups={");
+ listToString(s, pendingGroups);
+ s.append("}");
+
+ return s.toString();
+ }
+
+ private void listToString(StringBuilder s, String[] l) {
+ if (l != null) {
+ for (int i = 0; i < l.length; i++) {
+ s.append(l[i]);
+ if (i < (l.length - 1)) {
+ s.append(", ");
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
new file mode 100644
index 0000000..c673cb5
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
@@ -0,0 +1,149 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+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.tiles.ComponentContext;
+import org.apache.struts.tiles.actions.TilesAction;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Role;
+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.gui.legacy.Constants;
+import org.rhq.enterprise.gui.legacy.util.RequestUtils;
+import org.rhq.enterprise.gui.legacy.util.SessionUtils;
+import org.rhq.enterprise.gui.util.WebUtility;
+import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.resource.group.LdapGroupManager;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * An Action that retrieves data to facilitate display of the form for adding groups to a role.
+ */
+public class AddLdapGroupsFormPrepareAction extends TilesAction {
+ public ActionForward execute(ComponentContext context, ActionMapping mapping, ActionForm form,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+ Log log = LogFactory.getLog(AddLdapGroupsFormPrepareAction.class.getName());
+
+ Subject whoami = RequestUtils.getSubject(request);
+ AddLdapGroupsForm addForm = (AddLdapGroupsForm) form;
+ Integer roleId = addForm.getR();
+
+ if (roleId == null) {
+ roleId = RequestUtils.getRoleId(request);
+ }
+
+ Role role = (Role) request.getAttribute(Constants.ROLE_ATTR);
+ if (role == null) {
+ RequestUtils.setError(request, Constants.ERR_ROLE_NOT_FOUND);
+ return null;
+ }
+
+ addForm.setR(role.getId());
+
+ PageControl pca = WebUtility.getPageControl(request, "a");
+ PageControl pcp = WebUtility.getPageControl(request, "p");
+
+ /* pending groups are those on the right side of the "add
+ * to list" widget- awaiting association with the rolewhen the form's "ok" button is clicked. */
+ List<String> pendingGroupIds = SessionUtils.getListAsListStr(request.getSession(),
+ Constants.PENDING_RESGRPS_SES_ATTR);
+
+ log.trace("getting pending groups for role [" + roleId + ")");
+ String name = "foo";
+ Set<Map<String, String>> allGroups = LdapGroupManager.getInstance().findAvailableGroupsByRole(whoami,
+ role.getId());
+ RoleManagerLocal roleManager = LookupUtil.getRoleManager();
+
+ PageList<LdapGroup> assignedList = roleManager.findLdapGroupsByRole(role.getId(), PageControl
+ .getUnlimitedInstance());
+
+ allGroups = filterExisting(assignedList, allGroups);
+ Set<String> pendingIds = new HashSet<String>(pendingGroupIds);
+
+ Set<Map<String, String>> pendingSet = findPendingGroups(pendingIds, allGroups);
+ PageList<Map<String, String>> pendingGroups = new PageList<Map<String, String>>(pendingSet, pendingSet.size(),
+ pcp);
+
+ request.setAttribute(Constants.PENDING_RESGRPS_ATTR, pendingGroups);
+ request.setAttribute(Constants.NUM_PENDING_RESGRPS_ATTR, new Integer(pendingGroups.getTotalSize()));
+
+ /* available groups are all groups in the system that are not
+ * associated with the role and are not pending
+ */
+ log.trace("getting available groups for role [" + roleId + "]");
+
+ Set<Map<String, String>> availableGroupsSet = findAvailableGroups(pendingIds, allGroups);
+ PageList<Map<String, String>> availableGroups = new PageList<Map<String, String>>(availableGroupsSet,
+ availableGroupsSet.size(), pca);
+ request.setAttribute(Constants.AVAIL_RESGRPS_ATTR, availableGroups);
+ request.setAttribute(Constants.NUM_AVAIL_RESGRPS_ATTR, new Integer(availableGroups.getTotalSize()));
+
+ return null;
+ }
+
+ private Set<Map<String, String>> findPendingGroups(Set<String> pending, Set<Map<String, String>> allGroups) {
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
+ for (Map<String, String> group : allGroups) {
+ if (pending.contains(group.get("name"))) {
+ ret.add(group);
+ }
+ }
+ return ret;
+ }
+
+ private Set<Map<String, String>> findAvailableGroups(Set<String> pending, Set<Map<String, String>> allGroups) {
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
+ for (Map<String, String> group : allGroups) {
+ if (!pending.contains(group.get("name"))) {
+ ret.add(group);
+ }
+ }
+ return ret;
+ }
+
+ private Set<Map<String, String>> filterExisting(List<LdapGroup> pendingItems, Set<Map<String, String>> allGroups) {
+ Set<String> pending = new HashSet<String>();
+ for (LdapGroup group : pendingItems) {
+ pending.add(group.getName());
+ }
+
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
+ for (Map<String, String> group : allGroups) {
+ if (!pending.contains(group.get("name"))) {
+ ret.add(group);
+ }
+ }
+ return ret;
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java
new file mode 100644
index 0000000..fb359c6
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java
@@ -0,0 +1,54 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+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.rhq.core.util.collection.ArrayUtils;
+import org.rhq.enterprise.gui.legacy.Constants;
+import org.rhq.enterprise.gui.legacy.action.BaseAction;
+import org.rhq.enterprise.gui.legacy.util.RequestUtils;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * An Action that retrieves data to facilitate display of the form for removing groups to a role.
+ */
+public class RemoveLdapGroupsAction extends BaseAction {
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+ Log log = LogFactory.getLog(RemoveLdapGroupsAction.class.getName());
+
+ RemoveResourceGroupsForm rmForm = (RemoveResourceGroupsForm) form;
+ int roleId = rmForm.getR();
+ int[] groupIds = ArrayUtils.unwrapArray(rmForm.getLdapGroups());
+
+ log.debug("removing groups " + groupIds + "] for role [" + roleId + "]");
+ LookupUtil.getRoleManager().removeLdapGroupsFromRole(RequestUtils.getSubject(request), roleId, groupIds);
+
+ RequestUtils.setConfirmation(request, "admin.role.confirm.RemoveLdapGroups");
+ return returnSuccess(request, mapping, Constants.ROLE_PARAM, roleId);
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java
index 578136d..3ce789d 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java
@@ -19,7 +19,9 @@
package org.rhq.enterprise.gui.admin.role;
import javax.servlet.http.HttpServletRequest;
+
import org.apache.struts.action.ActionMapping;
+
import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
/**
@@ -28,6 +30,9 @@ import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
public class RemoveResourceGroupsForm extends BaseValidatorForm {
//-------------------------------------instance variables
+ private Integer[] ldapGroups;
+ private Integer ldapGroupPageSize;
+
private Integer[] groups;
private Integer r;
@@ -51,6 +56,14 @@ public class RemoveResourceGroupsForm extends BaseValidatorForm {
this.groups = groups;
}
+ public void setLdapGroups(Integer[] groups) {
+ this.ldapGroups = groups;
+ }
+
+ public Integer[] getLdapGroups() {
+ return ldapGroups;
+ }
+
public Integer getPsg() {
return getPs();
}
@@ -59,6 +72,14 @@ public class RemoveResourceGroupsForm extends BaseValidatorForm {
setPs(pageSize);
}
+ public Integer getPsldapGroups() {
+ return ldapGroupPageSize;
+ }
+
+ public void setPsldapGroups(Integer pageSize) {
+ ldapGroupPageSize = pageSize;
+ }
+
public Integer getR() {
return this.r;
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java
index 2918c1d..b637b98 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java
@@ -20,14 +20,17 @@ package org.rhq.enterprise.gui.admin.role;
import java.util.HashMap;
import java.util.Properties;
+
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+
import org.apache.commons.logging.Log;
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.rhq.core.domain.authz.Role;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.Portal;
@@ -55,6 +58,9 @@ public class RoleAdminPortalAction extends BaseDispatchAction {
private static final String TITLE_ADD_GROUPS = "admin.role.AddRoleGroupsTitle";
private static final String PORTLET_ADD_GROUPS = ".admin.role.AddGroups";
+ private static final String TITLE_ADD_LDAP_GROUPS = "admin.role.AddRoleLdapGroupsTitle";
+ private static final String PORTLET_ADD_LDAP_GROUPS = ".admin.role.AddLdapGroups";
+
private static final String TITLE_EDIT = "admin.role.EditRoleTitle";
private static final String PORTLET_EDIT = ".admin.role.Edit";
@@ -78,6 +84,7 @@ public class RoleAdminPortalAction extends BaseDispatchAction {
keyMethodMap.setProperty(Constants.MODE_LIST, "listRoles");
keyMethodMap.setProperty(Constants.MODE_ADD_USERS, "addRoleUsers");
keyMethodMap.setProperty(Constants.MODE_ADD_GROUPS, "addRoleGroups");
+ keyMethodMap.setProperty(Constants.MODE_ADD_LDAP_GROUPS, "addLdapGroups");
keyMethodMap.setProperty(Constants.MODE_EDIT, "editRole");
keyMethodMap.setProperty(Constants.MODE_NEW, "newRole");
keyMethodMap.setProperty(Constants.MODE_VIEW, "viewRole");
@@ -121,6 +128,17 @@ public class RoleAdminPortalAction extends BaseDispatchAction {
return null;
}
+ public ActionForward addLdapGroups(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+ setRole(request);
+
+ Portal portal = Portal.createPortal(TITLE_ADD_LDAP_GROUPS, PORTLET_ADD_LDAP_GROUPS);
+ portal.setDialog(true);
+ request.setAttribute(Constants.PORTAL_KEY, portal);
+
+ return null;
+ }
+
public ActionForward editRole(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
setRole(request);
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java
index dd53eed..3414dab 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java
@@ -35,6 +35,7 @@ import org.apache.struts.tiles.ComponentContext;
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.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.AuthzConstants;
import org.rhq.core.domain.util.PageControl;
@@ -69,8 +70,10 @@ public class ViewAction extends WorkflowPrepareAction {
Subject whoami = RequestUtils.getSubject(request);
PageControl pcu = WebUtility.getPageControl(request, "u");
PageControl pcg = WebUtility.getPageControl(request, "g");
+ PageControl pcldap = WebUtility.getPageControl(request, "l");
log.trace("user page control: " + pcu);
log.trace("group page control: " + pcg);
+ log.trace("ldap group page control: " + pcldap);
RoleManagerLocal roleManager = LookupUtil.getRoleManager();
ResourceGroupManagerLocal groupManager = LookupUtil.getResourceGroupManager();
@@ -101,6 +104,14 @@ public class ViewAction extends WorkflowPrepareAction {
request.setAttribute(Constants.NUM_RESGRPS_ATTR, new Integer(groups.getTotalSize()));
}
+ PageList<LdapGroup> ldapGroups = roleManager.findLdapGroupsByRole(roleId, pcldap);
+ request.setAttribute(Constants.ROLE_LDAPGRPS_ATTR, ldapGroups);
+ if (ldapGroups == null) {
+ request.setAttribute(Constants.NUM_LDAPGRPS_ATTR, new Integer(0));
+ } else {
+ request.setAttribute(Constants.NUM_LDAPGRPS_ATTR, new Integer(ldapGroups.getTotalSize()));
+ }
+
// create and initialize the remove users form
RemoveUsersForm rmUsersForm = new RemoveUsersForm();
rmUsersForm.setR(roleId);
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java
index 5c82d46..6c87a4f 100755
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java
@@ -233,6 +233,12 @@ public interface AttrConstants {
public static final String ROLE_RESGRPS_ATTR = "RoleResGrps";
/**
+ * The request scope attribute under which actions store the <code>List</code> of <code>LDAPGroupValue</code>
+ * objects for the requested role.
+ */
+ public static final String ROLE_LDAPGRPS_ATTR = "RoleLdapGrps";
+
+ /**
* The request scope attribute under which actions store the number of <code>AuthzSubjectValue</code> objects in the
* associated <code>List</code>.
*/
@@ -298,6 +304,12 @@ public interface AttrConstants {
public static final String NUM_RESGRPS_ATTR = "NumResGrps";
/**
+ * The request scope attribute under which actions store the number of <code>LdapGroupValue</code> objects in
+ * the associated <code>List</code>.
+ */
+ public static final String NUM_LDAPGRPS_ATTR = "NumLdapGrps";
+
+ /**
* The request scope attribute under which actions store the full <code>List</code> of <code>
* ResourceGroupValue</code> objects.
*/
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java
index a659e89..8847962 100755
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java
@@ -457,6 +457,12 @@ public interface ParamConstants {
/**
* a value for a standard request paramater mode.<br>
+ * signify adding ldap groups for a role.
+ */
+ public static final String MODE_ADD_LDAP_GROUPS = "addLdapGroups";
+
+ /**
+ * a value for a standard request paramater mode.<br>
* signify displaying a list of items
*/
public static final String MODE_ADD = "add";
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
index e95869f..62af674 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
+++ b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
@@ -280,6 +280,7 @@ admin.role.ViewRoleTitle=${product.shortName} View Role - {0}
admin.role.EditRoleTitle=${product.shortName} Edit Role Properties and Permissions - {0}
admin.role.AddRoleUsersTitle=${product.shortName} Edit Role Assign Users To Role - {0}
admin.role.AddRoleGroupsTitle=${product.shortName} Edit Role Assign Groups To Role - {0}
+admin.role.AddRoleLdapGroupsTitle=${product.shortName} Edit Role Assign LDAP Groups To Role - {0}
admin.role.AlertNotificationTimeRangeTitle=${product.shortName} Edit Role Alert Notification Time Range - {0}
admin.role.ChangeRoleOwnerTitle=${product.shortName} Change Owner - {0}
admin.role.error.StaticRole=You cannot alter the roles for one or more of these users
@@ -342,7 +343,8 @@ admin.role.add.users=Edit {0}: Assign Users to Role
admin.role.groups.GroupsTab=Groups
admin.role.groups.AssignToRoleTab=Assign To Role
admin.role.groups.NewResourceGroupButton=New Group...
-admin.role.groups.AssignedGroupsTab=Assigned Groups
+admin.role.groups.AssignedGroupsTab=Assigned Resource Groups
+admin.role.groups.AssignedLdapGroupsTab=Assigned LDAP Groups
#
admin.role.list.NameTH=Name
admin.role.list.OwnerTH=Owner
@@ -362,9 +364,11 @@ admin.role.confirm.Create=Role {0} has been created.
admin.role.confirm.Edit=Your changes have been saved.
admin.role.confirm.AddUsers=The requested users have been assigned to the role.
admin.role.confirm.AddResourceGroups=The requested groups have been assigned to the role.
+admin.role.confirm.AddLdapGroups=The requested groups have been assigned to the role.
admin.role.confirm.Remove=The requested roles have been removed.
admin.role.confirm.RemoveUsers=The requested users have been removed.
admin.role.confirm.RemoveResourceGroups=The requested groups have been removed.
+admin.role.confirm.RemoveLdapGroups=The requested groups have been removed.
admin.role.confirm.ChangeOwner=The owner has been changed.
#
admin.role.error.RoleNotFound=The specified role does not exist.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml
index 76321ce..d18f2d4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml
@@ -30,6 +30,8 @@
type="org.rhq.enterprise.gui.admin.role.RemoveUsersForm"/>
<form-bean name="AddRoleResourceGroupsForm"
type="org.rhq.enterprise.gui.admin.role.AddResourceGroupsForm"/>
+ <form-bean name="AddRoleLdapGroupsForm"
+ type="org.rhq.enterprise.gui.admin.role.AddLdapGroupsForm"/>
<form-bean name="RemoveRoleResourceGroupsForm"
type="org.rhq.enterprise.gui.admin.role.RemoveResourceGroupsForm"/>
<!-- / -->
@@ -546,6 +548,46 @@
<forward name="failure" path="/admin/role/RoleAdmin.do?mode=view"/>
<forward name="success" path="/admin/role/RoleAdmin.do?mode=view"/>
</action>
+
+
+ <action path="/admin/role/AddLdapGroupsFormPrepare"
+ name="AddRoleLdapGroupsForm"
+ scope="request"
+ type="org.rhq.enterprise.gui.admin.role.AddLdapGroupsFormPrepareAction">
+ <set-property property="title" value="Add+Resource+Group"/>
+ </action>
+
+ <action path="/admin/role/AddLdapGroups"
+ type="org.rhq.enterprise.gui.admin.role.AddLdapGroupsAction"
+ name="AddRoleLdapGroupsForm"
+ scope="request"
+ input="/admin/role/RoleAdmin.do?mode=addLdapGroups">
+ <set-property property="workflow" value="role/ViewUser"/>
+ <forward name="cancel" path="/admin/role/RoleAdmin.do?mode=view"
+ redirect="true"/>
+ <forward name="reset" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"
+ redirect="true"/>
+ <forward name="new" path="/resource/group/Inventory.do?mode=new" redirect="true"/>
+ <forward name="add" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <forward name="remove" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <forward name="failure" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <forward name="success" path="/admin/role/RoleAdmin.do?mode=view"/>
+ </action>
+
+ <action path="/admin/role/RemoveLdapGroups"
+ type="org.rhq.enterprise.gui.admin.role.RemoveLdapGroupsAction"
+ name="RemoveRoleResourceGroupsForm"
+ scope="request"
+ input="/admin/role/RoleAdmin.do?mode=view">
+ <forward name="failure" path="/admin/role/RoleAdmin.do?mode=view"/>
+ <forward name="success" path="/admin/role/RoleAdmin.do?mode=view"/>
+ </action>
+
+
+
+
+
+
<!-- / -->
<action path="/admin/role/ChangeOwnerFormPrepare"
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml
index 6dac0a0..0559198 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml
@@ -73,6 +73,10 @@
controllerUrl="/admin/role/AddResourceGroupsFormPrepare.do"
path="/admin/role/AddRoleGroups.jsp"/>
+ <definition name=".admin.role.AddLdapGroups"
+ controllerUrl="/admin/role/AddLdapGroupsFormPrepare.do"
+ path="/admin/role/AddLdapRoleGroups.jsp"/>
+
<definition name=".admin.role.ChangeOwner"
controllerUrl="/admin/role/ChangeOwnerFormPrepare.do"
path="/admin/role/ChangeRoleOwner.jsp"/>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp
new file mode 100644
index 0000000..93ec22e
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp
@@ -0,0 +1,30 @@
+<%@ page language="java" %>
+<%@ page errorPage="/common/Error.jsp" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>
+
+<html:form action="/admin/role/AddLdapGroups" method="POST">
+
+<tiles:insert definition=".page.title.admin.role">
+ <tiles:put name="titleName" beanName="Role" beanProperty="name"/>
+</tiles:insert>
+
+<tiles:insert definition=".portlet.error"/>
+
+<tiles:insert page="/admin/role/RoleGroupsForm.jsp">
+ <tiles:put name="availableResGrps" beanName="AvailableResGrps"/>
+ <tiles:put name="numAvailableResGrps" beanName="NumAvailableResGrps"/>
+ <tiles:put name="pendingResGrps" beanName="PendingResGrps"/>
+ <tiles:put name="numPendingResGrps" beanName="NumPendingResGrps"/>
+</tiles:insert>
+
+<tiles:insert definition=".form.buttons">
+ <tiles:put name="addToList" value="true"/>
+</tiles:insert>
+
+<tiles:insert definition=".page.footer"/>
+
+<html:hidden property="r"/>
+</html:form>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
index 1909ec5..ff4d6f6 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
@@ -12,12 +12,15 @@
<script language="JavaScript" src="<html:rewrite page="/js/listWidget.js"/>" type="text/javascript"></script>
<c:set var="userWidgetInstanceName" value="assignedUsers"/>
<c:set var="groupWidgetInstanceName" value="assignedGroups"/>
+<c:set var="ldapGroupWidgetInstanceName" value="assignedLdapGroups"/>
<script type="text/javascript">
var pageData = new Array();
initializeWidgetProperties('<c:out value="${userWidgetInstanceName}"/>');
userWidgetProperties = getWidgetProperties('<c:out value="${userWidgetInstanceName}"/>');
initializeWidgetProperties('<c:out value="${groupWidgetInstanceName}"/>');
groupWidgetProperties = getWidgetProperties('<c:out value="${groupWidgetInstanceName}"/>');
+initializeWidgetProperties('<c:out value="${ldapGroupWidgetInstanceName}"/>');
+ldapGroupWidgetProperties = getWidgetProperties('<c:out value="${ldapGroupWidgetInstanceName}"/>');
</script>
<c:url var="selfPuAction" value="/admin/role/RoleAdmin.do">
@@ -179,25 +182,24 @@ groupWidgetProperties = getWidgetProperties('<c:out value="${groupWidgetInstance
<html:form method="POST" action="/admin/role/RemoveLdapGroups">
<tiles:insert definition=".header.tab">
- <tiles:put name="tabKey" value="admin.role.groups.AssignedGroupsTab"/>
+ <tiles:put name="tabKey" value="admin.role.groups.AssignedLdapGroupsTab"/>
</tiles:insert>
<display:table items="${RoleLdapGrps}" var="group" action="${selfPgAction}"
- postfix="g"
+ postfix="ldapGroups"
width="100%" cellpadding="0" cellspacing="0">
- <display:column width="1%" property="id" title="<input type=\"checkbox\" onclick=\"ToggleAll(this, groupWidgetProperties, true)\" name=\"listToggleAll\">" isLocalizedTitle="false" styleClass="ListCellCheckbox" headerStyleClass="ListHeaderCheckbox" >
- <display:checkboxdecorator name="g" onclick="ToggleSelection(this, groupWidgetProperties, true)" styleClass="listMember"/>
+ <display:column width="1%" property="id" title="<input type=\"checkbox\" onclick=\"ToggleAll(this, ldapGroupWidgetProperties, true)\" name=\"listToggleAll\">" isLocalizedTitle="false" styleClass="ListCellCheckbox" headerStyleClass="ListHeaderCheckbox" >
+ <display:checkboxdecorator name="ldapGroups" onclick="ToggleSelection(this, ldapGroupWidgetProperties, true)" styleClass="listMember"/>
</display:column>
- <display:column width="25%" property="name" href="/rhq/group/inventory/view.xhtml?category=${group.groupCategory.name}&groupId=${group.id}" title="common.header.Group"
- sortAttr="r.name"/>
- <display:column width="75%" property="description" title="common.header.Description"/>
+ <display:column property="name" title="common.header.Group" sortAttr="r.name"/>
+
</display:table>
<tiles:insert definition=".toolbar.addToList">
<tiles:put name="addToListUrl" value="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
- <tiles:put name="widgetInstanceName" beanName="groupWidgetInstanceName"/>
+ <tiles:put name="widgetInstanceName" beanName="ldapGroupWidgetInstanceName"/>
<tiles:put name="addToListParamName" value="r"/>
<tiles:put name="addToListParamValue" beanName="Role" beanProperty="id"/>
<tiles:put name="pageList" beanName="RoleLdapGrps"/>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index 8762845..bcf7738 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.server.authz;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Set;
@@ -38,6 +39,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.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -88,6 +90,15 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
return roles;
}
+ @Override
+ public PageList<LdapGroup> findLdapGroupsByRole(int roleId, PageControl pageControl) {
+ Role role = entityManager.find(Role.class, roleId);
+ if (role == null) {
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to lookup ldap Groups on");
+ }
+ return new PageList<LdapGroup>(role.getLdapGroups(), role.getLdapGroups().size(), pageControl);
+ }
+
/**
* @see org.rhq.enterprise.server.authz.RoleManagerLocal#findRoles(PageControl)
*/
@@ -431,6 +442,63 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
}
}
+ /**
+ * @see org.rhq.enterprise.server.authz.RoleManagerLocal#addResourceGroupsToRole(Subject, int, int[])
+ */
+ @RequiredPermission(Permission.MANAGE_SECURITY)
+ public void addLdapGroupsToRole(Subject subject, int roleId, List<String> groupIds) {
+ if ((groupIds != null) && (groupIds.size() > 0)) {
+ Role role = entityManager.find(Role.class, roleId);
+ if (role == null) {
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to add resourceGroups to");
+ }
+ role.getLdapGroups().size(); // load them in
+
+ for (String groupId : groupIds) {
+ LdapGroup group = new LdapGroup();
+ group.setName(groupId);
+ if (role == null) {
+ throw new IllegalArgumentException("Tried to add ldapGroup[" + groupId + "] to role[" + roleId
+ + "], but resourceGroup was not found");
+ }
+ role.addLdapGroup(group);
+ }
+ }
+ }
+
+ /**
+ * @see org.rhq.enterprise.server.authz.RoleManagerLocal#removeLdapGroupsFromRole(Subject, int, int[])
+ */
+
+ @RequiredPermission(Permission.MANAGE_SECURITY)
+ public void removeLdapGroupsFromRole(Subject subject, int roleId, int[] groupIds) {
+ if ((groupIds != null) && (groupIds.length > 0)) {
+ Role role = entityManager.find(Role.class, roleId);
+ if (role == null) {
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to remove resourceGroups from");
+ }
+ role.getLdapGroups().size(); // load them in
+
+ for (Integer groupId : groupIds) {
+ 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");
+ }
+ role.removeLdapGroup(doomedGroup);
+ }
+
+ Query purgeQuery = entityManager.createNamedQuery(LdapGroup.DELETE_BY_ID);
+
+ List<Integer> ids = new LinkedList<Integer>();
+ for (int i : groupIds) {
+ ids.add(i);
+ }
+ purgeQuery.setParameter("ids", ids);
+ purgeQuery.executeUpdate();
+ }
+ }
+
private void processDependentPermissions(Role role) {
/*
* if you can control user/roles, then you can give yourself permissions, too; so we might as well
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
index 58f962a..34b81e0 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.authz;
+import java.util.List;
import java.util.Set;
import javax.ejb.Local;
@@ -26,6 +27,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.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -159,6 +161,8 @@ public interface RoleManagerLocal {
Role getRole(Subject subject, int roleId);
+ PageList<LdapGroup> findLdapGroupsByRole(int roleId, PageControl pageControl);
+
PageList<Role> findSubjectAssignedRoles(Subject subject, int subjectId, PageControl pc);
//This is a proxy of getAvailableRolesForSubject but without pendingRoleIds as required by remote spec
@@ -198,6 +202,8 @@ public interface RoleManagerLocal {
void addRolesToResourceGroup(Subject subject, int groupId, int[] roleIds);
+ void addLdapGroupsToRole(Subject subject, int roleId, List<String> groupIds);
+
/**
* Removes the given resource groups from the given role.
*
@@ -209,6 +215,8 @@ public interface RoleManagerLocal {
void removeRolesFromResourceGroup(Subject subject, int groupId, int[] roleIds);
+ void removeLdapGroupsFromRole(Subject subject, int roleId, int[] groupIds);
+
PageList<Role> findRolesByCriteria(Subject subject, RoleCriteria criteria);
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
index 12d0787..2c98b0a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
@@ -166,6 +166,8 @@ public class CustomJaasDeploymentService implements CustomJaasDeploymentServiceM
configOptions.put(Context.SECURITY_PROTOCOL, conf.getProperty(RHQConstants.LDAPProtocol));
configOptions.put("LoginProperty", conf.getProperty(RHQConstants.LDAPLoginProperty));
configOptions.put("Filter", conf.getProperty(RHQConstants.LDAPFilter));
+ configOptions.put("GroupFilter", conf.getProperty(RHQConstants.LDAPGroupFilter));
+ configOptions.put("GroupMemberFilter", conf.getProperty(RHQConstants.LDAPGroupMember));
configOptions.put("BaseDN", conf.getProperty(RHQConstants.LDAPBaseDN));
configOptions.put("BindDN", conf.getProperty(RHQConstants.LDAPBindDN));
configOptions.put("BindPW", conf.getProperty(RHQConstants.LDAPBindPW));
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
new file mode 100644
index 0000000..86bd8b4
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -0,0 +1,290 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.resource.group;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.InitialLdapContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.system.SystemManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.util.security.UntrustedSSLSocketFactory;
+
+/**
+ * @author paji
+ *
+ */
+public class LdapGroupManager {
+ private static final LdapGroupManager INSTANCE = new LdapGroupManager();
+ private static final String BASEDN_DELIMITER = ";";
+ private Log log = LogFactory.getLog(LdapGroupManager.class);
+
+ private LdapGroupManager() {
+ }
+
+ public static LdapGroupManager getInstance() {
+ return INSTANCE;
+ }
+
+ public Set<Map<String, String>> findAvailableGroupsByRole(Subject subject, int roleId) {
+ SystemManagerLocal manager = LookupUtil.getSystemManager();
+ manager.getSystemConfiguration();
+ Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
+ String[] names = { "bar", "foo" };
+
+ for (String name : names) {
+ Map<String, String> group = new HashMap<String, String>();
+ group.put("id", name);
+ group.put("name", name);
+ group.put("description", name);
+ ldapSet.add(group);
+ }
+ return ldapSet;
+ }
+
+ /*
+ *
+ {BindDN=uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com,
+ java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, jboss.security.security_domain=JON,
+ LoginProperty=uid, BaseDN=dc=rhndev,dc=redhat,dc=com, java.naming.provider.url=ldap://fjs-0-16.rhndev.redhat.com,
+ java.naming.security.protocol=, BindPW=dog8code}
+ */
+ protected boolean test() throws Exception {
+
+ // Load our LDAP specific properties
+ Properties env = null;// getProperties();
+
+ // Load the BaseDN
+ String baseDN = "dc=rhndev,dc=redhat,dc=com";
+
+ // Load the LoginProperty
+ String loginProperty = "uid";
+
+ // Load any search filter
+
+ // Find the user that is calling us
+ String userName = "sdoo";
+
+ // Load any information we may need to bind
+ String bindDN = "uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com";
+ String bindPW = "dog8code";
+
+ if (bindDN != null) {
+ env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
+ env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
+ env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
+ }
+ InitialLdapContext ctx = new InitialLdapContext(env, null);
+ SearchControls searchControls = getSearchControls();
+
+ // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
+ String filter;
+ /* if ((searchFilter != null) && (searchFilter.length() != 0)) {
+ filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
+ } else {
+ filter = "(" + loginProperty + "=" + userName + ")";
+ }
+ */
+ //filter = "(" + loginProperty + "=" + userName + ")";
+ filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
+ + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
+
+ // Loop through each configured base DN. It may be useful
+ // in the future to allow for a filter to be configured for
+ // each BaseDN, but for now the filter will apply to all.
+ String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+ log.info(Arrays.asList(baseDNs));
+ for (int x = 0; x < baseDNs.length; x++) {
+ NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ log.info(answer.hasMore());
+ while (answer.hasMore()) {
+ // We use the first match
+ SearchResult si = (SearchResult) answer.next();
+ log.info(si);
+
+ /*
+ // Construct the UserDN
+ String userDN = si.getName() + "," + baseDNs[x];
+ print (userDN);
+ ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
+ ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, "dog8code");
+ ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
+ ctx.reconnect(null);*/
+ }
+
+ }
+
+ // If we try all the BaseDN's and have not found a match, return false
+ return false;
+ }
+
+ /**
+ * @see org.jboss.security.auth.spi.UsernamePasswordLoginModule#validatePassword(java.lang.String,java.lang.String)
+ */
+ protected void buildGroup(Properties options, String userName) {
+ // Load our LDAP specific properties
+ Properties env = getProperties(options);
+
+ // Load the BaseDN
+ String baseDN = (String) options.get(RHQConstants.LDAPBaseDN);
+ if (baseDN == null) {
+ // If the BaseDN is not specified, log an error and refuse the login attempt
+ log.info("BaseDN is not set, refusing login");
+ }
+
+ // Load the LoginProperty
+ String loginProperty = (String) options.get(RHQConstants.LDAPLoginProperty);
+ if (loginProperty == null) {
+ // Use the default
+ loginProperty = "cn";
+ }
+
+ String groupFilter = (String) options.get("groupFilter");
+ String groupMember = (String) options.get("groupMember");
+
+ // Load any information we may need to bind
+ String bindDN = (String) options.get("BindDN");
+ String bindPW = (String) options.get("BindPW");
+ if (bindDN != null) {
+ env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
+ env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
+ env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
+ }
+
+ try {
+ InitialLdapContext ctx = new InitialLdapContext(env, null);
+ SearchControls searchControls = getSearchControls();
+ String filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
+ + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
+ // Load any search filter
+ String searchFilter = (String) options.get("Filter");
+ // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
+ if ((searchFilter != null) && (searchFilter.length() != 0)) {
+ filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
+ } else {
+ filter = "(" + loginProperty + "=" + userName + ")";
+ }
+
+ // Loop through each configured base DN. It may be useful
+ // in the future to allow for a filter to be configured for
+ // each BaseDN, but for now the filter will apply to all.
+ String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+ for (int x = 0; x < baseDNs.length; x++) {
+ NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ if (!answer.hasMore()) {
+ log.debug("User " + userName + " not found for BaseDN " + baseDNs[x]);
+
+ // Nothing found for this DN, move to the next one if we have one.
+ continue;
+ }
+
+ // We use the first match
+ SearchResult si = (SearchResult) answer.next();
+
+ }
+
+ } catch (Exception e) {
+ log.info("Failed to validate password: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Load a default set of properties to use when connecting to the LDAP server. If basic authentication is needed,
+ * the caller must set Context.SECURITY_PRINCIPAL, Context.SECURITY_CREDENTIALS and Context.SECURITY_AUTHENTICATION
+ * appropriately.
+ *
+ * @return properties that are to be used when connecting to LDAP server
+ */
+ private Properties getProperties(Properties options) {
+ Properties env = new Properties(options);
+ // Set our default factory name if one is not given
+ String factoryName = env.getProperty(Context.INITIAL_CONTEXT_FACTORY);
+ if (factoryName == null) {
+ env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+ }
+
+ // Setup SSL if requested
+ String protocol = env.getProperty(Context.SECURITY_PROTOCOL);
+ if ((protocol != null) && protocol.equals("ssl")) {
+ String ldapSocketFactory = env.getProperty("java.naming.ldap.factory.socket");
+ if (ldapSocketFactory == null) {
+ env.put("java.naming.ldap.factory.socket", UntrustedSSLSocketFactory.class.getName());
+ }
+ env.put(Context.SECURITY_PROTOCOL, "ssl");
+ }
+
+ // Set the LDAP url
+ String providerUrl = env.getProperty(Context.PROVIDER_URL);
+ if (providerUrl == null) {
+ providerUrl = "ldap://localhost:" + (((protocol != null) && protocol.equals("ssl")) ? "636" : "389");
+ }
+
+ env.setProperty(Context.PROVIDER_URL, providerUrl);
+
+ // Follow referrals automatically
+ env.setProperty(Context.REFERRAL, "follow");
+
+ return env;
+ }
+
+ /**
+ * A simple method to construct a SearchControls object for use when doing LDAP searches. All of the defaults are
+ * used, with the exception of the scope, which is set to SUBTREE rather than the default of ONE_LEVEL
+ *
+ * @return controls what is searched in LDAP
+ */
+ private SearchControls getSearchControls() {
+ // Set the scope to subtree, default is one-level
+ int scope = SearchControls.SUBTREE_SCOPE;
+
+ // No limit on the time waiting for a response
+ int timeLimit = 0;
+
+ // No limit on the number of entries returned
+ long countLimit = 0;
+
+ // Attributes to return.
+ String[] returnedAttributes = null;
+
+ // Don't return the object
+ boolean returnObject = false;
+
+ // No dereferencing during the search
+ boolean deference = false;
+
+ SearchControls constraints = new SearchControls(scope, countLimit, timeLimit, returnedAttributes, returnObject,
+ deference);
+ return constraints;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java
index 7a76b01..2315ee8 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java
@@ -27,6 +27,7 @@ import org.testng.annotations.Test;
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.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
@@ -243,4 +244,28 @@ public class RoleManagerBeanTest extends AbstractEJB3Test {
getTransactionManager().rollback();
}
}
+
+ /**
+ * Test creating, assigning, removing and deleting roles.
+ *
+ * @throws Exception
+ */
+ public void testLdapGroups() throws Exception {
+ getTransactionManager().begin();
+
+ try {
+ Subject superuser = subjectManager.getOverlord();
+ createSession(superuser);
+
+ Role role = new Role("role-manager-role");
+ role.setFsystem(false);
+ role = roleManager.createRole(superuser, role);
+ LdapGroup group = new LdapGroup();
+ group.setName("Foo");
+ role.addLdapGroup(group);
+ assert roleManager.findLdapGroupsByRole(role.getId(), PageControl.getUnlimitedInstance()).size() == 1 : "Ldap Group Foo Should be assigned";
+ } finally {
+ getTransactionManager().rollback();
+ }
+ }
}
\ No newline at end of file
commit 98ea3e7acbf13e94808a796a5478b5195fe59204
Merge: 71e2d92... cbb2b49...
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Mar 4 20:02:34 2010 -0500
Merge branch 'linux-config' into ldap
commit 71e2d920463a909506ffee19dfa73c26f074578a
Merge: 308b9d3... 6445fb2...
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 1 09:49:24 2010 -0500
Merge branch 'linux-config' into ldap
commit 308b9d3b2caa2f344368d713551c12f879448171
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 1 09:48:27 2010 -0500
whateve
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
index 029a2b9..ad8ae65 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
@@ -47,6 +47,7 @@ public class AuthorizationManagerBean implements AuthorizationManagerLocal {
@SuppressWarnings("unchecked")
public Set<Permission> getExplicitGlobalPermissions(Subject subject) {
+ entityManager.flush();
Query query = entityManager.createNamedQuery(Subject.QUERY_GET_GLOBAL_PERMISSIONS);
query.setParameter("subject", subject);
List<Permission> results = query.getResultList();
commit c84a76b89d8c197a3cd3f5dca03ac23e5cf519d5
Merge: 84c5d00... 991b94d...
Author: Partha Aji <paji(a)redhat.com>
Date: Fri Feb 26 11:47:33 2010 -0500
Merge branch 'linux-config' into ldap
commit 84c5d0010c7855544018cdc08e8a0f6c4099703e
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Thu Feb 25 16:12:53 2010 -0500
initial ldap group block
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
index 017e832..1909ec5 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
@@ -173,6 +173,43 @@ groupWidgetProperties = getWidgetProperties('<c:out value="${groupWidgetInstance
</c:if>
</c:if>
+<c:if test="${not Role.fsystem}">
+<c:if test="${useroperations['MANAGE_SECURITY']}">
+
+<html:form method="POST" action="/admin/role/RemoveLdapGroups">
+
+<tiles:insert definition=".header.tab">
+ <tiles:put name="tabKey" value="admin.role.groups.AssignedGroupsTab"/>
+</tiles:insert>
+
+<display:table items="${RoleLdapGrps}" var="group" action="${selfPgAction}"
+ postfix="g"
+ width="100%" cellpadding="0" cellspacing="0">
+
+ <display:column width="1%" property="id" title="<input type=\"checkbox\" onclick=\"ToggleAll(this, groupWidgetProperties, true)\" name=\"listToggleAll\">" isLocalizedTitle="false" styleClass="ListCellCheckbox" headerStyleClass="ListHeaderCheckbox" >
+ <display:checkboxdecorator name="g" onclick="ToggleSelection(this, groupWidgetProperties, true)" styleClass="listMember"/>
+ </display:column>
+
+ <display:column width="25%" property="name" href="/rhq/group/inventory/view.xhtml?category=${group.groupCategory.name}&groupId=${group.id}" title="common.header.Group"
+ sortAttr="r.name"/>
+ <display:column width="75%" property="description" title="common.header.Description"/>
+</display:table>
+
+<tiles:insert definition=".toolbar.addToList">
+ <tiles:put name="addToListUrl" value="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <tiles:put name="widgetInstanceName" beanName="groupWidgetInstanceName"/>
+ <tiles:put name="addToListParamName" value="r"/>
+ <tiles:put name="addToListParamValue" beanName="Role" beanProperty="id"/>
+ <tiles:put name="pageList" beanName="RoleLdapGrps"/>
+ <tiles:put name="pageAction" beanName="selfPgAction"/>
+ <tiles:put name="postfix" value="g"/>
+</tiles:insert>
+
+<html:hidden property="r"/>
+</html:form>
+</c:if>
+</c:if>
+
<tiles:insert definition=".page.return">
<tiles:put name="returnUrl" value="/admin/role/RoleAdmin.do?mode=list"/>
<tiles:put name="returnKey" value="admin.role.view.ReturnToRoles"/>
commit 3e1622402c2fa5724f505065c5b89512fa7da664
Merge: 59a906f... a986379...
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Feb 25 10:19:20 2010 -0500
Merge branch 'linux-config' into ldap
commit 59a906f82c207c0128ad5be30dfc4c112775dbf9
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 19:41:44 2010 -0500
Removed the unused is_ldap column from RHQ_SUBJECT_ROLE_MAP since we are using RHQ_SUBJECT_ROLE_LDAP_MAP for that information
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index 1eaa6f8..6e0a31e 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -72,7 +72,6 @@
<table name="RHQ_SUBJECT_ROLE_MAP">
<column name="SUBJECT_ID" required="true" type="INTEGER" references="RHQ_SUBJECT"/>
<column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
- <column name="IS_LDAP" required="true" type="BOOLEAN" default="false"/>
<constraint name="RHQ_SUBJECT_ROLE_MAPPING_KEY">
<primaryKey>
commit b9287ab8a2ff37eed95fc7883504db0a7130c7c1
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 19:32:04 2010 -0500
Mapping For Solution 2 Done
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index c7d895b..9b991cd 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -40,7 +40,6 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.QueryHint;
import javax.persistence.SequenceGenerator;
@@ -228,18 +227,19 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @OneToMany(mappedBy = "subject")
- private Set<SubjectRoleEntity> subjectRoles;
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
+ @ManyToMany
+ private java.util.Set<Role> roles;
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_LDAP_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
@ManyToMany
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
- private Set<Role> roles = new HashSet<Role>();
+ private java.util.Set<Role> ldapRoles;
@Transient
private Integer sessionId = null;
private void init() {
- subjectRoles = new HashSet<SubjectRoleEntity>();
+ roles = new HashSet<Role>();
}
/**
@@ -364,51 +364,44 @@ public class Subject implements Externalizable {
this.configuration = configuration;
}
- public Set<SubjectRoleEntity> getSubjectRoles() {
- if (subjectRoles == null) {
- subjectRoles = new HashSet<SubjectRoleEntity>();
+ public java.util.Set<Role> getRoles() {
+ if (this.roles == null) {
+ this.roles = new HashSet<Role>();
}
- return subjectRoles;
- }
-
- public void setSubjectRoles(Set<SubjectRoleEntity> subjectRolesIn) {
- subjectRoles = subjectRolesIn;
- }
- public Set<Role> getRoles() {
- if (roles == null) {
- roles = new HashSet<Role>();
- }
- return roles;
+ return this.roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
- public void addRole(Role role, boolean ldap) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setSubject(this);
- s.setRole(role);
- s.setLdap(ldap);
- getSubjectRoles().add(s);
- }
-
public void addRole(Role role) {
- addRole(role, false);
+ getRoles().add(role);
}
public void removeRole(Role role) {
- SubjectRoleEntity toRemove = null;
- for (SubjectRoleEntity s : getSubjectRoles()) {
- if (s.getSubject().equals(this) && s.getRole().equals(role)) {
- toRemove = s;
- break;
- }
- }
- if (toRemove != null) {
- getSubjectRoles().remove(toRemove);
+ getRoles().remove(role);
+ }
+
+ public java.util.Set<Role> getLdapRoles() {
+ if (this.ldapRoles == null) {
+ this.ldapRoles = new HashSet<Role>();
}
+
+ return this.ldapRoles;
+ }
+
+ public void setLdapRoles(Set<Role> roles) {
+ this.ldapRoles = roles;
+ }
+
+ public void addLdapRole(Role role) {
+ getLdapRoles().add(role);
+ }
+
+ public void removeLdapRole(Role role) {
+ getLdapRoles().remove(role);
}
@Override
@@ -517,7 +510,7 @@ public class Subject implements Externalizable {
this.factive = in.readBoolean();
this.fsystem = in.readBoolean();
this.configuration = (Configuration) in.readObject();
- setRoles((Set<Role>) in.readObject());
+ this.roles = (Set<Role>) in.readObject();
this.sessionId = in.readInt();
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
deleted file mode 100644
index 3636fb5..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.rhq.core.domain.auth;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.Table;
-
-import org.rhq.core.domain.authz.Role;
-
-@Entity
-(a)IdClass(SubjectRolePK.class)
-@Table(name = "RHQ_SUBJECT_ROLE_MAP")
-public class SubjectRoleEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Id
- private Subject subject;
-
- @Id
- private Role role;
-
- @Column(name = "IS_LDAP")
- private boolean isLdap;
-
- public Subject getSubject() {
- return subject;
- }
-
- public void setSubject(Subject subject) {
- this.subject = subject;
- }
-
- public Role getRole() {
- return role;
- }
-
- public void setRole(Role role) {
- this.role = role;
- }
-
- public boolean isLdap() {
- return isLdap;
- }
-
- public void setLdap(boolean isLdap) {
- this.isLdap = isLdap;
- }
-
- @Override
- public int hashCode() {
- final int PRIME = 31;
- int result = 1;
- result = (PRIME * result) + ((subject == null) ? 0 : subject.hashCode());
- result = (PRIME * result) + ((role == null) ? 0 : role.hashCode());
- result = (PRIME * result) + ((isLdap) ? 0 : PRIME);
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
-
- if ((obj == null) || !(obj instanceof SubjectRoleEntity)) {
- return false;
- }
-
- final SubjectRoleEntity other = (SubjectRoleEntity) obj;
- if (subject == null) {
- if (other.subject != null) {
- return false;
- }
- } else if (!subject.equals(other.subject)) {
- return false;
- }
-
- if (role == null) {
- if (other.role != null) {
- return false;
- }
- } else if (!role.equals(other.role)) {
- return false;
- }
-
- return isLdap == other.isLdap;
- }
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
deleted file mode 100644
index 8b6259c..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.core.domain.auth;
-
-import java.io.Serializable;
-
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-import org.rhq.core.domain.authz.Role;
-
-/**
- * @author paji
- *
- */
-public class SubjectRolePK implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @ManyToOne
- @JoinColumn(name = "USER_ID", referencedColumnName = "ID")
- private Subject subject;
-
- @ManyToOne
- @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
- private Role role;
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 5267fca..b7004bd 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -37,7 +37,6 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@@ -47,7 +46,6 @@ import org.hibernate.annotations.CollectionOfElements;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.auth.SubjectRoleEntity;
/**
* A role has zero or more {@link org.rhq.core.domain.resource.group.ResourceGroup}s assigned to it. You can assign a
@@ -106,11 +104,11 @@ public class Role implements Serializable {
@Column(name = "FSYSTEM")
private Boolean fsystem;
- @OneToMany(mappedBy = "role")
- private java.util.Set<SubjectRoleEntity> roleSubjects;
-
@ManyToMany(mappedBy = "roles")
- private Set<Subject> subjects = new HashSet<Subject>();
+ private java.util.Set<Subject> subjects = new HashSet<Subject>();
+
+ @ManyToMany(mappedBy = "ldapRoles")
+ private java.util.Set<Subject> ldapSubjects = new HashSet<Subject>();
@ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@@ -183,52 +181,56 @@ public class Role implements Serializable {
return this.permissions.remove(permission);
}
- public Set<SubjectRoleEntity> getRoleSubjects() {
- if (roleSubjects == null) {
- roleSubjects = new HashSet<SubjectRoleEntity>();
- }
- return roleSubjects;
+ public java.util.Set<Subject> getSubjects() {
+ return subjects;
}
- public void setRoleSubjects(Set<SubjectRoleEntity> subjectsIn) {
- roleSubjects = subjectsIn;
+ public void setSubjects(Set<Subject> subjects) {
+ this.subjects = subjects;
}
- public java.util.Set<Subject> getSubjects() {
- if (subjects == null) {
- subjects = new HashSet<Subject>();
+ public void addSubject(Subject subject) {
+ if (this.subjects == null) {
+ this.subjects = new HashSet<Subject>();
}
- return subjects;
+
+ subject.addRole(this);
+ this.subjects.add(subject);
}
- public void setSubjects(Set<Subject> subjects) {
- this.subjects = subjects;
+ public void removeSubject(Subject subject) {
+ if (this.subjects == null) {
+ this.subjects = new HashSet<Subject>();
+ }
+
+ subject.removeRole(this);
+ this.subjects.remove(subject);
}
- public void addSubject(Subject subject, boolean ldap) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setSubject(subject);
- s.setRole(this);
- s.setLdap(ldap);
- getRoleSubjects().add(s);
+ public java.util.Set<Subject> getLdapSubjects() {
+ return ldapSubjects;
}
- public void addSubject(Subject subject) {
- addSubject(subject, false);
+ public void setLdapSubjects(Set<Subject> subjects) {
+ this.ldapSubjects = subjects;
}
- public void removeSubject(Subject subject) {
- SubjectRoleEntity toRemove = null;
- for (SubjectRoleEntity s : getRoleSubjects()) {
- if (s.getSubject().equals(subject) && s.getRole().equals(this)) {
- toRemove = s;
- break;
- }
+ public void addLdapSubject(Subject subject) {
+ if (this.ldapSubjects == null) {
+ this.ldapSubjects = new HashSet<Subject>();
}
- if (toRemove != null) {
- getRoleSubjects().remove(toRemove);
- subject.removeRole(this);
+
+ subject.addLdapRole(this);
+ this.ldapSubjects.add(subject);
+ }
+
+ public void removeLdapSubject(Subject subject) {
+ if (this.ldapSubjects == null) {
+ this.ldapSubjects = new HashSet<Subject>();
}
+
+ subject.removeLdapRole(this);
+ this.ldapSubjects.remove(subject);
}
public Set<org.rhq.core.domain.resource.group.ResourceGroup> getResourceGroups() {
commit 8d87c981864acc5720869f0f651c9890f8653b0b
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 19:05:22 2010 -0500
Initial commit for solution 2
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index dcb993b..1eaa6f8 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -82,4 +82,14 @@
</constraint>
</table>
+ <table name="RHQ_SUBJECT_ROLE_LDAP_MAP">
+ <column name="SUBJECT_ID" required="true" type="INTEGER" references="RHQ_SUBJECT"/>
+ <column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
+ <constraint name="RHQ_SUBJECT_ROLE_LDAP_MAPPING_KEY">
+ <primaryKey>
+ <field ref="SUBJECT_ID"/>
+ <field ref="ROLE_ID"/>
+ </primaryKey>
+ </constraint>
+ </table>
</dbsetup>
commit 04fad7aae80087e6c5a0e9981d1115159873af8f
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 16:06:01 2010 -0500
Added back the Many To Many roles magic to preserve roles variable
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 73d074a..c7d895b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -36,6 +36,8 @@ import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@@ -229,6 +231,10 @@ public class Subject implements Externalizable {
@OneToMany(mappedBy = "subject")
private Set<SubjectRoleEntity> subjectRoles;
+ @ManyToMany
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
+ private Set<Role> roles = new HashSet<Role>();
+
@Transient
private Integer sessionId = null;
@@ -370,22 +376,14 @@ public class Subject implements Externalizable {
}
public Set<Role> getRoles() {
- Set<Role> r = new HashSet<Role>();
- for (SubjectRoleEntity s : getSubjectRoles()) {
- r.add(s.getRole());
+ if (roles == null) {
+ roles = new HashSet<Role>();
}
- return r;
+ return roles;
}
public void setRoles(Set<Role> roles) {
- Set<SubjectRoleEntity> sroles = getSubjectRoles();
- sroles.clear();
- for (Role r : roles) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setSubject(this);
- s.setRole(r);
- sroles.add(s);
- }
+ this.roles = roles;
}
public void addRole(Role role, boolean ldap) {
@@ -501,7 +499,7 @@ public class Subject implements Externalizable {
out.writeBoolean(factive);
out.writeBoolean(fsystem);
out.writeObject(configuration);
- out.writeObject(getRoles());
+ out.writeObject(roles);
// not supplied by remote: subjectNotifications
out.writeInt(this.sessionId == null ? 0 : this.sessionId);
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index d549027..5267fca 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -110,6 +110,9 @@ public class Role implements Serializable {
private java.util.Set<SubjectRoleEntity> roleSubjects;
@ManyToMany(mappedBy = "roles")
+ private Set<Subject> subjects = new HashSet<Subject>();
+
+ @ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@Cascade( { CascadeType.ALL })
@@ -192,22 +195,14 @@ public class Role implements Serializable {
}
public java.util.Set<Subject> getSubjects() {
- Set<Subject> s = new HashSet<Subject>();
- for (SubjectRoleEntity sre : getRoleSubjects()) {
- s.add(sre.getSubject());
+ if (subjects == null) {
+ subjects = new HashSet<Subject>();
}
- return s;
+ return subjects;
}
public void setSubjects(Set<Subject> subjects) {
- Set<SubjectRoleEntity> sroles = getRoleSubjects();
- sroles.clear();
- for (Subject subject : subjects) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setRole(this);
- s.setSubject(subject);
- sroles.add(s);
- }
+ this.subjects = subjects;
}
public void addSubject(Subject subject, boolean ldap) {
commit 09f0af7201c726cd1806d232164d2ea40c1470d2
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Feb 24 14:16:54 2010 -0500
added ldap group member txt field for ldap configs
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
index 6e95ef7..4f35fe6 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
@@ -61,6 +61,7 @@ public class SystemConfigForm extends BaseValidatorForm {
private String ldapSearchBase = "";
private String ldapSearchFilter = "";
private String ldapGroupFilter = "";
+ private String ldapGroupMember = "";
private String ldapUsername = "";
private String ldapPassword = "";
private Boolean ldapEnabled = null;
@@ -85,6 +86,7 @@ public class SystemConfigForm extends BaseValidatorForm {
buf.append(" ldapUsername=").append(ldapUsername);
buf.append(" ldapPassword=").append(ldapPassword);
buf.append(" ldapGroupFilter=").append(ldapGroupFilter);
+ buf.append(" ldapGroupMember=").append(ldapGroupMember);
return buf.toString();
}
@@ -128,6 +130,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapUsername = "";
ldapPassword = "";
ldapGroupFilter = "";
+ ldapGroupMember = "";
super.reset(mapping, request);
}
@@ -217,6 +220,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapSearchBase = prop.getProperty(RHQConstants.LDAPBaseDN);
ldapSearchFilter = prop.getProperty(RHQConstants.LDAPFilter);
ldapGroupFilter = prop.getProperty(RHQConstants.LDAPGroupFilter);
+ ldapGroupMember = prop.getProperty(RHQConstants.LDAPGroupMember);
ldapUsername = prop.getProperty(RHQConstants.LDAPBindDN);
ldapPassword = prop.getProperty(RHQConstants.LDAPBindPW);
@@ -317,6 +321,7 @@ public class SystemConfigForm extends BaseValidatorForm {
prop.setProperty(RHQConstants.LDAPBaseDN, ldapSearchBase);
prop.setProperty(RHQConstants.LDAPFilter, ldapSearchFilter);
prop.setProperty(RHQConstants.LDAPGroupFilter, ldapGroupFilter);
+ prop.setProperty(RHQConstants.LDAPGroupMember, ldapGroupMember);
prop.setProperty(RHQConstants.LDAPBindDN, ldapUsername);
prop.setProperty(RHQConstants.LDAPBindPW, ldapPassword);
prop.setProperty(RHQConstants.LDAPProtocol, ldapSsl ? "ssl" : "");
@@ -572,6 +577,14 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapGroupFilter = s;
}
+ public String getLdapGroupMember() {
+ return ldapGroupFilter;
+ }
+
+ public void setLdapGroupMember(String s) {
+ ldapGroupMember = s;
+ }
+
public String getLdapUsername() {
return ldapUsername;
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
index c65317a..e95869f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
+++ b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
@@ -631,6 +631,7 @@ admin.settings.LDAPHostNameLabel=LDAP Host Name:
admin.settings.LDAPUsernameLabel=Username:
admin.settings.LDAPSearchFilterLabel=Search Filter:
admin.settings.LDAPGroupSearchLabel=Group Search Filter:
+admin.settings.LDAPGroupMemberLabel=Group Member Filter:
admin.settings.LDAPPortLabel=LDAP Port:
admin.settings.LDAPUrlLabel=URL:
admin.settings.LDAPSslLabel=SSL:
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
index fbf6955..17f0a20 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
@@ -33,27 +33,34 @@
<tr>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPUrlLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapUrl"/></td>
- <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSslLabel"/></td>
- <td width="30%" class="BlockContent"><html:checkbox property="ldapSsl"/></td>
- </tr>
- <tr>
- <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPUsernameLabel"/></td>
- <td width="30%" class="BlockContent"><html:text size="31" property="ldapUsername"/></td>
- <td width="20%" class="BlockLabel"><fmt:message key="common.label.Password"/></td>
- <td width="30%" class="BlockContent"><html:password size="31" property="ldapPassword" redisplay="true"/></td>
- </tr>
- <tr>
- <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSearchBaseLabel"/></td>
- <td width="30%" class="BlockContent"><html:text size="31" property="ldapSearchBase"/></td>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSearchFilterLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapSearchFilter"/></td>
</tr>
<tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSearchBaseLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapSearchBase"/></td>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPLoginPropertyLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapLoginProperty"/></td>
+ </tr>
+ <tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPUsernameLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapUsername"/></td>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPGroupSearchLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapGroupFilter"/></td>
</tr>
+ <tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="common.label.Password"/></td>
+ <td width="30%" class="BlockContent"><html:password size="31" property="ldapPassword" redisplay="true"/></td>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPGroupMemberLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapGroupMember"/></td>
+ </tr>
+ <tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSslLabel"/></td>
+ <td width="30%" class="BlockContent"><html:checkbox property="ldapSsl"/></td>
+ <td width="20%" class="BlockLabel"> </td>
+ <td width="30%" class="BlockContent"> </td>
+ </tr>
+
<tr>
<td colspan="4" class="BlockBottomLine"><html:img page="/images/spacer.gif" width="1" height="1" border="0"/></td>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
index 8a94231..7bb1d72 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
@@ -47,6 +47,7 @@ public class RHQConstants {
public static final String LDAPLoginProperty = "CAM_LDAP_LOGIN_PROPERTY";
public static final String LDAPFilter = "CAM_LDAP_FILTER";
public static final String LDAPGroupFilter = "CAM_LDAP_GROUP_FILTER";
+ public static final String LDAPGroupMember = "CAM_LDAP_GROUP_MEMBER";
public static final String LDAPBaseDN = "CAM_LDAP_BASE_DN";
public static final String LDAPBindDN = "CAM_LDAP_BIND_DN";
public static final String LDAPBindPW = "CAM_LDAP_BIND_PW";
commit 9e4ca33363b357405733065e27f98e66d46535c1
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 12:51:22 2010 -0500
More updates on the Mapping
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 191106e..73d074a 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -226,7 +226,7 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @OneToMany(mappedBy = "user")
+ @OneToMany(mappedBy = "subject")
private Set<SubjectRoleEntity> subjectRoles;
@Transient
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
index ea110f7..3636fb5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -37,6 +37,11 @@ import org.rhq.core.domain.authz.Role;
@Table(name = "RHQ_SUBJECT_ROLE_MAP")
public class SubjectRoleEntity implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
@Id
private Subject subject;
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
index e881b5b..8b6259c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
@@ -19,6 +19,8 @@
package org.rhq.core.domain.auth;
+import java.io.Serializable;
+
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@@ -28,7 +30,12 @@ import org.rhq.core.domain.authz.Role;
* @author paji
*
*/
-public class SubjectRolePK {
+public class SubjectRolePK implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
@ManyToOne
@JoinColumn(name = "USER_ID", referencedColumnName = "ID")
private Subject subject;
commit c5ad7ab61a62cc4ad847a7ea43e30d9dbcf81c48
Merge: 17a885c... 073abeb...
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 11:32:03 2010 -0500
Merge branch 'linux-config' into ldap
commit 17a885cd48cf2fed8723b6253154fe2173d4cd58
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 11:30:56 2010 -0500
Added a more accurate mapping for SubjectRoleEntity
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 023faa3..191106e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -36,7 +36,6 @@ import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@@ -227,8 +226,7 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @OneToMany
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
+ @OneToMany(mappedBy = "user")
private Set<SubjectRoleEntity> subjectRoles;
@Transient
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
index fc0b0ed..ea110f7 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -25,20 +25,22 @@ package org.rhq.core.domain.auth;
import java.io.Serializable;
import javax.persistence.Column;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
import javax.persistence.Table;
import org.rhq.core.domain.authz.Role;
+@Entity
+(a)IdClass(SubjectRolePK.class)
@Table(name = "RHQ_SUBJECT_ROLE_MAP")
public class SubjectRoleEntity implements Serializable {
- @ManyToOne
- @JoinColumn(name = "SUBJECT_ID", referencedColumnName = "ID")
+
+ @Id
private Subject subject;
- @ManyToOne
- @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
+ @Id
private Role role;
@Column(name = "IS_LDAP")
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
new file mode 100644
index 0000000..e881b5b
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
@@ -0,0 +1,39 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.auth;
+
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.rhq.core.domain.authz.Role;
+
+/**
+ * @author paji
+ *
+ */
+public class SubjectRolePK {
+ @ManyToOne
+ @JoinColumn(name = "USER_ID", referencedColumnName = "ID")
+ private Subject subject;
+
+ @ManyToOne
+ @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
+ private Role role;
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 1e66029..d549027 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -106,8 +106,7 @@ public class Role implements Serializable {
@Column(name = "FSYSTEM")
private Boolean fsystem;
- @OneToMany
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "ROLE_ID") })
+ @OneToMany(mappedBy = "role")
private java.util.Set<SubjectRoleEntity> roleSubjects;
@ManyToMany(mappedBy = "roles")
commit 7789e66b5e5a114e67e2d0bb2bedc3641a33abc0
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 13:21:49 2010 -0500
Updated the addSubject/removeSubject stuff from Role to use SubjectRoleEntity bean
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 121f555..023faa3 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -231,13 +231,11 @@ public class Subject implements Externalizable {
@JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
private Set<SubjectRoleEntity> subjectRoles;
- private Set<Role> roles;
-
@Transient
private Integer sessionId = null;
private void init() {
- roles = new HashSet<Role>();
+ subjectRoles = new HashSet<SubjectRoleEntity>();
}
/**
@@ -505,7 +503,7 @@ public class Subject implements Externalizable {
out.writeBoolean(factive);
out.writeBoolean(fsystem);
out.writeObject(configuration);
- out.writeObject(roles);
+ out.writeObject(getRoles());
// not supplied by remote: subjectNotifications
out.writeInt(this.sessionId == null ? 0 : this.sessionId);
}
@@ -523,7 +521,7 @@ public class Subject implements Externalizable {
this.factive = in.readBoolean();
this.fsystem = in.readBoolean();
this.configuration = (Configuration) in.readObject();
- this.roles = (Set<Role>) in.readObject();
+ setRoles((Set<Role>) in.readObject());
this.sessionId = in.readInt();
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 4e157c6..1e66029 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -110,8 +110,6 @@ public class Role implements Serializable {
@JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "ROLE_ID") })
private java.util.Set<SubjectRoleEntity> roleSubjects;
- private java.util.Set<Subject> subjects = new HashSet<Subject>();
-
@ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@@ -183,30 +181,60 @@ public class Role implements Serializable {
return this.permissions.remove(permission);
}
+ public Set<SubjectRoleEntity> getRoleSubjects() {
+ if (roleSubjects == null) {
+ roleSubjects = new HashSet<SubjectRoleEntity>();
+ }
+ return roleSubjects;
+ }
+
+ public void setRoleSubjects(Set<SubjectRoleEntity> subjectsIn) {
+ roleSubjects = subjectsIn;
+ }
+
public java.util.Set<Subject> getSubjects() {
- return subjects;
+ Set<Subject> s = new HashSet<Subject>();
+ for (SubjectRoleEntity sre : getRoleSubjects()) {
+ s.add(sre.getSubject());
+ }
+ return s;
}
public void setSubjects(Set<Subject> subjects) {
- this.subjects = subjects;
+ Set<SubjectRoleEntity> sroles = getRoleSubjects();
+ sroles.clear();
+ for (Subject subject : subjects) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setRole(this);
+ s.setSubject(subject);
+ sroles.add(s);
+ }
}
- public void addSubject(Subject subject) {
- if (this.subjects == null) {
- this.subjects = new HashSet<Subject>();
- }
+ public void addSubject(Subject subject, boolean ldap) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setSubject(subject);
+ s.setRole(this);
+ s.setLdap(ldap);
+ getRoleSubjects().add(s);
+ }
- subject.addRole(this);
- this.subjects.add(subject);
+ public void addSubject(Subject subject) {
+ addSubject(subject, false);
}
public void removeSubject(Subject subject) {
- if (this.subjects == null) {
- this.subjects = new HashSet<Subject>();
+ SubjectRoleEntity toRemove = null;
+ for (SubjectRoleEntity s : getRoleSubjects()) {
+ if (s.getSubject().equals(subject) && s.getRole().equals(this)) {
+ toRemove = s;
+ break;
+ }
+ }
+ if (toRemove != null) {
+ getRoleSubjects().remove(toRemove);
+ subject.removeRole(this);
}
-
- subject.removeRole(this);
- this.subjects.remove(subject);
}
public Set<org.rhq.core.domain.resource.group.ResourceGroup> getResourceGroups() {
commit dcb59bb828983e2879cac829852437e00e0f29d8
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 11:03:16 2010 -0500
More clean up work on Subjects and SubjectRoleEntity
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index f7f6ac2..121f555 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -229,9 +229,9 @@ public class Subject implements Externalizable {
@OneToMany
@JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
- private java.util.Set<SubjectRoleEntity> subjectRoles;
+ private Set<SubjectRoleEntity> subjectRoles;
- private java.util.Set<Role> roles;
+ private Set<Role> roles;
@Transient
private Integer sessionId = null;
@@ -362,14 +362,18 @@ public class Subject implements Externalizable {
this.configuration = configuration;
}
- public java.util.Set<SubjectRoleEntity> getSubjectRoles() {
+ public Set<SubjectRoleEntity> getSubjectRoles() {
if (subjectRoles == null) {
subjectRoles = new HashSet<SubjectRoleEntity>();
}
return subjectRoles;
}
- public java.util.Set<Role> getRoles() {
+ public void setSubjectRoles(Set<SubjectRoleEntity> subjectRolesIn) {
+ subjectRoles = subjectRolesIn;
+ }
+
+ public Set<Role> getRoles() {
Set<Role> r = new HashSet<Role>();
for (SubjectRoleEntity s : getSubjectRoles()) {
r.add(s.getRole());
@@ -378,15 +382,39 @@ public class Subject implements Externalizable {
}
public void setRoles(Set<Role> roles) {
- this.roles = roles;
+ Set<SubjectRoleEntity> sroles = getSubjectRoles();
+ sroles.clear();
+ for (Role r : roles) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setSubject(this);
+ s.setRole(r);
+ sroles.add(s);
+ }
+ }
+
+ public void addRole(Role role, boolean ldap) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setSubject(this);
+ s.setRole(role);
+ s.setLdap(ldap);
+ getSubjectRoles().add(s);
}
public void addRole(Role role) {
- getRoles().add(role);
+ addRole(role, false);
}
public void removeRole(Role role) {
- getRoles().remove(role);
+ SubjectRoleEntity toRemove = null;
+ for (SubjectRoleEntity s : getSubjectRoles()) {
+ if (s.getSubject().equals(this) && s.getRole().equals(role)) {
+ toRemove = s;
+ break;
+ }
+ }
+ if (toRemove != null) {
+ getSubjectRoles().remove(toRemove);
+ }
}
@Override
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
index 369b491..fc0b0ed 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -1,3 +1,25 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.core.domain.auth;
import java.io.Serializable;
@@ -11,7 +33,6 @@ import org.rhq.core.domain.authz.Role;
@Table(name = "RHQ_SUBJECT_ROLE_MAP")
public class SubjectRoleEntity implements Serializable {
-
@ManyToOne
@JoinColumn(name = "SUBJECT_ID", referencedColumnName = "ID")
private Subject subject;
@@ -47,4 +68,43 @@ public class SubjectRoleEntity implements Serializable {
this.isLdap = isLdap;
}
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = (PRIME * result) + ((subject == null) ? 0 : subject.hashCode());
+ result = (PRIME * result) + ((role == null) ? 0 : role.hashCode());
+ result = (PRIME * result) + ((isLdap) ? 0 : PRIME);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if ((obj == null) || !(obj instanceof SubjectRoleEntity)) {
+ return false;
+ }
+
+ final SubjectRoleEntity other = (SubjectRoleEntity) obj;
+ if (subject == null) {
+ if (other.subject != null) {
+ return false;
+ }
+ } else if (!subject.equals(other.subject)) {
+ return false;
+ }
+
+ if (role == null) {
+ if (other.role != null) {
+ return false;
+ }
+ } else if (!role.equals(other.role)) {
+ return false;
+ }
+
+ return isLdap == other.isLdap;
+ }
}
commit 2e83a0cc092f8feef995642502447389152d598e
Merge: 3f91c1c... 4c82f06...
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 10:20:31 2010 -0500
Merge branch 'linux-config' into ldap
commit 3f91c1ca64b04ae174d42ca3839fa1cdaa99dbbc
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 10:09:47 2010 -0500
Adding initial mapping change needed for ldap
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index f13d6ef..f7f6ac2 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -37,7 +37,6 @@ import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@@ -161,8 +160,7 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ " AND s.fsystem = FALSE " //
+ " AND s.factive = TRUE"), //
@NamedQuery(name = Subject.QUERY_DYNAMIC_CONFIG_VALUES, query = "" //
- + "SELECT s.name, s.name FROM Subject AS s WHERE s.fsystem = false")
-})
+ + "SELECT s.name, s.name FROM Subject AS s WHERE s.fsystem = false") })
@SequenceGenerator(name = "RHQ_SUBJECT_ID_SEQ", sequenceName = "RHQ_SUBJECT_ID_SEQ")
@Table(name = "RHQ_SUBJECT")
/*@Cache(usage= CacheConcurrencyStrategy.TRANSACTIONAL)*/
@@ -229,8 +227,10 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
- @ManyToMany
+ @OneToMany
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
+ private java.util.Set<SubjectRoleEntity> subjectRoles;
+
private java.util.Set<Role> roles;
@Transient
@@ -362,12 +362,19 @@ public class Subject implements Externalizable {
this.configuration = configuration;
}
- public java.util.Set<Role> getRoles() {
- if (this.roles == null) {
- this.roles = new HashSet<Role>();
+ public java.util.Set<SubjectRoleEntity> getSubjectRoles() {
+ if (subjectRoles == null) {
+ subjectRoles = new HashSet<SubjectRoleEntity>();
}
+ return subjectRoles;
+ }
- return this.roles;
+ public java.util.Set<Role> getRoles() {
+ Set<Role> r = new HashSet<Role>();
+ for (SubjectRoleEntity s : getSubjectRoles()) {
+ r.add(s.getRole());
+ }
+ return r;
}
public void setRoles(Set<Role> roles) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
new file mode 100644
index 0000000..369b491
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -0,0 +1,50 @@
+package org.rhq.core.domain.auth;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.rhq.core.domain.authz.Role;
+
+@Table(name = "RHQ_SUBJECT_ROLE_MAP")
+public class SubjectRoleEntity implements Serializable {
+
+ @ManyToOne
+ @JoinColumn(name = "SUBJECT_ID", referencedColumnName = "ID")
+ private Subject subject;
+
+ @ManyToOne
+ @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
+ private Role role;
+
+ @Column(name = "IS_LDAP")
+ private boolean isLdap;
+
+ public Subject getSubject() {
+ return subject;
+ }
+
+ public void setSubject(Subject subject) {
+ this.subject = subject;
+ }
+
+ public Role getRole() {
+ return role;
+ }
+
+ public void setRole(Role role) {
+ this.role = role;
+ }
+
+ public boolean isLdap() {
+ return isLdap;
+ }
+
+ public void setLdap(boolean isLdap) {
+ this.isLdap = isLdap;
+ }
+
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 35772bd..4e157c6 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -47,6 +47,7 @@ import org.hibernate.annotations.CollectionOfElements;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.auth.SubjectRoleEntity;
/**
* A role has zero or more {@link org.rhq.core.domain.resource.group.ResourceGroup}s assigned to it. You can assign a
@@ -78,8 +79,7 @@ import org.rhq.core.domain.auth.Subject;
+ " JOIN ss.roles AS rr " //
+ " WHERE ss.id = :subjectId )"), //
@NamedQuery(name = Role.QUERY_DYNAMIC_CONFIG_VALUES, query = "" //
- + "SELECT r.name, r.name FROM Role AS r")
-})
+ + "SELECT r.name, r.name FROM Role AS r") })
@SequenceGenerator(name = "RHQ_ROLE_ID_SEQ", sequenceName = "RHQ_ROLE_ID_SEQ")
@Table(name = "RHQ_ROLE")
public class Role implements Serializable {
@@ -106,7 +106,10 @@ public class Role implements Serializable {
@Column(name = "FSYSTEM")
private Boolean fsystem;
- @ManyToMany(mappedBy = "roles")
+ @OneToMany
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "ROLE_ID") })
+ private java.util.Set<SubjectRoleEntity> roleSubjects;
+
private java.util.Set<Subject> subjects = new HashSet<Subject>();
@ManyToMany(mappedBy = "roles")
commit 204c6b7de81df429eae5a506c36a84f0ddb7bdc2
Merge: e09efb0... 2ae22a1...
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Feb 22 13:06:45 2010 -0500
Merge branch 'linux-config' into ldap
commit e09efb07b5c91f0a7889d2a6bb58ba41c1ac25c6
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Feb 22 12:59:31 2010 -0500
Intial config setup for LDAP stuff..
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
index c636aa2..6e95ef7 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
@@ -60,6 +60,7 @@ public class SystemConfigForm extends BaseValidatorForm {
private String ldapLoginProperty = "";
private String ldapSearchBase = "";
private String ldapSearchFilter = "";
+ private String ldapGroupFilter = "";
private String ldapUsername = "";
private String ldapPassword = "";
private Boolean ldapEnabled = null;
@@ -83,6 +84,7 @@ public class SystemConfigForm extends BaseValidatorForm {
buf.append(" ldapSearchFilter=").append(ldapSearchFilter);
buf.append(" ldapUsername=").append(ldapUsername);
buf.append(" ldapPassword=").append(ldapPassword);
+ buf.append(" ldapGroupFilter=").append(ldapGroupFilter);
return buf.toString();
}
@@ -125,6 +127,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapSearchFilter = "";
ldapUsername = "";
ldapPassword = "";
+ ldapGroupFilter = "";
super.reset(mapping, request);
}
@@ -213,6 +216,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapLoginProperty = prop.getProperty(RHQConstants.LDAPLoginProperty);
ldapSearchBase = prop.getProperty(RHQConstants.LDAPBaseDN);
ldapSearchFilter = prop.getProperty(RHQConstants.LDAPFilter);
+ ldapGroupFilter = prop.getProperty(RHQConstants.LDAPGroupFilter);
ldapUsername = prop.getProperty(RHQConstants.LDAPBindDN);
ldapPassword = prop.getProperty(RHQConstants.LDAPBindPW);
@@ -312,6 +316,7 @@ public class SystemConfigForm extends BaseValidatorForm {
prop.setProperty(RHQConstants.LDAPLoginProperty, ldapLoginProperty);
prop.setProperty(RHQConstants.LDAPBaseDN, ldapSearchBase);
prop.setProperty(RHQConstants.LDAPFilter, ldapSearchFilter);
+ prop.setProperty(RHQConstants.LDAPGroupFilter, ldapGroupFilter);
prop.setProperty(RHQConstants.LDAPBindDN, ldapUsername);
prop.setProperty(RHQConstants.LDAPBindPW, ldapPassword);
prop.setProperty(RHQConstants.LDAPProtocol, ldapSsl ? "ssl" : "");
@@ -558,6 +563,14 @@ public class SystemConfigForm extends BaseValidatorForm {
public void setLdapSearchFilter(String s) {
ldapSearchFilter = s;
}
+
+ public String getLdapGroupFilter() {
+ return ldapGroupFilter;
+ }
+
+ public void setLdapGroupFilter(String s) {
+ ldapGroupFilter = s;
+ }
public String getLdapUsername() {
return ldapUsername;
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
index 571cf22..1565fe3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
+++ b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
@@ -630,6 +630,7 @@ admin.settings.LDAPConfigPropTab=LDAP Configuration Properties
admin.settings.LDAPHostNameLabel=LDAP Host Name:
admin.settings.LDAPUsernameLabel=Username:
admin.settings.LDAPSearchFilterLabel=Search Filter:
+admin.settings.LDAPGroupSearchLabel=Group Search Filter:
admin.settings.LDAPPortLabel=LDAP Port:
admin.settings.LDAPUrlLabel=URL:
admin.settings.LDAPSslLabel=SSL:
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
index a0ea5ff..fbf6955 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
@@ -51,8 +51,8 @@
<tr>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPLoginPropertyLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapLoginProperty"/></td>
- <td width="20%" class="BlockLabel"> </td>
- <td width="30%" class="BlockContent"> </td>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPGroupSearchLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapGroupFilter"/></td>
</tr>
<tr>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
index 5411acc..8a94231 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
@@ -46,6 +46,7 @@ public class RHQConstants {
public static final String LDAPProtocol = "CAM_LDAP_PROTOCOL";
public static final String LDAPLoginProperty = "CAM_LDAP_LOGIN_PROPERTY";
public static final String LDAPFilter = "CAM_LDAP_FILTER";
+ public static final String LDAPGroupFilter = "CAM_LDAP_GROUP_FILTER";
public static final String LDAPBaseDN = "CAM_LDAP_BASE_DN";
public static final String LDAPBindDN = "CAM_LDAP_BIND_DN";
public static final String LDAPBindPW = "CAM_LDAP_BIND_PW";
@@ -61,7 +62,8 @@ public class RHQConstants {
// Are we allowing automatic AgentUpdate binary download
public static final String EnableAgentAutoUpdate = "ENABLE_AGENT_AUTO_UPDATE";
- // Are we rendering a special "debug" menu for administrators?
+
+ // Are we rendering a special "debug" menu for administrators?
public static final String EnableDebugMode = "ENABLE_DEBUG_MODE";
// How long do we keep data compressed in hourly intervals?
commit 0df397dd638fdfbd953fb6838f2fd00c274e3de3
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Mon Feb 22 10:25:46 2010 -0500
initial schema for ldap group feature
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index 13a4bc5..dcb993b 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -27,6 +27,18 @@
</constraint>
</table>
+ <table name="RHQ_ROLE_LDAP_GROUP_MAP">
+ <column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
+ <column name="LDAP_GROUP_NAME" required="true" type="VARCHAR2"/>
+
+ <constraint name="RHQ_ROLE_LDAP_GROUP_MAP_KEY">
+ <primaryKey>
+ <field ref="ROLE_ID"/>
+ <field ref="LDAP_GROUP_NAME"/>
+ </primaryKey>
+ </constraint>
+ </table>
+
<table name="RHQ_PERMISSION">
<column name="ROLE_ID" type="INTEGER" references="RHQ_ROLE" required="true"/>
<column name="OPERATION" type="INTEGER" required="true"/>
@@ -60,6 +72,7 @@
<table name="RHQ_SUBJECT_ROLE_MAP">
<column name="SUBJECT_ID" required="true" type="INTEGER" references="RHQ_SUBJECT"/>
<column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
+ <column name="IS_LDAP" required="true" type="BOOLEAN" default="false"/>
<constraint name="RHQ_SUBJECT_ROLE_MAPPING_KEY">
<primaryKey>
14 years, 1 month
[rhq] Branch 'gwt' - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
New commits:
commit 994a9dbec2327a21f0a4886dbac1c25fafd0670d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 14:05:09 2010 -0400
i can't figure out how to redraw this icon without hiding then showing it again. prior to doing this, the new icon would not show up
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
index 1d67a73..b0617f0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
@@ -178,14 +178,16 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
icon.setTooltip("Uploaded bundle file successfully");
CoreGUI.getMessageCenter().notify(
new Message("Uploaded bundle file successfully", results, Severity.Info));
- markForRedraw();
+ icon.hide();
+ icon.show();
} else {
uploadResults = Boolean.FALSE;
icon.setIcons(iconRed);
icon.setTooltip("Bundle file upload failed");
CoreGUI.getMessageCenter()
.notify(new Message("Bundle file upload failed", results, Severity.Error));
- markForRedraw();
+ icon.hide();
+ icon.show();
}
}
});
@@ -196,7 +198,8 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
icon.setIcons(iconRed);
icon.setTooltip("Bundle file upload failed");
CoreGUI.getMessageCenter().notify(new Message("Bundle file upload request failed", Severity.Error));
- markForRedraw();
+ icon.hide();
+ icon.show();
}
});
}
14 years, 1 month