modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/ConfigurationMetadataParser.java
| 22 +
modules/core/client-api/src/main/resources/rhq-configuration.xsd
| 42 +++
modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/ConfigurationMetadataParser2Test.java
| 131 +++++++++
modules/core/client-api/src/test/resources/test2-plugin.xml
| 40 ++
modules/core/dbutils/pom.xml
| 2
modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
| 9
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
| 38 ++
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
| 30 +-
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyOptionsSource.java
| 139 ++++++++++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/CreateResourceRunner.java
| 19 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
| 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
| 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
| 34 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
| 29 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
| 60 ++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
| 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBean.java
| 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
| 25 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java
| 17 +
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml
| 13
modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
| 17 +
modules/plugins/apache/src/main/java/org/rhq/plugins/www/util/WWWUtils.java
| 41 +-
modules/plugins/jboss-as-5/pom.xml
| 2
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/deploy/ManagedComponentDeployer.java
| 35 ++
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/DeploymentUtils.java
| 31 --
modules/plugins/jboss-cache-v3/pom.xml
| 2
pom.xml
| 5
27 files changed, 711 insertions(+), 92 deletions(-)
New commits:
commit d010ed0ad32d363421fca16baf8287a90d182b73
Merge: b06ec2e 02c3770
Author: Heiko W. Rupp <hrupp(a)pintsize.home.pilhuhn.de>
Date: Wed Jun 22 16:22:58 2011 +0200
Merge branch 'master' into as7plugin
commit 02c37708fa056563ca233f6b345f3936284afb91
Merge: eb65e1d 38ce0dd
Author: Heiko W. Rupp <hrupp(a)pintsize.home.pilhuhn.de>
Date: Wed Jun 22 16:22:19 2011 +0200
Merge branch 'master' into dependent-values
commit 38ce0dd10f62d6f5f190c3dc82d8bc03d8d5a998
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Jun 21 14:46:04 2011 -0400
[BZ 713448] in the EAR/WAR Resource creation code, if the ManagedDeployment fails to
start, do not consider the Resource creation a failure and rollback the deployment
(
https://bugzilla.redhat.com/show_bug.cgi?id=713448)
diff --git
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/CreateResourceRunner.java
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/CreateResourceRunner.java
index e03eaba..2ce32ef 100644
---
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/CreateResourceRunner.java
+++
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/CreateResourceRunner.java
@@ -129,14 +129,14 @@ public class CreateResourceRunner implements Callable, Runnable {
}
// Ensure a resource key was returned from the plugin if the plugin reports
the create was successful
- if ((reportedStatus == CreateResourceStatus.SUCCESS) && (resourceKey
== null)) {
- log.warn("Plugin did not indicate the result of the request: "
+ requestId);
+ if ((isSuccessStatus(reportedStatus)) && (resourceKey == null)) {
+ log.warn("Plugin did not indicate the resource key for this request:
" + requestId);
errorMessage = "Plugin did not indicate a resource key for this
request.";
status = CreateResourceStatus.FAILURE;
}
// RHQ-666 - The plugin should provide a resource name if the create was
successful
- if ((reportedStatus == CreateResourceStatus.SUCCESS) && (resourceName
== null)) {
+ if ((isSuccessStatus(reportedStatus)) && (resourceName == null)) {
log.warn("Plugin did not indicate a resource name for the request:
" + requestId);
errorMessage = "Plugin did not indicate a resource name for this
request.";
status = CreateResourceStatus.FAILURE;
@@ -175,16 +175,21 @@ public class CreateResourceRunner implements Callable, Runnable {
// Trigger a service scan on the parent resource to have the newly created
resource discovered if the plugin
// said the create was successful
- if (runRuntimeScan && (status == CreateResourceStatus.SUCCESS)) {
- log.info("Scanning for newly created resource");
+ if (runRuntimeScan && isSuccessStatus(status)) {
+ log.info("Scanning for newly created Resource...");
try {
InventoryManager inventoryManager =
PluginContainer.getInstance().getInventoryManager();
inventoryManager.performServiceScan(parentResourceId);
} catch (Throwable t) {
- log.error("Error received while attempting runtime scan for newly
created resource");
+ log.error("Error received while attempting runtime scan for newly
created Resource...");
}
}
return response;
}
-}
\ No newline at end of file
+
+ private static boolean isSuccessStatus(CreateResourceStatus status) {
+ return (status == CreateResourceStatus.SUCCESS) || (status ==
CreateResourceStatus.INVALID_CONFIGURATION)
+ || (status == CreateResourceStatus.INVALID_ARTIFACT);
+ }
+ }
\ No newline at end of file
diff --git
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/deploy/ManagedComponentDeployer.java
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/deploy/ManagedComponentDeployer.java
index 5733012..6314d3a 100644
---
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/deploy/ManagedComponentDeployer.java
+++
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/deploy/ManagedComponentDeployer.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -34,7 +34,9 @@ import org.apache.commons.logging.LogFactory;
import org.jboss.deployers.spi.management.KnownDeploymentTypes;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.deployers.spi.management.deploy.DeploymentManager;
+import org.jboss.managed.api.DeploymentState;
import org.jboss.managed.api.ManagedDeployment;
+import org.jboss.profileservice.spi.NoSuchDeploymentException;
import org.jboss.profileservice.spi.ProfileKey;
import org.rhq.core.domain.configuration.Configuration;
@@ -72,7 +74,9 @@ public class ManagedComponentDeployer implements Deployer {
}
public void deploy(CreateResourceReport createResourceReport, ResourceType
resourceType) {
+ createResourceReport.setStatus(null);
File archiveFile = null;
+
try {
ResourcePackageDetails details = createResourceReport.getPackageDetails();
PackageDetailsKey key = details.getKey();
@@ -163,11 +167,34 @@ public class ManagedComponentDeployer implements Deployer {
}
}
- // Deployment was successful!
+ ManagementView managementView =
this.profileServiceConnection.getManagementView();
+ managementView.load();
+ for (String deployedArchive : deployedArchives) {
+ ManagedDeployment managedDeployment;
+ try {
+ managedDeployment = managementView.getDeployment(deployedArchive);
+ } catch (NoSuchDeploymentException e) {
+ LOG.error("Failed to find managed deployment '" +
deployedArchive + "' after deploying '"
+ + archiveName + "'.");
+ continue;
+ }
+ DeploymentState state = managedDeployment.getDeploymentState();
+ if (state != DeploymentState.STARTED) {
+ // The app failed to start - do not consider this a FAILURE, since it
was at least deployed
+ // successfully. However, set the status to INVALID_ARTIFACT and set
an error message, so
+ // the user is informed of the condition.
+
createResourceReport.setStatus(CreateResourceStatus.INVALID_ARTIFACT);
+ createResourceReport.setErrorMessage("Failed to start
application '" + deployedArchive + "' after deploying it.");
+ break;
+ }
+ }
+
createResourceReport.setResourceName(archiveName);
createResourceReport.setResourceKey(archiveName);
- createResourceReport.setStatus(CreateResourceStatus.SUCCESS);
-
+ if (createResourceReport.getStatus() == null) {
+ // Deployment was 100% successful, including starting the app.
+ createResourceReport.setStatus(CreateResourceStatus.SUCCESS);
+ }
} catch (Throwable t) {
LOG.error("Error deploying application for request [" +
createResourceReport + "].", t);
createResourceReport.setStatus(CreateResourceStatus.FAILURE);
diff --git
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/DeploymentUtils.java
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/DeploymentUtils.java
index 7fb2ee8..560cb9d 100644
---
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/DeploymentUtils.java
+++
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/DeploymentUtils.java
@@ -1,6 +1,6 @@
/*
* Jopr Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -107,7 +107,7 @@ public class DeploymentUtils {
+ ThrowableUtil.getAllMessages(distributeFailure));
}
- // Now that we've successfully distributed the deployment, we need to start
it.
+ // Now that we've successfully distributed the deployment, try to start it.
String[] deploymentNames = progress.getDeploymentID().getRepositoryNames();
DeploymentStatus startStatus;
Exception startFailure = null;
@@ -122,30 +122,11 @@ public class DeploymentUtils {
startFailure = e;
}
if (startFailure != null) {
- LOG.error("Failed to start deployment " +
Arrays.asList(deploymentNames) + " during deployment of '"
- + archiveFileName + "'. Backing out the deployment...",
startFailure);
- // If start failed, the app is invalid, so back out the deployment.
- DeploymentStatus removeStatus;
- Exception removeFailure = null;
- try {
- progress = deploymentManager.remove(deploymentNames);
- removeStatus = run(progress);
- if (removeStatus.isFailed()) {
- removeFailure = (removeStatus.getFailure() != null) ?
removeStatus.getFailure() : new Exception(
- "Remove failed for unknown reason.");
- }
- } catch (Exception e) {
- removeFailure = e;
- }
- if (removeFailure != null) {
- LOG.error("Failed to remove deployment " +
Arrays.asList(deploymentNames) + " after start failure.",
- removeFailure);
- }
- throw new Exception("Failed to start deployment " +
Arrays.asList(deploymentNames)
- + " during deployment of '" + archiveFileName + "'
- cause: "
- + ThrowableUtil.getAllMessages(startFailure));
+ // There are times when the user expects the app to fail to start, so just
log a warning.
+ LOG.warn("Failed to start deployment " +
Arrays.asList(deploymentNames) + " during deployment of '"
+ + archiveFileName + "'.", startFailure);
}
- // If we made it this far, the deployment (distribution+start) was successful.
+
return deploymentNames;
}
commit 6002385bcf18e960d5ef4312d656e13ebf870239
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Jun 21 14:43:16 2011 -0400
set read timeout on http url connections to prevent calls to down URLs from hanging
when running on certain versions of JRockit
(
https://bugzilla.redhat.com/show_bug.cgi?id=714817)
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/www/util/WWWUtils.java
b/modules/plugins/apache/src/main/java/org/rhq/plugins/www/util/WWWUtils.java
index 5afb34a..a979565 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/www/util/WWWUtils.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/www/util/WWWUtils.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -21,8 +21,6 @@ package org.rhq.plugins.www.util;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
@@ -32,36 +30,37 @@ import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
-import javax.xml.ws.handler.LogicalHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
- * Helper class that contains methods that send http requests and evaluate results
+ * Helper class that contains methods that send HTTP requests and evaluate results.
+ *
* @author Ian Springer
*/
public abstract class WWWUtils {
- /**
- * Sends a HEAD request to the passed url and returns if the server was
reachable
- * @param httpURL a http or https URL to check
- * @return true if connecting to the URL succeeds, or false otherwise
- */
-
+ /**
+ * Sends a HEAD request for the passed URL and returns true if the URL was
reachable.
+ *
+ * @param httpURL a http or https URL to check
+ * @return true if connecting to the URL succeeds, or false otherwise
+ */
public static boolean isAvailable(URL httpURL) {
String failMsg = "URL [" + httpURL + "] returned
unavailable";
try {
HttpURLConnection connection = (HttpURLConnection) httpURL.openConnection();
connection.setRequestMethod("HEAD");
connection.setConnectTimeout(3000);
+ connection.setReadTimeout(1000);
if (connection instanceof HttpsURLConnection) {
disableCertificateVerification((HttpsURLConnection) connection);
}
connection.connect();
- // get the respone code to actually trigger sending the Request.
+ // get the response code to actually trigger sending the Request.
connection.getResponseCode();
} catch (SSLException e) {
Log log = LogFactory.getLog(WWWUtils.class);
@@ -77,9 +76,10 @@ public abstract class WWWUtils {
}
/**
- * Get the content of the 'Server:' header
+ * Get the content of the 'Server' header.
+ *
* @param httpURL a http or https URL to get the header from
- * @return The contents of the header or null if anything went wrong or the field was
not present.
+ * @return the contents of the header or null if anything went wrong or the field was
not present.
*/
public static String getServerHeader(URL httpURL) {
String ret;
@@ -88,8 +88,10 @@ public abstract class WWWUtils {
HttpURLConnection connection = (HttpURLConnection) httpURL.openConnection();
connection.setRequestMethod("HEAD");
connection.setConnectTimeout(3000);
+ connection.setReadTimeout(1000);
+
connection.connect();
- // get the respone code to actually trigger sending the Request.
+ // get the response code to actually trigger sending the Request.
connection.getResponseCode();
ret = connection.getHeaderField("Server");
}
@@ -108,9 +110,11 @@ public abstract class WWWUtils {
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
{
+ return;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
{
+ return;
}
}
};
@@ -120,14 +124,11 @@ public abstract class WWWUtils {
connection.setSSLSocketFactory(sslContext.getSocketFactory());
connection.setHostnameVerifier(new HostnameVerifier() {
@Override
- public boolean verify(String s, SSLSession sslSession) {
+ public boolean verify(String hostname, SSLSession sslSession) {
return true;
}
});
- } catch (NoSuchAlgorithmException e) {
- Log log = LogFactory.getLog(WWWUtils.class);
- log.warn("Failed to disable certificate validation.", e);
- } catch (KeyManagementException e) {
+ } catch (Exception e) {
Log log = LogFactory.getLog(WWWUtils.class);
log.warn("Failed to disable certificate validation.", e);
}
commit 1ec59dd46414571a9665657d74db4a97c8bfe0b7
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Mon Jun 20 15:52:02 2011 -0500
Remove findbugs filter and parse all the files included in project.
diff --git a/pom.xml b/pom.xml
index 404ca42..98dfb0c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1213,7 +1213,6 @@
<version>2.3.2</version>
<configuration>
<xmlOutput>true</xmlOutput>
- <onlyAnalyze>org.rhq.*,org.jboss.jopr.*</onlyAnalyze>
<effort>Max</effort>
<threshold>Default</threshold>
</configuration>
commit fd40309615241dcc25419fc11c811254944b29c0
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Mon Jun 20 14:42:55 2011 -0500
Upgrade findbugs to version 2.3.2.
diff --git a/modules/plugins/jboss-as-5/pom.xml b/modules/plugins/jboss-as-5/pom.xml
index 7d0fdcc..6ec0096 100644
--- a/modules/plugins/jboss-as-5/pom.xml
+++ b/modules/plugins/jboss-as-5/pom.xml
@@ -720,7 +720,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
- <version>2.0.1</version>
+ <version>2.3.2</version>
</plugin>
</plugins>
</reporting>
diff --git a/modules/plugins/jboss-cache-v3/pom.xml
b/modules/plugins/jboss-cache-v3/pom.xml
index 1d1e3aa..1a3a1df 100644
--- a/modules/plugins/jboss-cache-v3/pom.xml
+++ b/modules/plugins/jboss-cache-v3/pom.xml
@@ -645,7 +645,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
- <version>2.0.1</version>
+ <version>2.3.2</version>
</plugin>
</plugins>
</reporting>
diff --git a/pom.xml b/pom.xml
index b7f249e..404ca42 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
<commons-logging.version>1.1.0.jboss</commons-logging.version>
<concurrent.version>1.3.4-jboss-update1</concurrent.version> <!--
oswego-concurrent compatible with 4.2.3.GA -->
- <findbugs.version>2.3.1</findbugs.version>
+ <findbugs.version>2.3.2</findbugs.version>
<getopt.version>1.0.13</getopt.version>
<hibernate3.version>3.2.r14201-2</hibernate3.version>
<hibernate-annotations.version>3.2.1.GA</hibernate-annotations.version>
@@ -1210,7 +1210,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
- <version>2.3.1</version>
+ <version>2.3.2</version>
<configuration>
<xmlOutput>true</xmlOutput>
<onlyAnalyze>org.rhq.*,org.jboss.jopr.*</onlyAnalyze>
commit eb65e1d4bd710ca8e2c2f56c36419aecf8b78a4e
Merge: 7e9533e 04f721e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Jun 20 12:50:01 2011 +0200
Merge branch 'master' into linking
Conflicts:
modules/core/dbutils/pom.xml
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
diff --cc modules/core/dbutils/pom.xml
index c4c6a6a,e5994fe..a368986
--- a/modules/core/dbutils/pom.xml
+++ b/modules/core/dbutils/pom.xml
@@@ -22,7 -22,7 +22,7 @@@
<properties>
<scm.module.path>modules/core/dbutils/</scm.module.path>
- <db.schema.version>2.108</db.schema.version>
- <db.schema.version>2.109</db.schema.version>
++ <db.schema.version>2.110</db.schema.version>
</properties>
<dependencies>
diff --cc modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 20ebfb9,bbaa066..4d66b02
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@@ -3390,35 -3390,30 +3390,60 @@@
<schema-createSequence name="RHQ_OPERATION_SCHEDULE_ID_SEQ"
initial="10001"/>
</schemaSpec>
++
+ <!-- BZ 644328 -->
<schemaSpec version="2.108">
+ <schema-addColumn table="RHQ_RESOURCE_TYPE"
column="BUNDLE_CONFIG_ID" columnType="INTEGER" />
+ <schema-directSQL>
+ <statement desc="Creating RHQ_RESOURCE_TYPE foreign key
relation to RHQ_CONFIG for bundle config">
+ ALTER TABLE RHQ_RESOURCE_TYPE
+ ADD CONSTRAINT RHQ_RT_BUNDLE_CONFIG_ID_FK
+ FOREIGN KEY (BUNDLE_CONFIG_ID)
+ REFERENCES RHQ_CONFIG (ID)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
+ <!-- BZ 644328 -->
+ <schemaSpec version="2.109">
+ <schema-addColumn table="RHQ_BUNDLE_DESTINATION"
column="DEST_BASE_DIR_NAME" columnType="VARCHAR2"
precision="200" />
+ <schema-directSQL>
+ <statement desc="Pointing all bundle destinations to the
platform type's Root File System dest base dir">
+ UPDATE RHQ_BUNDLE_DESTINATION SET DEST_BASE_DIR_NAME = 'Root
File System'
+ </statement>
+ </schema-directSQL>
+ <schema-alterColumn table="RHQ_BUNDLE_DESTINATION"
column="DEST_BASE_DIR_NAME" nullable="FALSE"/>
+ </schemaSpec>
+
++ <schemaSpec version="2.110">
+ <schema-directSQL>
+ <statement desc="Creating table
RHQ_PROP_DEF_OPT_SRC">
+ CREATE TABLE RHQ_PROP_DEF_OPT_SRC ( ID INTEGER PRIMARY KEY )
+ </statement>
+ </schema-directSQL>
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="LINK_TO_TARGET" columnType="BOOLEAN"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="LINK_TO_TARGET" nullable="TRUE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="FILTER" columnType="VARCHAR2" precision="40"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="FILTER" nullable="TRUE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="EXPRESSION" columnType="VARCHAR2"
precision="400"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="EXPRESSION" nullable="FALSE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="TARGET_TYPE" columnType="VARCHAR2"
precision="20"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="TARGET_TYPE" nullable="FALSE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="PROPERTY_DEF_ID" columnType="INTEGER"/>
+ <schema-directSQL>
+ <statement desc="Adding a fk">
+ ALTER TABLE RHQ_PROP_DEF_OPT_SRC
+ ADD CONSTRAINT RHQ_PROP_DEF_OPT_SRC_ID_FK
+ FOREIGN KEY (PROPERTY_DEF_ID)
+ REFERENCES RHQ_CONFIG_PROP_DEF (ID)
+ </statement>
+ </schema-directSQL>
+ <schema-createSequence
name="rhq_config_prop_def_opt_src_id_seq" initial="10001" />
+ </schemaSpec>
</dbupgrade>
</target>
</project>
commit 7e9533e6a0a07a333beb8ed2a3867829098f554e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Jun 20 12:36:03 2011 +0200
Put the callback before the creation of the new Editor.
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
index bd59ff8..3e1364b 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
@@ -71,8 +71,6 @@ import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
-import com.smartgwt.client.widgets.form.fields.events.TitleHoverEvent;
-import com.smartgwt.client.widgets.form.fields.events.TitleHoverHandler;
import com.smartgwt.client.widgets.form.validator.CustomValidator;
import com.smartgwt.client.widgets.form.validator.FloatRangeValidator;
import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
@@ -352,22 +350,6 @@ public class ConfigurationEditor extends LocatableVLayout {
}
}
- if (configurationDefinition!=null ) {
-
configurationService.getOptionValuesForConfigDefinition(configurationDefinition,new
AsyncCallback<ConfigurationDefinition>() {
- @Override
- public void onFailure(Throwable throwable) {
- showError(throwable);
- }
-
- @Override
- public void onSuccess(ConfigurationDefinition result) {
- if (loadHandler!=null)
- loadHandler.loadedConfigurationDefinition(result);
- }
- });
- }
-
-
reload();
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index 528f2ef..ed727db 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -28,6 +28,7 @@ import java.util.Set;
import java.util.TreeSet;
import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.Canvas;
@@ -58,6 +59,8 @@ import
org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm
import org.rhq.enterprise.gui.coregui.client.components.form.TimeUnit;
import org.rhq.enterprise.gui.coregui.client.components.form.UnitType;
import org.rhq.enterprise.gui.coregui.client.components.trigger.JobTriggerEditor;
+import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import
org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.TypeConversionUtility;
@@ -355,7 +358,7 @@ public abstract class AbstractOperationScheduleDetailsView extends
if (operationName == null) {
value = "<i>" +
MSG.view_operationScheduleDetails_fieldDefault_parameters() + "</i>";
} else {
- ConfigurationDefinition parametersDefinition =
this.operationNameToParametersDefinitionMap
+ final ConfigurationDefinition parametersDefinition =
this.operationNameToParametersDefinitionMap
.get(operationName);
if (parametersDefinition == null ||
parametersDefinition.getPropertyDefinitions().isEmpty()) {
value = "<i>" +
MSG.view_operationScheduleDetails_noParameters() + "</i>";
@@ -382,11 +385,40 @@ public abstract class AbstractOperationScheduleDetailsView extends
} else {
}
+
+ ConfigurationGWTServiceAsync configurationService =
GWTServiceLookup.getConfigurationService();
+
configurationService.getOptionValuesForConfigDefinition(parametersDefinition,new
AsyncCallback<ConfigurationDefinition>() {
+
+
+ @Override
+ public void onFailure(Throwable throwable) {
+ ConfigurationEditor configurationEditor = new
ConfigurationEditor("ParametersEditor",
+ parametersDefinition, parameters);
+ configurationEditor.setReadOnly(isReadOnly());
+
operationParametersConfigurationHolder.addMember(configurationEditor);
+ operationParametersConfigurationHolder.show();
+
+ }
+
+ @Override
+ public void onSuccess(ConfigurationDefinition result) {
+ ConfigurationEditor configurationEditor = new
ConfigurationEditor("ParametersEditor",
+ result, parameters);
+ configurationEditor.setReadOnly(isReadOnly());
+
operationParametersConfigurationHolder.addMember(configurationEditor);
+ operationParametersConfigurationHolder.show();
+
+ }
+ });
+
+
+/*
ConfigurationEditor configurationEditor = new
ConfigurationEditor("ParametersEditor",
parametersDefinition, this.parameters);
configurationEditor.setReadOnly(isReadOnly());
this.operationParametersConfigurationHolder.addMember(configurationEditor);
this.operationParametersConfigurationHolder.show();
+*/
}
}
this.operationParametersItem.setValue(value);
commit 17552e0da2d96b1ee71f145dd31bc4b9d6671430
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Jun 17 20:43:52 2011 +0200
Prevent possible NPE
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
index fd94954..ebb6d38 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
@@ -250,6 +250,8 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
public void setOptionsSource(PropertyOptionsSource source) {
this.optionsSource.clear();
+ if (source==null)
+ return;
source.propertyDefinition = this;
this.optionsSource.add(source);
}
commit 4b070d94e8ceedefd7811a7d2cebe30010f03907
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Jun 17 20:01:21 2011 +0200
Directly do a resource criteria query. No need for the SearchSubsystem.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 3e10602..8299edd 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -2412,32 +2412,19 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
if (pds.getOptionsSource()!=null) {
// evaluate the source parameters
PropertyOptionsSource pos = pds.getOptionsSource();
- SearchSubsystem subsystem;
- if (pos.getTargetType()== PropertyOptionsSource.TargetType.GROUP)
- subsystem=SearchSubsystem.GROUP;
- else
- subsystem=SearchSubsystem.RESOURCE;
- SearchAssistManager searchAssistManager = new SearchAssistManager(subject,
subsystem); // TODO do we need the suggestions at all?
- List<SearchSuggestion> suggestions =
searchAssistManager.getSuggestions(pos.getExpression(),
- pos.getExpression().length());
- if (suggestions.size()>1)
- log.warn("Search expression for property [" + pds.getName() +
"] returned more than one result, joining ...");
- for (SearchSuggestion suggestion : suggestions) {
- ResourceCriteria criteria = new ResourceCriteria();
- criteria.setSearchExpression(suggestion.getValue());
- // TODO for groups we need to talk to the group manager
- List<ResourceComposite> composites =
resourceManager.findResourceCompositesByCriteria(subject,criteria);
- for (ResourceComposite composite : composites) {
-
- // TODO for configuration we need to drill down into the resource
configuration
- PropertyDefinitionEnumeration pde = new
PropertyDefinitionEnumeration(composite.getResource().getName(),""+composite.getResource().getId());
-
- // TODO filter -- or leave up to search expression??
-
- pds.getEnumeratedValues().add(pde);
- }
- }
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.setSearchExpression(pos.getExpression());
+ // TODO for groups we need to talk to the group manager
+ List<ResourceComposite> composites =
resourceManager.findResourceCompositesByCriteria(subject,criteria);
+ for (ResourceComposite composite : composites) {
+
+ // TODO for configuration we need to drill down into the resource
configuration
+ PropertyDefinitionEnumeration pde = new
PropertyDefinitionEnumeration(composite.getResource().getName(),""+composite.getResource().getId());
+ // TODO filter -- or leave up to search expression??
+
+ pds.getEnumeratedValues().add(pde);
+ }
}
}
commit 828c5d27e76168e2827ee3b868bb433087afb9e8
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Jun 17 18:18:50 2011 +0200
Persist the link to the property definition
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
index a597478..fd94954 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
@@ -250,6 +250,7 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
public void setOptionsSource(PropertyOptionsSource source) {
this.optionsSource.clear();
+ source.propertyDefinition = this;
this.optionsSource.add(source);
}
commit 6bdc50c39f70d2dce81db95dabaf28555df35167
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Jun 17 14:45:35 2011 +0200
Hook in the search subsystem and criteria search.
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
index 3aeaa07..bbd047b 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
@@ -355,7 +355,7 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
public ConfigurationDefinition getOptionValuesForConfigDefinition(
ConfigurationDefinition definition) throws RuntimeException {
try {
- ConfigurationDefinition def =
configurationManager.getOptionsForConfigurationDefinition(definition);
+ ConfigurationDefinition def =
configurationManager.getOptionsForConfigurationDefinition(getSessionSubject(),
definition);
return
SerialUtility.prepare(def,"ConfigurationService.getOptionValuesForPropertySimple");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 64f0927..3e10602 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -67,6 +67,7 @@ import
org.rhq.core.domain.configuration.definition.ConfigurationFormat;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertyOptionsSource;
import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
import org.rhq.core.domain.configuration.group.GroupPluginConfigurationUpdate;
import org.rhq.core.domain.configuration.group.GroupResourceConfigurationUpdate;
@@ -75,15 +76,19 @@ import
org.rhq.core.domain.criteria.GroupPluginConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.GroupResourceConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
+import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceError;
import org.rhq.core.domain.resource.ResourceErrorType;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.composite.ResourceComposite;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
+import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.core.domain.search.SearchSuggestion;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
@@ -113,6 +118,7 @@ import
org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupNotFoundException;
import org.rhq.enterprise.server.resource.group.ResourceGroupUpdateException;
import org.rhq.enterprise.server.scheduler.SchedulerLocal;
+import org.rhq.enterprise.server.search.execution.SearchAssistManager;
import org.rhq.enterprise.server.system.ServerVersion;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
@@ -2378,7 +2384,8 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
return updates;
}
- public ConfigurationDefinition
getOptionsForConfigurationDefinition(ConfigurationDefinition def) {
+
+ public ConfigurationDefinition getOptionsForConfigurationDefinition(Subject subject,
ConfigurationDefinition def) {
for (Map.Entry<String,PropertyDefinition> entry :
def.getPropertyDefinitions().entrySet()) {
@@ -2386,23 +2393,52 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
if (pd instanceof PropertyDefinitionSimple) {
PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd;
- handlePDS(pds);
+ handlePDS(subject, pds);
}
// TODO consider more cases
}
- return def;
+ return def; // TODO clone the incoming definition?
}
- private void handlePDS(PropertyDefinitionSimple pds) {
+ /**
+ * Determine the dynamic enumeration values for one PropertyDefinitionSimple
+ * @param subject Subject of the caller - may limit search results
+ * @param pds the PropertyDefinitionSimple to work on
+ */
+ private void handlePDS(Subject subject, PropertyDefinitionSimple pds) {
if (pds.getOptionsSource()!=null) {
- // TODO evaluate the source parameters
+ // evaluate the source parameters
+ PropertyOptionsSource pos = pds.getOptionsSource();
+ SearchSubsystem subsystem;
+ if (pos.getTargetType()== PropertyOptionsSource.TargetType.GROUP)
+ subsystem=SearchSubsystem.GROUP;
+ else
+ subsystem=SearchSubsystem.RESOURCE;
+ SearchAssistManager searchAssistManager = new SearchAssistManager(subject,
subsystem); // TODO do we need the suggestions at all?
+ List<SearchSuggestion> suggestions =
searchAssistManager.getSuggestions(pos.getExpression(),
+ pos.getExpression().length());
+ if (suggestions.size()>1)
+ log.warn("Search expression for property [" + pds.getName() +
"] returned more than one result, joining ...");
+ for (SearchSuggestion suggestion : suggestions) {
+ ResourceCriteria criteria = new ResourceCriteria();
+ criteria.setSearchExpression(suggestion.getValue());
+ // TODO for groups we need to talk to the group manager
+ List<ResourceComposite> composites =
resourceManager.findResourceCompositesByCriteria(subject,criteria);
+ for (ResourceComposite composite : composites) {
+
+ // TODO for configuration we need to drill down into the resource
configuration
+ PropertyDefinitionEnumeration pde = new
PropertyDefinitionEnumeration(composite.getResource().getName(),""+composite.getResource().getId());
+
+ // TODO filter -- or leave up to search expression??
+
+ pds.getEnumeratedValues().add(pde);
+ }
+ }
+
}
- // TODO next is a dummy.
- PropertyDefinitionEnumeration foo = new
PropertyDefinitionEnumeration("main-server-group","main-server-group");
- pds.getEnumeratedValues().add(foo);
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
index ca557203..f047d7b 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
@@ -568,5 +568,5 @@ public interface ConfigurationManagerLocal {
PageList<GroupPluginConfigurationUpdate>
findGroupPluginConfigurationUpdatesByCriteria(Subject subject,
GroupPluginConfigurationUpdateCriteria criteria);
- ConfigurationDefinition getOptionsForConfigurationDefinition(ConfigurationDefinition
def);
+ ConfigurationDefinition getOptionsForConfigurationDefinition(Subject subject,
ConfigurationDefinition def);
}
\ No newline at end of file
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java
index 3570f56..dbbeb64 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java
@@ -10,8 +10,12 @@ import java.util.List;
import org.testng.annotations.Test;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.search.SearchSubsystem;
import org.rhq.core.domain.search.SearchSuggestion;
+import org.rhq.enterprise.server.search.execution.SearchAssistManager;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.util.LookupUtil;
public class GenericSearchAssistTest extends AbstractEJB3Test {
@@ -61,6 +65,19 @@ public class GenericSearchAssistTest extends AbstractEJB3Test {
}
}
+ @Test
+ public void test2() throws Exception {
+ Subject overlord = LookupUtil.getSubjectManager().getOverlord();
+ SearchAssistManager mgr = new SearchAssistManager(overlord,
SearchSubsystem.RESOURCE);
+ List<SearchSuggestion> suggestions =
mgr.getSuggestions("category=PLATFORM",0);
+ System.out.println("Number of suggestions: " + suggestions.size());
+ for (SearchSuggestion s : suggestions) {
+ System.out.println(s);
+ }
+
+
+ }
+
private void compare(List<SearchSuggestion> results, List<String>
expected) {
List<String> rawResults = new ArrayList<String>();
for (SearchSuggestion suggestion : results) {
commit 3b2d8e21c537dac74b9652c63f8b12bef053c531
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Jun 15 18:11:44 2011 +0200
As tests are checking *updates*, I can only verify the updated version.
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 f3df649..ffdfec7 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
@@ -181,29 +181,17 @@ public class ConfigurationMetadataManagerBeanTest extends
AbstractEJB3Test {
public void updatePropertyDefinitionOptionSource() {
initConfigDefs("servers[name='OptionSourceTest']",
"OptionSourceTest");
- // check initial entry
- PropertyDefinitionSimple prop1 = (PropertyDefinitionSimple)
originalConfigDef.get("prop1");
- assert prop1 !=null;
-// assert prop1.getEnumeratedValues().size()==1 : "Did not find my one
option"; TODO
- PropertyOptionsSource source = prop1.getOptionsSource();
- assert source !=null : "PropertyOptionSource was not persisted";
- assert source.getFilter().equals("*.jdbc");
-
- PropertyDefinitionSimple prop2 = (PropertyDefinitionSimple)
originalConfigDef.get("prop2");
- assert prop2 !=null;
- assert prop2.getEnumeratedValues().size()==0;
- assert prop2.getOptionsSource()==null;
// now check the upgrades
- prop1 = (PropertyDefinitionSimple) updatedConfigDef.get("prop1");
+ PropertyDefinitionSimple prop1 = (PropertyDefinitionSimple)
updatedConfigDef.get("prop1");
assert prop1 !=null;
assert prop1.getEnumeratedValues().size()==0 : "Found an option value.
";
- source = prop1.getOptionsSource();
+ PropertyOptionsSource source = prop1.getOptionsSource();
assert source !=null : "PropertyOptionSource was not persisted";
assert source.getFilter()==null : "Assumed filter to be null, but was "
+ source.getFilter();
- prop2 = (PropertyDefinitionSimple) updatedConfigDef.get("prop2");
+ PropertyDefinitionSimple prop2 = (PropertyDefinitionSimple)
updatedConfigDef.get("prop2");
assert prop2 !=null;
- assert prop2.getEnumeratedValues().size()==0;
+ assert prop2.getEnumeratedValues().size()==1;
assert prop2.getOptionsSource()!=null;
assert prop2.getOptionsSource().getExpression().equals("*");
@@ -239,6 +227,7 @@ public class ConfigurationMetadataManagerBeanTest extends
AbstractEJB3Test {
private void updateConfigDef() {
ConfigurationMetadataManagerLocal configMetadataMgr =
LookupUtil.getConfigurationMetadataManager();
+ // The next line updates originalConfigDef with the content of updatedConfigDef
configMetadataMgr.updateConfigurationDefinition(updatedConfigDef,
originalConfigDef);
}
diff --git
a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
index 0f0e3a7..4292975 100644
---
a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
+++
b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
@@ -96,6 +96,9 @@
linkToTarget="false"/>
</c:simple-property>
<c:simple-property name="prop2">
+ <c:property-options>
+ <c:option value="value2"/>
+ </c:property-options>
<c:option-source target="resource"
expression="*"/>
</c:simple-property>
</plugin-configuration>
commit 093dfe99e79909d8cc0b01615a0b61fdc84a985f
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Jun 15 17:17:40 2011 +0200
Initial batch of core object changes and plugin parsing for the dependent values
feature.
diff --git
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/ConfigurationMetadataParser.java
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/ConfigurationMetadataParser.java
index 72e107a..facde3c 100644
---
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/ConfigurationMetadataParser.java
+++
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/ConfigurationMetadataParser.java
@@ -40,6 +40,7 @@ import
org.rhq.core.clientapi.descriptor.configuration.IntegerConstraintType;
import org.rhq.core.clientapi.descriptor.configuration.ListProperty;
import org.rhq.core.clientapi.descriptor.configuration.MapProperty;
import org.rhq.core.clientapi.descriptor.configuration.Option;
+import org.rhq.core.clientapi.descriptor.configuration.OptionSource;
import org.rhq.core.clientapi.descriptor.configuration.PropertyGroup;
import org.rhq.core.clientapi.descriptor.configuration.PropertyOptions;
import org.rhq.core.clientapi.descriptor.configuration.PropertyType;
@@ -60,6 +61,7 @@ import
org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyOptionsSource;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
import org.rhq.core.domain.configuration.definition.constraint.Constraint;
import org.rhq.core.domain.configuration.definition.constraint.FloatRangeConstraint;
@@ -235,6 +237,24 @@ public class ConfigurationMetadataParser {
parsePropertyOptions(property, simpleProperty.getPropertyOptions());
}
+ if (simpleProperty.getOptionSource() != null) {
+ PropertyOptionsSource optionsSource = new PropertyOptionsSource();
+ OptionSource source = simpleProperty.getOptionSource();
+ optionsSource.setTarget(source.getTarget().toString());
+ optionsSource.setLinkToTarget(source.isLinkToTarget());
+ if (source.getFilter()!=null && source.getFilter().length()>40) {
+ throw new IllegalArgumentException("Filter expression must be less
than 40 chars long");
+ }
+ optionsSource.setFilter(source.getFilter());
+ String expression = source.getExpression();
+ if (expression ==null || expression.isEmpty())
+ throw new IllegalArgumentException("Expression must not be
empty");
+ if (expression.length()>400)
+ throw new IllegalArgumentException("Expression must be less than 400
chars long");
+ optionsSource.setExpression(expression);
+ property.setOptionsSource(optionsSource);
+ }
+
return property;
}
@@ -500,4 +520,4 @@ public class ConfigurationMetadataParser {
return (value != null) ? value.trim() : null;
}
-}
\ No newline at end of file
+}
diff --git a/modules/core/client-api/src/main/resources/rhq-configuration.xsd
b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
index fe898f2..b038ec1 100644
--- a/modules/core/client-api/src/main/resources/rhq-configuration.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
@@ -258,6 +258,8 @@
<xs:element name="property-options"
type="config:propertyOptions" minOccurs="0"
maxOccurs="1"/>
+ <xs:element name="option-source"
type="config:optionSource" minOccurs="0" maxOccurs="1"/>
+
<xs:element name="constraint"
type="config:constraintType" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="defaultValueDescription"
minOccurs="0" maxOccurs="1">
@@ -440,6 +442,46 @@
</xs:attribute>
</xs:complexType>
+ <xs:simpleType name="sourceType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="plugin"/>
+ <xs:enumeration value="resourceType"/>
+ <xs:enumeration value="resource"/>
+ <xs:enumeration value="configuration"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="optionSource">
+ <xs:annotation>
+ <xs:documentation>
+ Defines a source for the options of the property options. Sources can
e.g.
+ be Resources, ResourceTypes, Schedules, Configurations etc.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:attribute name="target" use="required"
type="config:sourceType">
+ <xs:annotation>
+ <xs:documentation>Type of the link target</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="linkToTarget" use="optional"
default="false" type="xs:boolean">
+ <xs:annotation>
+ <xs:documentation>Should the UI show a link to the
target?</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="filter" use="optional"
type="xs:string">
+ <xs:annotation>
+ <xs:documentation>A filter to narrow down search results. Example:
*.jdbc</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="expression" use="required"
type="xs:string">
+ <xs:annotation>
+ <xs:documentation>An expression that defines a path to the target
item(s).
+ Expressions are written in the syntax of the search
bar.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ </xs:complexType>
+
<xs:complexType name="option">
<xs:annotation>
<xs:documentation>Describes an allowed value for an enumerated simple
property.
diff --git
a/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/ConfigurationMetadataParser2Test.java
b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/ConfigurationMetadataParser2Test.java
new file mode 100644
index 0000000..46db0a3
--- /dev/null
+++
b/modules/core/client-api/src/test/java/org/rhq/core/clientapi/agent/metadata/test/ConfigurationMetadataParser2Test.java
@@ -0,0 +1,131 @@
+ /*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 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.clientapi.agent.metadata.test;
+
+ import java.net.URL;
+ import java.util.List;
+
+ import javax.xml.bind.JAXBContext;
+ import javax.xml.bind.Unmarshaller;
+ import javax.xml.bind.util.ValidationEventCollector;
+
+
+ import org.apache.commons.logging.Log;
+ import org.apache.commons.logging.LogFactory;
+ import org.testng.annotations.BeforeSuite;
+ import org.testng.annotations.Test;
+
+ import org.rhq.core.clientapi.agent.metadata.ConfigurationMetadataParser;
+ import org.rhq.core.clientapi.agent.metadata.InvalidPluginDescriptorException;
+ import org.rhq.core.clientapi.descriptor.DescriptorPackages;
+ import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
+ import org.rhq.core.clientapi.descriptor.plugin.ServerDescriptor;
+ import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+ import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+ import org.rhq.core.domain.configuration.definition.PropertySimpleType;
+
+ /**
+ * @author Jason Dobies
+ * @author Heiko W. Rupp
+ */
+ public class ConfigurationMetadataParser2Test {
+ private static final Log LOG =
LogFactory.getLog(ConfigurationMetadataParser2Test.class);
+ private static final String DESCRIPTOR_FILENAME = "test2-plugin.xml";
+
+ private PluginDescriptor pluginDescriptor;
+
+ @BeforeSuite
+ public void loadPluginDescriptor() throws Exception {
+ try {
+ URL descriptorUrl =
this.getClass().getClassLoader().getResource(DESCRIPTOR_FILENAME);
+ LOG.info("Loading plugin descriptor at: " + descriptorUrl);
+
+ JAXBContext jaxbContext =
JAXBContext.newInstance(DescriptorPackages.PC_PLUGIN);
+
+ Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+ ValidationEventCollector vec = new ValidationEventCollector();
+ unmarshaller.setEventHandler(vec);
+ pluginDescriptor = (PluginDescriptor)
unmarshaller.unmarshal(descriptorUrl.openStream());
+ } catch (Throwable t) {
+ // Catch RuntimeExceptions and Errors and dump their stack trace, because
Surefire will completely swallow them
+ // and throw a cryptic NPE (see
http://jira.codehaus.org/browse/SUREFIRE-157)!
+ t.printStackTrace();
+ throw new RuntimeException(t);
+ }
+ }
+
+ @Test
+ public void parseValidDefinitionServer2() throws InvalidPluginDescriptorException {
+ ConfigurationDefinition definition = loadDescriptor("testServer2");
+
+ assertSimplePropertyType(definition, "prop1",
PropertySimpleType.STRING);
+ assertSimplePropertyType(definition, "prop2",
PropertySimpleType.STRING);
+ assertSimplePropertyType(definition, "prop3",
PropertySimpleType.STRING);
+
+ PropertyDefinitionSimple pds = (PropertyDefinitionSimple)
definition.get("prop1");
+ assert pds.getEnumeratedValues().size()==2;
+ assert pds.getOptionsSource()==null;
+
+ pds = (PropertyDefinitionSimple) definition.get("prop2");
+ assert pds.getEnumeratedValues().isEmpty();
+ assert pds.getOptionsSource()!=null;
+
+ pds = (PropertyDefinitionSimple) definition.get("prop3");
+ assert pds.getEnumeratedValues().size()==1;
+ assert pds.getOptionsSource()!=null;
+
+ }
+
+
+
+
+
+
+ private void assertSimplePropertyType(ConfigurationDefinition definition, String
propertyName,
+ PropertySimpleType type) {
+ PropertyDefinitionSimple simple =
definition.getPropertyDefinitionSimple(propertyName);
+ assert simple != null : propertyName + " was not loaded";
+ assert simple.getType() == type : propertyName + " was read with incorrect
type";
+ assert simple.getName().equals(propertyName) : propertyName + " was read
with no name";
+ }
+
+
+ private ConfigurationDefinition loadDescriptor(String serverName) throws
InvalidPluginDescriptorException {
+ List<ServerDescriptor> servers = pluginDescriptor.getServers();
+
+ ServerDescriptor serverDescriptor = findServer(serverName, servers);
+ assert serverDescriptor != null : "Server descriptor not found in test
plugin descriptor";
+
+ return ConfigurationMetadataParser.parse("null",
serverDescriptor.getResourceConfiguration());
+ }
+
+ private ServerDescriptor findServer(String name, List<ServerDescriptor>
servers) {
+ for (ServerDescriptor server : servers) {
+ if (server.getName().equals(name)) {
+ return server;
+ }
+ }
+
+ return null;
+ }
+ }
diff --git a/modules/core/client-api/src/test/resources/test2-plugin.xml
b/modules/core/client-api/src/test/resources/test2-plugin.xml
new file mode 100644
index 0000000..e954f51
--- /dev/null
+++ b/modules/core/client-api/src/test/resources/test2-plugin.xml
@@ -0,0 +1,40 @@
+<plugin name="TestPlugin2" displayName="Mock JBoss AS"
package="org.rhq.plugins.mock.jboss"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+
+ <server name="testServer2">
+
+
+ <resource-configuration>
+ <c:simple-property name="prop1">
+ <c:property-options>
+ <c:option value="a"/>
+ <c:option value="b"/>
+ </c:property-options>
+ </c:simple-property>
+
+ <c:simple-property name="prop2">
+ <c:option-source
+ target="resource"
+ linkToTarget="true"
+ filter="*.jdbc"
+ expression="resourceType=DomainDeployment,resource=*"
/>
+ </c:simple-property>
+
+ <c:simple-property name="prop3">
+ <c:property-options>
+ <c:option value="one"/>
+ </c:property-options>
+ <c:option-source
+ target="resource"
+ linkToTarget="true"
+ filter="*.jdbc"
+ expression="resourceType=DomainDeployment,resource=*"
/>
+ </c:simple-property>
+
+ </resource-configuration>
+
+ </server>
+</plugin>
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index 800cb87..c4c6a6a 100644
--- a/modules/core/dbutils/pom.xml
+++ b/modules/core/dbutils/pom.xml
@@ -22,7 +22,7 @@
<properties>
<scm.module.path>modules/core/dbutils/</scm.module.path>
- <db.schema.version>2.107</db.schema.version>
+ <db.schema.version>2.108</db.schema.version>
</properties>
<dependencies>
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
b/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
index 209a8a9..c5155ab 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
@@ -58,6 +58,15 @@
<column name="PROPERTY_DEF_ID" type="INTEGER"
required="false" references="RHQ_CONFIG_PROP_DEF"/>
</table>
+ <table name="RHQ_PROP_DEF_OPT_SRC">
+ <column name="ID" type="INTEGER" required="true"
default="sequence-only" initial="10001"
primarykey="true"/>
+ <column name="LINK_TO_TARGET" type="BOOLEAN"
required="false"/>
+ <column name="FILTER" type="VARCHAR2"
required="false" size="40"/>
+ <column name="EXPRESSION" type="VARCHAR2"
required="true" size="400"/>
+ <column name="TARGET_TYPE" type="VARCHAR2"
required="true" size="20"/>
+ <column name="PROPERTY_DEF_ID" type="INTEGER"
required="false" references="RHQ_CONFIG_PROP_DEF"/>
+ </table>
+
<table name="RHQ_CONFIG_PROP_CONSTR">
<column name="ID" type="INTEGER" required="true"
default="sequence-only" initial="10001"
primarykey="true"/>
<column name="DTYPE" type="VARCHAR2"
required="true" size="15"/>
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 1e7fffe..20ebfb9 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3290,11 +3290,11 @@
<schema-directSQL>
<statement desc="Changing primary key of
RHQ_OPERATION_SCHEDULE to ID. Step1/3...">
ALTER TABLE RHQ_OPERATION_SCHEDULE DROP CONSTRAINT
RHQ_OPERATION_SCHEDULE_KEY
- </statement>
- <statement desc="Changing primary key of
RHQ_OPERATION_SCHEDULE to ID. Step2/3...">
+ </statement>
+ <statement desc="Changing primary key of
RHQ_OPERATION_SCHEDULE to ID. Step2/3...">
ALTER TABLE RHQ_OPERATION_SCHEDULE ADD PRIMARY KEY (ID)
- </statement>
- <statement desc="Changing primary key of
RHQ_OPERATION_SCHEDULE to ID. Step3/3...">
+ </statement>
+ <statement desc="Changing primary key of
RHQ_OPERATION_SCHEDULE to ID. Step3/3...">
CREATE UNIQUE INDEX RHQ_OPERATION_SCHEDULE_KEY_IDX ON
RHQ_OPERATION_SCHEDULE (JOB_NAME, JOB_GROUP)
</statement>
</schema-directSQL>
@@ -3389,6 +3389,36 @@
<schemaSpec version="2.107">
<schema-createSequence name="RHQ_OPERATION_SCHEDULE_ID_SEQ"
initial="10001"/>
</schemaSpec>
+
+ <schemaSpec version="2.108">
+ <schema-directSQL>
+ <statement desc="Creating table
RHQ_PROP_DEF_OPT_SRC">
+ CREATE TABLE RHQ_PROP_DEF_OPT_SRC ( ID INTEGER PRIMARY KEY )
+ </statement>
+ </schema-directSQL>
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="LINK_TO_TARGET" columnType="BOOLEAN"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="LINK_TO_TARGET" nullable="TRUE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="FILTER" columnType="VARCHAR2" precision="40"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="FILTER" nullable="TRUE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="EXPRESSION" columnType="VARCHAR2"
precision="400"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="EXPRESSION" nullable="FALSE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="TARGET_TYPE" columnType="VARCHAR2"
precision="20"/>
+ <schema-alterColumn table="RHQ_PROP_DEF_OPT_SRC"
column="TARGET_TYPE" nullable="FALSE"/>
+
+ <schema-addColumn table="RHQ_PROP_DEF_OPT_SRC"
column="PROPERTY_DEF_ID" columnType="INTEGER"/>
+ <schema-directSQL>
+ <statement desc="Adding a fk">
+ ALTER TABLE RHQ_PROP_DEF_OPT_SRC
+ ADD CONSTRAINT RHQ_PROP_DEF_OPT_SRC_ID_FK
+ FOREIGN KEY (PROPERTY_DEF_ID)
+ REFERENCES RHQ_CONFIG_PROP_DEF (ID)
+ </statement>
+ </schema-directSQL>
+ <schema-createSequence
name="rhq_config_prop_def_opt_src_id_seq" initial="10001" />
+ </schemaSpec>
</dbupgrade>
</target>
</project>
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
index b77b4e6..a597478 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinitionSimple.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -38,6 +38,7 @@ import javax.persistence.OneToMany;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.IndexColumn;
@@ -84,7 +85,7 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
* {@link PropertyDefinition#required} field is <code>false</code> (i.e.
for optional properties). Conversely, this
* field should be null for properties whose {@link PropertyDefinition#required}
field is <code>true</code> (i.e. for
* required properties).
- *
+ *
* This field is mainly used to help build default templates. You usually do not want
to use this
* default value member variable directly - consider using the configuration
definition's default template.
*/
@@ -97,6 +98,10 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
@Enumerated(EnumType.ORDINAL)
private MeasurementUnits units;
+ @Cascade( { org.hibernate.annotations.CascadeType.ALL,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
+ @OneToMany(mappedBy = "propertyDefinition", fetch = FetchType.EAGER)
+ List<PropertyOptionsSource> optionsSource = new
ArrayList<PropertyOptionsSource>();
+
public PropertyDefinitionSimple(@NotNull String name, String description, boolean
required,
@NotNull PropertySimpleType type) {
super(name, description, required);
@@ -207,7 +212,7 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
* value. Note, however, you rarely want to use this directly. Under most
* circumstances, you should be using the configuration definition's
* {@link ConfigurationDefinition#getDefaultTemplate() default template}.
- *
+ *
* For an example of where this method is useful, see
*
org.rhq.core.clientapi.agent.configuration.ConfigurationUtility.initializeDefaultTemplate(ConfigurationDefinition)
*
@@ -222,7 +227,7 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
* only at times when you plan on building default templates with this
* property definition later. See {@link #getDefaultValue()} for more details
* on this default value.
- *
+ *
* @param defaultValue
*/
public void setDefaultValue(String defaultValue) {
@@ -237,6 +242,18 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
this.units = units;
}
+ public PropertyOptionsSource getOptionsSource() {
+ if (optionsSource.isEmpty())
+ return null;
+ return optionsSource.get(0);
+ }
+
+ public void setOptionsSource(PropertyOptionsSource source) {
+ this.optionsSource.clear();
+ this.optionsSource.add(source);
+ }
+
+
@Override
public String toString() {
return "SimpleProperty["
@@ -247,4 +264,4 @@ public class PropertyDefinitionSimple extends PropertyDefinition {
+ ((getPropertyGroupDefinition() != null) ? ("(Group: " +
getPropertyGroupDefinition().getName() + ")")
: "");
}
-}
\ No newline at end of file
+}
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyOptionsSource.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyOptionsSource.java
new file mode 100644
index 0000000..1af0bf4
--- /dev/null
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyOptionsSource.java
@@ -0,0 +1,139 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 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.configuration.definition;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+
+/**
+ * Defines a source for property options
+ * @author Heiko W. Rupp
+ */
+@Entity
+@Table(name="RHQ_PROP_DEF_OPT_SRC")
+@SequenceGenerator(name = "SEQ", sequenceName =
"RHQ_CONFIG_PROP_DEF_OPT_SRC_ID_SEQ")
+(a)XmlAccessorType(XmlAccessType.FIELD)
+public class PropertyOptionsSource implements Serializable{
+
+ @Id
+ @GeneratedValue(generator = "SEQ", strategy = GenerationType.AUTO)
+ private int id;
+
+ @Column(name="LINK_TO_TARGET")
+ private boolean linkToTarget;
+ private String filter;
+ private String expression;
+ @Column(name="TARGET_TYPE")
+ @Enumerated(EnumType.STRING)
+ private TargetType targetType;
+
+ @ManyToOne
+ @JoinColumn(name="PROPERTY_DEF_ID" )
+ PropertyDefinitionSimple propertyDefinition;
+
+ public PropertyOptionsSource() {
+ }
+
+ public void setTarget(String target) {
+ targetType = TargetType.fromValue(target);
+ }
+
+ public void setLinkToTarget(boolean linkToTarget) {
+ this.linkToTarget = linkToTarget;
+ }
+
+ public void setFilter(String filter) {
+ this.filter = filter;
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+
+ public boolean isLinkToTarget() {
+ return linkToTarget;
+ }
+
+ public String getFilter() {
+ return filter;
+ }
+
+ public String getExpression() {
+ return expression;
+ }
+
+ public TargetType getTargetType() {
+ return targetType;
+ }
+
+ public enum TargetType {
+ GROUP("group"),
+ PLUGIN("plugin"),
+ RESOURCE_TYPE("resourceType"),
+ RESOURCE("resource"),
+ CONFIGURATION("configuration");
+
+ private final String value;
+
+ TargetType(String v) {
+ value = v;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ public static TargetType fromValue(String v) {
+ for (TargetType c: TargetType.values()) {
+ if (c.value.equals(v)) {
+ return c;
+ }
+ }
+ return valueOf(v);
+// throw new IllegalArgumentException(v.toString());
+ }
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
index a956c46..bd59ff8 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
@@ -350,9 +350,25 @@ public class ConfigurationEditor extends LocatableVLayout {
}
});
}
- } else {
- reload();
}
+
+ if (configurationDefinition!=null ) {
+
configurationService.getOptionValuesForConfigDefinition(configurationDefinition,new
AsyncCallback<ConfigurationDefinition>() {
+ @Override
+ public void onFailure(Throwable throwable) {
+ showError(throwable);
+ }
+
+ @Override
+ public void onSuccess(ConfigurationDefinition result) {
+ if (loadHandler!=null)
+ loadHandler.loadedConfigurationDefinition(result);
+ }
+ });
+ }
+
+
+ reload();
}
public void reload() {
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
index bdb5a7d..d501799 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
@@ -11,6 +11,8 @@ import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.composite.ResourceConfigurationComposite;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.group.GroupPluginConfigurationUpdate;
import org.rhq.core.domain.configuration.group.GroupResourceConfigurationUpdate;
import org.rhq.core.domain.criteria.GroupPluginConfigurationUpdateCriteria;
@@ -86,4 +88,10 @@ public interface ConfigurationGWTService extends RemoteService {
void deleteGroupResourceConfigurationUpdate(Integer groupId, Integer[]
groupResourceConfigUpdateIds)
throws RuntimeException;
+
+ /**
+ * GWT-RPC service asynchronous (client-side) interface
+ * @see ConfigurationGWTService
+ */
+ ConfigurationDefinition getOptionValuesForConfigDefinition(ConfigurationDefinition
definition);
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
index 7f7c31b..3aeaa07 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
@@ -48,7 +48,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl
implemen
throws RuntimeException {
try {
configurationManager.purgeResourceConfigurationUpdates(getSessionSubject(),
configUpdateIds,
- purgeInProgress);
+ purgeInProgress);
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
}
@@ -87,7 +87,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl
implemen
public PluginConfigurationUpdate getLatestPluginConfigurationUpdate(int resourceId)
throws RuntimeException {
try {
PluginConfigurationUpdate update =
configurationManager.getLatestPluginConfigurationUpdate(
- getSessionSubject(), resourceId);
+ getSessionSubject(), resourceId);
return SerialUtility.prepare(update,
"ConfigurationService.getLatestPluginConfigurationUpdate");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
@@ -108,7 +108,7 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
public ConfigurationDefinition getPluginConfigurationDefinition(int resourceTypeId)
throws RuntimeException {
try {
ConfigurationDefinition definition =
configurationManager.getPluginConfigurationDefinitionForResourceType(
- getSessionSubject(), resourceTypeId);
+ getSessionSubject(), resourceTypeId);
return SerialUtility.prepare(definition,
"ConfigurationService.getPluginConfigDefinition");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
@@ -142,7 +142,7 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
Long endDate, boolean suppressOldest, PageControl pc) throws RuntimeException {
try {
PageList<ResourceConfigurationUpdate> updates =
configurationManager.findResourceConfigurationUpdates(
- getSessionSubject(), resourceId, beginDate, endDate, suppressOldest,
pc);
+ getSessionSubject(), resourceId, beginDate, endDate, suppressOldest,
pc);
if (!updates.isEmpty()) {
List<Resource> resources = new
ArrayList<Resource>(updates.size());
for (ResourceConfigurationUpdate update : updates) {
@@ -165,7 +165,7 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
throws RuntimeException {
try {
ResourceConfigurationUpdate update =
configurationManager.updateResourceConfiguration(getSessionSubject(),
- resourceId, configuration);
+ resourceId, configuration);
return SerialUtility.prepare(update,
"ConfigurationService.updateResourceConfiguration");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
@@ -177,7 +177,7 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
throws RuntimeException {
try {
PluginConfigurationUpdate update =
configurationManager.updatePluginConfiguration(getSessionSubject(),
- resourceId, configuration);
+ resourceId, configuration);
return SerialUtility.prepare(update,
"ConfigurationService.updatePluginConfiguration");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
@@ -323,7 +323,7 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
try {
Map<Integer, Configuration> configurations =
convertToMap(pluginConfigurations);
this.configurationManager.scheduleGroupPluginConfigurationUpdate(getSessionSubject(),
groupId,
- configurations);
+ configurations);
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
}
@@ -334,7 +334,7 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
throws RuntimeException {
try {
this.configurationManager.deleteGroupPluginConfigurationUpdates(getSessionSubject(),
groupId,
- groupPluginConfigUpdateIds);
+ groupPluginConfigUpdateIds);
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
}
@@ -345,7 +345,18 @@ public class ConfigurationGWTServiceImpl extends
AbstractGWTServiceImpl implemen
throws RuntimeException {
try {
this.configurationManager.deleteGroupResourceConfigurationUpdates(getSessionSubject(),
groupId,
- groupResourceConfigUpdateIds);
+ groupResourceConfigUpdateIds);
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
+ @Override
+ public ConfigurationDefinition getOptionValuesForConfigDefinition(
+ ConfigurationDefinition definition) throws RuntimeException {
+ try {
+ ConfigurationDefinition def =
configurationManager.getOptionsForConfigurationDefinition(definition);
+ return
SerialUtility.prepare(def,"ConfigurationService.getOptionValuesForPropertySimple");
} catch (Throwable t) {
throw getExceptionToThrowToClient(t);
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 7d94069..64f0927 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -64,6 +64,9 @@ import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.composite.ConfigurationUpdateComposite;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
+import org.rhq.core.domain.configuration.definition.PropertyDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
import org.rhq.core.domain.configuration.group.GroupPluginConfigurationUpdate;
import org.rhq.core.domain.configuration.group.GroupResourceConfigurationUpdate;
@@ -678,7 +681,7 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
}
Query countQuery = PersistenceUtility.createCountQuery(entityManager,
- ResourceConfigurationUpdate.QUERY_FIND_BY_GROUP_ID_AND_STATUS);
+ ResourceConfigurationUpdate.QUERY_FIND_BY_GROUP_ID_AND_STATUS);
countQuery.setParameter("groupId", compatibleGroup.getId());
countQuery.setParameter("status",
ConfigurationUpdateStatus.INPROGRESS);
long count = (Long) countQuery.getSingleResult();
@@ -1620,7 +1623,7 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
public Configuration getConfigurationFromDefaultTemplate(ConfigurationDefinition
definition) {
ConfigurationDefinition managedDefinition =
entityManager.find(ConfigurationDefinition.class, definition
- .getId());
+ .getId());
Configuration configuration =
managedDefinition.getDefaultTemplate().getConfiguration();
ConfigurationMaskingUtility.maskConfiguration(configuration, managedDefinition);
return configuration;
@@ -1992,7 +1995,7 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
pc.initDefaultOrderingField("modifiedTime", PageOrdering.DESC);
Query query = PersistenceUtility.createQueryWithOrderBy(entityManager,
- GroupPluginConfigurationUpdate.QUERY_FIND_BY_GROUP_ID, pc);
+ GroupPluginConfigurationUpdate.QUERY_FIND_BY_GROUP_ID, pc);
Query countQuery = PersistenceUtility.createCountQuery(entityManager,
GroupPluginConfigurationUpdate.QUERY_FIND_BY_GROUP_ID);
query.setParameter("groupId", groupId);
@@ -2375,6 +2378,34 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
return updates;
}
+ public ConfigurationDefinition
getOptionsForConfigurationDefinition(ConfigurationDefinition def) {
+
+
+ for (Map.Entry<String,PropertyDefinition> entry :
def.getPropertyDefinitions().entrySet()) {
+ PropertyDefinition pd = entry.getValue();
+
+ if (pd instanceof PropertyDefinitionSimple) {
+ PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd;
+ handlePDS(pds);
+
+ }
+ // TODO consider more cases
+ }
+
+ return def;
+ }
+
+ private void handlePDS(PropertyDefinitionSimple pds) {
+
+ if (pds.getOptionsSource()!=null) {
+ // TODO evaluate the source parameters
+ }
+ // TODO next is a dummy.
+ PropertyDefinitionEnumeration foo = new
PropertyDefinitionEnumeration("main-server-group","main-server-group");
+ pds.getEnumeratedValues().add(foo);
+
+ }
+
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
// Remote Interface Impl
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
index c1222c1..ca557203 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
@@ -44,7 +44,6 @@ import
org.rhq.core.domain.criteria.GroupResourceConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.configuration.job.GroupPluginConfigurationUpdateJob;
@@ -568,4 +567,6 @@ public interface ConfigurationManagerLocal {
PageList<GroupPluginConfigurationUpdate>
findGroupPluginConfigurationUpdatesByCriteria(Subject subject,
GroupPluginConfigurationUpdateCriteria criteria);
+
+ ConfigurationDefinition getOptionsForConfigurationDefinition(ConfigurationDefinition
def);
}
\ No newline at end of file
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 fd2decc..48109dc 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
@@ -420,6 +420,9 @@ public class ConfigurationMetadataManagerBean implements
ConfigurationMetadataMa
// handle <defaultValue> [0..1]
existingPDS.setDefaultValue(newPDS.getDefaultValue());
+
+ // handle <c:source>
+ existingPDS.setOptionsSource(newPDS.getOptionsSource());
} else {
// other type
replaceProperty(existingProperty, newProperty);
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 75feadd..f3df649 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
@@ -39,6 +39,7 @@ import
org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyOptionsSource;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.test.AssertUtils;
@@ -53,7 +54,7 @@ import static java.util.Arrays.asList;
* is the original version and the other is the upgraded version. In order to avoid
inter-dependencies between test
* methods, a separate plugin configuration should be used for each test method. A
separate resource type is declared
* for each test, further documenting and delinating where each configuration is used. In
the test methods, the
- * original and updated coniguration definitions are initialized with an xpath expression
that specifies the owning
+ * original and updated configuration definitions are initialized with an xpath
expression that specifies the owning
* resource type.
*/
public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
@@ -176,6 +177,39 @@ public class ConfigurationMetadataManagerBeanTest extends
AbstractEJB3Test {
expected, actual, ignoredProperties);
}
+ @Test
+ public void updatePropertyDefinitionOptionSource() {
+ initConfigDefs("servers[name='OptionSourceTest']",
"OptionSourceTest");
+
+ // check initial entry
+ PropertyDefinitionSimple prop1 = (PropertyDefinitionSimple)
originalConfigDef.get("prop1");
+ assert prop1 !=null;
+// assert prop1.getEnumeratedValues().size()==1 : "Did not find my one
option"; TODO
+ PropertyOptionsSource source = prop1.getOptionsSource();
+ assert source !=null : "PropertyOptionSource was not persisted";
+ assert source.getFilter().equals("*.jdbc");
+
+ PropertyDefinitionSimple prop2 = (PropertyDefinitionSimple)
originalConfigDef.get("prop2");
+ assert prop2 !=null;
+ assert prop2.getEnumeratedValues().size()==0;
+ assert prop2.getOptionsSource()==null;
+ // now check the upgrades
+ prop1 = (PropertyDefinitionSimple) updatedConfigDef.get("prop1");
+ assert prop1 !=null;
+ assert prop1.getEnumeratedValues().size()==0 : "Found an option value.
";
+ source = prop1.getOptionsSource();
+ assert source !=null : "PropertyOptionSource was not persisted";
+ assert source.getFilter()==null : "Assumed filter to be null, but was "
+ source.getFilter();
+
+ prop2 = (PropertyDefinitionSimple) updatedConfigDef.get("prop2");
+ assert prop2 !=null;
+ assert prop2.getEnumeratedValues().size()==0;
+ assert prop2.getOptionsSource()!=null;
+ assert prop2.getOptionsSource().getExpression().equals("*");
+
+
+ }
+
private void initConfigDefs(String path, String configName) {
loadAndPersistConfigDefs(path, configName);
updateConfigDef();
diff --git
a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml
b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml
index 5a1fe11..c125cf2 100644
---
a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml
+++
b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml
@@ -67,4 +67,17 @@
</c:map-property>
</plugin-configuration>
</server>
+
+ <server name="OptionSourceTest">
+ <plugin-configuration>
+ <c:simple-property name="prop1">
+ <c:property-options>
+ <c:option value="value1"/>
+ </c:property-options>
+ <c:option-source target="resource"
expression="resourceType=DomainDeployment,plugin=as7"
+ filter="*.jdbc"
linkToTarget="false"/>
+ </c:simple-property>
+ <c:simple-property name="prop2"/>
+ </plugin-configuration>
+ </server>
</plugin>
diff --git
a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
index 564c68c..0f0e3a7 100644
---
a/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
+++
b/modules/enterprise/server/jar/src/test/resources/org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml
@@ -67,7 +67,7 @@
<c:simple-property name="myListMember"
type="double"
default="3.14"
- description="PI"/>
+ description="PI"/>
</c:map-property>
</c:list-property>
</plugin-configuration>
@@ -89,4 +89,16 @@
</c:map-property>
</plugin-configuration>
</server>
+ <server name="OptionSourceTest">
+ <plugin-configuration>
+ <c:simple-property name="prop1">
+ <c:option-source target="resource"
expression="resourceType=DomainDeployment,plugin=as7"
+ linkToTarget="false"/>
+ </c:simple-property>
+ <c:simple-property name="prop2">
+ <c:option-source target="resource"
expression="*"/>
+ </c:simple-property>
+ </plugin-configuration>
+ </server>
+
</plugin>
commit 9c04e5bb15f7de53526930fb47b9f19ec55f49b9
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Jun 14 10:13:40 2011 +0200
BZ 712311 prevent a NPE in case there is no current config.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index bef0519..7d94069 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -410,14 +410,15 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
+ "]; will assume latest resource configuration update is the
current resource configuration.");
}
- // Mask the configuration before returning the update.
- Configuration configuration = current.getConfiguration();
- ConfigurationDefinition configurationDefinition =
getResourceConfigurationDefinitionForResourceType(
- subjectManager.getOverlord(), resource.getResourceType().getId());
- // We do not want the masked configuration persisted, so detach all entities
before masking the configuration.
- entityManager.clear();
- ConfigurationMaskingUtility.maskConfiguration(configuration,
configurationDefinition);
-
+ if (current!=null) {
+ // Mask the configuration before returning the update.
+ Configuration configuration = current.getConfiguration();
+ ConfigurationDefinition configurationDefinition =
getResourceConfigurationDefinitionForResourceType(
+ subjectManager.getOverlord(), resource.getResourceType().getId());
+ // We do not want the masked configuration persisted, so detach all entities
before masking the configuration.
+ entityManager.clear();
+ ConfigurationMaskingUtility.maskConfiguration(configuration,
configurationDefinition);
+ }
return current;
}